encode development requirements in pyproject.toml (#32616)
Add a `project` block to the toml config along with development and CI dependencies and a minimal `build-system` block, doing basically nothing, so that spack can be bootstrapped to a full development environment with: ```shell $ hatch -e dev shell ``` or for a minimal environment without hatch: ```shell $ python3 -m venv venv $ source venv/bin/activate $ python3 -m pip install --upgrade pip $ python3 -m pip install -e '.[dev]' ``` This means we can re-use the requirements list throughout the workflow yaml files and otherwise maintain this list in *one place* rather than several disparate ones. We may be stuck with a couple more temporarily to continue supporting python2.7, but aside from that it's less places to get out of sync and a couple new bootstrap options. Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>
This commit is contained in:
parent
28d669cb39
commit
6241cdb27b
5 changed files with 146 additions and 51 deletions
48
bin/spack
48
bin/spack
|
@ -49,52 +49,8 @@ spack_prefix = os.path.dirname(os.path.dirname(spack_file))
|
||||||
spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
|
spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
|
||||||
sys.path.insert(0, spack_lib_path)
|
sys.path.insert(0, spack_lib_path)
|
||||||
|
|
||||||
# Add external libs
|
from spack_installable.main import main # noqa: E402
|
||||||
spack_external_libs = os.path.join(spack_lib_path, "external")
|
|
||||||
|
|
||||||
if sys.version_info[:2] <= (2, 7):
|
|
||||||
sys.path.insert(0, os.path.join(spack_external_libs, "py2"))
|
|
||||||
|
|
||||||
sys.path.insert(0, spack_external_libs)
|
|
||||||
|
|
||||||
# Here we delete ruamel.yaml in case it has been already imported from site
|
|
||||||
# (see #9206 for a broader description of the issue).
|
|
||||||
#
|
|
||||||
# Briefly: ruamel.yaml produces a .pth file when installed with pip that
|
|
||||||
# makes the site installed package the preferred one, even though sys.path
|
|
||||||
# is modified to point to another version of ruamel.yaml.
|
|
||||||
if "ruamel.yaml" in sys.modules:
|
|
||||||
del sys.modules["ruamel.yaml"]
|
|
||||||
|
|
||||||
if "ruamel" in sys.modules:
|
|
||||||
del sys.modules["ruamel"]
|
|
||||||
|
|
||||||
# The following code is here to avoid failures when updating
|
|
||||||
# the develop version, due to spurious argparse.pyc files remaining
|
|
||||||
# in the libs/spack/external directory, see:
|
|
||||||
# https://github.com/spack/spack/pull/25376
|
|
||||||
# TODO: Remove in v0.18.0 or later
|
|
||||||
try:
|
|
||||||
import argparse
|
|
||||||
except ImportError:
|
|
||||||
argparse_pyc = os.path.join(spack_external_libs, "argparse.pyc")
|
|
||||||
if not os.path.exists(argparse_pyc):
|
|
||||||
raise
|
|
||||||
try:
|
|
||||||
os.remove(argparse_pyc)
|
|
||||||
import argparse # noqa: F401
|
|
||||||
except Exception:
|
|
||||||
msg = (
|
|
||||||
"The file\n\n\t{0}\n\nis corrupted and cannot be deleted by Spack. "
|
|
||||||
"Either delete it manually or ask some administrator to "
|
|
||||||
"delete it for you."
|
|
||||||
)
|
|
||||||
print(msg.format(argparse_pyc))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
import spack.main # noqa: E402
|
|
||||||
|
|
||||||
# Once we've set up the system path, run the spack main method
|
# Once we've set up the system path, run the spack main method
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
sys.exit(spack.main.main())
|
sys.exit(main())
|
||||||
|
|
|
@ -3,11 +3,20 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
#: (major, minor, micro, dev release) tuple
|
|
||||||
spack_version_info = (0, 19, 0, "dev0")
|
|
||||||
|
|
||||||
#: PEP440 canonical <major>.<minor>.<micro>.<devN> string
|
#: PEP440 canonical <major>.<minor>.<micro>.<devN> string
|
||||||
spack_version = ".".join(str(s) for s in spack_version_info)
|
__version__ = "0.19.0.dev0"
|
||||||
|
spack_version = __version__
|
||||||
|
|
||||||
|
|
||||||
|
def __try_int(v):
|
||||||
|
try:
|
||||||
|
return int(v)
|
||||||
|
except ValueError:
|
||||||
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
#: (major, minor, micro, dev release) tuple
|
||||||
|
spack_version_info = tuple([__try_int(v) for v in __version__.split(".")])
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["spack_version_info", "spack_version"]
|
__all__ = ["spack_version_info", "spack_version"]
|
||||||
__version__ = spack_version
|
|
||||||
|
|
0
lib/spack/spack_installable/__init__.py
Normal file
0
lib/spack/spack_installable/__init__.py
Normal file
59
lib/spack/spack_installable/main.py
Normal file
59
lib/spack/spack_installable/main.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from os.path import dirname as dn
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
# Find spack's location and its prefix.
|
||||||
|
this_file = os.path.realpath(os.path.expanduser(__file__))
|
||||||
|
spack_prefix = dn(dn(dn(dn(this_file))))
|
||||||
|
|
||||||
|
# Allow spack libs to be imported in our scripts
|
||||||
|
spack_lib_path = os.path.join(spack_prefix, "lib", "spack")
|
||||||
|
sys.path.insert(0, spack_lib_path)
|
||||||
|
|
||||||
|
# Add external libs
|
||||||
|
spack_external_libs = os.path.join(spack_lib_path, "external")
|
||||||
|
|
||||||
|
if sys.version_info[:2] <= (2, 7):
|
||||||
|
sys.path.insert(0, os.path.join(spack_external_libs, "py2"))
|
||||||
|
|
||||||
|
sys.path.insert(0, spack_external_libs)
|
||||||
|
# Here we delete ruamel.yaml in case it has been already imported from site
|
||||||
|
# (see #9206 for a broader description of the issue).
|
||||||
|
#
|
||||||
|
# Briefly: ruamel.yaml produces a .pth file when installed with pip that
|
||||||
|
# makes the site installed package the preferred one, even though sys.path
|
||||||
|
# is modified to point to another version of ruamel.yaml.
|
||||||
|
if "ruamel.yaml" in sys.modules:
|
||||||
|
del sys.modules["ruamel.yaml"]
|
||||||
|
|
||||||
|
if "ruamel" in sys.modules:
|
||||||
|
del sys.modules["ruamel"]
|
||||||
|
|
||||||
|
# The following code is here to avoid failures when updating
|
||||||
|
# the develop version, due to spurious argparse.pyc files remaining
|
||||||
|
# in the libs/spack/external directory, see:
|
||||||
|
# https://github.com/spack/spack/pull/25376
|
||||||
|
# TODO: Remove in v0.18.0 or later
|
||||||
|
try:
|
||||||
|
import argparse # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
argparse_pyc = os.path.join(spack_external_libs, "argparse.pyc")
|
||||||
|
if not os.path.exists(argparse_pyc):
|
||||||
|
raise
|
||||||
|
try:
|
||||||
|
os.remove(argparse_pyc)
|
||||||
|
import argparse # noqa: F401
|
||||||
|
except Exception:
|
||||||
|
msg = (
|
||||||
|
"The file\n\n\t{0}\n\nis corrupted and cannot be deleted by Spack. "
|
||||||
|
"Either delete it manually or ask some administrator to "
|
||||||
|
"delete it for you."
|
||||||
|
)
|
||||||
|
print(msg.format(argparse_pyc))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
import spack.main # noqa: E402
|
||||||
|
|
||||||
|
sys.exit(spack.main.main(argv))
|
|
@ -1,3 +1,74 @@
|
||||||
|
[project]
|
||||||
|
name="spack"
|
||||||
|
description="The spack package manager"
|
||||||
|
dependencies=[
|
||||||
|
"clingo",
|
||||||
|
"setuptools",
|
||||||
|
"six",
|
||||||
|
"types-six",
|
||||||
|
]
|
||||||
|
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==8.0.2",
|
||||||
|
'black==21.12b0',
|
||||||
|
"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]
|
[tool.black]
|
||||||
line-length = 99
|
line-length = 99
|
||||||
target-version = ['py27', 'py35', 'py36', 'py37', 'py38', 'py39', 'py310']
|
target-version = ['py27', 'py35', 'py36', 'py37', 'py38', 'py39', 'py310']
|
||||||
|
|
Loading…
Reference in a new issue