[project] name = "spack" description = "The spack package manager" requires-python = ">=3.6" dependencies = ["clingo", "setuptools"] dynamic = ["version"] [project.scripts] spack = "lib.spack.spack_installable.main:main" [tool.hatch.version] path = "lib/spack/spack/__init__.py" [project.optional-dependencies] dev = [ "pip>=21.3", "pytest", "pytest-xdist", "setuptools", "click", "black", "mypy", "isort", "flake8", "vermin", ] ci = ["pytest-cov", "codecov[toml]"] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] include = [ "/bin", "/etc", "/lib", "/share", "/var", "CITATION.cff", "COPYRIGHT", "LICENSE-APACHE", "LICENSE-MIT", "NOTICE", "README.md", "SECURITY.md", ] [tool.hatch.envs.default] features = ["dev"] [tool.hatch.envs.default.scripts] spack = "./bin/spack" style = "./bin/spack style" test = "./bin/spack unit-test" [tool.hatch.envs.ci] features = ["dev", "ci"] [tool.ruff] line-length = 99 extend-include = ["bin/spack"] extend-exclude = ["lib/spack/external", "*.pyi"] [tool.ruff.format] skip-magic-trailing-comma = true [tool.ruff.lint] extend-select = ["I"] ignore = ["E731", "E203"] [tool.ruff.lint.isort] split-on-trailing-comma = false section-order = [ "future", "standard-library", "third-party", "archspec", "llnl", "spack", "first-party", "local-folder", ] [tool.ruff.lint.isort.sections] spack = ["spack"] archspec = ["archspec"] llnl = ["llnl"] [tool.ruff.lint.per-file-ignores] "var/spack/*/package.py" = ["F403", "F405", "F811", "F821"] "*-ci-package.py" = ["F403", "F405", "F821"] [tool.black] line-length = 99 include = "(lib/spack|var/spack/repos|var/spack/test_repos)/.*\\.pyi?$|bin/spack$" extend-exclude = "lib/spack/external" skip_magic_trailing_comma = true [tool.isort] line_length = 99 profile = "black" sections = [ "FUTURE", "STDLIB", "THIRDPARTY", "ARCHSPEC", "LLNL", "FIRSTPARTY", "LOCALFOLDER", ] known_first_party = "spack" known_archspec = "archspec" known_llnl = "llnl" known_third_party = ["ruamel", "six"] src_paths = "lib" honor_noqa = true [tool.mypy] files = [ "lib/spack/llnl/**/*.py", "lib/spack/spack/**/*.py", "var/spack/repos/spack_repo/builtin/packages/*/package.py", ] mypy_path = ["lib/spack", "lib/spack/external", "var/spack/repos"] allow_redefinition = true # This and a generated import file allows supporting packages namespace_packages = true # To avoid re-factoring all the externals, ignore errors and missing imports # globally, then turn back on in spack and spack submodules ignore_errors = true ignore_missing_imports = true [[tool.mypy.overrides]] module = "spack.*" ignore_errors = false ignore_missing_imports = false [[tool.mypy.overrides]] module = "spack_repo.*" ignore_errors = false ignore_missing_imports = false # we can't do this here, not a module scope option, in spack style instead # disable_error_code = 'no-redef' [[tool.mypy.overrides]] module = "llnl.*" ignore_errors = false ignore_missing_imports = false [[tool.mypy.overrides]] module = "spack.test.packages" ignore_errors = true # ignore errors in fake import path for packages [[tool.mypy.overrides]] module = "spack.pkg.*" ignore_errors = true ignore_missing_imports = true # Spack imports a number of external packages, and they *may* require Python 3.8 or # higher in recent versions. This can cause mypy to fail because we check for 3.7 # compatibility. We could restrict mypy to run for the oldest supported version (3.7), # but that means most developers won't be able to run mypy, which means it'll fail # more in CI. Instead, we exclude these imported packages from mypy checking. [[tool.mypy.overrides]] module = [ "IPython", "altgraph", "attr", "boto3", "botocore", "distro", "importlib.metadata", "jinja2", "jsonschema", "macholib", "markupsafe", "numpy", "pkg_resources", "pyristent", "pytest", "ruamel.yaml", "six", ] follow_imports = "skip" follow_imports_for_stubs = true [tool.pyright] useLibraryCodeForTypes = true reportMissingImports = true reportWildcardImportFromLibrary = false include = ["lib/spack", "var/spack/repos", "var/spack/test_repos"] ignore = ["lib/spack/external"] extraPaths = ["lib/spack", "lib/spack/external"] [tool.coverage.run] parallel = true concurrency = ["multiprocessing"] branch = true source = ["bin", "lib"] data_file = "./tests-coverage/.coverage" omit = [ "lib/spack/spack/test/*", "lib/spack/docs/*", "lib/spack/external/*", "share/spack/qa/*", ] [tool.coverage.report] # Regexes for lines to exclude from consideration exclude_lines = [ # Have to re-enable the standard pragma "pragma: no cover", # Don't complain about missing debug-only code: "def __repr__", "if self\\.debug", # Don't complain if tests don't hit defensive assertion code: "raise AssertionError", "raise NotImplementedError", # Don't complain if non-runnable code isn't run: "if 0:", "if False:", "if __name__ == .__main__.:", ] ignore_errors = true [tool.coverage.paths] source = [ ".", "/Users/runner/work/spack/spack", "/System/Volumes/Data/home/runner/work/spack/spack", "D:\\a\\spack\\spack", ] [tool.coverage.html] directory = "htmlcov" [tool.vendoring] destination = "lib/spack/external/_vendoring" requirements = "lib/spack/external/vendor.txt" namespace = "" protected-files = ["__init__.py", "README.rst", "vendor.txt"] patches-dir = "lib/spack/external/patches" [tool.vendoring.transformations] substitute = [] drop = [ # contains unnecessary scripts "bin/", # interpreter and OS specific msgpack libs "msgpack/*.so", # unneeded parts of setuptools "easy_install.py", "setuptools", "pkg_resources/_vendor/", "pkg_resources/extern/", # trim vendored pygments styles and lexers "pygments/styles/[!_]*.py", "^pygments/lexers/(?!python|__init__|_mapping).*\\.py$", # trim rich's markdown support "rich/markdown.py", # ruamel.yaml installs unneded files "ruamel.*.pth", "pvectorc.*.so", ] [tool.vendoring.typing-stubs] six = ["six.__init__", "six.moves.__init__", "six.moves.configparser"] distro = [] [tool.vendoring.license.directories] setuptools = "pkg_resources" [tool.vendoring.license.fallback-urls] CacheControl = "https://raw.githubusercontent.com/ionrock/cachecontrol/v0.12.6/LICENSE.txt" distlib = "https://bitbucket.org/pypa/distlib/raw/master/LICENSE.txt" webencodings = "https://github.com/SimonSapin/python-webencodings/raw/master/LICENSE"