
Historically, every PR, push, etc. to Spack generates a bunch of jobs, each of which uploads its coverage report to codecov independently. This means that we get annoying partial coverage numbers when only a few of the jobs have finished, and frequently codecov is bad at understanding when to merge reports for a given PR. The numbers of the site can be weird as a result. This restructures our coverage handling so that we do all the merging ourselves and upload exactly one report per GitHub actions workflow. In practice, that means that every push to every PR will get exactly one coverage report and exactly one coverage number reported. I think this will at least partially restore peoples' faith in what codecov is telling them, and it might even make codecov handle Spack a bit better, since this reduces the report burden by ~7x. - [x] test and audit jobs now upload artifacts for coverage - [x] add a new job that downloads artifacts and merges coverage reports together - [x] set `paths` section of `pyproject.toml` so that cross-platform clone locations are merged - [x] upload to codecov once, at the end of the workflow Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
268 lines
5.9 KiB
TOML
268 lines
5.9 KiB
TOML
[project]
|
|
name="spack"
|
|
description="The spack package manager"
|
|
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.black]
|
|
line-length = 99
|
|
target-version = ['py36', 'py37', 'py38', 'py39', 'py310']
|
|
include = '''
|
|
\.pyi?$
|
|
'''
|
|
extend-exclude = '''
|
|
/(
|
|
\.git
|
|
| \.mypy_cache
|
|
| ^lib/spack/external/
|
|
| ^opt/
|
|
)/
|
|
'''
|
|
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]
|
|
python_version = 3.7
|
|
files = ['lib/spack/llnl/**/*.py', 'lib/spack/spack/**/*.py', './var/spack/repos/builtin/packages/*/package.py']
|
|
mypy_path = ['bin', 'lib/spack', 'lib/spack/external', 'var/spack/repos/builtin']
|
|
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 = 'packages.*'
|
|
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']
|
|
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"
|