Tribler/py-ipv8

Investigate `ruff` as a replacement linter for `flake8` and `pylint`

qstokkink opened this issue · 3 comments

Our current PR linters are Flake8 and Pylint. They take (depending on the size of the PR) in the order of 10 seconds and dozens of seconds to complete, respectively.

According to its marketing material, https://github.com/astral-sh/ruff can replace both of our linters and finish linting within a single second. If this is true, this would be a win-win, with one less dependency and shorter PR testing time.

We should probably investigate the consequences of switching to ruff.

So far, wildly impressed: ruff is extremely fast and finds more than pylint. I'm honestly amazed at how it manages to even write this much text to file in such a short time. We will have to carefully go through and select relevant errors though.

Example extracted from full `ipv8` folder scan

Pylint output, after dozens of seconds:

************* Module py-ipv8.ipv8.configuration
ipv8/configuration.py:30: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:30: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:31: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:31: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:32: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:32: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:33: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:34: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:35: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:36: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:37: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:38: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:39: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:40: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:41: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:58: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:59: [W1406(redundant-u-string-prefix), ] The u prefix for strings is no longer necessary in Python >=3.0
ipv8/configuration.py:191: [R0205(useless-object-inheritance), ConfigBuilder] Class 'ConfigBuilder' inherits from object, can be safely removed from bases in python3

ruff output, within a second:

