Use "vendoring" to manage 3rd party dependencies

This commit is contained in:
Massimiliano Culpo 2022-11-16 15:39:33 +01:00 committed by Todd Gamblin
parent 2530c7828b
commit 86378502f9
10 changed files with 92 additions and 70 deletions

View file

@ -36,7 +36,7 @@
if not os.path.exists(link_name): if not os.path.exists(link_name):
os.symlink(os.path.abspath("../../.."), link_name, target_is_directory=True) os.symlink(os.path.abspath("../../.."), link_name, target_is_directory=True)
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external")) sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external"))
sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external/pytest-fallback")) sys.path.insert(0, os.path.abspath("_spack_root/lib/spack/external/_vendoring"))
sys.path.append(os.path.abspath("_spack_root/lib/spack/")) sys.path.append(os.path.abspath("_spack_root/lib/spack/"))
# Add the Spack bin directory to the path so that we can use its output in docs. # Add the Spack bin directory to the path so that we can use its output in docs.

View file

@ -11,7 +11,7 @@
* Homepage: https://altgraph.readthedocs.io/en/latest/index.html * Homepage: https://altgraph.readthedocs.io/en/latest/index.html
* Usage: dependency of macholib * Usage: dependency of macholib
* Version: 0.17.2 * Version: 0.17.3
archspec archspec
-------- --------
@ -20,17 +20,6 @@
* Usage: Labeling, comparison and detection of microarchitectures * Usage: Labeling, comparison and detection of microarchitectures
* Version: 0.2.0 (commit e44bad9c7b6defac73696f64078b2fe634719b62) * Version: 0.2.0 (commit e44bad9c7b6defac73696f64078b2fe634719b62)
argparse
--------
* Homepage: https://pypi.python.org/pypi/argparse
* Usage: We include our own version to be Python 3.X compatible.
* Version: 1.4.0
* Note: This package has been slightly modified to improve
error message formatting. See the following commit if the
vendored copy ever needs to be updated again:
https://github.com/spack/spack/pull/6786/commits/dfcef577b77249106ea4e4c69a6cd9e64fa6c418
astunparse astunparse
---------------- ----------------
@ -52,7 +41,7 @@
* Homepage: https://github.com/python-attrs/attrs * Homepage: https://github.com/python-attrs/attrs
* Usage: Needed by jsonschema. * Usage: Needed by jsonschema.
* Version: 21.2.0 (83d3cd70f90a3f4d19ee8b508e58d1c58821c0ad) * Version: 22.1.0
ctest_log_parser ctest_log_parser
---------------- ----------------
@ -67,21 +56,14 @@
* Homepage: https://pypi.python.org/pypi/distro * Homepage: https://pypi.python.org/pypi/distro
* Usage: Provides a more stable linux distribution detection. * Usage: Provides a more stable linux distribution detection.
* Version: 1.6.0 (64946a1e2a9ff529047070657728600e006c99ff) * Version: 1.8.0
* Note: Last version supporting Python 2.7
functools32
-----------
* Homepage: https://github.com/MiCHiLU/python-functools32
* Usage: Needed by jsonschema when using Python 2.7.
* Version: 3.2.3-2
jinja2 jinja2
------ ------
* Homepage: https://pypi.python.org/pypi/Jinja2 * Homepage: https://pypi.python.org/pypi/Jinja2
* Usage: A modern and designer-friendly templating language for Python. * Usage: A modern and designer-friendly templating language for Python.
* Version: 2.11.3 (last version supporting Python 2.7) * Version: 3.0.3 (last version supporting Python 3.6)
jsonschema jsonschema
---------- ----------
@ -96,44 +78,21 @@
* Homepage: https://macholib.readthedocs.io/en/latest/index.html# * Homepage: https://macholib.readthedocs.io/en/latest/index.html#
* Usage: Manipulation of Mach-o binaries for relocating macOS buildcaches on Linux * Usage: Manipulation of Mach-o binaries for relocating macOS buildcaches on Linux
* Version: 1.15.2 * Version: 1.16.2
markupsafe markupsafe
---------- ----------
* Homepage: https://pypi.python.org/pypi/MarkupSafe * Homepage: https://pypi.python.org/pypi/MarkupSafe
* Usage: Implements a XML/HTML/XHTML Markup safe string for Python. * Usage: Implements a XML/HTML/XHTML Markup safe string for Python.
* Version: 1.1.1 (last version supporting Python 2.7) * Version: 2.0.1 (last version supporting Python 3.6)
py
--
* Homepage: https://pypi.python.org/pypi/py
* Usage: Needed by pytest. Library with cross-python path,
ini-parsing, io, code, and log facilities.
* Version: 1.4.34 (last version supporting Python 2.6)
* Note: This packages has been modified:
* https://github.com/pytest-dev/py/pull/186 was backported
pyrsistent pyrsistent
---------- ----------
* Homepage: http://github.com/tobgu/pyrsistent/ * Homepage: http://github.com/tobgu/pyrsistent/
* Usage: Needed by `jsonschema` * Usage: Needed by `jsonschema`
* Version: 0.16.1 (last version supporting Python 2.7) * Version: 0.18.0
* Note: We only include the parts needed for `jsonschema`.
pytest
------
* Homepage: https://pypi.python.org/pypi/pytest
* Usage: Testing framework used by Spack.
* Version: 3.2.5 (last version supporting Python 2.6)
* Note: This package has been slightly modified:
* We improve Python 2.6 compatibility. See:
https://github.com/spack/spack/pull/6801.
* We have patched pytest not to depend on setuptools. See:
https://github.com/spack/spack/pull/15612
ruamel.yaml ruamel.yaml
------ ------

