iterative/dvc

View on GitHub
pyproject.toml

Summary

Maintainability
Test Coverage
[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 = [
    "attrs>=22.2.0",
    "celery",
    "colorama>=0.3.9",
    "configobj>=5.0.6",
    "distro>=1.3",
    "dpath<3,>=2.1.0",
    "dulwich",
    "dvc-data>=3.15,<3.16",
    "dvc-http>=2.29.0",
    "dvc-objects",
    "dvc-render>=1.0.1,<2",
    "dvc-studio-client>=0.20,<1",
    "dvc-task>=0.3.0,<1",
    "flatten_dict<1,>=0.4.1",
    "flufl.lock>=5,<8", # https://github.com/iterative/dvc/issues/9654
    "fsspec",
    "funcy>=1.14",
    "grandalf<1,>=0.7",
    "gto>=1.6.0,<2",
    "hydra-core>=1.1",
    "iterative-telemetry>=0.0.7",
    "kombu",
    "networkx>=2.5",
    "omegaconf",
    "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>=3,<4",
    "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.1.0,<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.9.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>=4,<5"]
ssh_gssapi = ["dvc-ssh[gssapi]>=4,<5"]
testing = [
  "pytest-benchmark[histogram]",
  "pytest-test-utils",
  "virtualenv",
]
tests = [
    "dvc[testing]",
    "beautifulsoup4>=4.4",
    "dvc-ssh",
    "filelock",
    "pytest>=7,<9",
    "pytest-rerunfailures",
    "pytest-cov>=4.1.0",
    "pytest-docker>=1,<4",
    "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."universal_pathlib.implementations"]
dvc = "dvc.fs.dvc_path:DVCPath"
# universal_pathlib does not support fsspec url chaining yet.
# see https://github.com/fsspec/universal_pathlib/issues/28.
"dvc+http" = "dvc.fs.dvc_path:DVCPath"
"dvc+https" = "dvc.fs.dvc_path:DVCPath"
"dvc+ssh" = "dvc.fs.dvc_path:DVCPath"

[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",
    "upath",
    "virtualenv",
    "viztracer",
    "voluptuous",
    "yappi",
    "zc.*",
]

[tool.codespell]
ignore-words-list = "ba,datas,fo,uptodate,cachable,falsy"

[tool.ruff]
output-format = "full"
show-fixes = true

[tool.ruff.lint]
ignore = [
    "N818", "S101", "ISC001", "PT004", "PT007", "RET502", "RET503", "SIM105", "SIM108", "SIM117",
    "TRY003", "TRY300", "PLR2004", "PLW2901", "LOG007",
]
select = [
    "F", "E", "W", "C90", "I", "N", "UP", "YTT", "ASYNC", "S", "BLE", "B", "A", "C4", "DTZ", "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", "LOG", "RUF", "RUF022", "RUF023", "RUF024", "RUF025", "RUF026", "RUF027"
]
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_*", "tests"]

[tool.ruff.lint.pep8-naming]
extend-ignore-names = ["M", "SCM"]

[tool.ruff.lint.pylint]
max-args = 10

[tool.ruff.lint.per-file-ignores]
"dvc/commands/**" = ["N806"]
"dvc/testing/**" = ["ARG002"]
"dvc/testing/benchmarks/**" = ["ARG001"]
"tests/**" = ["S", "ARG001", "ARG002", "TRY002", "TRY301"]