Skip to content

Commit

Permalink
encode development requirements in pyproject.toml (spack#32616)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
2 people authored and spack spack committed Feb 15, 2023
1 parent 10f02ca commit 3ae7f26
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 50 deletions.
48 changes: 2 additions & 46 deletions bin/spack
Original file line number Diff line number Diff line change
Expand Up @@ -49,52 +49,8 @@ spack_prefix = os.path.dirname(os.path.dirname(spack_file))
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
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
from spack_installable.main import main # noqa: E402

# Once we've set up the system path, run the spack main method
if __name__ == "__main__":
sys.exit(spack.main.main())
sys.exit(main())
17 changes: 13 additions & 4 deletions lib/spack/spack/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,20 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

#: PEP440 canonical <major>.<minor>.<micro>.<devN> string
__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 = (0, 19, 0, "dev0")
spack_version_info = tuple([__try_int(v) for v in __version__.split(".")])

#: PEP440 canonical <major>.<minor>.<micro>.<devN> string
spack_version = ".".join(str(s) for s in spack_version_info)

__all__ = ["spack_version_info", "spack_version"]
__version__ = spack_version
Empty file.
59 changes: 59 additions & 0 deletions lib/spack/spack_installable/main.py
Original file line number Diff line number Diff line change
@@ -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))
71 changes: 71 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -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]
line-length = 99
target-version = ['py27', 'py35', 'py36', 'py37', 'py38', 'py39', 'py310']
Expand Down

0 comments on commit 3ae7f26

Please sign in to comment.