View file

@ -0,0 +1,15 @@
diff --git a/lib/spack/external/_vendoring/jsonschema/__init__.py b/lib/spack/external/_vendoring/jsonschema/__init__.py
index 6b630cdfbb..1791fe7fbf 100644
--- a/lib/spack/external/_vendoring/jsonschema/__init__.py
+++ b/lib/spack/external/_vendoring/jsonschema/__init__.py
@@ -27,8 +27,5 @@
RefResolver,
validate,
)
-try:
- from importlib import metadata
-except ImportError: # for Python<3.8
- import importlib_metadata as metadata
-__version__ = metadata.version("jsonschema")
+
+__version__ = "3.2.0"

9
lib/spack/external/vendor.txt vendored Normal file
View file

@ -0,0 +1,9 @@
distro==1.8.0
jsonschema==3.2.0
attrs==22.1.0
pyrsistent==0.18.0
jinja2==3.0.3
markupsafe==2.0.1
six==1.16.0
macholib==1.16.2
altgraph==0.17.3

View file

@ -83,7 +83,7 @@ def __init__(self):
if version: if version:
# If we found a CrayOS version, we do not want the information # If we found a CrayOS version, we do not want the information
# from LinuxDistro. In order to skip the logic from # from LinuxDistro. In order to skip the logic from
# external.distro.linux_distribution, while still calling __init__ # distro.linux_distribution, while still calling __init__
# methods further up the MRO, we skip LinuxDistro in the MRO and # methods further up the MRO, we skip LinuxDistro in the MRO and
# call the OperatingSystem superclass __init__ method # call the OperatingSystem superclass __init__ method
super(LinuxDistro, self).__init__(name, version) super(LinuxDistro, self).__init__(name, version)

View file

@ -15,9 +15,9 @@ def kernel_version():
"""Return the kernel version as a Version object. """Return the kernel version as a Version object.
Note that the kernel version is distinct from OS and/or Note that the kernel version is distinct from OS and/or
distribution versions. For instance: distribution versions. For instance:
>>> external.distro.id() >>> distro.id()
'centos' 'centos'
>>> external.distro.version() >>> distro.version()
'7' '7'
>>> platform.release() >>> platform.release()
'5.10.84+' '5.10.84+'
@ -39,9 +39,9 @@ class LinuxDistro(OperatingSystem):
def __init__(self): def __init__(self):
try: try:
# This will throw an error if imported on a non-Linux platform. # This will throw an error if imported on a non-Linux platform.
import external.distro import distro
distname, version = external.distro.id(), external.distro.version() distname, version = distro.id(), distro.version()
except ImportError: except ImportError:
distname, version = "unknown", "" distname, version = "unknown", ""

View file

