# We ignore the following PEP8 warnings # * E123: closing bracket does not match indentation of opening bracket's line # - Broken if multiple indentation levels start on a single line # * E203: whitespace before ':' # - E203 is not PEP 8 compliant and conflict with black # * E402: module level import not at top of file # - The tests use a little hack in order to cleanly import the # fdroidserver package locally like a regular package. pep8 doesn't # see that, so this makes pep8 skip E402 on the test files that need # that hack. # * E501: line too long (82 > 79 characters) # - Recommended for readability but not enforced # - Some lines are awkward to wrap around a char limit # * W503: line break before binary operator # - Quite pedantic [tool.autopep8] ignore = "E123,E203,E402,E501,W503" [tool.black] skip-string-normalization = true target-version = ["py38"] include = '(^fdroid|\.pyi?|\.TestCase)$' # These files will never be included in black runs. To run black on # one of thes files, remove it from this list. force-exclude = '''( \.direnv|\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.svn|\.tox|\.venv|venv|_build|buck-out|build|dist|__pypackages__ | docs/source/conf\.py | examples/fdroid_export_keystore_to_nitrokey\.py | examples/fdroid_exportkeystore\.py | examples/fdroid_fetchsrclibs\.py | examples/fdroid_nitrokeyimport\.py | fdroidserver/__init__\.py | fdroidserver/__main__\.py | fdroidserver/apksigcopier\.py | fdroidserver/looseversion\.py | fdroidserver/build\.py | fdroidserver/checkupdates\.py | fdroidserver/common\.py | fdroidserver/import_subcommand\.py | fdroidserver/index\.py | fdroidserver/metadata\.py | fdroidserver/nightly\.py | fdroidserver/publish\.py | fdroidserver/scanner\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py | locale/pick-complete-translations\.py | tests/config\.py | tests/extra/manual-vmtools-test\.py | tests/gradle-release-checksums\.py | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py | tests/checkupdates\.TestCase | tests/common\.TestCase | tests/publish\.TestCase | tests/signatures\.TestCase | tests/update\.TestCase )$''' [tool.mypy] python_version = "3.9" files = "fdroidserver" # exclude vendored files exclude = "fdroidserver/(apksigcopier|looseversion).py" # this is de-facto the linter setting for this file warn_unused_configs = true # TODO: we should either upgrade the used packages to a version which includes type hints OR install/write stub packages for these libraries. # Further details here: https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-type-hints-for-third-party-library ignore_missing_imports = true # ignore the [no-redef] errors, as they collide with the bandit "# nosec" exclusion (common.py) # unfortunately both tools expect their ignore flag as a comment in the same line # [misc] is ignored for the "incompatible import" # [arg-type] is ignored because when there are missing envs, everything will crash, not just the types disable_error_code = "no-redef, misc, arg-type" [tool.pylint.main] # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # number of processors available to use, and will cap the count on Windows to # avoid hangs. jobs = 4 # Minimum Python version to use for version dependent checks. Will default to the # version used to run pylint. py-version = "3.9" # Files or directories to be skipped. They should be base names, not paths. ignore = ["apksigcopier.py", "looseversion.py"] [tool.pylint.basic] # Good variable names which should always be accepted, separated by a comma. good-names = ["i", "j", "k", "ex", "Run", "f", "fp"] [tool.pylint."messages control"] # Only show warnings with the listed confidence levels. Leave empty to show all. # Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED. confidence = ["HIGH", "INFERENCE"] # Disable the message, report, category or checker with the given id(s). You can # either give multiple identifiers separated by comma (,) or put this option # multiple times (only on the command line, not in the configuration file where # it should appear only once). You can also use "--disable=all" to disable # everything first and then re-enable specific checks. For example, if you want # to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". # TODO many of these could be fixed if someone wants to spend the time disable = [ "broad-exception-caught", "broad-exception-raised", "invalid-name", "missing-class-docstring", "missing-function-docstring", "missing-module-docstring", "no-else-continue", "no-else-raise", "no-else-return", "subprocess-run-check", "use-dict-literal", ] [tool.pylint.miscellaneous] # List of note tags to take in consideration, separated by a comma. notes = ["FIXME", "XXX", "TODO"] [tool.pylint.refactoring] # Maximum number of nested blocks for function / method body max-nested-blocks = 5 [tool.pylint.format] # Maximum number of characters on a single line. max-line-length = 88