# Copyright The Lightning AI team. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. [build-system] requires = [ "setuptools", "wheel", ] [tool.black] line-length = 120 exclude = '(_notebooks/.*)' [tool.docformatter] recursive = true # this need to be shorter as some docstings are r"""... wrap-summaries = 119 wrap-descriptions = 120 blank = true [tool.codespell] # Todo: enable also python files in a next step skip = '*.py' quiet-level = 3 # comma separated list of words; waiting for: # https://github.com/codespell-project/codespell/issues/2839#issuecomment-1731601603 # also adding links until they ignored by its: nature # https://github.com/codespell-project/codespell/issues/2243#issuecomment-1732019960 ignore-words-list = "te, compiletime" [tool.ruff] line-length = 120 target-version = "py38" # Exclude a variety of commonly ignored directories. exclude = [ ".git", "docs", "_notebooks" ] [tool.ruff.format] preview = true [tool.ruff.lint] select = [ "E", "W", # see: https://pypi.org/project/pycodestyle "F", # see: https://pypi.org/project/pyflakes "S", # see: https://pypi.org/project/flake8-bandit "RUF018", # see: https://docs.astral.sh/ruff/rules/assignment-in-assert "UP", # see: https://docs.astral.sh/ruff/rules/#pyupgrade-up ] extend-select = [ "I", # see: isort "C4", # see: https://pypi.org/project/flake8-comprehensions "SIM", # see: https://pypi.org/project/flake8-simplify "RET", # see: https://pypi.org/project/flake8-return "PT", # see: https://pypi.org/project/flake8-pytest-style "RUF100", # see: https://docs.astral.sh/ruff/rules/unused-noqa/ ] ignore = [ "E731", # Do not assign a lambda expression, use a def "S108", "E203", # conflicts with black ] ignore-init-module-imports = true [tool.ruff.lint.per-file-ignores] ".actions/*" = ["S101", "S310"] "setup.py" = ["S101"] "examples/**" = [ "S101", # Use of `assert` detected "S113", # todo: Probable use of requests call without "S104", # Possible binding to all interface "F821", # Undefined name `...` "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes "S501", # Probable use of `requests` call with `verify=False` disabling SSL certificate checks "S108", # Probable insecure usage of temporary file or directory: "/tmp/data/MNIST" ] "src/**" = [ "S101", # todo: Use of `assert` detected "S105", "S106", "S107", # todo: Possible hardcoded password: ... "S113", # todo: Probable use of requests call without timeout "S301", # todo: `pickle` and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue "S324", # todo: Probable use of insecure hash functions in `hashlib` "S403", # todo: `pickle`, `cPickle`, `dill`, and `shelve` modules are possibly insecure "S404", # todo: `subprocess` module is possibly insecure "S602", # todo: `subprocess` call with `shell=True` identified, security issue "S603", # todo: `subprocess` call: check for execution of untrusted input "S605", # todo: Starting a process with a shell: seems safe, but may be changed in the future; consider rewriting without `shell` "S607", # todo: Starting a process with a partial executable path "RET504", # todo:Unnecessary variable assignment before `return` statement "RET503", ] "tests/**" = [ "S101", # Use of `assert` detected "S105", "S106", # todo: Possible hardcoded password: ... "S301", # `pickle` and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue "S113", # todo: Probable use of requests call without timeout "S311", # todo: Standard pseudo-random generators are not suitable for cryptographic purposes "S108", # todo: Probable insecure usage of temporary file or directory: "/tmp/sys-customizations-sync" "S202", # Uses of `tarfile.extractall()` "S403", # `pickle`, `cPickle`, `dill`, and `shelve` modules are possibly insecure "S404", # `subprocess` module is possibly insecure "S602", # todo: `subprocess` call with `shell=True` identified, security issue "S603", # todo: `subprocess` call: check for execution of untrusted input "S605", # todo: Starting a process with a shell: seems safe, but may be changed in the future; consider rewriting without `shell` "S607", # todo: Starting a process with a partial executable path "RET504", # todo:Unnecessary variable assignment before `return` statement "PT004", # todo: Fixture `tmpdir_unittest_fixture` does not return anything, add leading underscore "PT011", # todo: `pytest.raises(ValueError)` is too broad, set the `match` parameter or use a more specific exception "PT012", # todo: `pytest.raises()` block should contain a single simple statement "PT019", # todo: Fixture `_` without value is injected as parameter, use `@pytest.mark.usefixtures` instead ] [tool.ruff.lint.mccabe] # Unlike Flake8, default to a complexity level of 10. max-complexity = 10 [tool.mypy] files = [ "src/lightning", ] # This section is for folders with "-" as they are not valid python modules exclude = [ "src/lightning/app/cli/app-template", "src/lightning/app/cli/component-template", "src/lightning/app/cli/pl-app-template", "src/lightning/app/cli/react-ui-template", "src/lightning/app/launcher/utils.py", ] install_types = "True" non_interactive = "True" disallow_untyped_defs = "True" ignore_missing_imports = "True" show_error_codes = "True" warn_redundant_casts = "True" warn_unused_configs = "True" warn_unused_ignores = "True" allow_redefinition = "True" # disable this rule as the Trainer attributes are defined in the connectors, not in its __init__ disable_error_code = "attr-defined" # style choices warn_no_return = "False" # Ignore mypy errors for these files # TODO: the goal is for this to be empty [[tool.mypy.overrides]] # the list can be generated with: # mypy --no-error-summary 2>&1 | tr ':' ' ' | awk '{print $1}' | sort | uniq | sed 's/\.py//g; s|src/||g; s|\/|\.|g' | xargs -I {} echo '"{}",' module = [ "lightning.app.api.http_methods", "lightning.app.api.request_types", "lightning.app.cli.cmd_install", "lightning.app.cli.commands.app_commands", "lightning.app.cli.commands.cd", "lightning.app.cli.commands.cp", "lightning.app.cli.commands.ls", "lightning.app.cli.connect.app", "lightning.app.components.database.client", "lightning.app.components.database.server", "lightning.app.components.database.utilities", "lightning.app.components.multi_node.base", "lightning.app.components.multi_node.fabric", "lightning.app.components.multi_node.pytorch_spawn", "lightning.app.components.multi_node.trainer", "lightning.app.components.python.popen", "lightning.app.components.python.tracer", "lightning.app.components.serve.auto_scaler", "lightning.app.components.serve.gradio_server", "lightning.app.components.serve.python_server", "lightning.app.components.serve.serve", "lightning.app.components.serve.streamlit", "lightning.app.components.serve.types.image", "lightning.app.components.serve.types.type", "lightning.app.components.training", "lightning.app.frontend.panel.app_state_comm", "lightning.app.frontend.panel.app_state_watcher", "lightning.app.frontend.panel.panel_frontend", "lightning.app.frontend.panel.panel_serve_render_fn", "lightning.app.frontend.streamlit_base", "lightning.app.frontend.stream_lit", "lightning.app.frontend.utils", "lightning.app.frontend.web", "lightning.app.launcher.launcher", "lightning.app.launcher.lightning_backend", "lightning.app.launcher.lightning_hybrid_backend", "lightning.app.pdb.pdb", "lightning.app.runners.backends.backend", "lightning.app.runners.backends.cloud", "lightning.app.runners.backends.docker", "lightning.app.runners.backends.mp_process", "lightning.app.runners.cloud", "lightning.app.runners.multiprocess", "lightning.app.runners.runtime", "lightning.app.source_code.copytree", "lightning.app.source_code.hashing", "lightning.app.source_code.local", "lightning.app.source_code.tar", "lightning.app.source_code.uploader", "lightning.app.storage.copier", "lightning.app.storage.drive", "lightning.app.storage.filesystem", "lightning.app.storage.orchestrator", "lightning.app.storage.path", "lightning.app.storage.payload", "lightning.app.structures.dict", "lightning.app.structures.list", "lightning.app.testing.helpers", "lightning.app.testing.testing", "lightning.app.utilities.app_helpers", "lightning.app.utilities.app_logs", "lightning.app.utilities.cli_helpers", "lightning.app.utilities.cloud", "lightning.app.utilities.commands.base", "lightning.app.utilities.component", "lightning.app.utilities.enum", "lightning.app.utilities.exceptions", "lightning.app.utilities.git", "lightning.app.utilities.imports", "lightning.app.utilities.introspection", "lightning.app.utilities.layout", "lightning.app.utilities.load_app", "lightning.app.utilities.log_helpers", "lightning.app.utilities.login", "lightning.app.utilities.name_generator", "lightning.app.utilities.network", "lightning.app.utilities.openapi", "lightning.app.utilities.packaging.cloud_compute", "lightning.app.utilities.packaging.lightning_utils", "lightning.app.utilities.proxies", "lightning.app.utilities.scheduler", "lightning.app.utilities.state", "lightning.app.utilities.tracer", "lightning.app.utilities.tree", "lightning.store.utils", ] ignore_errors = "True" [tool.coverage.report] exclude_lines = [ "pragma: no cover", "warnings", "pass", "rank_zero_warn", "raise NotImplementedError", ] [tool.pytest.ini_options] norecursedirs = [ ".git", ".github", "dist", "build", "docs", ] addopts = [ "--strict-markers", "--doctest-modules", "--color=yes", "--disable-pytest-warnings", "--ignore=legacy/checkpoints", ] markers = [ "cloud: Run the cloud tests for example", ] filterwarnings = [ "error::FutureWarning", ] xfail_strict = true junit_duration_report = "call"