ipv8/configuration.py:1:1: D100 Missing docstring in public module
ipv8/configuration.py:7:1: UP035 `typing.Dict` is deprecated, use `dict` instead
ipv8/configuration.py:11:24: UP006 [*] Use `dict` instead of `Dict` for type annotation
ipv8/configuration.py:12:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:13:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:14:9: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:27:38: COM812 [*] Trailing comma missing
ipv8/configuration.py:29:9: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:30:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:30:48: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:31:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:31:48: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:32:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:32:48: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:33:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:34:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:35:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:36:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:37:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:38:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:39:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:40:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:41:14: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:41:42: COM812 [*] Trailing comma missing
ipv8/configuration.py:43:9: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:43:34: COM812 [*] Trailing comma missing
ipv8/configuration.py:44:6: COM812 [*] Trailing comma missing
ipv8/configuration.py:48:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:50:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:51:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:51:19: S104 Possible binding to all interfaces
ipv8/configuration.py:52:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:52:25: COM812 [*] Trailing comma missing
ipv8/configuration.py:53:10: COM812 [*] Trailing comma missing
ipv8/configuration.py:55:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:57:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:58:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:58:27: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:59:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:59:21: UP025 [*] Remove unicode literals from strings
ipv8/configuration.py:59:41: COM812 [*] Trailing comma missing
ipv8/configuration.py:60:10: COM812 [*] Trailing comma missing
ipv8/configuration.py:62:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:63:9: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:63:24: COM812 [*] Trailing comma missing
ipv8/configuration.py:65:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:66:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:67:5: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:69:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:69:22: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:70:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:71:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:73:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:74:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:75:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:76:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:76:39: COM812 [*] Trailing comma missing
ipv8/configuration.py:77:22: COM812 [*] Trailing comma missing
ipv8/configuration.py:80:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:81:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:82:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:83:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:84:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:85:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:86:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:86:42: COM812 [*] Trailing comma missing
ipv8/configuration.py:87:22: COM812 [*] Trailing comma missing
ipv8/configuration.py:90:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:91:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:92:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:92:31: COM812 [*] Trailing comma missing
ipv8/configuration.py:93:18: COM812 [*] Trailing comma missing
ipv8/configuration.py:95:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:96:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:97:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:97:27: COM812 [*] Trailing comma missing
ipv8/configuration.py:100:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:100:22: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:101:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:102:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:104:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:105:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:106:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:107:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:107:39: COM812 [*] Trailing comma missing
ipv8/configuration.py:108:22: COM812 [*] Trailing comma missing
ipv8/configuration.py:109:18: COM812 [*] Trailing comma missing
ipv8/configuration.py:111:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:112:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:113:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:114:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:115:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:116:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:117:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:118:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:119:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:120:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:120:46: COM812 [*] Trailing comma missing
ipv8/configuration.py:121:18: COM812 [*] Trailing comma missing
ipv8/configuration.py:123:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:124:18: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:124:37: COM812 [*] Trailing comma missing
ipv8/configuration.py:125:14: COM812 [*] Trailing comma missing
ipv8/configuration.py:128:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:128:22: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:129:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:130:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:132:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:133:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:134:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:135:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:135:39: COM812 [*] Trailing comma missing
ipv8/configuration.py:136:22: COM812 [*] Trailing comma missing
ipv8/configuration.py:139:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:140:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:141:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:141:31: COM812 [*] Trailing comma missing
ipv8/configuration.py:142:18: COM812 [*] Trailing comma missing
ipv8/configuration.py:144:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:145:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:146:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:146:27: COM812 [*] Trailing comma missing
ipv8/configuration.py:147:10: COM812 [*] Trailing comma missing
ipv8/configuration.py:148:6: COM812 [*] Trailing comma missing
ipv8/configuration.py:152:5: ANN201 Missing return type annotation for public function `get_default_configuration`
ipv8/configuration.py:152:5: D103 Missing docstring in public function
ipv8/configuration.py:156:7: D101 Missing docstring in public class
ipv8/configuration.py:164:9: ANN206 Missing return type annotation for classmethod `values`
ipv8/configuration.py:164:9: D102 Missing docstring in public method
ipv8/configuration.py:164:16: ANN102 Missing type annotation for `cls` in classmethod
ipv8/configuration.py:168:7: D101 Missing docstring in public class
ipv8/configuration.py:174:7: D101 Missing docstring in public class
ipv8/configuration.py:179:9: ANN206 Missing return type annotation for classmethod `values`
ipv8/configuration.py:179:9: D102 Missing docstring in public method
ipv8/configuration.py:179:16: ANN102 Missing type annotation for `cls` in classmethod
ipv8/configuration.py:183:7: D101 Missing docstring in public class
ipv8/configuration.py:188:107: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:191:7: D101 Missing docstring in public class
ipv8/configuration.py:191:21: UP004 [*] Class `ConfigBuilder` inherits from `object`
ipv8/configuration.py:193:9: ANN204 [*] Missing return type annotation for special method `__init__`
ipv8/configuration.py:193:9: D107 Missing docstring in `__init__`
ipv8/configuration.py:193:18: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:193:24: FBT001 Boolean positional arg in function definition
ipv8/configuration.py:193:38: FBT002 Boolean default value in function definition
ipv8/configuration.py:196:18: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:197:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:203:9: S101 Use of `assert` detected
ipv8/configuration.py:203:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:204:9: S101 Use of `assert` detected
ipv8/configuration.py:204:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:205:9: S101 Use of `assert` detected
ipv8/configuration.py:205:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:206:9: S101 Use of `assert` detected
ipv8/configuration.py:206:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:207:9: S101 Use of `assert` detected
ipv8/configuration.py:207:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:209:9: S101 Use of `assert` detected
ipv8/configuration.py:209:28: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:211:36: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:212:13: S101 Use of `assert` detected
ipv8/configuration.py:212:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:213:13: S101 Use of `assert` detected
ipv8/configuration.py:213:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:214:13: S101 Use of `assert` detected
ipv8/configuration.py:214:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:215:13: S101 Use of `assert` detected
ipv8/configuration.py:215:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:217:13: S101 Use of `assert` detected
ipv8/configuration.py:217:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:219:13: S101 Use of `assert` detected
ipv8/configuration.py:219:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:220:13: S101 Use of `assert` detected
ipv8/configuration.py:220:28: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:220:48: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:220:78: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:222:13: S101 Use of `assert` detected
ipv8/configuration.py:222:49: SIM118 [*] Use `key in overlay['initialize']` instead of `key in overlay['initialize'].keys()`
ipv8/configuration.py:222:64: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:224:13: S101 Use of `assert` detected
ipv8/configuration.py:224:71: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:226:35: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:227:17: S101 Use of `assert` detected
ipv8/configuration.py:227:35: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:229:17: S101 Use of `assert` detected
ipv8/configuration.py:229:35: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:231:17: S101 Use of `assert` detected
ipv8/configuration.py:231:35: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:233:41: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:234:17: S101 Use of `assert` detected
ipv8/configuration.py:234:41: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:236:17: S101 Use of `assert` detected
ipv8/configuration.py:236:41: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:238:17: S101 Use of `assert` detected
ipv8/configuration.py:238:37: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:242:20: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:243:9: D200 [*] One-line docstring should fit on one line
ipv8/configuration.py:243:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:246:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:249:24: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:250:9: D200 [*] One-line docstring should fit on one line
ipv8/configuration.py:250:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:253:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:256:21: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:257:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:268:51: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:268:73: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:269:24: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:270:53: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:271:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:273:16: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:274:29: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:276:29: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:279:18: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:280:9: D205 1 blank line required between summary line and description
ipv8/configuration.py:280:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:287:51: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:287:73: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:288:24: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:289:53: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:290:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:292:16: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:293:29: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:295:29: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:298:23: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:299:9: D205 1 blank line required between summary line and description
ipv8/configuration.py:299:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:303:9: S101 Use of `assert` detected
ipv8/configuration.py:303:30: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:303:42: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:303:51: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:303:62: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:303:70: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:303:79: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:304:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:304:34: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:307:31: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:308:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:313:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:316:29: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:317:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:324:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:327:17: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:328:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:333:9: S101 Use of `assert` detected
ipv8/configuration.py:333:31: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:333:45: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:333:57: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:333:64: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:333:74: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:334:12: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:335:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:335:63: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:337:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:338:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:339:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:340:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:341:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:341:30: COM812 [*] Trailing comma missing
ipv8/configuration.py:345:26: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:345:73: UP007 [*] Use `X | Y` for type annotations
ipv8/configuration.py:346:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:355:12: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:356:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:356:63: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:356:78: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:358:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:360:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:361:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:361:31: COM812 [*] Trailing comma missing
ipv8/configuration.py:364:24: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:365:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:368:27: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:369:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:377:9: PLR0913 Too many arguments to function call (8 > 5)
ipv8/configuration.py:377:21: ANN101 Missing type annotation for `self` in method
ipv8/configuration.py:380:30: UP006 [*] Use `list` instead of `typing.List` for type annotation
ipv8/configuration.py:381:36: UP006 [*] Use `list` instead of `typing.List` for type annotation
ipv8/configuration.py:382:33: UP006 [*] Use `dict` instead of `typing.Dict` for type annotation
ipv8/configuration.py:383:31: UP006 [*] Use `list` instead of `typing.List` for type annotation
ipv8/configuration.py:384:21: FBT001 Boolean positional arg in function definition
ipv8/configuration.py:384:45: FBT002 Boolean default value in function definition
ipv8/configuration.py:385:9: D205 1 blank line required between summary line and description
ipv8/configuration.py:385:9: D212 [*] Multi-line docstring summary should start at the first line
ipv8/configuration.py:409:12: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:411:29: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:411:79: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:414:25: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:415:21: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:416:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:417:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:418:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:419:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:420:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:421:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:421:36: COM812 [*] Trailing comma missing
ipv8/configuration.py:423:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:424:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:425:17: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:425:42: COM812 [*] Trailing comma missing
ipv8/configuration.py:427:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:428:13: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:428:33: COM812 [*] Trailing comma missing
ipv8/configuration.py:433:12: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:433:28: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:433:54: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:433:71: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:433:96: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:434:12: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:434:32: Q000 [*] Single quotes found but double quotes preferred
ipv8/configuration.py:434:58: Q000 [*] Single quotes found but double quotes preferred

