Created
July 24, 2025 13:56
-
-
Save serjflint/aad7f28baf2c8203ff1b92552403d8e6 to your computer and use it in GitHub Desktop.
backend-py3 config
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[tool.ruff] | |
target-version = "py312" | |
line-length = 120 | |
extend-exclude = [ | |
] | |
namespace-packages = [ | |
] | |
src = [ | |
] | |
[tool.ruff.format] | |
preview = true | |
quote-style = "single" | |
indent-style = "space" | |
line-ending = "lf" | |
skip-magic-trailing-comma = false | |
docstring-code-format = false | |
docstring-code-line-length = "dynamic" | |
[tool.ruff.lint] | |
preview = true | |
select = [ | |
"A001", # builtin-variable-shadowing | |
"ASYNC115", # async-zero-sleep | |
"B002", # unary-prefix-increment-decrement | |
"B006", # mutable-argument-default | |
"B009", # get-attr-with-constant | |
"B010", # set-attr-with-constant | |
# "B011", # assert-false, our python is not optimized | |
"B012", # jump-statement-in-finally | |
"B013", # redundant-tuple-in-exception-handler | |
"B014", # duplicate-handler-exception | |
"B018", # useless-expression | |
"B019", # cached-instance-method | |
"B023", # function-uses-loop-variable | |
"B026", # star-arg-unpacking-after-keyword-arg | |
"B028", # no-explicit-stacklevel | |
"B033", # duplicate-value | |
# "B904", # raise-without-from-inside-except, too big diff, no fix | |
"B905", # zip-without-explicit-strict | |
"BLE001", # blind-except | |
"C400", # unnecessary-generator-list | |
"C401", # unnecessary-generator-set | |
"C402", # unnecessary-generator-dict | |
"C403", # unnecessary-list-comprehension-set | |
"C404", # unnecessary-list-comprehension-dict | |
"C405", # unnecessary-literal-set | |
"C406", # unnecessary-literal-dict | |
# "C408", # unnecessary-collection-call, too big diff, unsafe fix | |
"C409", # unnecessary-literal-within-tuple-call | |
"C410", # unnecessary-literal-within-list-call | |
"C411", # unnecessary-list-call | |
"C413", # unnecessary-call-around-sorted | |
"C414", # unnecessary-double-cast-or-process | |
# "C416", # unnecessary-comprehension, too big diff, unsafe fix | |
# "C417", # unnecessary-map, too big diff, Fix is sometimes available. | |
"C418", # unnecessary-literal-within-dict-call | |
# "C419", # unnecessary-comprehension-in-call, too big diff, Fix is sometimes available. | |
# "COM812", # missing-trailing-comma, conflict with formatter | |
"COM818", # trailing-comma-on-bare-tuple | |
"COM819", # prohibited-trailing-comma | |
"D", # pydocstyle | |
"E101", # mixed-spaces-and-tabs | |
"E111", # indentation-with-invalid-multiple | |
"E112", # no-indented-block | |
"E113", # unexpected-indentation | |
"E114", # indentation-with-invalid-multiple-comment | |
"E115", # no-indented-block-comment | |
"E116", # unexpected-indentation-comment | |
"E117", # over-indented | |
"E201", # whitespace-after-open-bracket | |
"E202", # whitespace-before-close-bracket | |
"E203", # whitespace-before-punctuation | |
"E204", # whitespace-after-decorator | |
"E211", # whitespace-before-parameters | |
"E221", # multiple-spaces-before-operator | |
"E222", # multiple-spaces-after-operator | |
"E223", # tab-before-operator | |
"E224", # tab-after-operator | |
"E225", # missing-whitespace-around-operator | |
"E226", # missing-whitespace-around-arithmetic-operator | |
"E227", # missing-whitespace-around-bitwise-or-shift-operator | |
"E228", # missing-whitespace-around-modulo-operator | |
"E231", # missing-whitespace | |
"E241", # multiple-spaces-after-comma | |
"E242", # tab-after-comma | |
"E251", # unexpected-spaces-around-keyword-parameter-equals | |
"E252", # missing-whitespace-around-parameter-equals | |
"E261", # too-few-spaces-before-inline-comment | |
"E262", # no-space-after-inline-comment | |
"E265", # no-space-after-block-comment | |
"E266", # multiple-leading-hashes-for-block-comment | |
"E271", # multiple-spaces-after-keyword | |
"E272", # multiple-spaces-before-keyword | |
"E273", # tab-after-keyword | |
"E274", # tab-before-keyword | |
"E275", # missing-whitespace-after-keyword | |
"E301", # blank-line-between-methods | |
"E302", # blank-lines-top-level | |
"E303", # too-many-blank-lines | |
"E304", # blank-line-after-decorator | |
"E305", # blank-lines-after-function-or-class | |
"E306", # blank-lines-before-nested-definition | |
"E401", # multiple-imports-on-one-line | |
"E402", # module-import-not-at-top-of-file | |
# "E501", # line-too-long, conflict with formatter | |
"E502", # redundant-backslash | |
"E701", # multiple-statements-on-one-line-colon | |
"E702", # multiple-statements-on-one-line-semicolon | |
"E703", # useless-semicolon | |
"E711", # none-comparison | |
"E712", # true-false-comparison | |
"E713", # not-in-test | |
"E714", # not-is-test | |
"E721", # type-comparison | |
"E722", # bare-except | |
"E731", # lambda-assignment | |
"E741", # ambiguous-variable-name | |
"E742", # ambiguous-class-name | |
"E743", # ambiguous-function-name | |
"E902", # io-error | |
"EXE004", # shebang-leading-whitespace | |
"F401", # unused-import | |
"F402", # import-shadowed-by-loop-var | |
"F403", # undefined-local-with-import-star | |
"F404", # late-future-import | |
"F405", # undefined-local-with-import-star-usage | |
"F406", # undefined-local-with-nested-import-star-usage | |
"F407", # future-feature-not-defined | |
"F501", # percent-format-invalid-format | |
"F502", # percent-format-expected-mapping | |
"F503", # percent-format-expected-sequence | |
"F504", # percent-format-extra-named-arguments | |
"F505", # percent-format-missing-argument | |
"F506", # percent-format-mixed-positional-and-named | |
"F508", # percent-format-star-requires-sequence | |
"F509", # percent-format-unsupported-format-character | |
"F507", # percent-format-positional-count-mismatch | |
"F521", # string-dot-format-invalid-format | |
"F522", # string-dot-format-extra-named-arguments | |
"F523", # string-dot-format-extra-positional-arguments | |
"F524", # string-dot-format-missing-arguments | |
"F525", # string-dot-format-mixing-automatic | |
"F541", # f-string-missing-placeholders | |
"F601", # multi-value-repeated-key-literal | |
"F602", # multi-value-repeated-key-variable | |
"F621", # expressions-in-star-assignment | |
"F622", # multiple-starred-expressions | |
"F631", # assert-tuple | |
"F632", # is-literal | |
"F633", # invalid-print-syntax | |
"F634", # if-tuple | |
"F701", # break-outside-loop | |
"F702", # continue-outside-loop | |
"F704", # yield-outside-function | |
"F706", # return-outside-function | |
"F707", # default-except-not-last | |
"F722", # forward-annotation-syntax-error | |
"F811", # redefined-while-unused | |
"F821", # undefined-name | |
"F822", # undefined-export | |
"F823", # undefined-local | |
"F841", # unused-variable | |
"F842", # unused-annotation | |
"F901", # raise-not-implemented | |
"FA102", # future-required-type-annotation | |
"FAST001", # fast-api-redundant-response-model | |
"FLY002", # static-join-to-f-string | |
"FURB122", # for-loop-writes | |
"FURB129", # readlines-in-for | |
"FURB132", # check-and-remove-from-set | |
"FURB142", # for-loop-set-mutations | |
"FURB154", # repeated-global | |
"FURB157", # verbose-decimal-constructor | |
"FURB161", # bit-count | |
"FURB162", # fromisoformat-replace-z | |
"FURB166", # int-on-sliced-str | |
"FURB167", # regex-flag-alias | |
"FURB169", # type-none-comparison | |
"FURB180", # meta-class-abc-meta | |
"FURB187", # list-reverse-copy | |
"FURB188", # slice-to-remove-prefix-or-suffix | |
"G001", # logging-string-format | |
"G002", # logging-percent-format | |
"G010", # logging-warn | |
"I001", # unsorted-imports | |
"I002", # missing-required-import | |
# "ISC001", # auto-fix doesn't cover all cases https://github.com/astral-sh/ruff/issues/13063 | |
"ISC002", # multi-line-implicit-string-concatenation | |
"ISC003", # explicit-string-concatenation | |
"N804", # invalid-first-argument-name-for-class-method | |
"N804", # invalid-first-argument-name-for-class-method | |
"N805", # invalid-first-argument-name-for-method | |
"N815", # mixed-case-variable-in-class-scope | |
"N999", # invalid-module-name | |
"PERF101", # unnecessary-list-cast | |
"PERF102", # incorrect-dict-iterator | |
"PIE790", # unnecessary-placeholder | |
"PIE794", # duplicate-class-field-definition | |
"PIE808", # unnecessary-range-start | |
"PIE810", # multiple-starts-ends-with | |
"PLC0105", # type-name-incorrect-variance | |
"PLC0132", # type-param-name-mismatch | |
"PLC0205", # single-string-slots | |
"PLC0206", # dict-index-missing-items | |
"PLC0208", # iteration-over-set | |
"PLC0414", # useless-import-alias | |
"PLC0415", # import-outside-top-level | |
"PLC1802", # len-test | |
"PLC2401", # non-ascii-name | |
"PLC2403", # non-ascii-import-name | |
"PLC2801", # unnecessary-dunder-call | |
"PLC3002", # unnecessary-direct-lambda-call | |
"PLE0100", # yield-in-init | |
"PLE0101", # return-in-init | |
"PLE0115", # nonlocal-and-global | |
"PLE0116", # continue-in-finally | |
"PLE0117", # nonlocal-without-binding | |
"PLE0118", # load-before-global-declaration | |
"PLE0237", # non-slot-assignment | |
"PLE0241", # duplicate-bases | |
"PLE0302", # unexpected-special-method-signature | |
"PLE0303", # invalid-length-return-type | |
"PLE0304", # invalid-bool-return-type | |
"PLE0305", # invalid-index-return-type | |
"PLE0307", # invalid-str-return-type | |
"PLE0308", # invalid-bytes-return-type | |
"PLE0309", # invalid-hash-return-type | |
"PLE0604", # invalid-all-object | |
"PLE0605", # invalid-all-format | |
"PLE0643", # potential-index-error | |
"PLE0704", # misplaced-bare-raise | |
"PLE1132", # repeated-keyword-argument | |
"PLE1141", # dict-iter-missing-items | |
"PLE1142", # await-outside-async | |
"PLE1205", # logging-too-many-args | |
"PLE1206", # logging-too-few-args | |
"PLE1300", # bad-string-format-character | |
"PLE1307", # bad-string-format-type | |
"PLE1310", # bad-str-strip-call | |
"PLE1507", # invalid-envvar-value | |
"PLE1519", # singledispatch-method | |
"PLE1520", # singledispatchmethod-function | |
"PLE1700", # yield-from-in-async-function | |
"PLE2502", # bidirectional-unicode | |
"PLE2510", # invalid-character-backspace | |
"PLE2512", # invalid-character-sub | |
"PLE2513", # invalid-character-esc | |
"PLE2514", # invalid-character-nul | |
"PLE2515", # invalid-character-zero-width-space | |
"PLE4703", # modified-iterating-set | |
"PLR0124", # comparison-with-itself | |
"PLR0133", # comparison-of-constant | |
"PLR0202", # no-classmethod-decorator | |
"PLR0203", # no-staticmethod-decorator | |
"PLR0206", # property-with-parameters | |
"PLR0402", # manual-from-import | |
"PLR0916", # too-many-boolean-expressions | |
# "PLR1701", # has been remapped to `SIM101` | |
"PLR1702", # too-many-nested-blocks | |
"PLR1704", # redefined-argument-from-local | |
"PLR1711", # useless-return | |
"PLR1714", # repeated-equality-comparison | |
"PLR1716", # boolean-chained-comparison | |
"PLR1722", # sys-exit-alias | |
"PLR1730", # if-stmt-min-max | |
"PLR1733", # unnecessary-dict-index-lookup | |
"PLR1736", # unnecessary-list-index-lookup | |
"PLR2044", # empty-comment | |
"PLR6104", # non-augmented-assignment | |
# "PLR6201", # literal-membership, too big diff | |
"PLW0108", # unnecessary-lambda | |
"PLW0120", # useless-else-on-loop | |
"PLW0127", # self-assigning-variable | |
"PLW0128", # redeclared-assigned-name | |
"PLW0129", # assert-on-string-literal | |
"PLW0131", # named-expr-without-context | |
"PLW0133", # useless-exception-statement | |
"PLW0177", # nan-comparison | |
"PLW0211", # bad-staticmethod-argument | |
"PLW0245", # super-without-brackets | |
"PLW0406", # import-self | |
"PLW0602", # global-variable-not-assigned | |
"PLW0603", # global-statement | |
"PLW0604", # global-at-module-level | |
"PLW0711", # binary-op-exception | |
"PLW1501", # bad-open-mode | |
"PLW1507", # shallow-copy-environ | |
"PLW1508", # invalid-envvar-default | |
"PLW1509", # subprocess-popen-preexec-fn | |
"PLW1510", # subprocess-run-without-check | |
"PLW1514", # unspecified-encoding | |
"PLW2101", # useless-with-lock | |
"PLW3301", # nested-min-max | |
"PT001", # pytest-fixture-incorrect-parentheses-style | |
"PT003", # pytest-extraneous-scope-function | |
"PT022", # pytest-useless-yield-fixture | |
"PT023", # pytest-incorrect-mark-parentheses-style | |
"PT024", # pytest-unnecessary-asyncio-mark-on-fixture | |
"PT025", # pytest-erroneous-use-fixtures-on-fixture | |
"PT026", # pytest-use-fixtures-without-parameters | |
"PTH201", # path-constructor-current-directory | |
"PYI009", # pass-statement-stub-body | |
"PYI010", # non-empty-stub-body | |
"PYI011", # typed-argument-default-in-stub | |
"PYI012", # pass-in-class-body | |
"PYI014", # argument-default-in-stub | |
"PYI015", # assignment-default-in-stub | |
"PYI020", # quoted-annotation-in-stub | |
"PYI021", # docstring-in-stub | |
"PYI026", # type-alias-without-annotation | |
"PYI029", # str-or-repr-defined-in-stub | |
"PYI032", # any-eq-ne-annotation | |
"PYI053", # string-or-bytes-too-long | |
"PYI054", # numeric-literal-too-long | |
"PYI062", # duplicate-literal-member | |
"Q000", # bad-quotes-inline-string | |
"Q001", # bad-quotes-multiline-string | |
"Q003", # avoidable-escaped-quote | |
"Q004", # unnecessary-escaped-quote | |
"RET501", # unnecessary-return-none | |
"RET502", # implicit-return-value | |
# "RET503", # implicit-return, too big diff | |
# "RET504", # unnecessary-assign, too big diff | |
"RET505", # superfluous-else-return | |
"RET506", # superfluous-else-raise | |
"RET507", # superfluous-else-continue | |
"RET508", # superfluous-else-break | |
# "RSE102", # unnecessary-paren-on-raise-exception, too big diff | |
"RUF010", # explicit-f-string-type-conversion | |
"RUF015", # unnecessary-iterable-allocation-for-first-element | |
"RUF017", # quadratic-list-summation | |
"RUF019", # unnecessary-key-check | |
"RUF020", # never-union | |
"RUF021", # parenthesize-chained-operators | |
"RUF027", # missing-f-string-syntax | |
"RUF028", # invalid-formatter-suppression-comment | |
"RUF030", # assert-with-print-message | |
# "RUF032", # decimal-from-float-literal, too big diff, unsafe fix | |
"RUF046", # unnecessary-cast-to-int | |
"RUF051", # if-key-in-dict-del | |
"RUF057", # unnecessary-round | |
# "RUF100", # unused-noqa, conflicts with flake8 | |
"RUF101", # redirected-noqa | |
"S102", # exec-builtin | |
"S307", # suspicious-eval-usage | |
"SIM101", # duplicate-isinstance-call | |
"SIM108", # if-else-block-instead-of-if-exp | |
"SIM109", # compare-with-tuple | |
"SIM113", # enumerate-for-loop | |
"SIM115", # open-file-with-context-handler | |
# "SIM118", # in-dict-keys, too big diff | |
"SIM201", # negate-equal-op | |
"SIM202", # negate-not-equal-op | |
"SIM208", # double-negation | |
"SIM210", # if-expr-with-true-false | |
"SIM211", # if-expr-with-false-true | |
"SIM212", # if-expr-with-twisted-arms | |
"SIM220", # expr-and-not-expr | |
"SIM221", # expr-or-not-expr | |
"SIM222", # expr-or-true | |
"SIM223", # expr-and-false | |
"SIM401", # if-else-block-instead-of-dict-get | |
"SIM910", # dict-get-with-none-default | |
"SIM911", # zip-dict-keys-and-values | |
# "SLF001", # private-member-access, too big diff | |
"T100", # debugger | |
"TC005", # empty-type-checking-block | |
"TD006", # invalid-todo-capitalization | |
"TID252", # relative-imports | |
# "TRY002", # raise-vanilla-class, too big diff | |
"TRY201", # verbose-raise | |
"TRY203", # useless-try-except | |
"UP001", # useless-metaclass-type | |
"UP004", # useless-object-inheritance | |
"UP005", # deprecated-unittest-alias | |
"UP008", # super-call-with-parameters | |
"UP009", # utf8-encoding-declaration | |
"UP010", # unnecessary-future-import | |
"UP011", # lru-cache-without-parameters | |
"UP012", # unnecessary-encode-utf8 | |
"UP015", # redundant-open-modes | |
"UP018", # native-literals | |
"UP021", # replace-universal-newlines | |
"UP023", # deprecated-c-element-tree | |
"UP024", # os-error-alias | |
"UP025", # unicode-kind-prefix | |
"UP026", # deprecated-mock-import | |
# "UP027", # unpacked-list-comprehension # removed | |
"UP028", # yield-in-for-loop | |
"UP029", # unnecessary-builtin-import | |
# "UP031", # printf-string-formatting # consider-using-f-string | |
"UP033", # lru-cache-with-maxsize-none | |
"UP034", # extraneous-parentheses | |
"UP037", # quoted-annotation | |
# "UP038", # non-pep604-isinstance # deprecated | |
"UP039", # unnecessary-class-parentheses | |
"UP040", # non-pep695-type-alias | |
"UP041", # timeout-error-alias | |
"UP043", # unnecessary-default-type-args | |
"UP044", # non-pep646-unpack | |
"UP047", # non-pep695-generic-function | |
"W191", # tab-indentation | |
"W291", # trailing-whitespace | |
"W292", # missing-newline-at-end-of-file | |
"W293", # blank-line-with-whitespace | |
"W391", # too-many-newlines-at-end-of-file | |
"W605", # invalid-escape-sequence | |
"DTZ001", # call-datetime-without-tzinfo | |
"DTZ002", # call-datetime-today | |
"DTZ003", # call-datetime-utcnow | |
"DTZ004", # call-datetime-utcfromtimestamp | |
"DTZ005", # call-datetime-now-without-tzinfo | |
"DTZ006", # call-datetime-fromtimestamp | |
"DTZ007", # call-datetime-strptime-without-zone | |
"DTZ011", # call-date-today | |
"DTZ012", # call-date-fromtimestamp | |
"DTZ901", # datetime-min-max | |
] | |
ignore = [ | |
"D100", | |
"D101", | |
"D102", | |
"D103", | |
"D104", | |
"D105", | |
"D106", | |
"D107", | |
"D200", | |
"D205", | |
"D212", | |
"D415", | |
] | |
unfixable = [ | |
"N805", | |
"SIM108", | |
] | |
[tool.ruff.lint.pydocstyle] | |
convention = "google" | |
[tool.ruff.lint.flake8-quotes] | |
docstring-quotes = "double" | |
inline-quotes = "single" | |
multiline-quotes = "double" | |
[tool.ruff.lint.pep8-naming] | |
classmethod-decorators = [ | |
"classmethod", | |
# Allow Pydantic's `@validator` decorator to trigger class method treatment. | |
"pydantic.validator", | |
"pydantic.root_validator", | |
# Allow SQLAlchemy's dynamic decorators, like `@field.expression`, to trigger class method treatment. | |
"declared_attr", | |
"expression", | |
"comparator", | |
] | |
[lint.flake8-pytest-style] | |
fixture-parentheses = false | |
mark-parentheses = false | |
[tool.ruff.lint.isort] | |
force-single-line = true | |
# TODO(serjflint) | |
# relative-imports-order = "furthest-to-closest" | |
relative-imports-order = "closest-to-furthest" | |
force-sort-within-sections = true | |
case-sensitive = false | |
order-by-type = false | |
# FIXME: https://github.com/astral-sh/ruff/issues/10927 | |
# detect-same-package = true | |
# FIXME: https://github.com/astral-sh/ruff/issues/10926 | |
# force-to-top = ["*.pytest_init"] | |
# TODO(serjflint) | |
# required-imports = ["from __future__ import annotations"] | |
section-order = [ | |
"future", | |
"standard-library", | |
"third-party", | |
"appnexus", | |
"first-party", | |
"local-folder", | |
] | |
no-lines-before = [ | |
"local-folder", | |
] | |
# FIXME: https://github.com/astral-sh/ruff/issues/10989 | |
known-third-party = [ | |
"pytest", | |
"yaml", | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment