[build-system] build-backend = "setuptools.build_meta" requires = ["setuptools>=61", "setuptools_scm[toml]>=7"] [project] name = "dvc" description = "Git for data scientists - manage your code and data together" readme = "README.rst" keywords = [ "ai", "collaboration", "data-science", "data-version-control", "developer-tools", "git", "machine-learning", "reproducibility", ] license = { text = "Apache License 2.0" } maintainers = [{ name = "Iterative", email = "support@dvc.org" }] authors = [{ name = "Dmitry Petrov", email = "dmitry@dvc.org" }] requires-python = ">=3.8" classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", ] dynamic = ["version"] dependencies = [ "colorama>=0.3.9", "configobj>=5.0.6", "distro>=1.3", "dpath<3,>=2.1.0", "dvc-data>=0.53.0,<0.54", "dvc-http>=2.29.0", "dvc-render>=0.3.1,<1", "dvc-studio-client>=0.9.2,<1", "dvc-task>=0.2.1,<1", "flatten_dict<1,>=0.4.1", "flufl.lock>=5", "funcy>=1.14", "grandalf<1,>=0.7", "hydra-core>=1.1", "iterative-telemetry>=0.0.7", "networkx>=2.5", "packaging>=19", "pathspec>=0.10.3", "platformdirs<4,>=3.1.1", "psutil>=5.8", "pydot>=1.2.4", "pygtrie>=2.3.2", "pyparsing>=2.4.7", "requests>=2.22", "rich>=12", "ruamel.yaml>=0.17.11", "scmrepo>=1.0.0,<2", "shortuuid>=0.5", "shtab<2,>=1.3.4", "tabulate>=0.8.7", "tomlkit>=0.11.1", "tqdm<5,>=4.63.1", "voluptuous>=0.11.7", "zc.lockfile>=1.2.1", ] [project.optional-dependencies] all = ["dvc[azure,gdrive,gs,hdfs,oss,s3,ssh,webdav,webhdfs]"] azure = ["dvc-azure>=2.21.2"] dev = ["dvc[azure,gdrive,gs,hdfs,lint,oss,s3,ssh,terraform,tests,webdav,webhdfs]"] gdrive = ["dvc-gdrive==2.19.2"] gs = ["dvc-gs==2.22.1"] hdfs = ["dvc-hdfs==2.19"] lint = [ "mypy==1.3.0", "pylint==2.17.4", "types-colorama", "types-psutil", "types-requests", "types-tabulate", "types-toml", "types-tqdm", ] oss = ["dvc-oss==2.19"] s3 = ["dvc-s3==2.22.0"] ssh = ["dvc-ssh>=2.22.1,<3"] ssh_gssapi = ["dvc-ssh[gssapi]>=2.22.1,<3"] terraform = ["tpi[ssh]>=2.1"] testing = [ "pytest-test-utils", "pytest-benchmark[histogram]", "pytest-virtualenv", ] tests = [ "dvc[testing]", "beautifulsoup4>=4.4", "dvc-ssh", "filelock", "flaky", "pytest<8,>=7", "pytest-cov", "pytest-docker>=1,<2", "pytest-lazy-fixture", "pytest-mock", "pytest-test-utils", "pytest-timeout>=2", "pytest-xdist>=3.2", 'pywin32>=225; sys_platform == "win32"', # optional test dependency ] webdav = ["dvc-webdav==2.19.1"] webhdfs = ["dvc-webhdfs==2.19"] webhdfs_kerberos = ["dvc-webhdfs[kerberos]==2.19"] [project.urls] Documentation = "https://dvc.org/doc" Issues = "https://github.com/iterative/dvc/issues" Source = "https://github.com/iterative/dvc" [project.scripts] dvc = "dvc.cli:main" [project.entry-points."fsspec.specs"] dvc = "dvc.api:DVCFileSystem" [project.entry-points."pytest11"] dvc-testing = "dvc.testing.plugin" [tool.setuptools] license-files = ["LICENSE"] [tool.setuptools.packages.find] exclude = ["tests", "tests.*"] namespaces = false [tool.setuptools_scm] write_to = "dvc/_dvc_version.py" [tool.isort] known_first_party = ["dvc", "dvc_data", "dvc_objects", "dvc_render", "dvc_task", "tests"] profile = "black" [tool.pytest.ini_options] addopts = "-ra --cov-config pyproject.toml --dist worksteal" filterwarnings = [ "error::ResourceWarning", "error::pytest.PytestUnraisableExceptionWarning", "error::pytest_mock.PytestMockWarning", # remove when aiobotocore supports botocore>=1.29.13 "ignore:'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning", # also relates to botocore, but looks like it's not going to be fixed # https://github.com/boto/botocore/issues/2744 "ignore:'urllib3.contrib.pyopenssl' module is deprecated:DeprecationWarning", # ruamel.yaml: https://sourceforge.net/p/ruamel-yaml/tickets/452/ # google.cloud: https://github.com/googleapis/python-storage/issues/1000 # google.logging: https://github.com/googleapis/python-logging/issues/730 # Also happens with `zc.lockfile`. "ignore:Deprecated call to `pkg_resources.declare_namespace:DeprecationWarning", # see https://github.com/celery/kombu/issues/1339 # and https://github.com/celery/celery/issues/7528 # drop when celery==5.3 && kombu==5.3 releases "ignore:SelectableGroups dict interface is deprecated:DeprecationWarning", # tpi imports pkg_resources "ignore:pkg_resources is deprecated as an API:DeprecationWarning", # see https://github.com/networkx/networkx/issues/5723. "ignore:nx.nx_pydot.* depends on the pydot package, which has.*known issues and is not actively maintained:DeprecationWarning", # remove when new version of pytest-cov gets released # https://github.com/pytest-dev/pytest-cov/issues/557 "ignore:The --rsyncdir command line argument and rsyncdirs config variable are deprecated:DeprecationWarning", ] log_level = "debug" markers = [ "needs_internet: Might need network access for the tests", "studio: Tests verifying contract between DVC and Studio", "vscode: Tests verifying contract between DVC and VSCode plugin", ] testpaths = ["tests"] xfail_strict = true [tool.coverage.run] branch = true source = ["dvc", "tests"] [tool.coverage.paths] source = ["dvc"] [tool.coverage.report] exclude_lines = [ "if __name__ == .__main__.:", "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", "@overload", "pragma: no cover", "raise AssertionError", "raise NotImplementedError", ] show_missing = true [tool.mypy] check_untyped_defs = true files = ["dvc"] no_implicit_optional = true pretty = true show_column_numbers = true show_error_codes = true show_error_context = true show_traceback = true strict_equality = true strict_concatenate = true warn_no_return = true warn_redundant_casts = true warn_unreachable = true warn_unused_configs = true [[tool.mypy.overrides]] ignore_missing_imports = true module = [ "celery.*", "configobj.*", "dpath.*", "distro", "dvc_http", "dvc_render.*", "dvc_ssh", "dvc_studio_client.*", "flatten_dict", "fsspec.*", "funcy.*", # https://github.com/Suor/funcy/issues/106, "grandalf.*", "ipdb", "iterative_telemetry", "kombu.*", "networkx.*", # https://github.com/networkx/networkx/issues/3988 "pygtrie.*", "pyinstrument", "pyparsing", "pytest_benchmark.*", "pytest_docker.plugin", "pytest_virtualenv.*", "ruamel.*", "ruamel.yaml.*", "shortuuid", "shtab", "tpi.*", "viztracer", "voluptuous", "yappi", "zc.*", ] [tool.codespell] ignore-words-list = "ba,datas,fo,uptodate,cachable,falsy" [tool.pylint.message_control] disable = [ "cyclic-import", "design", "duplicate-code", "fixme", "format", "import-outside-toplevel", "invalid-name", "missing-class-docstring", "missing-function-docstring", "missing-module-docstring", "multiple-imports", "raise-missing-from", "refactoring", "spelling", "ungrouped-imports", "unused-wildcard-import", "wrong-import-order", "wrong-import-position", ] enable = ["c-extension-no-member", "no-else-return"] [tool.pylint.typecheck] generated-members = ["argparse.Namespace", "logger.trace", "logging.TRACE", "pytest.lazy_fixture", "sys.getwindowsversion"] signature-mutators = ["funcy.decorators.decorator"] [tool.pylint.variables] dummy-variables-rgx = "_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)" ignored-argument-names = "_.*|args|kwargs" [tool.ruff] # external flake8 codes that should be preserved external = ["B301", "C901", "E302", "W601"] ignore = ["N818", "S101", "PT004", "PT007", "PT019", "SIM105", "SIM108", "SIM110", "SIM117", "TRY003", "TRY200", "TRY300", "TRY301", "PLR2004", "PLW2901", "RUF005"] select = ["F", "E", "W", "C90", "N", "UP", "YTT", "S", "BLE", "B", "A", "C4", "T10", "EXE", "ISC", "ICN", "G", "INP", "PIE", "T20", "PT", "Q", "RET501", "RET504", "SIM", "TID", "TCH", "ARG", "PGH", "PLC", "PLE", "PLR", "PLW", "TRY", "RUF"] show-source = true [tool.ruff.flake8-pytest-style] fixture-parentheses = false mark-parentheses = false parametrize-names-type = "csv" raises-extend-require-match-for = ["dvc.exceptions.DvcException", "dvc.scm.SCMError", "scmrepo.exceptions.SCMError"] [tool.ruff.flake8-tidy-imports] [tool.ruff.flake8-tidy-imports.banned-api] "funcy.cached_property" = {msg = "use `from dvc.utils.objects import cached_property` instead."} [tool.ruff.flake8-type-checking] strict = true [tool.ruff.flake8-unused-arguments] ignore-variadic-names = true [tool.ruff.isort] known-first-party = ["dvc", "dvc_data", "dvc_objects", "dvc_render", "dvc_task", "tests"] [tool.ruff.pep8-naming] ignore-names = ["M", "SCM"] [tool.ruff.per-file-ignores] "dvc/commands/**" = ["N806"] "dvc/testing/**" = ["ARG002"] "dvc/testing/benchmarks/**" = ["ARG001"] "scripts/**" = ["T201", "INP001", "TRY002"] [tool.ruff.pylint] max-args = 10 [tool.bandit] exclude_dirs = ["tests", "scripts", "dvc/repo/experiments/utils.py"] skips = ["B101"]