I'm considering the following ruff configuration:

(Click Me) Configuration `.ruff.toml`
select = ["ALL"]
fixable = ["ALL"]
unfixable = []

ignore = [
    "ANN003",
    "ANN101",
    "ARG001",
    "ARG002",
    "ARG005",
    "BLE001",
    "COM812",
    "COM819",
    "D100",
    "D104",
    "D200",
    "D212",
    "D401",
    "D404",
    "E501",
    "E722",
    "E731",
    "E741",
    "EM",
    "ERA001",
    "F403",
    "F405",
    "FBT",
    "INP001",
    "N818",
    "N999",
    "PERF203",
    "PLR2004",
    "PT",
    "PTH",
    "Q000",
    "RUF012",
    "S101",
    "S104",
    "S105",
    "S106",
    "S107",
    "S303",
    "S311",
    "S324",
    "TID",
    "TRY002",
    "TRY300",
    "TRY301",
    "TRY401",
]

exclude = [
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".github",
    ".hg",
    ".idea",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytest_cache",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pycache__",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "venv",
]

line-length = 120

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

target-version = "py37"

[pylint]
max-args = 5
max-returns=8
max-branches=12
max-statements=50

This is in line with our previous standards (assuming I didn't make any mistakes porting the previous configs). However, we have accumulated quite some violations in this repo:

Found 13694 errors.
[*] 3449 potentially fixable with the --fix option.

That said, the ruff linting check would normally only be applied to the changed files in PRs and not the entire repo.

For the unit tests (the tests) folder we should additionally ignore ANN201. Otherwise, we would have to specify return types for our unit tests.

For example:

class MyTests(TestCase):
    def test_a(self): ...
    def test_b(self): ...
    def test_c(self): ...
    def test_d(self): ...
    def test_e(self): ...
    def test_f(self): ...

Would have to be:

class MyTests(TestCase):
    def test_a(self) -> None: ...
    def test_b(self) -> None: ...
    def test_c(self) -> None: ...
    def test_d(self) -> None: ...
    def test_e(self) -> None: ...
    def test_f(self) -> None: ...

This seems unnecessarily painful for test cases. However, for "normal" classes we should still enforce this.

We would have to perform two ruff runs:

ruff check . --exclude="ipv8/test/*.py"
ruff check ipv8/test --ignore ANN201