[build-system] requires = ["setuptools>=61", "setuptools_scm[toml]>=7"] build-backend = "setuptools.build_meta" [project] name = "dvc" description = "Git for data scientists - manage your code and data together" readme = "README.rst" keywords = [ "data-science", "data-version-control", "machine-learning", "git", "developer-tools", "reproducibility", "collaboration", "ai", ] license = { text = "Apache License 2.0" } authors = [{ name = "Dmitry Petrov", email = "dmitry@dvc.org" }] maintainers = [{ name = "Iterative", email = "support@dvc.org" }] requires-python = ">=3.8" dependencies = [ "colorama>=0.3.9", "configobj>=5.0.6", "voluptuous>=0.11.7", "requests>=2.22.0", "grandalf>=0.7,<1", "distro>=1.3.0", "appdirs>=1.4.3", "ruamel.yaml>=0.17.11", "tomlkit>=0.11.1", "funcy>=1.14", "pathspec>=0.10.3", "shortuuid>=0.5.0", "tqdm>=4.63.1,<5", "packaging>=19.0", "zc.lockfile>=1.2.1", "flufl.lock>=5", "networkx>=2.5", "psutil>=5.8.0", "pydot>=1.2.4", "importlib-resources>=5.2.2; python_version < '3.9'", "flatten_dict>=0.4.1,<1", "tabulate>=0.8.7", "pygtrie>=2.3.2", "dpath>=2.0.2,<3", "shtab>=1.3.4,<2", "rich>=12.0.0", "pyparsing>=2.4.7", "typing-extensions>=3.7.4", "scmrepo==0.1.11", "dvc-render>=0.1.2", "dvc-task==0.1.11", "dvclive>=1.2.2", "dvc-data==0.40.4", "dvc-http", "hydra-core>=1.1.0", "iterative-telemetry==0.0.7", "dvc-studio-client>=0.1.1" ] dynamic = ["version"] 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", ] [project.optional-dependencies] azure = ["dvc-azure==2.21.1"] gdrive = ["dvc-gdrive==2.19.1"] gs = ["dvc-gs==2.21.1"] hdfs = ["dvc-hdfs==2.19.0"] oss = ["dvc-oss==2.19.0"] s3 = ["dvc-s3==2.21.0"] ssh = ["dvc-ssh==2.21.0"] ssh_gssapi = ["dvc-ssh[gssapi]==2.21.0"] webdav = ["dvc-webdav==2.19.1"] webhdfs = ["dvc-webhdfs==2.19.0"] webhdfs_kerberos = ["dvc-webhdfs[kerberos]==2.19.0"] terraform = ["tpi[ssh]>=2.1.0"] testing = ["pytest-test-utils"] tests = [ "beautifulsoup4>=4.4", "dvc-ssh", "filelock", "flaky", "pytest>=7,<8", "pytest-cov", "pytest-docker==0.13.0", "pytest-lazy-fixture", "pytest-mock", "pytest-test-utils", "pytest-xdist>=3.1", "pytest-timeout>=2", "pywin32>=225; sys_platform == 'win32'", # optional test dependency ] lint = [ "mypy==1.0.1", "pylint==2.16.2", "types-appdirs", "types-colorama", "types-psutil", "types-requests", "types-tabulate", "types-toml", "types-tqdm", ] all = ["dvc[azure,gdrive,gs,hdfs,oss,s3,ssh,webdav,webhdfs]"] dev = ["dvc[azure,gdrive,gs,hdfs,oss,s3,ssh,webdav,webhdfs,tests,lint,terraform]"] [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" [tool.setuptools] license-files = ["LICENSE"] [tool.setuptools.packages] find = {namespaces = false, exclude=["tests", "tests.*"]} [tool.setuptools_scm] write_to = "dvc/_dvc_version.py" [tool.black] include = '\.pyi?$' exclude = ''' /( \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist )/ ''' [tool.isort] profile = "black" known_first_party = ["dvc", "dvc_data", "dvc_objects", "dvc_render", "dvc_task", "tests"] [tool.ruff] target-version = "py38" show-source = true ignore = ["N818", "S101", "PT004", "PT007", "PT019", "SIM105", "SIM108", "SIM110", "SIM111", "SIM117", "TRY003", "TRY200", "TRY300", "TRY301", "PLR2004", "RUF005"] select = ["F", "E", "W", "C90", "N", "UP", "YTT", "S", "BLE", "B", "A", "C4", "T10", "ISC", "ICN", "G", "INP", "PIE", "T20", "PT", "Q", "RET501", "RET504", "SIM", "TID", "TCH", "ARG", "PGH", "PLC", "PLE", "PLR", "PLW", "TRY", "RUF"] # external flake8 codes that should be preserved external = ["B301", "C901", "E302", "W601"] [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/testing/**" = ["ARG002"] "scripts/**" = ["T201", "INP001", "TRY002"] "dvc/commands/**" = ["N806"] [tool.ruff.pylint] max-args = 10 [tool.pytest.ini_options] log_level = "debug" addopts = "-ra --cov-config pyproject.toml" markers = [ "needs_internet: Might need network access for the tests", "vscode: Tests verifying contract between DVC and VSCode plugin", "studio: Tests verifying contract between DVC and Studio", ] xfail_strict = true testpaths = ["tests"] filterwarnings = ["error::pytest_mock.PytestMockWarning"] [tool.coverage.run] branch = true source = ["dvc", "tests"] [tool.coverage.paths] source = ["dvc"] [tool.coverage.report] show_missing = true exclude_lines = [ "if __name__ == .__main__.:", "if typing.TYPE_CHECKING:", "if TYPE_CHECKING:", "@overload", "pragma: no cover", "raise NotImplementedError", "raise AssertionError", ] [tool.mypy] # Error output show_column_numbers = true show_error_codes = true show_error_context = true show_traceback = true pretty = true no_implicit_optional = true check_untyped_defs = true strict_equality = true strict_concatenate = true # Warnings warn_no_return = true warn_redundant_casts = true warn_unused_configs = true warn_unreachable = true ignore_missing_imports = true files = ["dvc"] [[tool.mypy.overrides]] module = [ "celery.*", "configobj.*", "dpath.*", "flatten_dict", "fsspec.*", "funcy.*", # https://github.com/Suor/funcy/issues/106, "grandalf.*", "ipdb", "kombu.*", "networkx.*", # https://github.com/networkx/networkx/issues/3988 "pygtrie.*", "pyinstrument", "pytest_docker.plugin", "ruamel.*", "ruamel.yaml.*", "tpi.*", "viztracer", "voluptuous", "yappi", "zc.*", ] ignore_missing_imports = true [tool.pylint.message_control] disable = [ "format", "refactoring", "spelling", "design", "invalid-name", "fixme", "duplicate-code", "unused-wildcard-import", "cyclic-import", "wrong-import-order", "wrong-import-position", "ungrouped-imports", "multiple-imports", "missing-function-docstring", "missing-module-docstring", "missing-class-docstring", "raise-missing-from", "import-outside-toplevel", ] enable = ["c-extension-no-member", "no-else-return"] [tool.pylint.typecheck] generated-members = ["pytest.lazy_fixture", "logging.TRACE", "logger.trace", "sys.getwindowsversion", "argparse.Namespace"] 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.codespell] ignore-words-list = "ba,datas,fo,uptodate,cachable,falsy"