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:
		
							
								
								
									
										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") | ||||
| 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()) | ||||
|   | ||||
| @@ -3,11 +3,20 @@ | ||||
| # | ||||
| # 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 | ||||
| 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"] | ||||
| __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] | ||||
| line-length = 99 | ||||
| target-version = ['py27', 'py35', 'py36', 'py37', 'py38', 'py39', 'py310'] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Tom Scogland
					Tom Scogland