# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> # # SPDX-License-Identifier: GPL-3.0-or-later [build-system] requires = ["hatchling", "versioningit"] build-backend = "hatchling.build" [project] name = "mednet" dynamic = ["version"] requires-python = ">=3.10" description = "Benchmarks for Computer-Aided Disease Detection from Medical Data." readme = "README.md" license = "GPL-3.0-or-later" authors = [{ name = "Geoffrey Raposo", email = "geoffrey@raposo.ch" }] maintainers = [ { name = "Andre Anjos", email = "andre.anjos@idiap.ch" }, { name = "Daniel Carron", email = "daniel.carron@idiap.ch" }, ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules", ] dependencies = [ "clapper", "click", "credible", "grad-cam~=1.5.2", "lightning~=2.2.5", "h5py", "matplotlib", "mlflow-skinny", "numpy", "pandas", "pillow", "psutil", "python-gitlab", "scikit-image", "scikit-learn", "scipy", "tabulate", "tensorboard", "torchvision~=0.17.2", "torch~=2.2.2", "tqdm", "versioningit", ] [project.urls] documentation = "https://mednet.readthedocs.io/en/latest/" homepage = "https://pypi.org/project/mednet" repository = "https://gitlab.idiap.ch/biosignal/software/mednet" changelog = "https://gitlab.idiap.ch/biosignal/software/mednet/-/releases" [project.optional-dependencies] qa = ["pre-commit"] doc = [ "auto-intersphinx", "furo", "sphinx", "sphinx-autodoc-typehints", "sphinx-click", "sphinx-copybutton", "sphinx-inline-tabs", ] test = ["pytest", "pytest-cov"] [project.scripts] mednet = "mednet.scripts.cli:cli" [tool.pixi.project] channels = ["conda-forge", "pytorch"] platforms = ["linux-64", "osx-arm64"] conda-pypi-map = { "https://conda.anaconda.org/pytorch" = ".pixi-pytorch-mapping.json" } [tool.pixi.system-requirements] linux = "4.19.0" [tool.pixi.dependencies] clapper = "*" click = "*" credible = "*" grad-cam = "~=1.5.2" lightning = "~=2.2.5" h5py = "*" matplotlib-base = "*" mlflow-skinny = "*" numpy = "*" pandas = "*" pillow = "*" psutil = "*" python-gitlab = "*" pytorch = { version = "~=2.2.2", channel = "pytorch" } scikit-image = "*" scikit-learn = "*" scipy = "*" tabulate = "*" tensorboard = "*" torchvision = { version = "~=0.17.2", channel = "pytorch" } tqdm = "*" versioningit = "*" torchio = ">=0.19.7,<0.20" [tool.pixi.feature.self.pypi-dependencies] mednet = { path = ".", editable = true } [tool.pixi.feature.self.tasks] info = "mednet info" [tool.pixi.feature.py311.dependencies] python = "~=3.11.0" [tool.pixi.feature.py312.dependencies] python = "~=3.12.0" [tool.pixi.feature.qa.dependencies] pre-commit = "*" ruff = "*" reuse = "*" [tool.pixi.feature.qa.tasks] qa-install = "pre-commit install" qa = "pre-commit run --all-files" qa-ci = "pre-commit run --all-files --show-diff-on-failure --verbose" [tool.pixi.feature.doc.dependencies] auto-intersphinx = "*" furo = "*" sphinx = "*" sphinx-autodoc-typehints = "*" sphinx-click = "*" sphinx-copybutton = "*" sphinx-inline-tabs = "*" [tool.pixi.feature.doc.tasks] doc-clean = "rm -rf doc/api && rm -rf html" doc = "sphinx-build -aEW doc html" doctest = "sphinx-build -aEb doctest doc html/doctest" [tool.pixi.feature.test.dependencies] pytest = "*" pytest-cov = "*" [tool.pixi.feature.test.tasks] test = "pytest -sv tests/" test-slow = { cmd = "pytest -sv tests/", env = { PYTEST_ADDOPTS = "-m slow" } } test-fast = { cmd = "pytest -sv tests/", env = { PYTEST_ADDOPTS = "-m '(not slow)'" } } test-cov = "pytest -sv --cov-report 'html:html/coverage' tests/" test-ci = "cp tests/data/mednet.toml $XDG_CONFIG_HOME && pytest -sv --cov-report 'html:html/coverage' --cov-report 'xml:coverage.xml' --junitxml 'junit-coverage.xml' --ignore '.profile' tests/" [tool.pixi.feature.build.dependencies] hatch = "*" versioningit = "*" twine = "*" [tool.pixi.feature.build.tasks] build = "hatch build" check = "twine check dist/*" upload = "twine upload dist/*" [tool.pixi.feature.dev.dependencies] pdbpp = "*" uv = "*" [tool.pixi.feature.dev.tasks] uv-update-lock = "uv pip compile -q pyproject.toml --python-platform=linux -o uv.lock" [tool.pixi.feature.cuda] channels = [ { channel = "nvidia", priority = 1 }, { channel = "pytorch", priority = -1 }, ] platforms = ["linux-64", "osx-arm64"] [tool.pixi.feature.cuda.system-requirements] cuda = "12.1" [tool.pixi.feature.cuda.target.linux-64.dependencies] pytorch-cuda = { version = "12.1.*", channel = "pytorch" } pip = "*" # required for docker image building [tool.pixi.environments] default = { features = ["qa", "build", "doc", "test", "dev", "py312", "self"] } qa-ci = { features = ["qa", "py312"] } build-ci = { features = ["build", "py312"] } test-ci-alternative = { features = ["test", "py311", "self"] } cuda-base = { features = ["py312", "cuda"], solve-group = "cuda" } cuda-prod = { features = ["py312", "cuda", "self"], solve-group = "cuda" } cuda = { features = [ "qa", "build", "doc", "test", "dev", "py312", "cuda", "self", ], solve-group = "cuda" } [tool.hatch.version] source = "versioningit" # versioningit configuration via tool.hatch.version table default-version = "0.0.0+unknown" next-version.method = "smallest" # Example formatted version: 1.2.4.dev42+ge174a1f format.distance = "{next_version}.dev{distance}+{vcs}{rev}" # Example formatted version: 1.2.4.dev42+ge174a1f.d20230922 format.distance-dirty = "{next_version}.dev{distance}+{vcs}{rev}.d{build_date:%Y%m%d}" [tool.hatch.build.targets.sdist] include = [ "src/**/*.py", "src/**/*.json", "src/**/*.json.bz2", "tests/**/*.py", "tests/**/*.png", "tests/**/*.json", "doc/**/*.rst", "doc/**/*.png", "doc/**/*.jpg", "doc/**/*.dot", "doc/*.txt", "doc/*.inv", "doc/conf.py", "doc/_static/*.css", "doc/_templates/*.html", "LICENSES/*.txt", ] [tool.hatch.build.targets.wheel] packages = ["src/mednet"] [project.entry-points."mednet.libs.classification.config"] # models pasa = "mednet.libs.classification.config.models.pasa" mlp = "mednet.libs.classification.config.models.mlp" logistic-regression = "mednet.libs.classification.config.models.logistic_regression" alexnet = "mednet.libs.classification.config.models.alexnet" alexnet-pretrained = "mednet.libs.classification.config.models.alexnet_pretrained" densenet = "mednet.libs.classification.config.models.densenet" densenet-pretrained = "mednet.libs.classification.config.models.densenet_pretrained" # 3D models cnn3d = "mednet.config.models.cnn3d" # lists of data augmentations affine = "mednet.config.augmentations.affine" elastic = "mednet.config.augmentations.elastic" hflip = "mednet.config.augmentations.hflip" jitter = "mednet.config.augmentations.jitter" hflip-affine = "mednet.config.augmentations.hflip_affine" hflip-jitter-affine = "mednet.config.augmentations.hflip_jitter_affine" # montgomery dataset (and cross-validation folds) montgomery = "mednet.libs.classification.config.data.montgomery.default" montgomery-f0 = "mednet.libs.classification.config.data.montgomery.fold_0" montgomery-f1 = "mednet.libs.classification.config.data.montgomery.fold_1" montgomery-f2 = "mednet.libs.classification.config.data.montgomery.fold_2" montgomery-f3 = "mednet.libs.classification.config.data.montgomery.fold_3" montgomery-f4 = "mednet.libs.classification.config.data.montgomery.fold_4" montgomery-f5 = "mednet.libs.classification.config.data.montgomery.fold_5" montgomery-f6 = "mednet.libs.classification.config.data.montgomery.fold_6" montgomery-f7 = "mednet.libs.classification.config.data.montgomery.fold_7" montgomery-f8 = "mednet.libs.classification.config.data.montgomery.fold_8" montgomery-f9 = "mednet.libs.classification.config.data.montgomery.fold_9" # shenzhen dataset (and cross-validation folds) shenzhen = "mednet.libs.classification.config.data.shenzhen.default" shenzhen-alltest = "mednet.libs.classification.config.data.shenzhen.alltest" shenzhen-f0 = "mednet.libs.classification.config.data.shenzhen.fold_0" shenzhen-f1 = "mednet.libs.classification.config.data.shenzhen.fold_1" shenzhen-f2 = "mednet.libs.classification.config.data.shenzhen.fold_2" shenzhen-f3 = "mednet.libs.classification.config.data.shenzhen.fold_3" shenzhen-f4 = "mednet.libs.classification.config.data.shenzhen.fold_4" shenzhen-f5 = "mednet.libs.classification.config.data.shenzhen.fold_5" shenzhen-f6 = "mednet.libs.classification.config.data.shenzhen.fold_6" shenzhen-f7 = "mednet.libs.classification.config.data.shenzhen.fold_7" shenzhen-f8 = "mednet.libs.classification.config.data.shenzhen.fold_8" shenzhen-f9 = "mednet.libs.classification.config.data.shenzhen.fold_9" # indian dataset (and cross-validation folds) indian = "mednet.libs.classification.config.data.indian.default" indian-f0 = "mednet.libs.classification.config.data.indian.fold_0" indian-f1 = "mednet.libs.classification.config.data.indian.fold_1" indian-f2 = "mednet.libs.classification.config.data.indian.fold_2" indian-f3 = "mednet.libs.classification.config.data.indian.fold_3" indian-f4 = "mednet.libs.classification.config.data.indian.fold_4" indian-f5 = "mednet.libs.classification.config.data.indian.fold_5" indian-f6 = "mednet.libs.classification.config.data.indian.fold_6" indian-f7 = "mednet.libs.classification.config.data.indian.fold_7" indian-f8 = "mednet.libs.classification.config.data.indian.fold_8" indian-f9 = "mednet.libs.classification.config.data.indian.fold_9" # TBX11K dataset split 1: healthy vs active tb, and cross-validation folds tbx11k-v1-healthy-vs-atb = "mednet.libs.classification.config.data.tbx11k.v1_healthy_vs_atb" tbx11k-v1-f0 = "mednet.libs.classification.config.data.tbx11k.v1_fold_0" tbx11k-v1-f1 = "mednet.libs.classification.config.data.tbx11k.v1_fold_1" tbx11k-v1-f2 = "mednet.libs.classification.config.data.tbx11k.v1_fold_2" tbx11k-v1-f3 = "mednet.libs.classification.config.data.tbx11k.v1_fold_3" tbx11k-v1-f4 = "mednet.libs.classification.config.data.tbx11k.v1_fold_4" tbx11k-v1-f5 = "mednet.libs.classification.config.data.tbx11k.v1_fold_5" tbx11k-v1-f6 = "mednet.libs.classification.config.data.tbx11k.v1_fold_6" tbx11k-v1-f7 = "mednet.libs.classification.config.data.tbx11k.v1_fold_7" tbx11k-v1-f8 = "mednet.libs.classification.config.data.tbx11k.v1_fold_8" tbx11k-v1-f9 = "mednet.libs.classification.config.data.tbx11k.v1_fold_9" # TBX11K dataset split 2: others vs active tb, and cross-validation folds tbx11k-v2-others-vs-atb = "mednet.libs.classification.config.data.tbx11k.v2_others_vs_atb" tbx11k-v2-f0 = "mednet.libs.classification.config.data.tbx11k.v2_fold_0" tbx11k-v2-f1 = "mednet.libs.classification.config.data.tbx11k.v2_fold_1" tbx11k-v2-f2 = "mednet.libs.classification.config.data.tbx11k.v2_fold_2" tbx11k-v2-f3 = "mednet.libs.classification.config.data.tbx11k.v2_fold_3" tbx11k-v2-f4 = "mednet.libs.classification.config.data.tbx11k.v2_fold_4" tbx11k-v2-f5 = "mednet.libs.classification.config.data.tbx11k.v2_fold_5" tbx11k-v2-f6 = "mednet.libs.classification.config.data.tbx11k.v2_fold_6" tbx11k-v2-f7 = "mednet.libs.classification.config.data.tbx11k.v2_fold_7" tbx11k-v2-f8 = "mednet.libs.classification.config.data.tbx11k.v2_fold_8" tbx11k-v2-f9 = "mednet.libs.classification.config.data.tbx11k.v2_fold_9" # montgomery-shenzhen aggregated dataset montgomery-shenzhen = "mednet.libs.classification.config.data.montgomery_shenzhen.default" montgomery-shenzhen-f0 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_0" montgomery-shenzhen-f1 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_1" montgomery-shenzhen-f2 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_2" montgomery-shenzhen-f3 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_3" montgomery-shenzhen-f4 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_4" montgomery-shenzhen-f5 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_5" montgomery-shenzhen-f6 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_6" montgomery-shenzhen-f7 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_7" montgomery-shenzhen-f8 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_8" montgomery-shenzhen-f9 = "mednet.libs.classification.config.data.montgomery_shenzhen.fold_9" # montgomery-shenzhen-indian aggregated dataset montgomery-shenzhen-indian = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.default" montgomery-shenzhen-indian-f0 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_0" montgomery-shenzhen-indian-f1 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_1" montgomery-shenzhen-indian-f2 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_2" montgomery-shenzhen-indian-f3 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_3" montgomery-shenzhen-indian-f4 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_4" montgomery-shenzhen-indian-f5 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_5" montgomery-shenzhen-indian-f6 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_6" montgomery-shenzhen-indian-f7 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_7" montgomery-shenzhen-indian-f8 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_8" montgomery-shenzhen-indian-f9 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian.fold_9" # montgomery-shenzhen-indian-tbx11k aggregated dataset montgomery-shenzhen-indian-tbx11k-v1 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_healthy_vs_atb" montgomery-shenzhen-indian-tbx11k-v1-f0 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_0" montgomery-shenzhen-indian-tbx11k-v1-f1 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_1" montgomery-shenzhen-indian-tbx11k-v1-f2 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_2" montgomery-shenzhen-indian-tbx11k-v1-f3 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_3" montgomery-shenzhen-indian-tbx11k-v1-f4 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_4" montgomery-shenzhen-indian-tbx11k-v1-f5 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_5" montgomery-shenzhen-indian-tbx11k-v1-f6 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_6" montgomery-shenzhen-indian-tbx11k-v1-f7 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_7" montgomery-shenzhen-indian-tbx11k-v1-f8 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_8" montgomery-shenzhen-indian-tbx11k-v1-f9 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v1_fold_9" montgomery-shenzhen-indian-tbx11k-v2 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_others_vs_atb" montgomery-shenzhen-indian-tbx11k-v2-f0 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_0" montgomery-shenzhen-indian-tbx11k-v2-f1 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_1" montgomery-shenzhen-indian-tbx11k-v2-f2 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_2" montgomery-shenzhen-indian-tbx11k-v2-f3 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_3" montgomery-shenzhen-indian-tbx11k-v2-f4 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_4" montgomery-shenzhen-indian-tbx11k-v2-f5 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_5" montgomery-shenzhen-indian-tbx11k-v2-f6 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_6" montgomery-shenzhen-indian-tbx11k-v2-f7 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_7" montgomery-shenzhen-indian-tbx11k-v2-f8 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_8" montgomery-shenzhen-indian-tbx11k-v2-f9 = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_tbx11k.v2_fold_9" # tbpoc dataset (only cross-validation folds) tbpoc-f0 = "mednet.libs.classification.config.data.tbpoc.fold_0" tbpoc-f1 = "mednet.libs.classification.config.data.tbpoc.fold_1" tbpoc-f2 = "mednet.libs.classification.config.data.tbpoc.fold_2" tbpoc-f3 = "mednet.libs.classification.config.data.tbpoc.fold_3" tbpoc-f4 = "mednet.libs.classification.config.data.tbpoc.fold_4" tbpoc-f5 = "mednet.libs.classification.config.data.tbpoc.fold_5" tbpoc-f6 = "mednet.libs.classification.config.data.tbpoc.fold_6" tbpoc-f7 = "mednet.libs.classification.config.data.tbpoc.fold_7" tbpoc-f8 = "mednet.libs.classification.config.data.tbpoc.fold_8" tbpoc-f9 = "mednet.libs.classification.config.data.tbpoc.fold_9" # hivtb dataset (only cross-validation folds) hivtb-f0 = "mednet.libs.classification.config.data.hivtb.fold_0" hivtb-f1 = "mednet.libs.classification.config.data.hivtb.fold_1" hivtb-f2 = "mednet.libs.classification.config.data.hivtb.fold_2" hivtb-f3 = "mednet.libs.classification.config.data.hivtb.fold_3" hivtb-f4 = "mednet.libs.classification.config.data.hivtb.fold_4" hivtb-f5 = "mednet.libs.classification.config.data.hivtb.fold_5" hivtb-f6 = "mednet.libs.classification.config.data.hivtb.fold_6" hivtb-f7 = "mednet.libs.classification.config.data.hivtb.fold_7" hivtb-f8 = "mednet.libs.classification.config.data.hivtb.fold_8" hivtb-f9 = "mednet.libs.classification.config.data.hivtb.fold_9" # NIH CXR14 (relabeled), multi-class (14 labels) nih-cxr14 = "mednet.libs.classification.config.data.nih_cxr14.default" nih-cxr14-cardiomegaly = "mednet.libs.classification.config.data.nih_cxr14.cardiomegaly" # PadChest, multi-class (varied number of labels) padchest-idiap = "mednet.libs.classification.config.data.padchest.idiap" padchest-tb-idiap = "mednet.libs.classification.config.data.padchest.tb_idiap" padchest-no-tb-idiap = "mednet.libs.classification.config.data.padchest.no_tb_idiap" padchest-cardiomegaly-idiap = "mednet.libs.classification.config.data.padchest.cardiomegaly_idiap" # NIH CXR14 / PadChest aggregated dataset nih-cxr14-padchest = "mednet.libs.classification.config.data.nih_cxr14_padchest.idiap" # montgomery-shenzhen-indian-padchest aggregated dataset montgomery-shenzhen-indian-padchest = "mednet.libs.classification.config.data.montgomery_shenzhen_indian_padchest.default" # VISCERAL dataset visceral = "mednet.config.data.visceral.default" [project.entry-points."mednet.libs.segmentation.config"] lwnet = "mednet.libs.segmentation.config.models.lwnet" # drive dataset - retinal vessel segmentation drive = "mednet.libs.segmentation.config.data.drive.default" [tool.ruff] line-length = 88 target-version = "py310" [tool.ruff.format] docstring-code-format = true [tool.ruff.lint] select = [ "A", # https://docs.astral.sh/ruff/rules/#flake8-builtins-a "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com "D", # https://docs.astral.sh/ruff/rules/#pydocstyle-d "E", # https://docs.astral.sh/ruff/rules/#error-e "F", # https://docs.astral.sh/ruff/rules/#pyflakes-f "I", # https://docs.astral.sh/ruff/rules/#isort-i "ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc "LOG", # https://docs.astral.sh/ruff/rules/#flake8-logging-log "N", # https://docs.astral.sh/ruff/rules/#pep8-naming-n "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q "RET", # https://docs.astral.sh/ruff/rules/#flake8-return-ret "SLF", # https://docs.astral.sh/ruff/rules/#flake8-self-slf "T10", # https://docs.astral.sh/ruff/rules/#flake8-debugger-t10 "T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20 "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up "W", # https://docs.astral.sh/ruff/rules/#warning-w #"G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g #"ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn #"NPY", # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy ] ignore = [ "COM812", # https://docs.astral.sh/ruff/rules/missing-trailing-comma/ "D100", # https://docs.astral.sh/ruff/rules/undocumented-public-module/ "D102", # https://docs.astral.sh/ruff/rules/undocumented-public-method/ "D104", # https://docs.astral.sh/ruff/rules/undocumented-public-package/ "D105", # https://docs.astral.sh/ruff/rules/undocumented-magic-method/ "D107", # https://docs.astral.sh/ruff/rules/undocumented-public-init/ "D203", # https://docs.astral.sh/ruff/rules/one-blank-line-before-class/ "D202", # https://docs.astral.sh/ruff/rules/no-blank-line-after-function/ "D205", # https://docs.astral.sh/ruff/rules/blank-line-after-summary/ "D212", # https://docs.astral.sh/ruff/rules/multi-line-summary-first-line/ "D213", # https://docs.astral.sh/ruff/rules/multi-line-summary-second-line/ "E302", # https://docs.astral.sh/ruff/rules/blank-lines-top-level/ "E402", # https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/ "E501", # https://docs.astral.sh/ruff/rules/line-too-long/ "ISC001", # https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/ ] [tool.ruff.lint.pydocstyle] convention = "numpy" [tool.ruff.lint.per-file-ignores] "helpers/*.py" = ["T201", "D103"] "**/tests/*.py" = ["D", "E501"] "doc/conf.py" = ["D"] "**/scripts/*.py" = ["E501"] [tool.numpydoc_validation] checks = [ "all", # report on all checks, except the ones below "ES01", # Not all functions require extended summaries "EX01", # Not all functions require examples "GL01", # Expects text to be on the line after the opening quotes but that is in direct opposition of the sphinx recommendations and conflicts with other pre-commit hooks. "GL08", # Causes issues if we don't have a docstring at the top of the file. Disabling this might fail to catch actual missing docstrings. "PR04", # numpydoc does not currently support PEP484 typehints, which we are using "RT03", # Since sphinx is unable to understand type annotations we need to remove some types from 'Returns', which breaks this check. "SA01", # We do not use Also sections "SS06", # Summary will span multiple lines if too long because of reformatting by other hooks. ] exclude = [ # don't report on objects that match any of these regex '\.__len__$', '\.__getitem__$', '\.__iter__$', '\.__exit__$', ] override_SS05 = [ # override SS05 to allow docstrings starting with these words '^Process ', '^Assess ', '^Access ', '^This', ] [tool.pytest.ini_options] addopts = ["--cov=mednet", "--cov-report=term-missing", "--import-mode=append"] junit_logging = "all" junit_log_passing_tests = false markers = ["slow: marks tests as slow (deselect with '-m \"not slow\"')"]