@ -9,8 +9,8 @@
import shutil import shutil
import sys import sys
import jsonschema
import pytest import pytest
from jsonschema import ValidationError, validate
from llnl.util.filesystem import mkdirp, working_dir from llnl.util.filesystem import mkdirp, working_dir
@ -1313,7 +1313,7 @@ def test_push_mirror_contents(
index_path = os.path.join(buildcache_path, "index.json") index_path = os.path.join(buildcache_path, "index.json")
with open(index_path) as idx_fd: with open(index_path) as idx_fd:
index_object = json.load(idx_fd) index_object = json.load(idx_fd)
validate(index_object, db_idx_schema) jsonschema.validate(index_object, db_idx_schema)
# Now that index is regenerated, validate "buildcache list" output # Now that index is regenerated, validate "buildcache list" output
buildcache_list_output = buildcache_cmd("list", output=str) buildcache_list_output = buildcache_cmd("list", output=str)
@ -1325,7 +1325,7 @@ def test_push_mirror_contents(
spec_json_path = os.path.join(buildcache_path, file_name) spec_json_path = os.path.join(buildcache_path, file_name)
with open(spec_json_path) as json_fd: with open(spec_json_path) as json_fd:
json_object = Spec.extract_json_from_clearsig(json_fd.read()) json_object = Spec.extract_json_from_clearsig(json_fd.read())
validate(json_object, specfile_schema) jsonschema.validate(json_object, specfile_schema)
logs_dir = working_dir.join("logs_dir") logs_dir = working_dir.join("logs_dir")
if not os.path.exists(logs_dir.strpath): if not os.path.exists(logs_dir.strpath):
@ -1630,7 +1630,7 @@ def test_ci_rebuild_index(
index_path = os.path.join(buildcache_path, "index.json") index_path = os.path.join(buildcache_path, "index.json")
with open(index_path) as idx_fd: with open(index_path) as idx_fd:
index_object = json.load(idx_fd) index_object = json.load(idx_fd)
validate(index_object, db_idx_schema) jsonschema.validate(index_object, db_idx_schema)
def test_ci_generate_bootstrap_prune_dag( def test_ci_generate_bootstrap_prune_dag(
@ -1911,21 +1911,21 @@ def test_ensure_only_one_temporary_storage():
# User can specify "enable-artifacts-buildcache" (boolean) # User can specify "enable-artifacts-buildcache" (boolean)
yaml_obj = syaml.load(gitlab_ci_template.format(enable_artifacts)) yaml_obj = syaml.load(gitlab_ci_template.format(enable_artifacts))
validate(yaml_obj, gitlab_ci_schema) jsonschema.validate(yaml_obj, gitlab_ci_schema)
# User can also specify "temporary-storage-url-prefix" (string) # User can also specify "temporary-storage-url-prefix" (string)
yaml_obj = syaml.load(gitlab_ci_template.format(temp_storage)) yaml_obj = syaml.load(gitlab_ci_template.format(temp_storage))
validate(yaml_obj, gitlab_ci_schema) jsonschema.validate(yaml_obj, gitlab_ci_schema)
# However, specifying both should fail to validate # However, specifying both should fail to validate
yaml_obj = syaml.load(gitlab_ci_template.format(specify_both)) yaml_obj = syaml.load(gitlab_ci_template.format(specify_both))
with pytest.raises(ValidationError): with pytest.raises(jsonschema.ValidationError):
validate(yaml_obj, gitlab_ci_schema) jsonschema.validate(yaml_obj, gitlab_ci_schema)
# Specifying neither should be fine too, as neither of these properties # Specifying neither should be fine too, as neither of these properties
# should be required # should be required
yaml_obj = syaml.load(gitlab_ci_template.format(specify_neither)) yaml_obj = syaml.load(gitlab_ci_template.format(specify_neither))
validate(yaml_obj, gitlab_ci_schema) jsonschema.validate(yaml_obj, gitlab_ci_schema)
def test_ci_generate_temp_storage_url( def test_ci_generate_temp_storage_url(

View file

@ -20,7 +20,7 @@
_use_uuid = False _use_uuid = False
pass pass
from jsonschema import validate import jsonschema
import llnl.util.lock as lk import llnl.util.lock as lk
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
@ -456,7 +456,7 @@ def test_005_db_exists(database):
with open(index_file) as fd: with open(index_file) as fd:
index_object = json.load(fd) index_object = json.load(fd)
validate(index_object, schema) jsonschema.validate(index_object, schema)
def test_010_all_install_sanity(database): def test_010_all_install_sanity(database):
@ -750,7 +750,7 @@ def test_old_external_entries_prefix(mutable_database):
with open(spack.store.db._index_path, "r") as f: with open(spack.store.db._index_path, "r") as f:
db_obj = json.loads(f.read()) db_obj = json.loads(f.read())
validate(db_obj, schema) jsonschema.validate(db_obj, schema)
s = spack.spec.Spec("externaltool") s = spack.spec.Spec("externaltool")
s.concretize() s.concretize()

View file

@ -18,6 +18,7 @@ def main(argv=None):
# Add external libs # Add external libs
spack_external_libs = os.path.join(spack_lib_path, "external") spack_external_libs = os.path.join(spack_lib_path, "external")
sys.path.insert(0, os.path.join(spack_external_libs, "_vendoring"))
sys.path.insert(0, spack_external_libs) sys.path.insert(0, spack_external_libs)
# Here we delete ruamel.yaml in case it has been already imported from site # Here we delete ruamel.yaml in case it has been already imported from site
# (see #9206 for a broader description of the issue). # (see #9206 for a broader description of the issue).

View file

@ -4,8 +4,6 @@ description="The spack package manager"
dependencies=[ dependencies=[
"clingo", "clingo",
"setuptools", "setuptools",
"six",
"types-six",
] ]
dynamic = ["version"] dynamic = ["version"]
@ -21,8 +19,8 @@ dev = [
"pytest", "pytest",
"pytest-xdist", "pytest-xdist",
"setuptools", "setuptools",
"click==8.0.2", "click",
'black==21.12b0', 'black',
"mypy", "mypy",
"isort", "isort",
"flake8", "flake8",
@ -195,3 +193,43 @@ ignore_errors = true
[tool.coverage.html] [tool.coverage.html]
directory = "htmlcov" 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",
]
[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"