[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.9" classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] dynamic = ["version"] dependencies = [ "colorama>=0.3.9", "configobj>=5.0.6", "distro>=1.3", "dpath<3,>=2.1.0", "dvc-data>=3.9,<3.10", "dvc-http>=2.29.0", "dvc-render>=1.0.1,<2", "dvc-studio-client>=0.17.1,<1", "dvc-task>=0.3.0,<1", "flatten_dict<1,>=0.4.1", # https://github.com/iterative/dvc/issues/9654 "flufl.lock>=5,<8", "funcy>=1.14", "grandalf<1,>=0.7", "gto>=1.6.0,<2", "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>=2.0.2,<3", "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>=3,<4"] dev = ["dvc[azure,gdrive,gs,hdfs,lint,oss,s3,ssh,tests,webdav,webhdfs]"] gdrive = ["dvc-gdrive>=3,<4"] gs = ["dvc-gs>=3,<4"] hdfs = ["dvc-hdfs>=3,<4"] lint = [ "mypy==1.8.0", "pandas-stubs", "types-colorama", "types-psutil", "types-pyinstaller", "types-requests", "types-tabulate", "types-toml", "types-tqdm", "typing-extensions", ] oss = ["dvc-oss>=3,<4"] s3 = ["dvc-s3>=3,<4"] ssh = ["dvc-ssh>=3,<4"] ssh_gssapi = ["dvc-ssh[gssapi]>=3,<4"] testing = [ "pytest-benchmark[histogram]", "pytest-test-utils", "virtualenv", ] tests = [ "dvc[testing]", "beautifulsoup4>=4.4", "dvc-ssh", "filelock", "flaky", "pytest>=7,<9", "pytest-cov>=4.1.0", "pytest-docker>=1,<4", "pytest-lazy-fixture", "pytest-mock", "pytest-test-utils", "pytest-timeout>=2", "pytest-xdist>=3.2", 'pywin32>=225; sys_platform == "win32"', # optional test dependency 'tzdata; sys_platform == "win32"', # for testing with celery "sqlalchemy>=1,<3", # optional dependency for `import-db` "pandas>=1", # optional dependency for `import-db` ] webdav = ["dvc-webdav>=3,<4"] webhdfs = ["dvc-webhdfs>=3.1,<4"] webhdfs_kerberos = ["dvc-webhdfs[kerberos]>=3.1,<4"] [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."pyinstaller40"] hook-dirs = "dvc.__pyinstaller:get_hook_dirs" tests = "dvc.__pyinstaller:get_PyInstaller_tests" [tool.setuptools] license-files = ["LICENSE"] [tool.setuptools.packages.find] exclude = ["tests", "tests.*"] namespaces = false [tool.setuptools_scm] write_to = "dvc/_dvc_version.py" [tool.pytest.ini_options] addopts = "-ra --cov-config pyproject.toml --dist worksteal --benchmark-skip" filterwarnings = [ "error::ResourceWarning", "error::pytest.PytestUnraisableExceptionWarning", "error::pytest_mock.PytestMockWarning", # https://github.com/boto/botocore/issues/2744 "ignore:'urllib3.contrib.pyopenssl' module is deprecated:DeprecationWarning", # 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/networkx/networkx/issues/5723. "ignore:nx.nx_pydot.* depends on the pydot package, which has.*known issues and is not actively maintained: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 extra_checks = true warn_no_return = true warn_redundant_casts = true warn_unreachable = true warn_unused_configs = true [[tool.mypy.overrides]] ignore_missing_imports = true module = [ "agate.*", "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", "ruamel.*", "ruamel.yaml.*", "shortuuid", "shtab", "virtualenv", "viztracer", "voluptuous", "yappi", "zc.*", ] [tool.codespell] ignore-words-list = "ba,datas,fo,uptodate,cachable,falsy" [tool.ruff] show-source = true show-fixes = true [tool.ruff.lint] ignore = [ "N818", "S101", "ISC001", "PT004", "PT007", "RET502", "RET503", "SIM105", "SIM108", "SIM117", "TRY003", "TRY200", "TRY300", "PLR2004", "PLW2901", ] select = [ "F", "E", "W", "C90", "I", "N", "UP", "YTT", "ASYNC", "S", "BLE", "B", "A", "C4", "T10", "EXE", "ISC", "ICN", "G", "INP", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SLOT", "SIM", "TID", "TCH", "ARG", "PGH", "PLC", "PLE", "PLR", "PLW", "TRY", "FLY", "PERF101", "RUF", "RUF018", "RUF019", "RUF022", "RUF023", "RUF025", ] preview = true explicit-preview-rules = true [tool.ruff.lint.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.lint.flake8-tidy-imports] [tool.ruff.lint.flake8-tidy-imports.banned-api] "funcy.cached_property" = {msg = "use `from dvc.utils.objects import cached_property` instead."} [tool.ruff.lint.flake8-type-checking] strict = true [tool.ruff.lint.flake8-unused-arguments] ignore-variadic-names = true [tool.ruff.lint.isort] known-first-party = ["dvc", "dvc_data", "dvc_objects", "dvc_render", "dvc_task", "tests"] [tool.ruff.lint.pep8-naming] extend-ignore-names = ["M", "SCM"] [tool.ruff.lint.pylint] max-args = 10 [tool.ruff.per-file-ignores] "dvc/commands/**" = ["N806"] "dvc/testing/**" = ["ARG002"] "dvc/testing/benchmarks/**" = ["ARG001"] "tests/**" = ["S", "ARG001", "ARG002", "TRY002", "TRY301"]