},
'filters': ['abs', 'attr', 'batch', 'capitalize', 'center', 'count', 'd',
..., 'urlencode', 'urlize', 'wordcount', 'wordwrap', 'xmlattr'],
'tests': ['!=', '<', '<=', '==', '>', '>=', 'callable', 'defined',
@@ -679,7 +679,7 @@ def extract_from_ast(
This example explains the behavior:
- >>> from jinja2 import Environment
+ >>> from _vendoring.jinja2 import Environment
>>> env = Environment()
>>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}')
>>> list(extract_from_ast(node))
diff --git a/lib/spack/external/_vendoring/jinja2/filters.py b/lib/spack/external/_vendoring/jinja2/filters.py
index ffb98bf4e33..97757d18419 100644
--- a/lib/spack/external/_vendoring/jinja2/filters.py
+++ b/lib/spack/external/_vendoring/jinja2/filters.py
@@ -9,9 +9,9 @@
from itertools import chain
from itertools import groupby
-from markupsafe import escape
-from markupsafe import Markup
-from markupsafe import soft_str
+from _vendoring.markupsafe import escape
+from _vendoring.markupsafe import Markup
+from _vendoring.markupsafe import soft_str
from .async_utils import async_variant
from .async_utils import auto_aiter
@@ -28,7 +28,7 @@
from .utils import urlize
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
from .environment import Environment
from .nodes import EvalContext
from .runtime import Context
@@ -48,7 +48,7 @@ def contextfilter(f: F) -> F:
"""Pass the context as the first argument to the decorated function.
.. deprecated:: 3.0
- Will be removed in Jinja 3.1. Use :func:`~jinja2.pass_context`
+ Will be removed in Jinja 3.1. Use :func:`~_vendoring.jinja2.pass_context`
instead.
"""
warnings.warn(
@@ -66,7 +66,7 @@ def evalcontextfilter(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
- :func:`~jinja2.pass_eval_context` instead.
+ :func:`~_vendoring.jinja2.pass_eval_context` instead.
.. versionadded:: 2.4
"""
@@ -85,7 +85,7 @@ def environmentfilter(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
- :func:`~jinja2.pass_environment` instead.
+ :func:`~_vendoring.jinja2.pass_environment` instead.
"""
warnings.warn(
"'environmentfilter' is renamed to 'pass_environment', the old"
@@ -547,10 +547,10 @@ def do_default(
{{ ''|default('the string was empty', true) }}
.. versionchanged:: 2.11
- It's now possible to configure the :class:`~jinja2.Environment` with
- :class:`~jinja2.ChainableUndefined` to make the `default` filter work
+ It's now possible to configure the :class:`~_vendoring.jinja2.Environment` with
+ :class:`~_vendoring.jinja2.ChainableUndefined` to make the `default` filter work
on nested elements and attributes that may contain undefined values
- in the chain without getting an :exc:`~jinja2.UndefinedError`.
+ in the chain without getting an :exc:`~_vendoring.jinja2.UndefinedError`.
"""
if isinstance(value, Undefined) or (boolean and not value):
return default_value
diff --git a/lib/spack/external/_vendoring/jinja2/lexer.py b/lib/spack/external/_vendoring/jinja2/lexer.py
index c25ab0f6901..943cf9023f2 100644
--- a/lib/spack/external/_vendoring/jinja2/lexer.py
+++ b/lib/spack/external/_vendoring/jinja2/lexer.py
@@ -14,7 +14,7 @@
from .utils import LRUCache
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
from .environment import Environment
# cache for the lexers. Exists in order to be able to have multiple
@@ -400,7 +400,7 @@ def close(self) -> None:
def expect(self, expr: str) -> Token:
"""Expect a given token type and return it. This accepts the same
- argument as :meth:`jinja2.lexer.Token.test`.
+ argument as :meth:`_vendoring.jinja2.lexer.Token.test`.
"""
if not self.current.test(expr):
expr = describe_token_expr(expr)
diff --git a/lib/spack/external/_vendoring/jinja2/loaders.py b/lib/spack/external/_vendoring/jinja2/loaders.py
index 4fac3a09665..8b3929dcd73 100644
--- a/lib/spack/external/_vendoring/jinja2/loaders.py
+++ b/lib/spack/external/_vendoring/jinja2/loaders.py
@@ -47,7 +47,7 @@ class BaseLoader:
A very basic example for a loader that looks up templates on the file
system could look like this::
- from jinja2 import BaseLoader, TemplateNotFound
+ from _vendoring.jinja2 import BaseLoader, TemplateNotFound
from os.path import join, exists, getmtime
class MyLoader(BaseLoader):
@@ -594,7 +594,7 @@ class ModuleLoader(BaseLoader):
def __init__(
self, path: t.Union[str, os.PathLike, t.Sequence[t.Union[str, os.PathLike]]]
) -> None:
- package_name = f"_jinja2_module_templates_{id(self):x}"
+ package_name = f"__vendoring.jinja2_module_templates_{id(self):x}"
# create a fake module that looks for the templates in the
# path given.
diff --git a/lib/spack/external/_vendoring/jinja2/meta.py b/lib/spack/external/_vendoring/jinja2/meta.py
index 0057d6eabad..6b42e8cef35 100644
--- a/lib/spack/external/_vendoring/jinja2/meta.py
+++ b/lib/spack/external/_vendoring/jinja2/meta.py
@@ -36,7 +36,7 @@ def find_undeclared_variables(ast: nodes.Template) -> t.Set[str]:
variables will be used depending on the path the execution takes at
runtime, all variables are returned.
- >>> from jinja2 import Environment, meta
+ >>> from _vendoring.jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
>>> meta.find_undeclared_variables(ast) == {'bar'}
@@ -64,7 +64,7 @@ def find_referenced_templates(ast: nodes.Template) -> t.Iterator[t.Optional[str]
imports. If dynamic inheritance or inclusion is used, `None` will be
yielded.
- >>> from jinja2 import Environment, meta
+ >>> from _vendoring.jinja2 import Environment, meta
>>> env = Environment()
>>> ast = env.parse('{% extends "layout.html" %}{% include helper %}')
>>> list(meta.find_referenced_templates(ast))
diff --git a/lib/spack/external/_vendoring/jinja2/nodes.py b/lib/spack/external/_vendoring/jinja2/nodes.py
index b2f88d9d9c1..f9b5c322d6e 100644
--- a/lib/spack/external/_vendoring/jinja2/nodes.py
+++ b/lib/spack/external/_vendoring/jinja2/nodes.py
@@ -7,12 +7,12 @@
import typing as t
from collections import deque
-from markupsafe import Markup
+from _vendoring.markupsafe import Markup
from .utils import _PassArg
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
from .environment import Environment
_NodeBound = t.TypeVar("_NodeBound", bound="Node")
@@ -1041,7 +1041,7 @@ class ExtensionAttribute(Expr):
The identifier is the identifier of the :class:`Extension`.
This node is usually constructed by calling the
- :meth:`~jinja2.ext.Extension.attr` method on an extension.
+ :meth:`~_vendoring.jinja2.ext.Extension.attr` method on an extension.
"""
fields = ("identifier", "name")
@@ -1063,7 +1063,7 @@ class ImportedName(Expr):
class InternalName(Expr):
"""An internal name in the compiler. You cannot create these nodes
yourself but the parser provides a
- :meth:`~jinja2.parser.Parser.free_identifier` method that creates
+ :meth:`~_vendoring.jinja2.parser.Parser.free_identifier` method that creates
a new identifier for you. This identifier is not available from the
template and is not treated specially by the compiler.
"""
@@ -1114,7 +1114,7 @@ def as_const(
class ContextReference(Expr):
"""Returns the current template context. It can be used like a
:class:`Name` node, with a ``'load'`` ctx and will return the
- current :class:`~jinja2.runtime.Context` object.
+ current :class:`~_vendoring.jinja2.runtime.Context` object.
Here an example that assigns the current template name to a
variable named `foo`::
@@ -1123,7 +1123,7 @@ class ContextReference(Expr):
Getattr(ContextReference(), 'name'))
This is basically equivalent to using the
- :func:`~jinja2.pass_context` decorator when using the high-level
+ :func:`~_vendoring.jinja2.pass_context` decorator when using the high-level
API, which causes a reference to the context to be passed as the
first argument to a function.
"""
@@ -1188,7 +1188,7 @@ class EvalContextModifier(Stmt):
class ScopedEvalContextModifier(EvalContextModifier):
"""Modifies the eval context and reverts it later. Works exactly like
:class:`EvalContextModifier` but will only modify the
- :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
+ :class:`~_vendoring.jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
"""
fields = ("body",)
diff --git a/lib/spack/external/_vendoring/jinja2/parser.py b/lib/spack/external/_vendoring/jinja2/parser.py
index 7ad73fcc0f0..050de2526a4 100644
--- a/lib/spack/external/_vendoring/jinja2/parser.py
+++ b/lib/spack/external/_vendoring/jinja2/parser.py
@@ -9,7 +9,7 @@
from .lexer import describe_token_expr
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
from .environment import Environment
_ImportInclude = t.TypeVar("_ImportInclude", nodes.Import, nodes.Include)
@@ -156,7 +156,7 @@ def is_tuple_end(
return False
def free_identifier(self, lineno: t.Optional[int] = None) -> nodes.InternalName:
- """Return a new free identifier as :class:`~jinja2.nodes.InternalName`."""
+ """Return a new free identifier as :class:`~_vendoring.jinja2.nodes.InternalName`."""
self._last_identifier += 1
rv = object.__new__(nodes.InternalName)
nodes.Node.__init__(rv, f"fi{self._last_identifier}", lineno=lineno)
@@ -687,7 +687,7 @@ def parse_tuple(
explicit_parentheses: bool = False,
) -> t.Union[nodes.Tuple, nodes.Expr]:
"""Works like `parse_expression` but if multiple expressions are
- delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
+ delimited by a comma a :class:`~_vendoring.jinja2.nodes.Tuple` node is created.
This method could also return a regular expression instead of a tuple
if no commas where found.
diff --git a/lib/spack/external/_vendoring/jinja2/runtime.py b/lib/spack/external/_vendoring/jinja2/runtime.py
index 2346cf2bac1..38ba42ad97a 100644
--- a/lib/spack/external/_vendoring/jinja2/runtime.py
+++ b/lib/spack/external/_vendoring/jinja2/runtime.py
@@ -5,9 +5,9 @@
from collections import abc
from itertools import chain
-from markupsafe import escape # noqa: F401
-from markupsafe import Markup
-from markupsafe import soft_str
+from _vendoring.markupsafe import escape # noqa: F401
+from _vendoring.markupsafe import Markup
+from _vendoring.markupsafe import soft_str
from .async_utils import auto_aiter
from .async_utils import auto_await # noqa: F401
@@ -28,7 +28,7 @@
if t.TYPE_CHECKING:
import logging
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
from .environment import Environment
class LoopRenderFunc(te.Protocol):
@@ -849,7 +849,7 @@ class Undefined:
>>> foo + 42
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = (
@@ -1020,7 +1020,7 @@ class ChainableUndefined(Undefined):
>>> foo.bar['baz'] + 42
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
.. versionadded:: 2.11.0
"""
@@ -1047,7 +1047,7 @@ class DebugUndefined(Undefined):
>>> foo + 42
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = ()
@@ -1077,15 +1077,15 @@ class StrictUndefined(Undefined):
>>> str(foo)
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
>>> not foo
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
>>> foo + 42
Traceback (most recent call last):
...
- jinja2.exceptions.UndefinedError: 'foo' is undefined
+ _vendoring.jinja2.exceptions.UndefinedError: 'foo' is undefined
"""
__slots__ = ()
diff --git a/lib/spack/external/_vendoring/jinja2/sandbox.py b/lib/spack/external/_vendoring/jinja2/sandbox.py
index 42948847769..ef9262d3637 100644
--- a/lib/spack/external/_vendoring/jinja2/sandbox.py
+++ b/lib/spack/external/_vendoring/jinja2/sandbox.py
@@ -9,8 +9,8 @@
from collections import deque
from string import Formatter
-from markupsafe import EscapeFormatter
-from markupsafe import Markup
+from _vendoring.markupsafe import EscapeFormatter
+from _vendoring.markupsafe import Markup
from .environment import Environment
from .exceptions import SecurityError
@@ -128,7 +128,7 @@ def is_internal_attribute(obj: t.Any, attr: str) -> bool:
python objects. This is useful if the environment method
:meth:`~SandboxedEnvironment.is_safe_attribute` is overridden.
- >>> from jinja2.sandbox import is_internal_attribute
+ >>> from _vendoring.jinja2.sandbox import is_internal_attribute
>>> is_internal_attribute(str, "mro")
True
>>> is_internal_attribute(str, "upper")
diff --git a/lib/spack/external/_vendoring/jinja2/utils.py b/lib/spack/external/_vendoring/jinja2/utils.py
index 567185f41fc..4f51efba8cf 100644
--- a/lib/spack/external/_vendoring/jinja2/utils.py
+++ b/lib/spack/external/_vendoring/jinja2/utils.py
@@ -12,10 +12,10 @@
from types import CodeType
from urllib.parse import quote_from_bytes
-import markupsafe
+import _vendoring.markupsafe
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
F = t.TypeVar("F", bound=t.Callable[..., t.Any])
@@ -28,7 +28,7 @@
def pass_context(f: F) -> F:
- """Pass the :class:`~jinja2.runtime.Context` as the first argument
+ """Pass the :class:`~_vendoring.jinja2.runtime.Context` as the first argument
to the decorated function when called while rendering a template.
Can be used on functions, filters, and tests.
@@ -45,7 +45,7 @@ def pass_context(f: F) -> F:
def pass_eval_context(f: F) -> F:
- """Pass the :class:`~jinja2.nodes.EvalContext` as the first argument
+ """Pass the :class:`~_vendoring.jinja2.nodes.EvalContext` as the first argument
to the decorated function when called while rendering a template.
See :ref:`eval-context`.
@@ -62,7 +62,7 @@ def pass_eval_context(f: F) -> F:
def pass_environment(f: F) -> F:
- """Pass the :class:`~jinja2.Environment` as the first argument to
+ """Pass the :class:`~_vendoring.jinja2.Environment` as the first argument to
the decorated function when called while rendering a template.
Can be used on functions, filters, and tests.
@@ -104,7 +104,7 @@ def contextfunction(f: F) -> F:
"""Pass the context as the first argument to the decorated function.
.. deprecated:: 3.0
- Will be removed in Jinja 3.1. Use :func:`~jinja2.pass_context`
+ Will be removed in Jinja 3.1. Use :func:`~_vendoring.jinja2.pass_context`
instead.
"""
warnings.warn(
@@ -122,7 +122,7 @@ def evalcontextfunction(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
- :func:`~jinja2.pass_eval_context` instead.
+ :func:`~_vendoring.jinja2.pass_eval_context` instead.
.. versionadded:: 2.4
"""
@@ -141,7 +141,7 @@ def environmentfunction(f: F) -> F:
.. deprecated:: 3.0
Will be removed in Jinja 3.1. Use
- :func:`~jinja2.pass_environment` instead.
+ :func:`~_vendoring.jinja2.pass_environment` instead.
"""
warnings.warn(
"'environmentfunction' is renamed to 'pass_environment', the"
@@ -335,9 +335,9 @@ def trim_url(x: str) -> str:
def trim_url(x: str) -> str:
return x
- words = re.split(r"(\s+)", str(markupsafe.escape(text)))
- rel_attr = f' rel="{markupsafe.escape(rel)}"' if rel else ""
- target_attr = f' target="{markupsafe.escape(target)}"' if target else ""
+ words = re.split(r"(\s+)", str(_vendoring.markupsafe.escape(text)))
+ rel_attr = f' rel="{_vendoring.markupsafe.escape(rel)}"' if rel else ""
+ target_attr = f' target="{_vendoring.markupsafe.escape(target)}"' if target else ""
for i, word in enumerate(words):
head, middle, tail = "", word, ""
@@ -455,8 +455,8 @@ def generate_lorem_ipsum(
if not html:
return "\n\n".join(result)
- return markupsafe.Markup(
- "\n".join(f"{markupsafe.escape(x)}
" for x in result)
+ return _vendoring.markupsafe.Markup(
+ "\n".join(f"{_vendoring.markupsafe.escape(x)}
" for x in result)
)
@@ -658,7 +658,7 @@ def select_autoescape(
If you want to enable it for all templates created from strings or
for all templates with `.html` and `.xml` extensions::
- from jinja2 import Environment, select_autoescape
+ from _vendoring.jinja2 import Environment, select_autoescape
env = Environment(autoescape=select_autoescape(
enabled_extensions=('html', 'xml'),
default_for_string=True,
@@ -667,7 +667,7 @@ def select_autoescape(
Example configuration to turn it on at all times except if the template
ends with `.txt`::
- from jinja2 import Environment, select_autoescape
+ from _vendoring.jinja2 import Environment, select_autoescape
env = Environment(autoescape=select_autoescape(
disabled_extensions=('txt',),
default_for_string=True,
@@ -703,10 +703,10 @@ def autoescape(template_name: t.Optional[str]) -> bool:
def htmlsafe_json_dumps(
obj: t.Any, dumps: t.Optional[t.Callable[..., str]] = None, **kwargs: t.Any
-) -> markupsafe.Markup:
+) -> _vendoring.markupsafe.Markup:
"""Serialize an object to a string of JSON with :func:`json.dumps`,
then replace HTML-unsafe characters with Unicode escapes and mark
- the result safe with :class:`~markupsafe.Markup`.
+ the result safe with :class:`~_vendoring.markupsafe.Markup`.
This is available in templates as the ``|tojson`` filter.
@@ -732,7 +732,7 @@ def htmlsafe_json_dumps(
if dumps is None:
dumps = json.dumps
- return markupsafe.Markup(
+ return _vendoring.markupsafe.Markup(
dumps(obj, **kwargs)
.replace("<", "\\u003c")
.replace(">", "\\u003e")
@@ -833,11 +833,11 @@ def __repr__(self) -> str:
return f""
-class Markup(markupsafe.Markup):
+class Markup(_vendoring.markupsafe.Markup):
def __new__(cls, base="", encoding=None, errors="strict"): # type: ignore
warnings.warn(
- "'jinja2.Markup' is deprecated and will be removed in Jinja"
- " 3.1. Import 'markupsafe.Markup' instead.",
+ "'_vendoring.jinja2.Markup' is deprecated and will be removed in Jinja"
+ " 3.1. Import '_vendoring.markupsafe.Markup' instead.",
DeprecationWarning,
stacklevel=2,
)
@@ -846,9 +846,9 @@ def __new__(cls, base="", encoding=None, errors="strict"): # type: ignore
def escape(s: t.Any) -> str:
warnings.warn(
- "'jinja2.escape' is deprecated and will be removed in Jinja"
- " 3.1. Import 'markupsafe.escape' instead.",
+ "'_vendoring.jinja2.escape' is deprecated and will be removed in Jinja"
+ " 3.1. Import '_vendoring.markupsafe.escape' instead.",
DeprecationWarning,
stacklevel=2,
)
- return markupsafe.escape(s)
+ return _vendoring.markupsafe.escape(s)
diff --git a/lib/spack/external/_vendoring/jinja2/visitor.py b/lib/spack/external/_vendoring/jinja2/visitor.py
index b150e578a8e..87fe7de6a97 100644
--- a/lib/spack/external/_vendoring/jinja2/visitor.py
+++ b/lib/spack/external/_vendoring/jinja2/visitor.py
@@ -6,7 +6,7 @@
from .nodes import Node
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
class VisitCallable(te.Protocol):
def __call__(self, node: Node, *args: t.Any, **kwargs: t.Any) -> t.Any:
diff --git a/lib/spack/external/_vendoring/jsonschema/__init__.py b/lib/spack/external/_vendoring/jsonschema/__init__.py
index 1791fe7fbf0..498105842b7 100644
--- a/lib/spack/external/_vendoring/jsonschema/__init__.py
+++ b/lib/spack/external/_vendoring/jsonschema/__init__.py
@@ -8,18 +8,18 @@
instance under a schema, and will create a validator for you.
"""
-from jsonschema.exceptions import (
+from _vendoring.jsonschema.exceptions import (
ErrorTree, FormatError, RefResolutionError, SchemaError, ValidationError
)
-from jsonschema._format import (
+from _vendoring.jsonschema._format import (
FormatChecker,
draft3_format_checker,
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
)
-from jsonschema._types import TypeChecker
-from jsonschema.validators import (
+from _vendoring.jsonschema._types import TypeChecker
+from _vendoring.jsonschema.validators import (
Draft3Validator,
Draft4Validator,
Draft6Validator,
diff --git a/lib/spack/external/_vendoring/jsonschema/__main__.py b/lib/spack/external/_vendoring/jsonschema/__main__.py
index 82c29fd39e7..5d8c6436061 100644
--- a/lib/spack/external/_vendoring/jsonschema/__main__.py
+++ b/lib/spack/external/_vendoring/jsonschema/__main__.py
@@ -1,2 +1,2 @@
-from jsonschema.cli import main
+from _vendoring.jsonschema.cli import main
main()
diff --git a/lib/spack/external/_vendoring/jsonschema/_format.py b/lib/spack/external/_vendoring/jsonschema/_format.py
index 29061e3661f..922ee3c63c3 100644
--- a/lib/spack/external/_vendoring/jsonschema/_format.py
+++ b/lib/spack/external/_vendoring/jsonschema/_format.py
@@ -3,8 +3,8 @@
import socket
import struct
-from jsonschema.compat import str_types
-from jsonschema.exceptions import FormatError
+from _vendoring.jsonschema.compat import str_types
+from _vendoring.jsonschema.exceptions import FormatError
class FormatChecker(object):
diff --git a/lib/spack/external/_vendoring/jsonschema/_legacy_validators.py b/lib/spack/external/_vendoring/jsonschema/_legacy_validators.py
index 264ff7d7135..fd5724d398c 100644
--- a/lib/spack/external/_vendoring/jsonschema/_legacy_validators.py
+++ b/lib/spack/external/_vendoring/jsonschema/_legacy_validators.py
@@ -1,6 +1,6 @@
-from jsonschema import _utils
-from jsonschema.compat import iteritems
-from jsonschema.exceptions import ValidationError
+from _vendoring.jsonschema import _utils
+from _vendoring.jsonschema.compat import iteritems
+from _vendoring.jsonschema.exceptions import ValidationError
def dependencies_draft3(validator, dependencies, instance, schema):
diff --git a/lib/spack/external/_vendoring/jsonschema/_reflect.py b/lib/spack/external/_vendoring/jsonschema/_reflect.py
index d09e38fbdcf..29e8bb5f25a 100644
--- a/lib/spack/external/_vendoring/jsonschema/_reflect.py
+++ b/lib/spack/external/_vendoring/jsonschema/_reflect.py
@@ -9,7 +9,7 @@
import sys
-from jsonschema.compat import PY3
+from _vendoring.jsonschema.compat import PY3
class _NoModuleFound(Exception):
diff --git a/lib/spack/external/_vendoring/jsonschema/_types.py b/lib/spack/external/_vendoring/jsonschema/_types.py
index a71a4e34bdc..f669beb1406 100644
--- a/lib/spack/external/_vendoring/jsonschema/_types.py
+++ b/lib/spack/external/_vendoring/jsonschema/_types.py
@@ -1,10 +1,10 @@
import numbers
-from pyrsistent import pmap
-import attr
+from _vendoring.pyrsistent import pmap
+import _vendoring.attr
-from jsonschema.compat import int_types, str_types
-from jsonschema.exceptions import UndefinedTypeCheck
+from _vendoring.jsonschema.compat import int_types, str_types
+from _vendoring.jsonschema.exceptions import UndefinedTypeCheck
def is_array(checker, instance):
@@ -45,7 +45,7 @@ def is_any(checker, instance):
return True
-@attr.s(frozen=True)
+@_vendoring.attr.s(frozen=True)
class TypeChecker(object):
"""
A ``type`` property checker.
@@ -61,7 +61,7 @@ class TypeChecker(object):
The initial mapping of types to their checking functions.
"""
- _type_checkers = attr.ib(default=pmap(), converter=pmap)
+ _type_checkers = _vendoring.attr.ib(default=pmap(), converter=pmap)
def is_type(self, instance, type):
"""
@@ -131,7 +131,7 @@ def redefine_many(self, definitions=()):
A new `TypeChecker` instance.
"""
- return attr.evolve(
+ return _vendoring.attr.evolve(
self, type_checkers=self._type_checkers.update(definitions),
)
@@ -162,7 +162,7 @@ def remove(self, *types):
checkers = checkers.remove(each)
except KeyError:
raise UndefinedTypeCheck(each)
- return attr.evolve(self, type_checkers=checkers)
+ return _vendoring.attr.evolve(self, type_checkers=checkers)
draft3_type_checker = TypeChecker(
diff --git a/lib/spack/external/_vendoring/jsonschema/_utils.py b/lib/spack/external/_vendoring/jsonschema/_utils.py
index ceb880198d1..452eecc96f5 100644
--- a/lib/spack/external/_vendoring/jsonschema/_utils.py
+++ b/lib/spack/external/_vendoring/jsonschema/_utils.py
@@ -3,7 +3,7 @@
import pkgutil
import re
-from jsonschema.compat import MutableMapping, str_types, urlsplit
+from _vendoring.jsonschema.compat import MutableMapping, str_types, urlsplit
class URIDict(MutableMapping):
@@ -51,7 +51,7 @@ def load_schema(name):
Load a schema from ./schemas/``name``.json and return it.
"""
- data = pkgutil.get_data("jsonschema", "schemas/{0}.json".format(name))
+ data = pkgutil.get_data("_vendoring.jsonschema", "schemas/{0}.json".format(name))
return json.loads(data.decode("utf-8"))
diff --git a/lib/spack/external/_vendoring/jsonschema/_validators.py b/lib/spack/external/_vendoring/jsonschema/_validators.py
index 179fec09a94..c49d81fd503 100644
--- a/lib/spack/external/_vendoring/jsonschema/_validators.py
+++ b/lib/spack/external/_vendoring/jsonschema/_validators.py
@@ -1,6 +1,6 @@
import re
-from jsonschema._utils import (
+from _vendoring.jsonschema._utils import (
ensure_list,
equal,
extras_msg,
@@ -9,8 +9,8 @@
unbool,
uniq,
)
-from jsonschema.exceptions import FormatError, ValidationError
-from jsonschema.compat import iteritems
+from _vendoring.jsonschema.exceptions import FormatError, ValidationError
+from _vendoring.jsonschema.compat import iteritems
def patternProperties(validator, patternProperties, instance, schema):
diff --git a/lib/spack/external/_vendoring/jsonschema/benchmarks/issue232.py b/lib/spack/external/_vendoring/jsonschema/benchmarks/issue232.py
index 65e3aedf794..e4ea5e37d00 100644
--- a/lib/spack/external/_vendoring/jsonschema/benchmarks/issue232.py
+++ b/lib/spack/external/_vendoring/jsonschema/benchmarks/issue232.py
@@ -6,10 +6,10 @@
"""
from twisted.python.filepath import FilePath
from pyperf import Runner
-from pyrsistent import m
+from _vendoring.pyrsistent import m
-from jsonschema.tests._suite import Version
-import jsonschema
+from _vendoring.jsonschema.tests._suite import Version
+import _vendoring.jsonschema
issue232 = Version(
diff --git a/lib/spack/external/_vendoring/jsonschema/benchmarks/json_schema_test_suite.py b/lib/spack/external/_vendoring/jsonschema/benchmarks/json_schema_test_suite.py
index 5add5051df1..d2f1b69dd1d 100644
--- a/lib/spack/external/_vendoring/jsonschema/benchmarks/json_schema_test_suite.py
+++ b/lib/spack/external/_vendoring/jsonschema/benchmarks/json_schema_test_suite.py
@@ -7,7 +7,7 @@
"""
from pyperf import Runner
-from jsonschema.tests._suite import Suite
+from _vendoring.jsonschema.tests._suite import Suite
if __name__ == "__main__":
diff --git a/lib/spack/external/_vendoring/jsonschema/cli.py b/lib/spack/external/_vendoring/jsonschema/cli.py
index ab3335b27c5..2e81ba1a53a 100644
--- a/lib/spack/external/_vendoring/jsonschema/cli.py
+++ b/lib/spack/external/_vendoring/jsonschema/cli.py
@@ -6,9 +6,9 @@
import json
import sys
-from jsonschema import __version__
-from jsonschema._reflect import namedAny
-from jsonschema.validators import validator_for
+from _vendoring.jsonschema import __version__
+from _vendoring.jsonschema._reflect import namedAny
+from _vendoring.jsonschema.validators import validator_for
def _namedAnyWithDefault(name):
diff --git a/lib/spack/external/_vendoring/jsonschema/exceptions.py b/lib/spack/external/_vendoring/jsonschema/exceptions.py
index 691dcffe6c7..6422eb47ea0 100644
--- a/lib/spack/external/_vendoring/jsonschema/exceptions.py
+++ b/lib/spack/external/_vendoring/jsonschema/exceptions.py
@@ -6,10 +6,10 @@
import pprint
import textwrap
-import attr
+import _vendoring.attr
-from jsonschema import _utils
-from jsonschema.compat import PY3, iteritems
+from _vendoring.jsonschema import _utils
+from _vendoring.jsonschema.compat import PY3, iteritems
WEAK_MATCHES = frozenset(["anyOf", "oneOf"])
@@ -149,13 +149,13 @@ class SchemaError(_Error):
_word_for_instance_in_error_message = "schema"
-@attr.s(hash=True)
+@_vendoring.attr.s(hash=True)
class RefResolutionError(Exception):
"""
A ref could not be resolved.
"""
- _cause = attr.ib()
+ _cause = _vendoring.attr.ib()
def __str__(self):
return str(self._cause)
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/_helpers.py b/lib/spack/external/_vendoring/jsonschema/tests/_helpers.py
deleted file mode 100644
index 70f291fe2ab..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/_helpers.py
+++ /dev/null
@@ -1,5 +0,0 @@
-def bug(issue=None):
- message = "A known bug."
- if issue is not None:
- message += " See issue #{issue}.".format(issue=issue)
- return message
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/_suite.py b/lib/spack/external/_vendoring/jsonschema/tests/_suite.py
deleted file mode 100644
index b68a7b668c9..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/_suite.py
+++ /dev/null
@@ -1,239 +0,0 @@
-"""
-Python representations of the JSON Schema Test Suite tests.
-"""
-
-from functools import partial
-import json
-import os
-import re
-import subprocess
-import sys
-import unittest
-
-from twisted.python.filepath import FilePath
-import attr
-
-from jsonschema.compat import PY3
-from jsonschema.validators import validators
-import jsonschema
-
-
-def _find_suite():
- root = os.environ.get("JSON_SCHEMA_TEST_SUITE")
- if root is not None:
- return FilePath(root)
-
- root = FilePath(jsonschema.__file__).parent().sibling("json")
- if not root.isdir(): # pragma: no cover
- raise ValueError(
- (
- "Can't find the JSON-Schema-Test-Suite directory. "
- "Set the 'JSON_SCHEMA_TEST_SUITE' environment "
- "variable or run the tests from alongside a checkout "
- "of the suite."
- ),
- )
- return root
-
-
-@attr.s(hash=True)
-class Suite(object):
-
- _root = attr.ib(default=attr.Factory(_find_suite))
-
- def _remotes(self):
- jsonschema_suite = self._root.descendant(["bin", "jsonschema_suite"])
- remotes = subprocess.check_output(
- [sys.executable, jsonschema_suite.path, "remotes"],
- )
- return {
- "http://localhost:1234/" + name: schema
- for name, schema in json.loads(remotes.decode("utf-8")).items()
- }
-
- def benchmark(self, runner): # pragma: no cover
- for name in validators:
- self.version(name=name).benchmark(runner=runner)
-
- def version(self, name):
- return Version(
- name=name,
- path=self._root.descendant(["tests", name]),
- remotes=self._remotes(),
- )
-
-
-@attr.s(hash=True)
-class Version(object):
-
- _path = attr.ib()
- _remotes = attr.ib()
-
- name = attr.ib()
-
- def benchmark(self, runner, **kwargs): # pragma: no cover
- for suite in self.tests():
- for test in suite:
- runner.bench_func(
- test.fully_qualified_name,
- partial(test.validate_ignoring_errors, **kwargs),
- )
-
- def tests(self):
- return (
- test
- for child in self._path.globChildren("*.json")
- for test in self._tests_in(
- subject=child.basename()[:-5],
- path=child,
- )
- )
-
- def format_tests(self):
- path = self._path.descendant(["optional", "format"])
- return (
- test
- for child in path.globChildren("*.json")
- for test in self._tests_in(
- subject=child.basename()[:-5],
- path=child,
- )
- )
-
- def tests_of(self, name):
- return self._tests_in(
- subject=name,
- path=self._path.child(name + ".json"),
- )
-
- def optional_tests_of(self, name):
- return self._tests_in(
- subject=name,
- path=self._path.descendant(["optional", name + ".json"]),
- )
-
- def to_unittest_testcase(self, *suites, **kwargs):
- name = kwargs.pop("name", "Test" + self.name.title())
- methods = {
- test.method_name: test.to_unittest_method(**kwargs)
- for suite in suites
- for tests in suite
- for test in tests
- }
- cls = type(name, (unittest.TestCase,), methods)
-
- try:
- cls.__module__ = _someone_save_us_the_module_of_the_caller()
- except Exception: # pragma: no cover
- # We're doing crazy things, so if they go wrong, like a function
- # behaving differently on some other interpreter, just make them
- # not happen.
- pass
-
- return cls
-
- def _tests_in(self, subject, path):
- for each in json.loads(path.getContent().decode("utf-8")):
- yield (
- _Test(
- version=self,
- subject=subject,
- case_description=each["description"],
- schema=each["schema"],
- remotes=self._remotes,
- **test
- ) for test in each["tests"]
- )
-
-
-@attr.s(hash=True, repr=False)
-class _Test(object):
-
- version = attr.ib()
-
- subject = attr.ib()
- case_description = attr.ib()
- description = attr.ib()
-
- data = attr.ib()
- schema = attr.ib(repr=False)
-
- valid = attr.ib()
-
- _remotes = attr.ib()
-
- def __repr__(self): # pragma: no cover
- return "".format(self.fully_qualified_name)
-
- @property
- def fully_qualified_name(self): # pragma: no cover
- return " > ".join(
- [
- self.version.name,
- self.subject,
- self.case_description,
- self.description,
- ]
- )
-
- @property
- def method_name(self):
- delimiters = r"[\W\- ]+"
- name = "test_%s_%s_%s" % (
- re.sub(delimiters, "_", self.subject),
- re.sub(delimiters, "_", self.case_description),
- re.sub(delimiters, "_", self.description),
- )
-
- if not PY3: # pragma: no cover
- name = name.encode("utf-8")
- return name
-
- def to_unittest_method(self, skip=lambda test: None, **kwargs):
- if self.valid:
- def fn(this):
- self.validate(**kwargs)
- else:
- def fn(this):
- with this.assertRaises(jsonschema.ValidationError):
- self.validate(**kwargs)
-
- fn.__name__ = self.method_name
- reason = skip(self)
- return unittest.skipIf(reason is not None, reason)(fn)
-
- def validate(self, Validator, **kwargs):
- resolver = jsonschema.RefResolver.from_schema(
- schema=self.schema,
- store=self._remotes,
- id_of=Validator.ID_OF,
- )
- jsonschema.validate(
- instance=self.data,
- schema=self.schema,
- cls=Validator,
- resolver=resolver,
- **kwargs
- )
-
- def validate_ignoring_errors(self, Validator): # pragma: no cover
- try:
- self.validate(Validator=Validator)
- except jsonschema.ValidationError:
- pass
-
-
-def _someone_save_us_the_module_of_the_caller():
- """
- The FQON of the module 2nd stack frames up from here.
-
- This is intended to allow us to dynamicallly return test case classes that
- are indistinguishable from being defined in the module that wants them.
-
- Otherwise, trial will mis-print the FQON, and copy pasting it won't re-run
- the class that really is running.
-
- Save us all, this is all so so so so so terrible.
- """
-
- return sys._getframe(2).f_globals["__name__"]
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_cli.py b/lib/spack/external/_vendoring/jsonschema/tests/test_cli.py
deleted file mode 100644
index ed820ba3f83..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_cli.py
+++ /dev/null
@@ -1,151 +0,0 @@
-from unittest import TestCase
-import json
-import subprocess
-import sys
-
-from jsonschema import Draft4Validator, ValidationError, cli, __version__
-from jsonschema.compat import NativeIO
-from jsonschema.exceptions import SchemaError
-
-
-def fake_validator(*errors):
- errors = list(reversed(errors))
-
- class FakeValidator(object):
- def __init__(self, *args, **kwargs):
- pass
-
- def iter_errors(self, instance):
- if errors:
- return errors.pop()
- return []
-
- def check_schema(self, schema):
- pass
-
- return FakeValidator
-
-
-class TestParser(TestCase):
-
- FakeValidator = fake_validator()
- instance_file = "foo.json"
- schema_file = "schema.json"
-
- def setUp(self):
- cli.open = self.fake_open
- self.addCleanup(delattr, cli, "open")
-
- def fake_open(self, path):
- if path == self.instance_file:
- contents = ""
- elif path == self.schema_file:
- contents = {}
- else: # pragma: no cover
- self.fail("What is {!r}".format(path))
- return NativeIO(json.dumps(contents))
-
- def test_find_validator_by_fully_qualified_object_name(self):
- arguments = cli.parse_args(
- [
- "--validator",
- "jsonschema.tests.test_cli.TestParser.FakeValidator",
- "--instance", self.instance_file,
- self.schema_file,
- ]
- )
- self.assertIs(arguments["validator"], self.FakeValidator)
-
- def test_find_validator_in_jsonschema(self):
- arguments = cli.parse_args(
- [
- "--validator", "Draft4Validator",
- "--instance", self.instance_file,
- self.schema_file,
- ]
- )
- self.assertIs(arguments["validator"], Draft4Validator)
-
-
-class TestCLI(TestCase):
- def test_draft3_schema_draft4_validator(self):
- stdout, stderr = NativeIO(), NativeIO()
- with self.assertRaises(SchemaError):
- cli.run(
- {
- "validator": Draft4Validator,
- "schema": {
- "anyOf": [
- {"minimum": 20},
- {"type": "string"},
- {"required": True},
- ],
- },
- "instances": [1],
- "error_format": "{error.message}",
- },
- stdout=stdout,
- stderr=stderr,
- )
-
- def test_successful_validation(self):
- stdout, stderr = NativeIO(), NativeIO()
- exit_code = cli.run(
- {
- "validator": fake_validator(),
- "schema": {},
- "instances": [1],
- "error_format": "{error.message}",
- },
- stdout=stdout,
- stderr=stderr,
- )
- self.assertFalse(stdout.getvalue())
- self.assertFalse(stderr.getvalue())
- self.assertEqual(exit_code, 0)
-
- def test_unsuccessful_validation(self):
- error = ValidationError("I am an error!", instance=1)
- stdout, stderr = NativeIO(), NativeIO()
- exit_code = cli.run(
- {
- "validator": fake_validator([error]),
- "schema": {},
- "instances": [1],
- "error_format": "{error.instance} - {error.message}",
- },
- stdout=stdout,
- stderr=stderr,
- )
- self.assertFalse(stdout.getvalue())
- self.assertEqual(stderr.getvalue(), "1 - I am an error!")
- self.assertEqual(exit_code, 1)
-
- def test_unsuccessful_validation_multiple_instances(self):
- first_errors = [
- ValidationError("9", instance=1),
- ValidationError("8", instance=1),
- ]
- second_errors = [ValidationError("7", instance=2)]
- stdout, stderr = NativeIO(), NativeIO()
- exit_code = cli.run(
- {
- "validator": fake_validator(first_errors, second_errors),
- "schema": {},
- "instances": [1, 2],
- "error_format": "{error.instance} - {error.message}\t",
- },
- stdout=stdout,
- stderr=stderr,
- )
- self.assertFalse(stdout.getvalue())
- self.assertEqual(stderr.getvalue(), "1 - 9\t1 - 8\t2 - 7\t")
- self.assertEqual(exit_code, 1)
-
- def test_version(self):
- version = subprocess.check_output(
- [sys.executable, "-m", "jsonschema", "--version"],
- stderr=subprocess.STDOUT,
- )
- version = version.decode("utf-8").strip()
- self.assertEqual(version, __version__)
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_exceptions.py b/lib/spack/external/_vendoring/jsonschema/tests/test_exceptions.py
deleted file mode 100644
index eae00d76d77..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_exceptions.py
+++ /dev/null
@@ -1,462 +0,0 @@
-from unittest import TestCase
-import textwrap
-
-from jsonschema import Draft4Validator, exceptions
-from jsonschema.compat import PY3
-
-
-class TestBestMatch(TestCase):
- def best_match(self, errors):
- errors = list(errors)
- best = exceptions.best_match(errors)
- reversed_best = exceptions.best_match(reversed(errors))
- msg = "Didn't return a consistent best match!\nGot: {0}\n\nThen: {1}"
- self.assertEqual(
- best._contents(), reversed_best._contents(),
- msg=msg.format(best, reversed_best),
- )
- return best
-
- def test_shallower_errors_are_better_matches(self):
- validator = Draft4Validator(
- {
- "properties": {
- "foo": {
- "minProperties": 2,
- "properties": {"bar": {"type": "object"}},
- },
- },
- },
- )
- best = self.best_match(validator.iter_errors({"foo": {"bar": []}}))
- self.assertEqual(best.validator, "minProperties")
-
- def test_oneOf_and_anyOf_are_weak_matches(self):
- """
- A property you *must* match is probably better than one you have to
- match a part of.
- """
-
- validator = Draft4Validator(
- {
- "minProperties": 2,
- "anyOf": [{"type": "string"}, {"type": "number"}],
- "oneOf": [{"type": "string"}, {"type": "number"}],
- }
- )
- best = self.best_match(validator.iter_errors({}))
- self.assertEqual(best.validator, "minProperties")
-
- def test_if_the_most_relevant_error_is_anyOf_it_is_traversed(self):
- """
- If the most relevant error is an anyOf, then we traverse its context
- and select the otherwise *least* relevant error, since in this case
- that means the most specific, deep, error inside the instance.
-
- I.e. since only one of the schemas must match, we look for the most
- relevant one.
- """
-
- validator = Draft4Validator(
- {
- "properties": {
- "foo": {
- "anyOf": [
- {"type": "string"},
- {"properties": {"bar": {"type": "array"}}},
- ],
- },
- },
- },
- )
- best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
- self.assertEqual(best.validator_value, "array")
-
- def test_if_the_most_relevant_error_is_oneOf_it_is_traversed(self):
- """
- If the most relevant error is an oneOf, then we traverse its context
- and select the otherwise *least* relevant error, since in this case
- that means the most specific, deep, error inside the instance.
-
- I.e. since only one of the schemas must match, we look for the most
- relevant one.
- """
-
- validator = Draft4Validator(
- {
- "properties": {
- "foo": {
- "oneOf": [
- {"type": "string"},
- {"properties": {"bar": {"type": "array"}}},
- ],
- },
- },
- },
- )
- best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
- self.assertEqual(best.validator_value, "array")
-
- def test_if_the_most_relevant_error_is_allOf_it_is_traversed(self):
- """
- Now, if the error is allOf, we traverse but select the *most* relevant
- error from the context, because all schemas here must match anyways.
- """
-
- validator = Draft4Validator(
- {
- "properties": {
- "foo": {
- "allOf": [
- {"type": "string"},
- {"properties": {"bar": {"type": "array"}}},
- ],
- },
- },
- },
- )
- best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
- self.assertEqual(best.validator_value, "string")
-
- def test_nested_context_for_oneOf(self):
- validator = Draft4Validator(
- {
- "properties": {
- "foo": {
- "oneOf": [
- {"type": "string"},
- {
- "oneOf": [
- {"type": "string"},
- {
- "properties": {
- "bar": {"type": "array"},
- },
- },
- ],
- },
- ],
- },
- },
- },
- )
- best = self.best_match(validator.iter_errors({"foo": {"bar": 12}}))
- self.assertEqual(best.validator_value, "array")
-
- def test_one_error(self):
- validator = Draft4Validator({"minProperties": 2})
- error, = validator.iter_errors({})
- self.assertEqual(
- exceptions.best_match(validator.iter_errors({})).validator,
- "minProperties",
- )
-
- def test_no_errors(self):
- validator = Draft4Validator({})
- self.assertIsNone(exceptions.best_match(validator.iter_errors({})))
-
-
-class TestByRelevance(TestCase):
- def test_short_paths_are_better_matches(self):
- shallow = exceptions.ValidationError("Oh no!", path=["baz"])
- deep = exceptions.ValidationError("Oh yes!", path=["foo", "bar"])
- match = max([shallow, deep], key=exceptions.relevance)
- self.assertIs(match, shallow)
-
- match = max([deep, shallow], key=exceptions.relevance)
- self.assertIs(match, shallow)
-
- def test_global_errors_are_even_better_matches(self):
- shallow = exceptions.ValidationError("Oh no!", path=[])
- deep = exceptions.ValidationError("Oh yes!", path=["foo"])
-
- errors = sorted([shallow, deep], key=exceptions.relevance)
- self.assertEqual(
- [list(error.path) for error in errors],
- [["foo"], []],
- )
-
- errors = sorted([deep, shallow], key=exceptions.relevance)
- self.assertEqual(
- [list(error.path) for error in errors],
- [["foo"], []],
- )
-
- def test_weak_validators_are_lower_priority(self):
- weak = exceptions.ValidationError("Oh no!", path=[], validator="a")
- normal = exceptions.ValidationError("Oh yes!", path=[], validator="b")
-
- best_match = exceptions.by_relevance(weak="a")
-
- match = max([weak, normal], key=best_match)
- self.assertIs(match, normal)
-
- match = max([normal, weak], key=best_match)
- self.assertIs(match, normal)
-
- def test_strong_validators_are_higher_priority(self):
- weak = exceptions.ValidationError("Oh no!", path=[], validator="a")
- normal = exceptions.ValidationError("Oh yes!", path=[], validator="b")
- strong = exceptions.ValidationError("Oh fine!", path=[], validator="c")
-
- best_match = exceptions.by_relevance(weak="a", strong="c")
-
- match = max([weak, normal, strong], key=best_match)
- self.assertIs(match, strong)
-
- match = max([strong, normal, weak], key=best_match)
- self.assertIs(match, strong)
-
-
-class TestErrorTree(TestCase):
- def test_it_knows_how_many_total_errors_it_contains(self):
- # FIXME: https://github.com/Julian/jsonschema/issues/442
- errors = [
- exceptions.ValidationError("Something", validator=i)
- for i in range(8)
- ]
- tree = exceptions.ErrorTree(errors)
- self.assertEqual(tree.total_errors, 8)
-
- def test_it_contains_an_item_if_the_item_had_an_error(self):
- errors = [exceptions.ValidationError("a message", path=["bar"])]
- tree = exceptions.ErrorTree(errors)
- self.assertIn("bar", tree)
-
- def test_it_does_not_contain_an_item_if_the_item_had_no_error(self):
- errors = [exceptions.ValidationError("a message", path=["bar"])]
- tree = exceptions.ErrorTree(errors)
- self.assertNotIn("foo", tree)
-
- def test_validators_that_failed_appear_in_errors_dict(self):
- error = exceptions.ValidationError("a message", validator="foo")
- tree = exceptions.ErrorTree([error])
- self.assertEqual(tree.errors, {"foo": error})
-
- def test_it_creates_a_child_tree_for_each_nested_path(self):
- errors = [
- exceptions.ValidationError("a bar message", path=["bar"]),
- exceptions.ValidationError("a bar -> 0 message", path=["bar", 0]),
- ]
- tree = exceptions.ErrorTree(errors)
- self.assertIn(0, tree["bar"])
- self.assertNotIn(1, tree["bar"])
-
- def test_children_have_their_errors_dicts_built(self):
- e1, e2 = (
- exceptions.ValidationError("1", validator="foo", path=["bar", 0]),
- exceptions.ValidationError("2", validator="quux", path=["bar", 0]),
- )
- tree = exceptions.ErrorTree([e1, e2])
- self.assertEqual(tree["bar"][0].errors, {"foo": e1, "quux": e2})
-
- def test_multiple_errors_with_instance(self):
- e1, e2 = (
- exceptions.ValidationError(
- "1",
- validator="foo",
- path=["bar", "bar2"],
- instance="i1"),
- exceptions.ValidationError(
- "2",
- validator="quux",
- path=["foobar", 2],
- instance="i2"),
- )
- exceptions.ErrorTree([e1, e2])
-
- def test_it_does_not_contain_subtrees_that_are_not_in_the_instance(self):
- error = exceptions.ValidationError("123", validator="foo", instance=[])
- tree = exceptions.ErrorTree([error])
-
- with self.assertRaises(IndexError):
- tree[0]
-
- def test_if_its_in_the_tree_anyhow_it_does_not_raise_an_error(self):
- """
- If a validator is dumb (like :validator:`required` in draft 3) and
- refers to a path that isn't in the instance, the tree still properly
- returns a subtree for that path.
- """
-
- error = exceptions.ValidationError(
- "a message", validator="foo", instance={}, path=["foo"],
- )
- tree = exceptions.ErrorTree([error])
- self.assertIsInstance(tree["foo"], exceptions.ErrorTree)
-
-
-class TestErrorInitReprStr(TestCase):
- def make_error(self, **kwargs):
- defaults = dict(
- message=u"hello",
- validator=u"type",
- validator_value=u"string",
- instance=5,
- schema={u"type": u"string"},
- )
- defaults.update(kwargs)
- return exceptions.ValidationError(**defaults)
-
- def assertShows(self, expected, **kwargs):
- if PY3: # pragma: no cover
- expected = expected.replace("u'", "'")
- expected = textwrap.dedent(expected).rstrip("\n")
-
- error = self.make_error(**kwargs)
- message_line, _, rest = str(error).partition("\n")
- self.assertEqual(message_line, error.message)
- self.assertEqual(rest, expected)
-
- def test_it_calls_super_and_sets_args(self):
- error = self.make_error()
- self.assertGreater(len(error.args), 1)
-
- def test_repr(self):
- self.assertEqual(
- repr(exceptions.ValidationError(message="Hello!")),
- "" % "Hello!",
- )
-
- def test_unset_error(self):
- error = exceptions.ValidationError("message")
- self.assertEqual(str(error), "message")
-
- kwargs = {
- "validator": "type",
- "validator_value": "string",
- "instance": 5,
- "schema": {"type": "string"},
- }
- # Just the message should show if any of the attributes are unset
- for attr in kwargs:
- k = dict(kwargs)
- del k[attr]
- error = exceptions.ValidationError("message", **k)
- self.assertEqual(str(error), "message")
-
- def test_empty_paths(self):
- self.assertShows(
- """
- Failed validating u'type' in schema:
- {u'type': u'string'}
-
- On instance:
- 5
- """,
- path=[],
- schema_path=[],
- )
-
- def test_one_item_paths(self):
- self.assertShows(
- """
- Failed validating u'type' in schema:
- {u'type': u'string'}
-
- On instance[0]:
- 5
- """,
- path=[0],
- schema_path=["items"],
- )
-
- def test_multiple_item_paths(self):
- self.assertShows(
- """
- Failed validating u'type' in schema[u'items'][0]:
- {u'type': u'string'}
-
- On instance[0][u'a']:
- 5
- """,
- path=[0, u"a"],
- schema_path=[u"items", 0, 1],
- )
-
- def test_uses_pprint(self):
- self.assertShows(
- """
- Failed validating u'maxLength' in schema:
- {0: 0,
- 1: 1,
- 2: 2,
- 3: 3,
- 4: 4,
- 5: 5,
- 6: 6,
- 7: 7,
- 8: 8,
- 9: 9,
- 10: 10,
- 11: 11,
- 12: 12,
- 13: 13,
- 14: 14,
- 15: 15,
- 16: 16,
- 17: 17,
- 18: 18,
- 19: 19}
-
- On instance:
- [0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24]
- """,
- instance=list(range(25)),
- schema=dict(zip(range(20), range(20))),
- validator=u"maxLength",
- )
-
- def test_str_works_with_instances_having_overriden_eq_operator(self):
- """
- Check for https://github.com/Julian/jsonschema/issues/164 which
- rendered exceptions unusable when a `ValidationError` involved
- instances with an `__eq__` method that returned truthy values.
- """
-
- class DontEQMeBro(object):
- def __eq__(this, other): # pragma: no cover
- self.fail("Don't!")
-
- def __ne__(this, other): # pragma: no cover
- self.fail("Don't!")
-
- instance = DontEQMeBro()
- error = exceptions.ValidationError(
- "a message",
- validator="foo",
- instance=instance,
- validator_value="some",
- schema="schema",
- )
- self.assertIn(repr(instance), str(error))
-
-
-class TestHashable(TestCase):
- def test_hashable(self):
- set([exceptions.ValidationError("")])
- set([exceptions.SchemaError("")])
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_format.py b/lib/spack/external/_vendoring/jsonschema/tests/test_format.py
deleted file mode 100644
index 254985f6156..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_format.py
+++ /dev/null
@@ -1,89 +0,0 @@
-"""
-Tests for the parts of jsonschema related to the :validator:`format` property.
-"""
-
-from unittest import TestCase
-
-from jsonschema import FormatError, ValidationError, FormatChecker
-from jsonschema.validators import Draft4Validator
-
-
-BOOM = ValueError("Boom!")
-BANG = ZeroDivisionError("Bang!")
-
-
-def boom(thing):
- if thing == "bang":
- raise BANG
- raise BOOM
-
-
-class TestFormatChecker(TestCase):
- def test_it_can_validate_no_formats(self):
- checker = FormatChecker(formats=())
- self.assertFalse(checker.checkers)
-
- def test_it_raises_a_key_error_for_unknown_formats(self):
- with self.assertRaises(KeyError):
- FormatChecker(formats=["o noes"])
-
- def test_it_can_register_cls_checkers(self):
- original = dict(FormatChecker.checkers)
- self.addCleanup(FormatChecker.checkers.pop, "boom")
- FormatChecker.cls_checks("boom")(boom)
- self.assertEqual(
- FormatChecker.checkers,
- dict(original, boom=(boom, ())),
- )
-
- def test_it_can_register_checkers(self):
- checker = FormatChecker()
- checker.checks("boom")(boom)
- self.assertEqual(
- checker.checkers,
- dict(FormatChecker.checkers, boom=(boom, ()))
- )
-
- def test_it_catches_registered_errors(self):
- checker = FormatChecker()
- checker.checks("boom", raises=type(BOOM))(boom)
-
- with self.assertRaises(FormatError) as cm:
- checker.check(instance=12, format="boom")
-
- self.assertIs(cm.exception.cause, BOOM)
- self.assertIs(cm.exception.__cause__, BOOM)
-
- # Unregistered errors should not be caught
- with self.assertRaises(type(BANG)):
- checker.check(instance="bang", format="boom")
-
- def test_format_error_causes_become_validation_error_causes(self):
- checker = FormatChecker()
- checker.checks("boom", raises=ValueError)(boom)
- validator = Draft4Validator({"format": "boom"}, format_checker=checker)
-
- with self.assertRaises(ValidationError) as cm:
- validator.validate("BOOM")
-
- self.assertIs(cm.exception.cause, BOOM)
- self.assertIs(cm.exception.__cause__, BOOM)
-
- def test_format_checkers_come_with_defaults(self):
- # This is bad :/ but relied upon.
- # The docs for quite awhile recommended people do things like
- # validate(..., format_checker=FormatChecker())
- # We should change that, but we can't without deprecation...
- checker = FormatChecker()
- with self.assertRaises(FormatError):
- checker.check(instance="not-an-ipv4", format="ipv4")
-
- def test_repr(self):
- checker = FormatChecker(formats=())
- checker.checks("foo")(lambda thing: True)
- checker.checks("bar")(lambda thing: True)
- checker.checks("baz")(lambda thing: True)
- self.assertEqual(
- repr(checker),
- "",
- )
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_jsonschema_test_suite.py b/lib/spack/external/_vendoring/jsonschema/tests/test_jsonschema_test_suite.py
deleted file mode 100644
index ebccf29735a..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_jsonschema_test_suite.py
+++ /dev/null
@@ -1,277 +0,0 @@
-"""
-Test runner for the JSON Schema official test suite
-
-Tests comprehensive correctness of each draft's validator.
-
-See https://github.com/json-schema-org/JSON-Schema-Test-Suite for details.
-"""
-
-import sys
-import warnings
-
-from jsonschema import (
- Draft3Validator,
- Draft4Validator,
- Draft6Validator,
- Draft7Validator,
- draft3_format_checker,
- draft4_format_checker,
- draft6_format_checker,
- draft7_format_checker,
-)
-from jsonschema.tests._helpers import bug
-from jsonschema.tests._suite import Suite
-from jsonschema.validators import _DEPRECATED_DEFAULT_TYPES, create
-
-
-SUITE = Suite()
-DRAFT3 = SUITE.version(name="draft3")
-DRAFT4 = SUITE.version(name="draft4")
-DRAFT6 = SUITE.version(name="draft6")
-DRAFT7 = SUITE.version(name="draft7")
-
-
-def skip(message, **kwargs):
- def skipper(test):
- if all(value == getattr(test, attr) for attr, value in kwargs.items()):
- return message
- return skipper
-
-
-def missing_format(checker):
- def missing_format(test):
- schema = test.schema
- if schema is True or schema is False or "format" not in schema:
- return
-
- if schema["format"] not in checker.checkers:
- return "Format checker {0!r} not found.".format(schema["format"])
- return missing_format
-
-
-is_narrow_build = sys.maxunicode == 2 ** 16 - 1
-if is_narrow_build: # pragma: no cover
- message = "Not running surrogate Unicode case, this Python is narrow."
-
- def narrow_unicode_build(test): # pragma: no cover
- return skip(
- message=message,
- description="one supplementary Unicode code point is not long enough",
- )(test) or skip(
- message=message,
- description="two supplementary Unicode code points is long enough",
- )(test)
-else:
- def narrow_unicode_build(test): # pragma: no cover
- return
-
-
-TestDraft3 = DRAFT3.to_unittest_testcase(
- DRAFT3.tests(),
- DRAFT3.optional_tests_of(name="bignum"),
- DRAFT3.optional_tests_of(name="format"),
- DRAFT3.optional_tests_of(name="zeroTerminatedFloats"),
- Validator=Draft3Validator,
- format_checker=draft3_format_checker,
- skip=lambda test: (
- narrow_unicode_build(test)
- or missing_format(draft3_format_checker)(test)
- or skip(
- message="Upstream bug in strict_rfc3339",
- subject="format",
- description="case-insensitive T and Z",
- )(test)
- ),
-)
-
-
-TestDraft4 = DRAFT4.to_unittest_testcase(
- DRAFT4.tests(),
- DRAFT4.optional_tests_of(name="bignum"),
- DRAFT4.optional_tests_of(name="format"),
- DRAFT4.optional_tests_of(name="zeroTerminatedFloats"),
- Validator=Draft4Validator,
- format_checker=draft4_format_checker,
- skip=lambda test: (
- narrow_unicode_build(test)
- or missing_format(draft4_format_checker)(test)
- or skip(
- message=bug(),
- subject="ref",
- case_description="Recursive references between schemas",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description="Location-independent identifier",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with absolute URI"
- ),
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with base URI change in subschema"
- ),
- )(test)
- or skip(
- message=bug(),
- subject="refRemote",
- case_description="base URI change - change folder in subschema",
- )(test)
- or skip(
- message="Upstream bug in strict_rfc3339",
- subject="format",
- description="case-insensitive T and Z",
- )(test)
- ),
-)
-
-
-TestDraft6 = DRAFT6.to_unittest_testcase(
- DRAFT6.tests(),
- DRAFT6.optional_tests_of(name="bignum"),
- DRAFT6.optional_tests_of(name="format"),
- DRAFT6.optional_tests_of(name="zeroTerminatedFloats"),
- Validator=Draft6Validator,
- format_checker=draft6_format_checker,
- skip=lambda test: (
- narrow_unicode_build(test)
- or missing_format(draft6_format_checker)(test)
- or skip(
- message=bug(),
- subject="ref",
- case_description="Recursive references between schemas",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description="Location-independent identifier",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with absolute URI"
- ),
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with base URI change in subschema"
- ),
- )(test)
- or skip(
- message=bug(),
- subject="refRemote",
- case_description="base URI change - change folder in subschema",
- )(test)
- or skip(
- message="Upstream bug in strict_rfc3339",
- subject="format",
- description="case-insensitive T and Z",
- )(test)
- ),
-)
-
-
-TestDraft7 = DRAFT7.to_unittest_testcase(
- DRAFT7.tests(),
- DRAFT7.format_tests(),
- DRAFT7.optional_tests_of(name="bignum"),
- DRAFT7.optional_tests_of(name="content"),
- DRAFT7.optional_tests_of(name="zeroTerminatedFloats"),
- Validator=Draft7Validator,
- format_checker=draft7_format_checker,
- skip=lambda test: (
- narrow_unicode_build(test)
- or missing_format(draft7_format_checker)(test)
- or skip(
- message=bug(),
- subject="ref",
- case_description="Recursive references between schemas",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description="Location-independent identifier",
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with absolute URI"
- ),
- )(test)
- or skip(
- message=bug(371),
- subject="ref",
- case_description=(
- "Location-independent identifier with base URI change in subschema"
- ),
- )(test)
- or skip(
- message=bug(),
- subject="refRemote",
- case_description="base URI change - change folder in subschema",
- )(test)
- or skip(
- message="Upstream bug in strict_rfc3339",
- subject="date-time",
- description="case-insensitive T and Z",
- )(test)
- or skip(
- message=bug(593),
- subject="content",
- case_description=(
- "validation of string-encoded content based on media type"
- ),
- )(test)
- or skip(
- message=bug(593),
- subject="content",
- case_description="validation of binary string-encoding",
- )(test)
- or skip(
- message=bug(593),
- subject="content",
- case_description=(
- "validation of binary-encoded media type documents"
- ),
- )(test)
- ),
-)
-
-
-with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
-
- TestDraft3LegacyTypeCheck = DRAFT3.to_unittest_testcase(
- # Interestingly the any part couldn't really be done w/the old API.
- (
- (test for test in each if test.schema != {"type": "any"})
- for each in DRAFT3.tests_of(name="type")
- ),
- name="TestDraft3LegacyTypeCheck",
- Validator=create(
- meta_schema=Draft3Validator.META_SCHEMA,
- validators=Draft3Validator.VALIDATORS,
- default_types=_DEPRECATED_DEFAULT_TYPES,
- ),
- )
-
- TestDraft4LegacyTypeCheck = DRAFT4.to_unittest_testcase(
- DRAFT4.tests_of(name="type"),
- name="TestDraft4LegacyTypeCheck",
- Validator=create(
- meta_schema=Draft4Validator.META_SCHEMA,
- validators=Draft4Validator.VALIDATORS,
- default_types=_DEPRECATED_DEFAULT_TYPES,
- ),
- )
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_types.py b/lib/spack/external/_vendoring/jsonschema/tests/test_types.py
deleted file mode 100644
index 2280cc395b2..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_types.py
+++ /dev/null
@@ -1,190 +0,0 @@
-"""
-Tests on the new type interface. The actual correctness of the type checking
-is handled in test_jsonschema_test_suite; these tests check that TypeChecker
-functions correctly and can facilitate extensions to type checking
-"""
-from collections import namedtuple
-from unittest import TestCase
-
-from jsonschema import ValidationError, _validators
-from jsonschema._types import TypeChecker
-from jsonschema.exceptions import UndefinedTypeCheck
-from jsonschema.validators import Draft4Validator, extend
-
-
-def equals_2(checker, instance):
- return instance == 2
-
-
-def is_namedtuple(instance):
- return isinstance(instance, tuple) and getattr(instance, "_fields", None)
-
-
-def is_object_or_named_tuple(checker, instance):
- if Draft4Validator.TYPE_CHECKER.is_type(instance, "object"):
- return True
- return is_namedtuple(instance)
-
-
-def coerce_named_tuple(fn):
- def coerced(validator, value, instance, schema):
- if is_namedtuple(instance):
- instance = instance._asdict()
- return fn(validator, value, instance, schema)
- return coerced
-
-
-required = coerce_named_tuple(_validators.required)
-properties = coerce_named_tuple(_validators.properties)
-
-
-class TestTypeChecker(TestCase):
- def test_is_type(self):
- checker = TypeChecker({"two": equals_2})
- self.assertEqual(
- (
- checker.is_type(instance=2, type="two"),
- checker.is_type(instance="bar", type="two"),
- ),
- (True, False),
- )
-
- def test_is_unknown_type(self):
- with self.assertRaises(UndefinedTypeCheck) as context:
- TypeChecker().is_type(4, "foobar")
- self.assertIn("foobar", str(context.exception))
-
- def test_checks_can_be_added_at_init(self):
- checker = TypeChecker({"two": equals_2})
- self.assertEqual(checker, TypeChecker().redefine("two", equals_2))
-
- def test_redefine_existing_type(self):
- self.assertEqual(
- TypeChecker().redefine("two", object()).redefine("two", equals_2),
- TypeChecker().redefine("two", equals_2),
- )
-
- def test_remove(self):
- self.assertEqual(
- TypeChecker({"two": equals_2}).remove("two"),
- TypeChecker(),
- )
-
- def test_remove_unknown_type(self):
- with self.assertRaises(UndefinedTypeCheck) as context:
- TypeChecker().remove("foobar")
- self.assertIn("foobar", str(context.exception))
-
- def test_redefine_many(self):
- self.assertEqual(
- TypeChecker().redefine_many({"foo": int, "bar": str}),
- TypeChecker().redefine("foo", int).redefine("bar", str),
- )
-
- def test_remove_multiple(self):
- self.assertEqual(
- TypeChecker({"foo": int, "bar": str}).remove("foo", "bar"),
- TypeChecker(),
- )
-
- def test_type_check_can_raise_key_error(self):
- """
- Make sure no one writes:
-
- try:
- self._type_checkers[type](...)
- except KeyError:
-
- ignoring the fact that the function itself can raise that.
- """
-
- error = KeyError("Stuff")
-
- def raises_keyerror(checker, instance):
- raise error
-
- with self.assertRaises(KeyError) as context:
- TypeChecker({"foo": raises_keyerror}).is_type(4, "foo")
-
- self.assertIs(context.exception, error)
-
-
-class TestCustomTypes(TestCase):
- def test_simple_type_can_be_extended(self):
- def int_or_str_int(checker, instance):
- if not isinstance(instance, (int, str)):
- return False
- try:
- int(instance)
- except ValueError:
- return False
- return True
-
- CustomValidator = extend(
- Draft4Validator,
- type_checker=Draft4Validator.TYPE_CHECKER.redefine(
- "integer", int_or_str_int,
- ),
- )
- validator = CustomValidator({"type": "integer"})
-
- validator.validate(4)
- validator.validate("4")
-
- with self.assertRaises(ValidationError):
- validator.validate(4.4)
-
- def test_object_can_be_extended(self):
- schema = {"type": "object"}
-
- Point = namedtuple("Point", ["x", "y"])
-
- type_checker = Draft4Validator.TYPE_CHECKER.redefine(
- u"object", is_object_or_named_tuple,
- )
-
- CustomValidator = extend(Draft4Validator, type_checker=type_checker)
- validator = CustomValidator(schema)
-
- validator.validate(Point(x=4, y=5))
-
- def test_object_extensions_require_custom_validators(self):
- schema = {"type": "object", "required": ["x"]}
-
- type_checker = Draft4Validator.TYPE_CHECKER.redefine(
- u"object", is_object_or_named_tuple,
- )
-
- CustomValidator = extend(Draft4Validator, type_checker=type_checker)
- validator = CustomValidator(schema)
-
- Point = namedtuple("Point", ["x", "y"])
- # Cannot handle required
- with self.assertRaises(ValidationError):
- validator.validate(Point(x=4, y=5))
-
- def test_object_extensions_can_handle_custom_validators(self):
- schema = {
- "type": "object",
- "required": ["x"],
- "properties": {"x": {"type": "integer"}},
- }
-
- type_checker = Draft4Validator.TYPE_CHECKER.redefine(
- u"object", is_object_or_named_tuple,
- )
-
- CustomValidator = extend(
- Draft4Validator,
- type_checker=type_checker,
- validators={"required": required, "properties": properties},
- )
-
- validator = CustomValidator(schema)
-
- Point = namedtuple("Point", ["x", "y"])
- # Can now process required and properties
- validator.validate(Point(x=4, y=5))
-
- with self.assertRaises(ValidationError):
- validator.validate(Point(x="not an integer", y=5))
diff --git a/lib/spack/external/_vendoring/jsonschema/tests/test_validators.py b/lib/spack/external/_vendoring/jsonschema/tests/test_validators.py
deleted file mode 100644
index 07be4f08bc2..00000000000
--- a/lib/spack/external/_vendoring/jsonschema/tests/test_validators.py
+++ /dev/null
@@ -1,1762 +0,0 @@
-from collections import deque
-from contextlib import contextmanager
-from decimal import Decimal
-from io import BytesIO
-from unittest import TestCase
-import json
-import os
-import sys
-import tempfile
-import unittest
-
-from twisted.trial.unittest import SynchronousTestCase
-import attr
-
-from jsonschema import FormatChecker, TypeChecker, exceptions, validators
-from jsonschema.compat import PY3, pathname2url
-from jsonschema.tests._helpers import bug
-
-
-def startswith(validator, startswith, instance, schema):
- if not instance.startswith(startswith):
- yield exceptions.ValidationError(u"Whoops!")
-
-
-class TestCreateAndExtend(SynchronousTestCase):
- def setUp(self):
- self.addCleanup(
- self.assertEqual,
- validators.meta_schemas,
- dict(validators.meta_schemas),
- )
-
- self.meta_schema = {u"$id": "some://meta/schema"}
- self.validators = {u"startswith": startswith}
- self.type_checker = TypeChecker()
- self.Validator = validators.create(
- meta_schema=self.meta_schema,
- validators=self.validators,
- type_checker=self.type_checker,
- )
-
- def test_attrs(self):
- self.assertEqual(
- (
- self.Validator.VALIDATORS,
- self.Validator.META_SCHEMA,
- self.Validator.TYPE_CHECKER,
- ), (
- self.validators,
- self.meta_schema,
- self.type_checker,
- ),
- )
-
- def test_init(self):
- schema = {u"startswith": u"foo"}
- self.assertEqual(self.Validator(schema).schema, schema)
-
- def test_iter_errors(self):
- schema = {u"startswith": u"hel"}
- iter_errors = self.Validator(schema).iter_errors
-
- errors = list(iter_errors(u"hello"))
- self.assertEqual(errors, [])
-
- expected_error = exceptions.ValidationError(
- u"Whoops!",
- instance=u"goodbye",
- schema=schema,
- validator=u"startswith",
- validator_value=u"hel",
- schema_path=deque([u"startswith"]),
- )
-
- errors = list(iter_errors(u"goodbye"))
- self.assertEqual(len(errors), 1)
- self.assertEqual(errors[0]._contents(), expected_error._contents())
-
- def test_if_a_version_is_provided_it_is_registered(self):
- Validator = validators.create(
- meta_schema={u"$id": "something"},
- version="my version",
- )
- self.addCleanup(validators.meta_schemas.pop, "something")
- self.assertEqual(Validator.__name__, "MyVersionValidator")
-
- def test_if_a_version_is_not_provided_it_is_not_registered(self):
- original = dict(validators.meta_schemas)
- validators.create(meta_schema={u"id": "id"})
- self.assertEqual(validators.meta_schemas, original)
-
- def test_validates_registers_meta_schema_id(self):
- meta_schema_key = "meta schema id"
- my_meta_schema = {u"id": meta_schema_key}
-
- validators.create(
- meta_schema=my_meta_schema,
- version="my version",
- id_of=lambda s: s.get("id", ""),
- )
- self.addCleanup(validators.meta_schemas.pop, meta_schema_key)
-
- self.assertIn(meta_schema_key, validators.meta_schemas)
-
- def test_validates_registers_meta_schema_draft6_id(self):
- meta_schema_key = "meta schema $id"
- my_meta_schema = {u"$id": meta_schema_key}
-
- validators.create(
- meta_schema=my_meta_schema,
- version="my version",
- )
- self.addCleanup(validators.meta_schemas.pop, meta_schema_key)
-
- self.assertIn(meta_schema_key, validators.meta_schemas)
-
- def test_create_default_types(self):
- Validator = validators.create(meta_schema={}, validators=())
- self.assertTrue(
- all(
- Validator({}).is_type(instance=instance, type=type)
- for type, instance in [
- (u"array", []),
- (u"boolean", True),
- (u"integer", 12),
- (u"null", None),
- (u"number", 12.0),
- (u"object", {}),
- (u"string", u"foo"),
- ]
- ),
- )
-
- def test_extend(self):
- original = dict(self.Validator.VALIDATORS)
- new = object()
-
- Extended = validators.extend(
- self.Validator,
- validators={u"new": new},
- )
- self.assertEqual(
- (
- Extended.VALIDATORS,
- Extended.META_SCHEMA,
- Extended.TYPE_CHECKER,
- self.Validator.VALIDATORS,
- ), (
- dict(original, new=new),
- self.Validator.META_SCHEMA,
- self.Validator.TYPE_CHECKER,
- original,
- ),
- )
-
- def test_extend_idof(self):
- """
- Extending a validator preserves its notion of schema IDs.
- """
- def id_of(schema):
- return schema.get(u"__test__", self.Validator.ID_OF(schema))
- correct_id = "the://correct/id/"
- meta_schema = {
- u"$id": "the://wrong/id/",
- u"__test__": correct_id,
- }
- Original = validators.create(
- meta_schema=meta_schema,
- validators=self.validators,
- type_checker=self.type_checker,
- id_of=id_of,
- )
- self.assertEqual(Original.ID_OF(Original.META_SCHEMA), correct_id)
-
- Derived = validators.extend(Original)
- self.assertEqual(Derived.ID_OF(Derived.META_SCHEMA), correct_id)
-
-
-class TestLegacyTypeChecking(SynchronousTestCase):
- def test_create_default_types(self):
- Validator = validators.create(meta_schema={}, validators=())
- self.assertEqual(
- set(Validator.DEFAULT_TYPES), {
- u"array",
- u"boolean",
- u"integer",
- u"null",
- u"number",
- u"object", u"string",
- },
- )
- self.flushWarnings()
-
- def test_extend(self):
- Validator = validators.create(meta_schema={}, validators=())
- original = dict(Validator.VALIDATORS)
- new = object()
-
- Extended = validators.extend(
- Validator,
- validators={u"new": new},
- )
- self.assertEqual(
- (
- Extended.VALIDATORS,
- Extended.META_SCHEMA,
- Extended.TYPE_CHECKER,
- Validator.VALIDATORS,
-
- Extended.DEFAULT_TYPES,
- Extended({}).DEFAULT_TYPES,
- self.flushWarnings()[0]["message"],
- ), (
- dict(original, new=new),
- Validator.META_SCHEMA,
- Validator.TYPE_CHECKER,
- original,
-
- Validator.DEFAULT_TYPES,
- Validator.DEFAULT_TYPES,
- self.flushWarnings()[0]["message"],
- ),
- )
-
- def test_types_redefines_the_validators_type_checker(self):
- schema = {"type": "string"}
- self.assertFalse(validators.Draft7Validator(schema).is_valid(12))
-
- validator = validators.Draft7Validator(
- schema,
- types={"string": (str, int)},
- )
- self.assertTrue(validator.is_valid(12))
- self.flushWarnings()
-
- def test_providing_default_types_warns(self):
- self.assertWarns(
- category=DeprecationWarning,
- message=(
- "The default_types argument is deprecated. "
- "Use the type_checker argument instead."
- ),
- # https://tm.tl/9363 :'(
- filename=sys.modules[self.assertWarns.__module__].__file__,
-
- f=validators.create,
- meta_schema={},
- validators={},
- default_types={"foo": object},
- )
-
- def test_cannot_ask_for_default_types_with_non_default_type_checker(self):
- """
- We raise an error when you ask a validator with non-default
- type checker for its DEFAULT_TYPES.
-
- The type checker argument is new, so no one but this library
- itself should be trying to use it, and doing so while then
- asking for DEFAULT_TYPES makes no sense (not to mention is
- deprecated), since type checkers are not strictly about Python
- type.
- """
- Validator = validators.create(
- meta_schema={},
- validators={},
- type_checker=TypeChecker(),
- )
- with self.assertRaises(validators._DontDoThat) as e:
- Validator.DEFAULT_TYPES
-
- self.assertIn(
- "DEFAULT_TYPES cannot be used on Validators using TypeCheckers",
- str(e.exception),
- )
- with self.assertRaises(validators._DontDoThat):
- Validator({}).DEFAULT_TYPES
-
- self.assertFalse(self.flushWarnings())
-
- def test_providing_explicit_type_checker_does_not_warn(self):
- Validator = validators.create(
- meta_schema={},
- validators={},
- type_checker=TypeChecker(),
- )
- self.assertFalse(self.flushWarnings())
-
- Validator({})
- self.assertFalse(self.flushWarnings())
-
- def test_providing_neither_does_not_warn(self):
- Validator = validators.create(meta_schema={}, validators={})
- self.assertFalse(self.flushWarnings())
-
- Validator({})
- self.assertFalse(self.flushWarnings())
-
- def test_providing_default_types_with_type_checker_errors(self):
- with self.assertRaises(TypeError) as e:
- validators.create(
- meta_schema={},
- validators={},
- default_types={"foo": object},
- type_checker=TypeChecker(),
- )
-
- self.assertIn(
- "Do not specify default_types when providing a type checker",
- str(e.exception),
- )
- self.assertFalse(self.flushWarnings())
-
- def test_extending_a_legacy_validator_with_a_type_checker_errors(self):
- Validator = validators.create(
- meta_schema={},
- validators={},
- default_types={u"array": list}
- )
- with self.assertRaises(TypeError) as e:
- validators.extend(
- Validator,
- validators={},
- type_checker=TypeChecker(),
- )
-
- self.assertIn(
- (
- "Cannot extend a validator created with default_types "
- "with a type_checker. Update the validator to use a "
- "type_checker when created."
- ),
- str(e.exception),
- )
- self.flushWarnings()
-
- def test_extending_a_legacy_validator_does_not_rewarn(self):
- Validator = validators.create(meta_schema={}, default_types={})
- self.assertTrue(self.flushWarnings())
-
- validators.extend(Validator)
- self.assertFalse(self.flushWarnings())
-
- def test_accessing_default_types_warns(self):
- Validator = validators.create(meta_schema={}, validators={})
- self.assertFalse(self.flushWarnings())
-
- self.assertWarns(
- DeprecationWarning,
- (
- "The DEFAULT_TYPES attribute is deprecated. "
- "See the type checker attached to this validator instead."
- ),
- # https://tm.tl/9363 :'(
- sys.modules[self.assertWarns.__module__].__file__,
-
- getattr,
- Validator,
- "DEFAULT_TYPES",
- )
-
- def test_accessing_default_types_on_the_instance_warns(self):
- Validator = validators.create(meta_schema={}, validators={})
- self.assertFalse(self.flushWarnings())
-
- self.assertWarns(
- DeprecationWarning,
- (
- "The DEFAULT_TYPES attribute is deprecated. "
- "See the type checker attached to this validator instead."
- ),
- # https://tm.tl/9363 :'(
- sys.modules[self.assertWarns.__module__].__file__,
-
- getattr,
- Validator({}),
- "DEFAULT_TYPES",
- )
-
- def test_providing_types_to_init_warns(self):
- Validator = validators.create(meta_schema={}, validators={})
- self.assertFalse(self.flushWarnings())
-
- self.assertWarns(
- category=DeprecationWarning,
- message=(
- "The types argument is deprecated. "
- "Provide a type_checker to jsonschema.validators.extend "
- "instead."
- ),
- # https://tm.tl/9363 :'(
- filename=sys.modules[self.assertWarns.__module__].__file__,
-
- f=Validator,
- schema={},
- types={"bar": object},
- )
-
-
-class TestIterErrors(TestCase):
- def setUp(self):
- self.validator = validators.Draft3Validator({})
-
- def test_iter_errors(self):
- instance = [1, 2]
- schema = {
- u"disallow": u"array",
- u"enum": [["a", "b", "c"], ["d", "e", "f"]],
- u"minItems": 3,
- }
-
- got = (e.message for e in self.validator.iter_errors(instance, schema))
- expected = [
- "%r is disallowed for [1, 2]" % (schema["disallow"],),
- "[1, 2] is too short",
- "[1, 2] is not one of %r" % (schema["enum"],),
- ]
- self.assertEqual(sorted(got), sorted(expected))
-
- def test_iter_errors_multiple_failures_one_validator(self):
- instance = {"foo": 2, "bar": [1], "baz": 15, "quux": "spam"}
- schema = {
- u"properties": {
- "foo": {u"type": "string"},
- "bar": {u"minItems": 2},
- "baz": {u"maximum": 10, u"enum": [2, 4, 6, 8]},
- },
- }
-
- errors = list(self.validator.iter_errors(instance, schema))
- self.assertEqual(len(errors), 4)
-
-
-class TestValidationErrorMessages(TestCase):
- def message_for(self, instance, schema, *args, **kwargs):
- kwargs.setdefault("cls", validators.Draft3Validator)
- with self.assertRaises(exceptions.ValidationError) as e:
- validators.validate(instance, schema, *args, **kwargs)
- return e.exception.message
-
- def test_single_type_failure(self):
- message = self.message_for(instance=1, schema={u"type": u"string"})
- self.assertEqual(message, "1 is not of type %r" % u"string")
-
- def test_single_type_list_failure(self):
- message = self.message_for(instance=1, schema={u"type": [u"string"]})
- self.assertEqual(message, "1 is not of type %r" % u"string")
-
- def test_multiple_type_failure(self):
- types = u"string", u"object"
- message = self.message_for(instance=1, schema={u"type": list(types)})
- self.assertEqual(message, "1 is not of type %r, %r" % types)
-
- def test_object_without_title_type_failure(self):
- type = {u"type": [{u"minimum": 3}]}
- message = self.message_for(instance=1, schema={u"type": [type]})
- self.assertEqual(message, "1 is less than the minimum of 3")
-
- def test_object_with_named_type_failure(self):
- schema = {u"type": [{u"name": "Foo", u"minimum": 3}]}
- message = self.message_for(instance=1, schema=schema)
- self.assertEqual(message, "1 is less than the minimum of 3")
-
- def test_minimum(self):
- message = self.message_for(instance=1, schema={"minimum": 2})
- self.assertEqual(message, "1 is less than the minimum of 2")
-
- def test_maximum(self):
- message = self.message_for(instance=1, schema={"maximum": 0})
- self.assertEqual(message, "1 is greater than the maximum of 0")
-
- def test_dependencies_single_element(self):
- depend, on = "bar", "foo"
- schema = {u"dependencies": {depend: on}}
- message = self.message_for(
- instance={"bar": 2},
- schema=schema,
- cls=validators.Draft3Validator,
- )
- self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
-
- def test_dependencies_list_draft3(self):
- depend, on = "bar", "foo"
- schema = {u"dependencies": {depend: [on]}}
- message = self.message_for(
- instance={"bar": 2},
- schema=schema,
- cls=validators.Draft3Validator,
- )
- self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
-
- def test_dependencies_list_draft7(self):
- depend, on = "bar", "foo"
- schema = {u"dependencies": {depend: [on]}}
- message = self.message_for(
- instance={"bar": 2},
- schema=schema,
- cls=validators.Draft7Validator,
- )
- self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
-
- def test_additionalItems_single_failure(self):
- message = self.message_for(
- instance=[2],
- schema={u"items": [], u"additionalItems": False},
- )
- self.assertIn("(2 was unexpected)", message)
-
- def test_additionalItems_multiple_failures(self):
- message = self.message_for(
- instance=[1, 2, 3],
- schema={u"items": [], u"additionalItems": False}
- )
- self.assertIn("(1, 2, 3 were unexpected)", message)
-
- def test_additionalProperties_single_failure(self):
- additional = "foo"
- schema = {u"additionalProperties": False}
- message = self.message_for(instance={additional: 2}, schema=schema)
- self.assertIn("(%r was unexpected)" % (additional,), message)
-
- def test_additionalProperties_multiple_failures(self):
- schema = {u"additionalProperties": False}
- message = self.message_for(
- instance=dict.fromkeys(["foo", "bar"]),
- schema=schema,
- )
-
- self.assertIn(repr("foo"), message)
- self.assertIn(repr("bar"), message)
- self.assertIn("were unexpected)", message)
-
- def test_const(self):
- schema = {u"const": 12}
- message = self.message_for(
- instance={"foo": "bar"},
- schema=schema,
- cls=validators.Draft6Validator,
- )
- self.assertIn("12 was expected", message)
-
- def test_contains(self):
- schema = {u"contains": {u"const": 12}}
- message = self.message_for(
- instance=[2, {}, []],
- schema=schema,
- cls=validators.Draft6Validator,
- )
- self.assertIn(
- "None of [2, {}, []] are valid under the given schema",
- message,
- )
-
- def test_invalid_format_default_message(self):
- checker = FormatChecker(formats=())
- checker.checks(u"thing")(lambda value: False)
-
- schema = {u"format": u"thing"}
- message = self.message_for(
- instance="bla",
- schema=schema,
- format_checker=checker,
- )
-
- self.assertIn(repr("bla"), message)
- self.assertIn(repr("thing"), message)
- self.assertIn("is not a", message)
-
- def test_additionalProperties_false_patternProperties(self):
- schema = {u"type": u"object",
- u"additionalProperties": False,
- u"patternProperties": {
- u"^abc$": {u"type": u"string"},
- u"^def$": {u"type": u"string"},
- }}
- message = self.message_for(
- instance={u"zebra": 123},
- schema=schema,
- cls=validators.Draft4Validator,
- )
- self.assertEqual(
- message,
- "{} does not match any of the regexes: {}, {}".format(
- repr(u"zebra"), repr(u"^abc$"), repr(u"^def$"),
- ),
- )
- message = self.message_for(
- instance={u"zebra": 123, u"fish": 456},
- schema=schema,
- cls=validators.Draft4Validator,
- )
- self.assertEqual(
- message,
- "{}, {} do not match any of the regexes: {}, {}".format(
- repr(u"fish"), repr(u"zebra"), repr(u"^abc$"), repr(u"^def$")
- ),
- )
-
- def test_False_schema(self):
- message = self.message_for(
- instance="something",
- schema=False,
- cls=validators.Draft7Validator,
- )
- self.assertIn("False schema does not allow 'something'", message)
-
-
-class TestValidationErrorDetails(TestCase):
- # TODO: These really need unit tests for each individual validator, rather
- # than just these higher level tests.
- def test_anyOf(self):
- instance = 5
- schema = {
- "anyOf": [
- {"minimum": 20},
- {"type": "string"},
- ],
- }
-
- validator = validators.Draft4Validator(schema)
- errors = list(validator.iter_errors(instance))
- self.assertEqual(len(errors), 1)
- e = errors[0]
-
- self.assertEqual(e.validator, "anyOf")
- self.assertEqual(e.validator_value, schema["anyOf"])
- self.assertEqual(e.instance, instance)
- self.assertEqual(e.schema, schema)
- self.assertIsNone(e.parent)
-
- self.assertEqual(e.path, deque([]))
- self.assertEqual(e.relative_path, deque([]))
- self.assertEqual(e.absolute_path, deque([]))
-
- self.assertEqual(e.schema_path, deque(["anyOf"]))
- self.assertEqual(e.relative_schema_path, deque(["anyOf"]))
- self.assertEqual(e.absolute_schema_path, deque(["anyOf"]))
-
- self.assertEqual(len(e.context), 2)
-
- e1, e2 = sorted_errors(e.context)
-
- self.assertEqual(e1.validator, "minimum")
- self.assertEqual(e1.validator_value, schema["anyOf"][0]["minimum"])
- self.assertEqual(e1.instance, instance)
- self.assertEqual(e1.schema, schema["anyOf"][0])
- self.assertIs(e1.parent, e)
-
- self.assertEqual(e1.path, deque([]))
- self.assertEqual(e1.absolute_path, deque([]))
- self.assertEqual(e1.relative_path, deque([]))
-
- self.assertEqual(e1.schema_path, deque([0, "minimum"]))
- self.assertEqual(e1.relative_schema_path, deque([0, "minimum"]))
- self.assertEqual(
- e1.absolute_schema_path, deque(["anyOf", 0, "minimum"]),
- )
-
- self.assertFalse(e1.context)
-
- self.assertEqual(e2.validator, "type")
- self.assertEqual(e2.validator_value, schema["anyOf"][1]["type"])
- self.assertEqual(e2.instance, instance)
- self.assertEqual(e2.schema, schema["anyOf"][1])
- self.assertIs(e2.parent, e)
-
- self.assertEqual(e2.path, deque([]))
- self.assertEqual(e2.relative_path, deque([]))
- self.assertEqual(e2.absolute_path, deque([]))
-
- self.assertEqual(e2.schema_path, deque([1, "type"]))
- self.assertEqual(e2.relative_schema_path, deque([1, "type"]))
- self.assertEqual(e2.absolute_schema_path, deque(["anyOf", 1, "type"]))
-
- self.assertEqual(len(e2.context), 0)
-
- def test_type(self):
- instance = {"foo": 1}
- schema = {
- "type": [
- {"type": "integer"},
- {
- "type": "object",
- "properties": {"foo": {"enum": [2]}},
- },
- ],
- }
-
- validator = validators.Draft3Validator(schema)
- errors = list(validator.iter_errors(instance))
- self.assertEqual(len(errors), 1)
- e = errors[0]
-
- self.assertEqual(e.validator, "type")
- self.assertEqual(e.validator_value, schema["type"])
- self.assertEqual(e.instance, instance)
- self.assertEqual(e.schema, schema)
- self.assertIsNone(e.parent)
-
- self.assertEqual(e.path, deque([]))
- self.assertEqual(e.relative_path, deque([]))
- self.assertEqual(e.absolute_path, deque([]))
-
- self.assertEqual(e.schema_path, deque(["type"]))
- self.assertEqual(e.relative_schema_path, deque(["type"]))
- self.assertEqual(e.absolute_schema_path, deque(["type"]))
-
- self.assertEqual(len(e.context), 2)
-
- e1, e2 = sorted_errors(e.context)
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e1.validator_value, schema["type"][0]["type"])
- self.assertEqual(e1.instance, instance)
- self.assertEqual(e1.schema, schema["type"][0])
- self.assertIs(e1.parent, e)
-
- self.assertEqual(e1.path, deque([]))
- self.assertEqual(e1.relative_path, deque([]))
- self.assertEqual(e1.absolute_path, deque([]))
-
- self.assertEqual(e1.schema_path, deque([0, "type"]))
- self.assertEqual(e1.relative_schema_path, deque([0, "type"]))
- self.assertEqual(e1.absolute_schema_path, deque(["type", 0, "type"]))
-
- self.assertFalse(e1.context)
-
- self.assertEqual(e2.validator, "enum")
- self.assertEqual(e2.validator_value, [2])
- self.assertEqual(e2.instance, 1)
- self.assertEqual(e2.schema, {u"enum": [2]})
- self.assertIs(e2.parent, e)
-
- self.assertEqual(e2.path, deque(["foo"]))
- self.assertEqual(e2.relative_path, deque(["foo"]))
- self.assertEqual(e2.absolute_path, deque(["foo"]))
-
- self.assertEqual(
- e2.schema_path, deque([1, "properties", "foo", "enum"]),
- )
- self.assertEqual(
- e2.relative_schema_path, deque([1, "properties", "foo", "enum"]),
- )
- self.assertEqual(
- e2.absolute_schema_path,
- deque(["type", 1, "properties", "foo", "enum"]),
- )
-
- self.assertFalse(e2.context)
-
- def test_single_nesting(self):
- instance = {"foo": 2, "bar": [1], "baz": 15, "quux": "spam"}
- schema = {
- "properties": {
- "foo": {"type": "string"},
- "bar": {"minItems": 2},
- "baz": {"maximum": 10, "enum": [2, 4, 6, 8]},
- },
- }
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2, e3, e4 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque(["bar"]))
- self.assertEqual(e2.path, deque(["baz"]))
- self.assertEqual(e3.path, deque(["baz"]))
- self.assertEqual(e4.path, deque(["foo"]))
-
- self.assertEqual(e1.relative_path, deque(["bar"]))
- self.assertEqual(e2.relative_path, deque(["baz"]))
- self.assertEqual(e3.relative_path, deque(["baz"]))
- self.assertEqual(e4.relative_path, deque(["foo"]))
-
- self.assertEqual(e1.absolute_path, deque(["bar"]))
- self.assertEqual(e2.absolute_path, deque(["baz"]))
- self.assertEqual(e3.absolute_path, deque(["baz"]))
- self.assertEqual(e4.absolute_path, deque(["foo"]))
-
- self.assertEqual(e1.validator, "minItems")
- self.assertEqual(e2.validator, "enum")
- self.assertEqual(e3.validator, "maximum")
- self.assertEqual(e4.validator, "type")
-
- def test_multiple_nesting(self):
- instance = [1, {"foo": 2, "bar": {"baz": [1]}}, "quux"]
- schema = {
- "type": "string",
- "items": {
- "type": ["string", "object"],
- "properties": {
- "foo": {"enum": [1, 3]},
- "bar": {
- "type": "array",
- "properties": {
- "bar": {"required": True},
- "baz": {"minItems": 2},
- },
- },
- },
- },
- }
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2, e3, e4, e5, e6 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque([]))
- self.assertEqual(e2.path, deque([0]))
- self.assertEqual(e3.path, deque([1, "bar"]))
- self.assertEqual(e4.path, deque([1, "bar", "bar"]))
- self.assertEqual(e5.path, deque([1, "bar", "baz"]))
- self.assertEqual(e6.path, deque([1, "foo"]))
-
- self.assertEqual(e1.schema_path, deque(["type"]))
- self.assertEqual(e2.schema_path, deque(["items", "type"]))
- self.assertEqual(
- list(e3.schema_path), ["items", "properties", "bar", "type"],
- )
- self.assertEqual(
- list(e4.schema_path),
- ["items", "properties", "bar", "properties", "bar", "required"],
- )
- self.assertEqual(
- list(e5.schema_path),
- ["items", "properties", "bar", "properties", "baz", "minItems"]
- )
- self.assertEqual(
- list(e6.schema_path), ["items", "properties", "foo", "enum"],
- )
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e2.validator, "type")
- self.assertEqual(e3.validator, "type")
- self.assertEqual(e4.validator, "required")
- self.assertEqual(e5.validator, "minItems")
- self.assertEqual(e6.validator, "enum")
-
- def test_recursive(self):
- schema = {
- "definitions": {
- "node": {
- "anyOf": [{
- "type": "object",
- "required": ["name", "children"],
- "properties": {
- "name": {
- "type": "string",
- },
- "children": {
- "type": "object",
- "patternProperties": {
- "^.*$": {
- "$ref": "#/definitions/node",
- },
- },
- },
- },
- }],
- },
- },
- "type": "object",
- "required": ["root"],
- "properties": {"root": {"$ref": "#/definitions/node"}},
- }
-
- instance = {
- "root": {
- "name": "root",
- "children": {
- "a": {
- "name": "a",
- "children": {
- "ab": {
- "name": "ab",
- # missing "children"
- },
- },
- },
- },
- },
- }
- validator = validators.Draft4Validator(schema)
-
- e, = validator.iter_errors(instance)
- self.assertEqual(e.absolute_path, deque(["root"]))
- self.assertEqual(
- e.absolute_schema_path, deque(["properties", "root", "anyOf"]),
- )
-
- e1, = e.context
- self.assertEqual(e1.absolute_path, deque(["root", "children", "a"]))
- self.assertEqual(
- e1.absolute_schema_path, deque(
- [
- "properties",
- "root",
- "anyOf",
- 0,
- "properties",
- "children",
- "patternProperties",
- "^.*$",
- "anyOf",
- ],
- ),
- )
-
- e2, = e1.context
- self.assertEqual(
- e2.absolute_path, deque(
- ["root", "children", "a", "children", "ab"],
- ),
- )
- self.assertEqual(
- e2.absolute_schema_path, deque(
- [
- "properties",
- "root",
- "anyOf",
- 0,
- "properties",
- "children",
- "patternProperties",
- "^.*$",
- "anyOf",
- 0,
- "properties",
- "children",
- "patternProperties",
- "^.*$",
- "anyOf",
- ],
- ),
- )
-
- def test_additionalProperties(self):
- instance = {"bar": "bar", "foo": 2}
- schema = {"additionalProperties": {"type": "integer", "minimum": 5}}
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque(["bar"]))
- self.assertEqual(e2.path, deque(["foo"]))
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e2.validator, "minimum")
-
- def test_patternProperties(self):
- instance = {"bar": 1, "foo": 2}
- schema = {
- "patternProperties": {
- "bar": {"type": "string"},
- "foo": {"minimum": 5},
- },
- }
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque(["bar"]))
- self.assertEqual(e2.path, deque(["foo"]))
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e2.validator, "minimum")
-
- def test_additionalItems(self):
- instance = ["foo", 1]
- schema = {
- "items": [],
- "additionalItems": {"type": "integer", "minimum": 5},
- }
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque([0]))
- self.assertEqual(e2.path, deque([1]))
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e2.validator, "minimum")
-
- def test_additionalItems_with_items(self):
- instance = ["foo", "bar", 1]
- schema = {
- "items": [{}],
- "additionalItems": {"type": "integer", "minimum": 5},
- }
-
- validator = validators.Draft3Validator(schema)
- errors = validator.iter_errors(instance)
- e1, e2 = sorted_errors(errors)
-
- self.assertEqual(e1.path, deque([1]))
- self.assertEqual(e2.path, deque([2]))
-
- self.assertEqual(e1.validator, "type")
- self.assertEqual(e2.validator, "minimum")
-
- def test_propertyNames(self):
- instance = {"foo": 12}
- schema = {"propertyNames": {"not": {"const": "foo"}}}
-
- validator = validators.Draft7Validator(schema)
- error, = validator.iter_errors(instance)
-
- self.assertEqual(error.validator, "not")
- self.assertEqual(
- error.message,
- "%r is not allowed for %r" % ({"const": "foo"}, "foo"),
- )
- self.assertEqual(error.path, deque([]))
- self.assertEqual(error.schema_path, deque(["propertyNames", "not"]))
-
- def test_if_then(self):
- schema = {
- "if": {"const": 12},
- "then": {"const": 13},
- }
-
- validator = validators.Draft7Validator(schema)
- error, = validator.iter_errors(12)
-
- self.assertEqual(error.validator, "const")
- self.assertEqual(error.message, "13 was expected")
- self.assertEqual(error.path, deque([]))
- self.assertEqual(error.schema_path, deque(["if", "then", "const"]))
-
- def test_if_else(self):
- schema = {
- "if": {"const": 12},
- "else": {"const": 13},
- }
-
- validator = validators.Draft7Validator(schema)
- error, = validator.iter_errors(15)
-
- self.assertEqual(error.validator, "const")
- self.assertEqual(error.message, "13 was expected")
- self.assertEqual(error.path, deque([]))
- self.assertEqual(error.schema_path, deque(["if", "else", "const"]))
-
- def test_boolean_schema_False(self):
- validator = validators.Draft7Validator(False)
- error, = validator.iter_errors(12)
-
- self.assertEqual(
- (
- error.message,
- error.validator,
- error.validator_value,
- error.instance,
- error.schema,
- error.schema_path,
- ),
- (
- "False schema does not allow 12",
- None,
- None,
- 12,
- False,
- deque([]),
- ),
- )
-
- def test_ref(self):
- ref, schema = "someRef", {"additionalProperties": {"type": "integer"}}
- validator = validators.Draft7Validator(
- {"$ref": ref},
- resolver=validators.RefResolver("", {}, store={ref: schema}),
- )
- error, = validator.iter_errors({"foo": "notAnInteger"})
-
- self.assertEqual(
- (
- error.message,
- error.validator,
- error.validator_value,
- error.instance,
- error.absolute_path,
- error.schema,
- error.schema_path,
- ),
- (
- "'notAnInteger' is not of type 'integer'",
- "type",
- "integer",
- "notAnInteger",
- deque(["foo"]),
- {"type": "integer"},
- deque(["additionalProperties", "type"]),
- ),
- )
-
-
-class MetaSchemaTestsMixin(object):
- # TODO: These all belong upstream
- def test_invalid_properties(self):
- with self.assertRaises(exceptions.SchemaError):
- self.Validator.check_schema({"properties": {"test": object()}})
-
- def test_minItems_invalid_string(self):
- with self.assertRaises(exceptions.SchemaError):
- # needs to be an integer
- self.Validator.check_schema({"minItems": "1"})
-
- def test_enum_allows_empty_arrays(self):
- """
- Technically, all the spec says is they SHOULD have elements, not MUST.
-
- See https://github.com/Julian/jsonschema/issues/529.
- """
- self.Validator.check_schema({"enum": []})
-
- def test_enum_allows_non_unique_items(self):
- """
- Technically, all the spec says is they SHOULD be unique, not MUST.
-
- See https://github.com/Julian/jsonschema/issues/529.
- """
- self.Validator.check_schema({"enum": [12, 12]})
-
-
-class ValidatorTestMixin(MetaSchemaTestsMixin, object):
- def test_valid_instances_are_valid(self):
- schema, instance = self.valid
- self.assertTrue(self.Validator(schema).is_valid(instance))
-
- def test_invalid_instances_are_not_valid(self):
- schema, instance = self.invalid
- self.assertFalse(self.Validator(schema).is_valid(instance))
-
- def test_non_existent_properties_are_ignored(self):
- self.Validator({object(): object()}).validate(instance=object())
-
- def test_it_creates_a_ref_resolver_if_not_provided(self):
- self.assertIsInstance(
- self.Validator({}).resolver,
- validators.RefResolver,
- )
-
- def test_it_delegates_to_a_ref_resolver(self):
- ref, schema = "someCoolRef", {"type": "integer"}
- resolver = validators.RefResolver("", {}, store={ref: schema})
- validator = self.Validator({"$ref": ref}, resolver=resolver)
-
- with self.assertRaises(exceptions.ValidationError):
- validator.validate(None)
-
- def test_it_delegates_to_a_legacy_ref_resolver(self):
- """
- Legacy RefResolvers support only the context manager form of
- resolution.
- """
-
- class LegacyRefResolver(object):
- @contextmanager
- def resolving(this, ref):
- self.assertEqual(ref, "the ref")
- yield {"type": "integer"}
-
- resolver = LegacyRefResolver()
- schema = {"$ref": "the ref"}
-
- with self.assertRaises(exceptions.ValidationError):
- self.Validator(schema, resolver=resolver).validate(None)
-
- def test_is_type_is_true_for_valid_type(self):
- self.assertTrue(self.Validator({}).is_type("foo", "string"))
-
- def test_is_type_is_false_for_invalid_type(self):
- self.assertFalse(self.Validator({}).is_type("foo", "array"))
-
- def test_is_type_evades_bool_inheriting_from_int(self):
- self.assertFalse(self.Validator({}).is_type(True, "integer"))
- self.assertFalse(self.Validator({}).is_type(True, "number"))
-
- @unittest.skipIf(PY3, "In Python 3 json.load always produces unicode")
- def test_string_a_bytestring_is_a_string(self):
- self.Validator({"type": "string"}).validate(b"foo")
-
- def test_patterns_can_be_native_strings(self):
- """
- See https://github.com/Julian/jsonschema/issues/611.
- """
- self.Validator({"pattern": "foo"}).validate("foo")
-
- def test_it_can_validate_with_decimals(self):
- schema = {"items": {"type": "number"}}
- Validator = validators.extend(
- self.Validator,
- type_checker=self.Validator.TYPE_CHECKER.redefine(
- "number",
- lambda checker, thing: isinstance(
- thing, (int, float, Decimal),
- ) and not isinstance(thing, bool),
- )
- )
-
- validator = Validator(schema)
- validator.validate([1, 1.1, Decimal(1) / Decimal(8)])
-
- invalid = ["foo", {}, [], True, None]
- self.assertEqual(
- [error.instance for error in validator.iter_errors(invalid)],
- invalid,
- )
-
- def test_it_returns_true_for_formats_it_does_not_know_about(self):
- validator = self.Validator(
- {"format": "carrot"}, format_checker=FormatChecker(),
- )
- validator.validate("bugs")
-
- def test_it_does_not_validate_formats_by_default(self):
- validator = self.Validator({})
- self.assertIsNone(validator.format_checker)
-
- def test_it_validates_formats_if_a_checker_is_provided(self):
- checker = FormatChecker()
- bad = ValueError("Bad!")
-
- @checker.checks("foo", raises=ValueError)
- def check(value):
- if value == "good":
- return True
- elif value == "bad":
- raise bad
- else: # pragma: no cover
- self.fail("What is {}? [Baby Don't Hurt Me]".format(value))
-
- validator = self.Validator(
- {"format": "foo"}, format_checker=checker,
- )
-
- validator.validate("good")
- with self.assertRaises(exceptions.ValidationError) as cm:
- validator.validate("bad")
-
- # Make sure original cause is attached
- self.assertIs(cm.exception.cause, bad)
-
- def test_non_string_custom_type(self):
- non_string_type = object()
- schema = {"type": [non_string_type]}
- Crazy = validators.extend(
- self.Validator,
- type_checker=self.Validator.TYPE_CHECKER.redefine(
- non_string_type,
- lambda checker, thing: isinstance(thing, int),
- )
- )
- Crazy(schema).validate(15)
-
- def test_it_properly_formats_tuples_in_errors(self):
- """
- A tuple instance properly formats validation errors for uniqueItems.
-
- See https://github.com/Julian/jsonschema/pull/224
- """
- TupleValidator = validators.extend(
- self.Validator,
- type_checker=self.Validator.TYPE_CHECKER.redefine(
- "array",
- lambda checker, thing: isinstance(thing, tuple),
- )
- )
- with self.assertRaises(exceptions.ValidationError) as e:
- TupleValidator({"uniqueItems": True}).validate((1, 1))
- self.assertIn("(1, 1) has non-unique elements", str(e.exception))
-
-
-class AntiDraft6LeakMixin(object):
- """
- Make sure functionality from draft 6 doesn't leak backwards in time.
- """
-
- def test_True_is_not_a_schema(self):
- with self.assertRaises(exceptions.SchemaError) as e:
- self.Validator.check_schema(True)
- self.assertIn("True is not of type", str(e.exception))
-
- def test_False_is_not_a_schema(self):
- with self.assertRaises(exceptions.SchemaError) as e:
- self.Validator.check_schema(False)
- self.assertIn("False is not of type", str(e.exception))
-
- @unittest.skip(bug(523))
- def test_True_is_not_a_schema_even_if_you_forget_to_check(self):
- resolver = validators.RefResolver("", {})
- with self.assertRaises(Exception) as e:
- self.Validator(True, resolver=resolver).validate(12)
- self.assertNotIsInstance(e.exception, exceptions.ValidationError)
-
- @unittest.skip(bug(523))
- def test_False_is_not_a_schema_even_if_you_forget_to_check(self):
- resolver = validators.RefResolver("", {})
- with self.assertRaises(Exception) as e:
- self.Validator(False, resolver=resolver).validate(12)
- self.assertNotIsInstance(e.exception, exceptions.ValidationError)
-
-
-class TestDraft3Validator(AntiDraft6LeakMixin, ValidatorTestMixin, TestCase):
- Validator = validators.Draft3Validator
- valid = {}, {}
- invalid = {"type": "integer"}, "foo"
-
- def test_any_type_is_valid_for_type_any(self):
- validator = self.Validator({"type": "any"})
- validator.validate(object())
-
- def test_any_type_is_redefinable(self):
- """
- Sigh, because why not.
- """
- Crazy = validators.extend(
- self.Validator,
- type_checker=self.Validator.TYPE_CHECKER.redefine(
- "any", lambda checker, thing: isinstance(thing, int),
- )
- )
- validator = Crazy({"type": "any"})
- validator.validate(12)
- with self.assertRaises(exceptions.ValidationError):
- validator.validate("foo")
-
- def test_is_type_is_true_for_any_type(self):
- self.assertTrue(self.Validator({}).is_valid(object(), {"type": "any"}))
-
- def test_is_type_does_not_evade_bool_if_it_is_being_tested(self):
- self.assertTrue(self.Validator({}).is_type(True, "boolean"))
- self.assertTrue(self.Validator({}).is_valid(True, {"type": "any"}))
-
-
-class TestDraft4Validator(AntiDraft6LeakMixin, ValidatorTestMixin, TestCase):
- Validator = validators.Draft4Validator
- valid = {}, {}
- invalid = {"type": "integer"}, "foo"
-
-
-class TestDraft6Validator(ValidatorTestMixin, TestCase):
- Validator = validators.Draft6Validator
- valid = {}, {}
- invalid = {"type": "integer"}, "foo"
-
-
-class TestDraft7Validator(ValidatorTestMixin, TestCase):
- Validator = validators.Draft7Validator
- valid = {}, {}
- invalid = {"type": "integer"}, "foo"
-
-
-class TestValidatorFor(SynchronousTestCase):
- def test_draft_3(self):
- schema = {"$schema": "http://json-schema.org/draft-03/schema"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft3Validator,
- )
-
- schema = {"$schema": "http://json-schema.org/draft-03/schema#"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft3Validator,
- )
-
- def test_draft_4(self):
- schema = {"$schema": "http://json-schema.org/draft-04/schema"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft4Validator,
- )
-
- schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft4Validator,
- )
-
- def test_draft_6(self):
- schema = {"$schema": "http://json-schema.org/draft-06/schema"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft6Validator,
- )
-
- schema = {"$schema": "http://json-schema.org/draft-06/schema#"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft6Validator,
- )
-
- def test_draft_7(self):
- schema = {"$schema": "http://json-schema.org/draft-07/schema"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft7Validator,
- )
-
- schema = {"$schema": "http://json-schema.org/draft-07/schema#"}
- self.assertIs(
- validators.validator_for(schema),
- validators.Draft7Validator,
- )
-
- def test_True(self):
- self.assertIs(
- validators.validator_for(True),
- validators._LATEST_VERSION,
- )
-
- def test_False(self):
- self.assertIs(
- validators.validator_for(False),
- validators._LATEST_VERSION,
- )
-
- def test_custom_validator(self):
- Validator = validators.create(
- meta_schema={"id": "meta schema id"},
- version="12",
- id_of=lambda s: s.get("id", ""),
- )
- schema = {"$schema": "meta schema id"}
- self.assertIs(
- validators.validator_for(schema),
- Validator,
- )
-
- def test_custom_validator_draft6(self):
- Validator = validators.create(
- meta_schema={"$id": "meta schema $id"},
- version="13",
- )
- schema = {"$schema": "meta schema $id"}
- self.assertIs(
- validators.validator_for(schema),
- Validator,
- )
-
- def test_validator_for_jsonschema_default(self):
- self.assertIs(validators.validator_for({}), validators._LATEST_VERSION)
-
- def test_validator_for_custom_default(self):
- self.assertIs(validators.validator_for({}, default=None), None)
-
- def test_warns_if_meta_schema_specified_was_not_found(self):
- self.assertWarns(
- category=DeprecationWarning,
- message=(
- "The metaschema specified by $schema was not found. "
- "Using the latest draft to validate, but this will raise "
- "an error in the future."
- ),
- # https://tm.tl/9363 :'(
- filename=sys.modules[self.assertWarns.__module__].__file__,
-
- f=validators.validator_for,
- schema={u"$schema": "unknownSchema"},
- default={},
- )
-
- def test_does_not_warn_if_meta_schema_is_unspecified(self):
- validators.validator_for(schema={}, default={}),
- self.assertFalse(self.flushWarnings())
-
-
-class TestValidate(SynchronousTestCase):
- def assertUses(self, schema, Validator):
- result = []
- self.patch(Validator, "check_schema", result.append)
- validators.validate({}, schema)
- self.assertEqual(result, [schema])
-
- def test_draft3_validator_is_chosen(self):
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-03/schema#"},
- Validator=validators.Draft3Validator,
- )
- # Make sure it works without the empty fragment
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-03/schema"},
- Validator=validators.Draft3Validator,
- )
-
- def test_draft4_validator_is_chosen(self):
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-04/schema#"},
- Validator=validators.Draft4Validator,
- )
- # Make sure it works without the empty fragment
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-04/schema"},
- Validator=validators.Draft4Validator,
- )
-
- def test_draft6_validator_is_chosen(self):
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-06/schema#"},
- Validator=validators.Draft6Validator,
- )
- # Make sure it works without the empty fragment
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-06/schema"},
- Validator=validators.Draft6Validator,
- )
-
- def test_draft7_validator_is_chosen(self):
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-07/schema#"},
- Validator=validators.Draft7Validator,
- )
- # Make sure it works without the empty fragment
- self.assertUses(
- schema={"$schema": "http://json-schema.org/draft-07/schema"},
- Validator=validators.Draft7Validator,
- )
-
- def test_draft7_validator_is_the_default(self):
- self.assertUses(schema={}, Validator=validators.Draft7Validator)
-
- def test_validation_error_message(self):
- with self.assertRaises(exceptions.ValidationError) as e:
- validators.validate(12, {"type": "string"})
- self.assertRegexpMatches(
- str(e.exception),
- "(?s)Failed validating u?'.*' in schema.*On instance",
- )
-
- def test_schema_error_message(self):
- with self.assertRaises(exceptions.SchemaError) as e:
- validators.validate(12, {"type": 12})
- self.assertRegexpMatches(
- str(e.exception),
- "(?s)Failed validating u?'.*' in metaschema.*On schema",
- )
-
- def test_it_uses_best_match(self):
- # This is a schema that best_match will recurse into
- schema = {"oneOf": [{"type": "string"}, {"type": "array"}]}
- with self.assertRaises(exceptions.ValidationError) as e:
- validators.validate(12, schema)
- self.assertIn("12 is not of type", str(e.exception))
-
-
-class TestRefResolver(SynchronousTestCase):
-
- base_uri = ""
- stored_uri = "foo://stored"
- stored_schema = {"stored": "schema"}
-
- def setUp(self):
- self.referrer = {}
- self.store = {self.stored_uri: self.stored_schema}
- self.resolver = validators.RefResolver(
- self.base_uri, self.referrer, self.store,
- )
-
- def test_it_does_not_retrieve_schema_urls_from_the_network(self):
- ref = validators.Draft3Validator.META_SCHEMA["id"]
- self.patch(
- self.resolver,
- "resolve_remote",
- lambda *args, **kwargs: self.fail("Should not have been called!"),
- )
- with self.resolver.resolving(ref) as resolved:
- pass
- self.assertEqual(resolved, validators.Draft3Validator.META_SCHEMA)
-
- def test_it_resolves_local_refs(self):
- ref = "#/properties/foo"
- self.referrer["properties"] = {"foo": object()}
- with self.resolver.resolving(ref) as resolved:
- self.assertEqual(resolved, self.referrer["properties"]["foo"])
-
- def test_it_resolves_local_refs_with_id(self):
- schema = {"id": "http://bar/schema#", "a": {"foo": "bar"}}
- resolver = validators.RefResolver.from_schema(
- schema,
- id_of=lambda schema: schema.get(u"id", u""),
- )
- with resolver.resolving("#/a") as resolved:
- self.assertEqual(resolved, schema["a"])
- with resolver.resolving("http://bar/schema#/a") as resolved:
- self.assertEqual(resolved, schema["a"])
-
- def test_it_retrieves_stored_refs(self):
- with self.resolver.resolving(self.stored_uri) as resolved:
- self.assertIs(resolved, self.stored_schema)
-
- self.resolver.store["cached_ref"] = {"foo": 12}
- with self.resolver.resolving("cached_ref#/foo") as resolved:
- self.assertEqual(resolved, 12)
-
- def test_it_retrieves_unstored_refs_via_requests(self):
- ref = "http://bar#baz"
- schema = {"baz": 12}
-
- if "requests" in sys.modules:
- self.addCleanup(
- sys.modules.__setitem__, "requests", sys.modules["requests"],
- )
- sys.modules["requests"] = ReallyFakeRequests({"http://bar": schema})
-
- with self.resolver.resolving(ref) as resolved:
- self.assertEqual(resolved, 12)
-
- def test_it_retrieves_unstored_refs_via_urlopen(self):
- ref = "http://bar#baz"
- schema = {"baz": 12}
-
- if "requests" in sys.modules:
- self.addCleanup(
- sys.modules.__setitem__, "requests", sys.modules["requests"],
- )
- sys.modules["requests"] = None
-
- @contextmanager
- def fake_urlopen(url):
- self.assertEqual(url, "http://bar")
- yield BytesIO(json.dumps(schema).encode("utf8"))
-
- self.addCleanup(setattr, validators, "urlopen", validators.urlopen)
- validators.urlopen = fake_urlopen
-
- with self.resolver.resolving(ref) as resolved:
- pass
- self.assertEqual(resolved, 12)
-
- def test_it_retrieves_local_refs_via_urlopen(self):
- with tempfile.NamedTemporaryFile(delete=False, mode="wt") as tempf:
- self.addCleanup(os.remove, tempf.name)
- json.dump({"foo": "bar"}, tempf)
-
- ref = "file://{}#foo".format(pathname2url(tempf.name))
- with self.resolver.resolving(ref) as resolved:
- self.assertEqual(resolved, "bar")
-
- def test_it_can_construct_a_base_uri_from_a_schema(self):
- schema = {"id": "foo"}
- resolver = validators.RefResolver.from_schema(
- schema,
- id_of=lambda schema: schema.get(u"id", u""),
- )
- self.assertEqual(resolver.base_uri, "foo")
- self.assertEqual(resolver.resolution_scope, "foo")
- with resolver.resolving("") as resolved:
- self.assertEqual(resolved, schema)
- with resolver.resolving("#") as resolved:
- self.assertEqual(resolved, schema)
- with resolver.resolving("foo") as resolved:
- self.assertEqual(resolved, schema)
- with resolver.resolving("foo#") as resolved:
- self.assertEqual(resolved, schema)
-
- def test_it_can_construct_a_base_uri_from_a_schema_without_id(self):
- schema = {}
- resolver = validators.RefResolver.from_schema(schema)
- self.assertEqual(resolver.base_uri, "")
- self.assertEqual(resolver.resolution_scope, "")
- with resolver.resolving("") as resolved:
- self.assertEqual(resolved, schema)
- with resolver.resolving("#") as resolved:
- self.assertEqual(resolved, schema)
-
- def test_custom_uri_scheme_handlers(self):
- def handler(url):
- self.assertEqual(url, ref)
- return schema
-
- schema = {"foo": "bar"}
- ref = "foo://bar"
- resolver = validators.RefResolver("", {}, handlers={"foo": handler})
- with resolver.resolving(ref) as resolved:
- self.assertEqual(resolved, schema)
-
- def test_cache_remote_on(self):
- response = [object()]
-
- def handler(url):
- try:
- return response.pop()
- except IndexError: # pragma: no cover
- self.fail("Response must not have been cached!")
-
- ref = "foo://bar"
- resolver = validators.RefResolver(
- "", {}, cache_remote=True, handlers={"foo": handler},
- )
- with resolver.resolving(ref):
- pass
- with resolver.resolving(ref):
- pass
-
- def test_cache_remote_off(self):
- response = [object()]
-
- def handler(url):
- try:
- return response.pop()
- except IndexError: # pragma: no cover
- self.fail("Handler called twice!")
-
- ref = "foo://bar"
- resolver = validators.RefResolver(
- "", {}, cache_remote=False, handlers={"foo": handler},
- )
- with resolver.resolving(ref):
- pass
-
- def test_if_you_give_it_junk_you_get_a_resolution_error(self):
- error = ValueError("Oh no! What's this?")
-
- def handler(url):
- raise error
-
- ref = "foo://bar"
- resolver = validators.RefResolver("", {}, handlers={"foo": handler})
- with self.assertRaises(exceptions.RefResolutionError) as err:
- with resolver.resolving(ref):
- self.fail("Shouldn't get this far!") # pragma: no cover
- self.assertEqual(err.exception, exceptions.RefResolutionError(error))
-
- def test_helpful_error_message_on_failed_pop_scope(self):
- resolver = validators.RefResolver("", {})
- resolver.pop_scope()
- with self.assertRaises(exceptions.RefResolutionError) as exc:
- resolver.pop_scope()
- self.assertIn("Failed to pop the scope", str(exc.exception))
-
-
-def sorted_errors(errors):
- def key(error):
- return (
- [str(e) for e in error.path],
- [str(e) for e in error.schema_path],
- )
- return sorted(errors, key=key)
-
-
-@attr.s
-class ReallyFakeRequests(object):
-
- _responses = attr.ib()
-
- def get(self, url):
- response = self._responses.get(url)
- if url is None: # pragma: no cover
- raise ValueError("Unknown URL: " + repr(url))
- return _ReallyFakeJSONResponse(json.dumps(response))
-
-
-@attr.s
-class _ReallyFakeJSONResponse(object):
-
- _response = attr.ib()
-
- def json(self):
- return json.loads(self._response)
diff --git a/lib/spack/external/_vendoring/jsonschema/validators.py b/lib/spack/external/_vendoring/jsonschema/validators.py
index 1dc420c70d2..75eab02d688 100644
--- a/lib/spack/external/_vendoring/jsonschema/validators.py
+++ b/lib/spack/external/_vendoring/jsonschema/validators.py
@@ -8,16 +8,16 @@
import json
import numbers
-from six import add_metaclass
+from _vendoring.six import add_metaclass
-from jsonschema import (
+from _vendoring.jsonschema import (
_legacy_validators,
_types,
_utils,
_validators,
exceptions,
)
-from jsonschema.compat import (
+from _vendoring.jsonschema.compat import (
Sequence,
int_types,
iteritems,
@@ -33,7 +33,7 @@
# Sigh. https://gitlab.com/pycqa/flake8/issues/280
# https://github.com/pyga/ebb-lint/issues/7
# Imported for backwards compatibility.
-from jsonschema.exceptions import ErrorTree
+from _vendoring.jsonschema.exceptions import ErrorTree
ErrorTree
diff --git a/lib/spack/external/_vendoring/macholib/MachO.py b/lib/spack/external/_vendoring/macholib/MachO.py
index daa36b0d3c3..ed55a4a9358 100644
--- a/lib/spack/external/_vendoring/macholib/MachO.py
+++ b/lib/spack/external/_vendoring/macholib/MachO.py
@@ -7,7 +7,7 @@
import struct
import sys
-from macholib.util import fileview
+from _vendoring.macholib.util import fileview
from .mach_o import (
FAT_MAGIC,
@@ -41,7 +41,7 @@
from .ptypes import sizeof
try:
- from macholib.compat import bytes
+ from _vendoring.macholib.compat import bytes
except ImportError:
pass
diff --git a/lib/spack/external/_vendoring/macholib/MachOGraph.py b/lib/spack/external/_vendoring/macholib/MachOGraph.py
index 8943ed8bd3b..666ff7cae04 100644
--- a/lib/spack/external/_vendoring/macholib/MachOGraph.py
+++ b/lib/spack/external/_vendoring/macholib/MachOGraph.py
@@ -5,11 +5,11 @@
import os
import sys
-from altgraph.ObjectGraph import ObjectGraph
+from _vendoring.altgraph.ObjectGraph import ObjectGraph
-from macholib.dyld import dyld_find
-from macholib.itergraphreport import itergraphreport
-from macholib.MachO import MachO
+from _vendoring.macholib.dyld import dyld_find
+from _vendoring.macholib.itergraphreport import itergraphreport
+from _vendoring.macholib.MachO import MachO
__all__ = ["MachOGraph"]
diff --git a/lib/spack/external/_vendoring/macholib/MachOStandalone.py b/lib/spack/external/_vendoring/macholib/MachOStandalone.py
index 6ce154227c5..ad84cdd7d34 100644
--- a/lib/spack/external/_vendoring/macholib/MachOStandalone.py
+++ b/lib/spack/external/_vendoring/macholib/MachOStandalone.py
@@ -1,9 +1,9 @@
import os
from collections import deque
-from macholib.dyld import framework_info
-from macholib.MachOGraph import MachOGraph, MissingMachO
-from macholib.util import (
+from _vendoring.macholib.dyld import framework_info
+from _vendoring.macholib.MachOGraph import MachOGraph, MissingMachO
+from _vendoring.macholib.util import (
flipwritable,
has_filename_filter,
in_system_path,
diff --git a/lib/spack/external/_vendoring/macholib/SymbolTable.py b/lib/spack/external/_vendoring/macholib/SymbolTable.py
index 006abab59fd..759eb464faf 100644
--- a/lib/spack/external/_vendoring/macholib/SymbolTable.py
+++ b/lib/spack/external/_vendoring/macholib/SymbolTable.py
@@ -5,7 +5,7 @@
import sys
-from macholib.mach_o import (
+from _vendoring.macholib.mach_o import (
MH_CIGAM_64,
MH_MAGIC_64,
dylib_module,
diff --git a/lib/spack/external/_vendoring/macholib/__main__.py b/lib/spack/external/_vendoring/macholib/__main__.py
index dd3cc116108..8ad8e53c267 100644
--- a/lib/spack/external/_vendoring/macholib/__main__.py
+++ b/lib/spack/external/_vendoring/macholib/__main__.py
@@ -3,8 +3,8 @@
import os
import sys
-from macholib import macho_dump, macho_standalone
-from macholib.util import is_platform_file
+from _vendoring.macholib import macho_dump, macho_standalone
+from _vendoring.macholib.util import is_platform_file
gCommand = None
@@ -43,10 +43,10 @@ def walk_tree(callback, paths):
def print_usage(fp):
print("Usage:", file=fp)
- print(" python -mmacholib [help|--help]", file=fp)
- print(" python -mmacholib dump FILE ...", file=fp)
- print(" python -mmacholib find DIR ...", file=fp)
- print(" python -mmacholib standalone DIR ...", file=fp)
+ print(" python -m_vendoring.macholib [help|--help]", file=fp)
+ print(" python -m_vendoring.macholib dump FILE ...", file=fp)
+ print(" python -m_vendoring.macholib find DIR ...", file=fp)
+ print(" python -m_vendoring.macholib standalone DIR ...", file=fp)
def main():
diff --git a/lib/spack/external/_vendoring/macholib/_cmdline.py b/lib/spack/external/_vendoring/macholib/_cmdline.py
index 9304fb62577..56a42e08f08 100644
--- a/lib/spack/external/_vendoring/macholib/_cmdline.py
+++ b/lib/spack/external/_vendoring/macholib/_cmdline.py
@@ -6,7 +6,7 @@
import os
import sys
-from macholib.util import is_platform_file
+from _vendoring.macholib.util import is_platform_file
def check_file(fp, path, callback):
diff --git a/lib/spack/external/_vendoring/macholib/dyld.py b/lib/spack/external/_vendoring/macholib/dyld.py
index fcb23198cb8..c8b84cb615b 100644
--- a/lib/spack/external/_vendoring/macholib/dyld.py
+++ b/lib/spack/external/_vendoring/macholib/dyld.py
@@ -8,8 +8,8 @@
import sys
from itertools import chain
-from macholib.dylib import dylib_info
-from macholib.framework import framework_info
+from _vendoring.macholib.dylib import dylib_info
+from _vendoring.macholib.framework import framework_info
__all__ = ["dyld_find", "framework_find", "framework_info", "dylib_info"]
diff --git a/lib/spack/external/_vendoring/macholib/mach_o.py b/lib/spack/external/_vendoring/macholib/mach_o.py
index bfe61571729..8af7ba731ac 100644
--- a/lib/spack/external/_vendoring/macholib/mach_o.py
+++ b/lib/spack/external/_vendoring/macholib/mach_o.py
@@ -13,7 +13,7 @@
import time
-from macholib.ptypes import (
+from _vendoring.macholib.ptypes import (
Structure,
p_int32,
p_int64,
diff --git a/lib/spack/external/_vendoring/macholib/macho_dump.py b/lib/spack/external/_vendoring/macholib/macho_dump.py
index bca5d777ae8..fda8072c4e3 100644
--- a/lib/spack/external/_vendoring/macholib/macho_dump.py
+++ b/lib/spack/external/_vendoring/macholib/macho_dump.py
@@ -4,9 +4,9 @@
import sys
-from macholib._cmdline import main as _main
-from macholib.mach_o import CPU_TYPE_NAMES, MH_CIGAM_64, MH_MAGIC_64, get_cpu_subtype
-from macholib.MachO import MachO
+from _vendoring.macholib._cmdline import main as _main
+from _vendoring.macholib.mach_o import CPU_TYPE_NAMES, MH_CIGAM_64, MH_MAGIC_64, get_cpu_subtype
+from _vendoring.macholib.MachO import MachO
ARCH_MAP = {
("<", "64-bit"): "x86_64",
@@ -45,7 +45,7 @@ def print_file(fp, path):
def main():
print(
- "WARNING: 'macho_dump' is deprecated, use 'python -mmacholib dump' " "instead"
+ "WARNING: 'macho_dump' is deprecated, use 'python -m_vendoring.macholib dump' " "instead"
)
_main(print_file)
diff --git a/lib/spack/external/_vendoring/macholib/macho_find.py b/lib/spack/external/_vendoring/macholib/macho_find.py
index a963c36dcc3..1fe315b8234 100644
--- a/lib/spack/external/_vendoring/macholib/macho_find.py
+++ b/lib/spack/external/_vendoring/macholib/macho_find.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from __future__ import print_function
-from macholib._cmdline import main as _main
+from _vendoring.macholib._cmdline import main as _main
def print_file(fp, path):
@@ -10,7 +10,7 @@ def print_file(fp, path):
def main():
print(
- "WARNING: 'macho_find' is deprecated, " "use 'python -mmacholib dump' instead"
+ "WARNING: 'macho_find' is deprecated, " "use 'python -m_vendoring.macholib dump' instead"
)
_main(print_file)
diff --git a/lib/spack/external/_vendoring/macholib/macho_standalone.py b/lib/spack/external/_vendoring/macholib/macho_standalone.py
index 0bb29e802f3..bc527cd3a52 100644
--- a/lib/spack/external/_vendoring/macholib/macho_standalone.py
+++ b/lib/spack/external/_vendoring/macholib/macho_standalone.py
@@ -3,8 +3,8 @@
import os
import sys
-from macholib.MachOStandalone import MachOStandalone
-from macholib.util import strip_files
+from _vendoring.macholib.MachOStandalone import MachOStandalone
+from _vendoring.macholib.util import strip_files
def standaloneApp(path):
@@ -18,7 +18,7 @@ def standaloneApp(path):
def main():
print(
"WARNING: 'macho_standalone' is deprecated, use "
- "'python -mmacholib standalone' instead"
+ "'python -m_vendoring.macholib standalone' instead"
)
if not sys.argv[1:]:
raise SystemExit("usage: %s [appbundle ...]" % (sys.argv[0],))
diff --git a/lib/spack/external/_vendoring/macholib/util.py b/lib/spack/external/_vendoring/macholib/util.py
index d5ab33544af..105e515aaf5 100644
--- a/lib/spack/external/_vendoring/macholib/util.py
+++ b/lib/spack/external/_vendoring/macholib/util.py
@@ -4,7 +4,7 @@
import struct
import sys
-from macholib import mach_o
+from _vendoring.macholib import mach_o
MAGIC = [
struct.pack("!L", getattr(mach_o, "MH_" + _))
diff --git a/lib/spack/external/_vendoring/markupsafe/__init__.py b/lib/spack/external/_vendoring/markupsafe/__init__.py
index d331ac36228..e6868f1cbaf 100644
--- a/lib/spack/external/_vendoring/markupsafe/__init__.py
+++ b/lib/spack/external/_vendoring/markupsafe/__init__.py
@@ -4,7 +4,7 @@
import typing as t
if t.TYPE_CHECKING:
- import typing_extensions as te
+ import _vendoring.typing_extensions as te
class HasHTML(te.Protocol):
def __html__(self) -> str:
diff --git a/lib/spack/external/_vendoring/pyrsistent/__init__.py b/lib/spack/external/_vendoring/pyrsistent/__init__.py
index be299658f3f..7ba067c2a78 100644
--- a/lib/spack/external/_vendoring/pyrsistent/__init__.py
+++ b/lib/spack/external/_vendoring/pyrsistent/__init__.py
@@ -1,35 +1,35 @@
# -*- coding: utf-8 -*-
-from pyrsistent._pmap import pmap, m, PMap
+from _vendoring.pyrsistent._pmap import pmap, m, PMap
-from pyrsistent._pvector import pvector, v, PVector
+from _vendoring.pyrsistent._pvector import pvector, v, PVector
-from pyrsistent._pset import pset, s, PSet
+from _vendoring.pyrsistent._pset import pset, s, PSet
-from pyrsistent._pbag import pbag, b, PBag
+from _vendoring.pyrsistent._pbag import pbag, b, PBag
-from pyrsistent._plist import plist, l, PList
+from _vendoring.pyrsistent._plist import plist, l, PList
-from pyrsistent._pdeque import pdeque, dq, PDeque
+from _vendoring.pyrsistent._pdeque import pdeque, dq, PDeque
-from pyrsistent._checked_types import (
+from _vendoring.pyrsistent._checked_types import (
CheckedPMap, CheckedPVector, CheckedPSet, InvariantException, CheckedKeyTypeError,
CheckedValueTypeError, CheckedType, optional)
-from pyrsistent._field_common import (
+from _vendoring.pyrsistent._field_common import (
field, PTypeError, pset_field, pmap_field, pvector_field)
-from pyrsistent._precord import PRecord
+from _vendoring.pyrsistent._precord import PRecord
-from pyrsistent._pclass import PClass, PClassMeta
+from _vendoring.pyrsistent._pclass import PClass, PClassMeta
-from pyrsistent._immutable import immutable
+from _vendoring.pyrsistent._immutable import immutable
-from pyrsistent._helpers import freeze, thaw, mutant
+from _vendoring.pyrsistent._helpers import freeze, thaw, mutant
-from pyrsistent._transformations import inc, discard, rex, ny
+from _vendoring.pyrsistent._transformations import inc, discard, rex, ny
-from pyrsistent._toolz import get_in
+from _vendoring.pyrsistent._toolz import get_in
__all__ = ('pmap', 'm', 'PMap',
diff --git a/lib/spack/external/_vendoring/pyrsistent/_checked_types.py b/lib/spack/external/_vendoring/pyrsistent/_checked_types.py
index 8ab8c2a8cc7..f44667ddc2e 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_checked_types.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_checked_types.py
@@ -3,9 +3,9 @@
from abc import abstractmethod, ABCMeta
from collections.abc import Iterable
-from pyrsistent._pmap import PMap, pmap
-from pyrsistent._pset import PSet, pset
-from pyrsistent._pvector import PythonPVector, python_pvector
+from _vendoring.pyrsistent._pmap import PMap, pmap
+from _vendoring.pyrsistent._pset import PSet, pset
+from _vendoring.pyrsistent._pvector import PythonPVector, python_pvector
class CheckedType(object):
diff --git a/lib/spack/external/_vendoring/pyrsistent/_field_common.py b/lib/spack/external/_vendoring/pyrsistent/_field_common.py
index 9ddfe29d2d9..2b17433b067 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_field_common.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_field_common.py
@@ -1,6 +1,6 @@
import sys
-from pyrsistent._checked_types import (
+from _vendoring.pyrsistent._checked_types import (
CheckedPMap,
CheckedPSet,
CheckedPVector,
@@ -11,8 +11,8 @@
maybe_parse_user_type,
maybe_parse_many_user_types,
)
-from pyrsistent._checked_types import optional as optional_type
-from pyrsistent._checked_types import wrap_invariant
+from _vendoring.pyrsistent._checked_types import optional as optional_type
+from _vendoring.pyrsistent._checked_types import wrap_invariant
import inspect
PY2 = sys.version_info[0] < 3
diff --git a/lib/spack/external/_vendoring/pyrsistent/_helpers.py b/lib/spack/external/_vendoring/pyrsistent/_helpers.py
index 1320e657689..2858dd219f2 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_helpers.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_helpers.py
@@ -1,11 +1,11 @@
from functools import wraps
-from pyrsistent._pmap import PMap, pmap
-from pyrsistent._pset import PSet, pset
-from pyrsistent._pvector import PVector, pvector
+from _vendoring.pyrsistent._pmap import PMap, pmap
+from _vendoring.pyrsistent._pset import PSet, pset
+from _vendoring.pyrsistent._pvector import PVector, pvector
def freeze(o, strict=True):
"""
- Recursively convert simple Python containers into pyrsistent versions
+ Recursively convert simple Python containers into _vendoring.pyrsistent versions
of those containers.
- list is converted to pvector, recursively
@@ -47,7 +47,7 @@ def freeze(o, strict=True):
def thaw(o, strict=True):
"""
- Recursively convert pyrsistent containers into simple Python containers.
+ Recursively convert _vendoring.pyrsistent containers into simple Python containers.
- pvector is converted to list, recursively
- pmap is converted to dict, recursively on values (but not keys)
@@ -59,7 +59,7 @@ def thaw(o, strict=True):
- thaw is called on elements of lists
- thaw is called on values in dicts
- >>> from pyrsistent import s, m, v
+ >>> from _vendoring.pyrsistent import s, m, v
>>> thaw(s(1, 2))
{1, 2}
>>> thaw(v(1, m(a=3)))
diff --git a/lib/spack/external/_vendoring/pyrsistent/_immutable.py b/lib/spack/external/_vendoring/pyrsistent/_immutable.py
index 7c759453360..f4f1f99e09f 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_immutable.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_immutable.py
@@ -94,7 +94,7 @@ def set(self, **kwargs):
print(template)
from collections import namedtuple
- namespace = dict(namedtuple=namedtuple, __name__='pyrsistent_immutable')
+ namespace = dict(namedtuple=namedtuple, __name__='_vendoring.pyrsistent_immutable')
try:
exec(template, namespace)
except SyntaxError as e:
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pbag.py b/lib/spack/external/_vendoring/pyrsistent/_pbag.py
index 9cf5840b72e..fc6c9ca20f6 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pbag.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pbag.py
@@ -1,6 +1,6 @@
from collections.abc import Container, Iterable, Sized, Hashable
from functools import reduce
-from pyrsistent._pmap import pmap
+from _vendoring.pyrsistent._pmap import pmap
def _add_to_counters(counters, element):
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pclass.py b/lib/spack/external/_vendoring/pyrsistent/_pclass.py
index fd31a95d63a..71040da85b9 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pclass.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pclass.py
@@ -1,8 +1,8 @@
-from pyrsistent._checked_types import (InvariantException, CheckedType, _restore_pickle, store_invariants)
-from pyrsistent._field_common import (
+from _vendoring.pyrsistent._checked_types import (InvariantException, CheckedType, _restore_pickle, store_invariants)
+from _vendoring.pyrsistent._field_common import (
set_fields, check_type, is_field_ignore_extra_complaint, PFIELD_NO_INITIAL, serialize, check_global_invariants
)
-from pyrsistent._transformations import transform
+from _vendoring.pyrsistent._transformations import transform
def _is_pclass(bases):
@@ -41,7 +41,7 @@ class PClass(CheckedType, metaclass=PClassMeta):
is not a PMap and hence not a collection but rather a plain Python object.
- More documentation and examples of PClass usage is available at https://github.com/tobgu/pyrsistent
+ More documentation and examples of PClass usage is available at https://github.com/tobgu/_vendoring.pyrsistent
"""
def __new__(cls, **kwargs): # Support *args?
result = super(PClass, cls).__new__(cls)
@@ -84,7 +84,7 @@ def set(self, *args, **kwargs):
Set a field in the instance. Returns a new instance with the updated value. The original instance remains
unmodified. Accepts key-value pairs or single string representing the field name and a value.
- >>> from pyrsistent import PClass, field
+ >>> from _vendoring.pyrsistent import PClass, field
>>> class AClass(PClass):
... x = field()
...
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pdeque.py b/lib/spack/external/_vendoring/pyrsistent/_pdeque.py
index bd11bfa0320..d33b4dea9b6 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pdeque.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pdeque.py
@@ -1,7 +1,7 @@
from collections.abc import Sequence, Hashable
from itertools import islice, chain
from numbers import Integral
-from pyrsistent._plist import plist
+from _vendoring.pyrsistent._plist import plist
class PDeque(object):
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pmap.py b/lib/spack/external/_vendoring/pyrsistent/_pmap.py
index 81d99c076f5..e257fb0d57c 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pmap.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pmap.py
@@ -1,7 +1,7 @@
from collections.abc import Mapping, Hashable
from itertools import chain
-from pyrsistent._pvector import pvector
-from pyrsistent._transformations import transform
+from _vendoring.pyrsistent._pvector import pvector
+from _vendoring.pyrsistent._transformations import transform
class PMap(object):
@@ -256,7 +256,7 @@ def transform(self, *transformations):
consists of two parts. One match expression that specifies which elements to transform
and one transformation function that performs the actual transformation.
- >>> from pyrsistent import freeze, ny
+ >>> from _vendoring.pyrsistent import freeze, ny
>>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
... {'author': 'Steve', 'content': 'A slightly longer article'}],
... 'weather': {'temperature': '11C', 'wind': '5m/s'}})
diff --git a/lib/spack/external/_vendoring/pyrsistent/_precord.py b/lib/spack/external/_vendoring/pyrsistent/_precord.py
index 1ee8198a1a3..70850add75e 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_precord.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_precord.py
@@ -1,8 +1,8 @@
-from pyrsistent._checked_types import CheckedType, _restore_pickle, InvariantException, store_invariants
-from pyrsistent._field_common import (
+from _vendoring.pyrsistent._checked_types import CheckedType, _restore_pickle, InvariantException, store_invariants
+from _vendoring.pyrsistent._field_common import (
set_fields, check_type, is_field_ignore_extra_complaint, PFIELD_NO_INITIAL, serialize, check_global_invariants
)
-from pyrsistent._pmap import PMap, pmap
+from _vendoring.pyrsistent._pmap import PMap, pmap
class _PRecordMeta(type):
@@ -28,7 +28,7 @@ class PRecord(PMap, CheckedType, metaclass=_PRecordMeta):
from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
access using subscript notation.
- More documentation and examples of PRecord usage is available at https://github.com/tobgu/pyrsistent
+ More documentation and examples of PRecord usage is available at https://github.com/tobgu/_vendoring.pyrsistent
"""
def __new__(cls, **kwargs):
# Hack total! If these two special attributes exist that means we can create
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pset.py b/lib/spack/external/_vendoring/pyrsistent/_pset.py
index 4fae8278f0e..4fb3baced20 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pset.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pset.py
@@ -1,6 +1,6 @@
from collections.abc import Set, Hashable
import sys
-from pyrsistent._pmap import pmap
+from _vendoring.pyrsistent._pmap import pmap
class PSet(object):
diff --git a/lib/spack/external/_vendoring/pyrsistent/_pvector.py b/lib/spack/external/_vendoring/pyrsistent/_pvector.py
index 2aff0e8b42b..61157108dfe 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_pvector.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_pvector.py
@@ -2,7 +2,7 @@
from collections.abc import Sequence, Hashable
from numbers import Integral
import operator
-from pyrsistent._transformations import transform
+from _vendoring.pyrsistent._transformations import transform
def _bitcount(val):
@@ -626,7 +626,7 @@ def transform(self, *transformations):
consists of two parts. One match expression that specifies which elements to transform
and one transformation function that performs the actual transformation.
- >>> from pyrsistent import freeze, ny
+ >>> from _vendoring.pyrsistent import freeze, ny
>>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
... {'author': 'Steve', 'content': 'A slightly longer article'}],
... 'weather': {'temperature': '11C', 'wind': '5m/s'}})
diff --git a/lib/spack/external/_vendoring/pyrsistent/_toolz.py b/lib/spack/external/_vendoring/pyrsistent/_toolz.py
index a7faed16535..9b39013ae3a 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_toolz.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_toolz.py
@@ -56,7 +56,7 @@ def get_in(keys, coll, default=None, no_default=False):
``get_in`` is a generalization of ``operator.getitem`` for nested data
structures such as dictionaries and lists.
- >>> from pyrsistent import freeze
+ >>> from _vendoring.pyrsistent import freeze
>>> transaction = freeze({'name': 'Alice',
... 'purchase': {'items': ['Apple', 'Orange'],
... 'costs': [0.50, 1.25]},
diff --git a/lib/spack/external/_vendoring/pyrsistent/_transformations.py b/lib/spack/external/_vendoring/pyrsistent/_transformations.py
index 7544843aca6..94bb3e08ecb 100644
--- a/lib/spack/external/_vendoring/pyrsistent/_transformations.py
+++ b/lib/spack/external/_vendoring/pyrsistent/_transformations.py
@@ -117,7 +117,7 @@ def _get_arity(f):
def _update_structure(structure, kvs, path, command):
- from pyrsistent._pmap import pmap
+ from _vendoring.pyrsistent._pmap import pmap
e = structure.evolver()
if not path and command is discard:
# Do this in reverse to avoid index problems with vectors. See #92.
diff --git a/lib/spack/external/_vendoring/pyrsistent/typing.py b/lib/spack/external/_vendoring/pyrsistent/typing.py
index 6a86c831ba4..0981640bb5e 100644
--- a/lib/spack/external/_vendoring/pyrsistent/typing.py
+++ b/lib/spack/external/_vendoring/pyrsistent/typing.py
@@ -5,8 +5,8 @@
For example,
- from pyrsistent import pvector
- from pyrsistent.typing import PVector
+ from _vendoring.pyrsistent import pvector
+ from _vendoring.pyrsistent.typing import PVector
myvector: PVector[str] = pvector(['a', 'b', 'c'])
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/__init__.py b/lib/spack/external/_vendoring/ruamel/yaml/__init__.py
index 2a2572cd4a1..2f8eeec1ad8 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/__init__.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/__init__.py
@@ -4,18 +4,18 @@
from typing import Dict, Any # NOQA
_package_data = dict(
- full_package_name='ruamel.yaml',
+ full_package_name='_vendoring.ruamel.yaml',
version_info=(0, 17, 21),
__version__='0.17.21',
version_timestamp='2022-02-12 09:49:22',
author='Anthon van der Neut',
author_email='a.van.der.neut@ruamel.eu',
- description='ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order', # NOQA
+ description='_vendoring.ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order', # NOQA
entry_points=None,
since=2014,
extras_require={
- ':platform_python_implementation=="CPython" and python_version<"3.11"': ['ruamel.yaml.clib>=0.2.6'], # NOQA
- 'jinja2': ['ruamel.yaml.jinja2>=0.2'],
+ ':platform_python_implementation=="CPython" and python_version<"3.11"': ['_vendoring.ruamel.yaml.clib>=0.2.6'], # NOQA
+ '_vendoring.jinja2': ['_vendoring.ruamel.yaml._vendoring.jinja2>=0.2'],
'docs': ['ryd'],
},
classifiers=[
@@ -54,4 +54,4 @@
except (ImportError, ValueError): # for Jython
__with_libyaml__ = False
-from ruamel.yaml.main import * # NOQA
+from _vendoring.ruamel.yaml.main import * # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/comments.py b/lib/spack/external/_vendoring/ruamel/yaml/comments.py
index 1badeda585d..641a10cc029 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/comments.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/comments.py
@@ -10,10 +10,10 @@
import copy
-from ruamel.yaml.compat import ordereddict
-from ruamel.yaml.compat import MutableSliceableSequence, _F, nprintf # NOQA
-from ruamel.yaml.scalarstring import ScalarString
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.compat import ordereddict
+from _vendoring.ruamel.yaml.compat import MutableSliceableSequence, _F, nprintf # NOQA
+from _vendoring.ruamel.yaml.scalarstring import ScalarString
+from _vendoring.ruamel.yaml.anchor import Anchor
from collections.abc import MutableSet, Sized, Set, Mapping
@@ -375,8 +375,8 @@ def yaml_set_comment_before_after_key(
"""
expects comment (before/after) to be without `#` and possible have multiple lines
"""
- from ruamel.yaml.error import CommentMark
- from ruamel.yaml.tokens import CommentToken
+ from _vendoring.ruamel.yaml.error import CommentMark
+ from _vendoring.ruamel.yaml.tokens import CommentToken
def comment_token(s, mark):
# type: (Any, Any) -> Any
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/compat.py b/lib/spack/external/_vendoring/ruamel/yaml/compat.py
index 87d5e359d35..e50ff30dcee 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/compat.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/compat.py
@@ -169,7 +169,7 @@ def fp(self, mode='a'):
nprint = Nprint()
-nprintf = Nprint('/var/tmp/ruamel.yaml.log')
+nprintf = Nprint('/var/tmp/_vendoring.ruamel.yaml.log')
# char checkers following production rules
@@ -197,9 +197,9 @@ def check_anchorname_char(ch):
def version_tnf(t1, t2=None):
# type: (Any, Any) -> Any
"""
- return True if ruamel.yaml version_info < t1, None if t2 is specified and bigger else False
+ return True if _vendoring.ruamel.yaml version_info < t1, None if t2 is specified and bigger else False
"""
- from ruamel.yaml import version_info # NOQA
+ from _vendoring.ruamel.yaml import version_info # NOQA
if version_info < t1:
return True
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/composer.py b/lib/spack/external/_vendoring/ruamel/yaml/composer.py
index bad132aae82..2fd6e312074 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/composer.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/composer.py
@@ -2,10 +2,10 @@
import warnings
-from ruamel.yaml.error import MarkedYAMLError, ReusedAnchorWarning
-from ruamel.yaml.compat import _F, nprint, nprintf # NOQA
+from _vendoring.ruamel.yaml.error import MarkedYAMLError, ReusedAnchorWarning
+from _vendoring.ruamel.yaml.compat import _F, nprint, nprintf # NOQA
-from ruamel.yaml.events import (
+from _vendoring.ruamel.yaml.events import (
StreamStartEvent,
StreamEndEvent,
MappingStartEvent,
@@ -15,7 +15,7 @@
AliasEvent,
ScalarEvent,
)
-from ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode
+from _vendoring.ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode
if False: # MYPY
from typing import Any, Dict, Optional, List # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/configobjwalker.py b/lib/spack/external/_vendoring/ruamel/yaml/configobjwalker.py
index cbc6148038e..2254a3cd515 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/configobjwalker.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/configobjwalker.py
@@ -2,7 +2,7 @@
import warnings
-from ruamel.yaml.util import configobj_walker as new_configobj_walker
+from _vendoring.ruamel.yaml.util import configobj_walker as new_configobj_walker
if False: # MYPY
from typing import Any # NOQA
@@ -10,5 +10,5 @@
def configobj_walker(cfg):
# type: (Any) -> Any
- warnings.warn('configobj_walker has moved to ruamel.yaml.util, please update your code')
+ warnings.warn('configobj_walker has moved to _vendoring.ruamel.yaml.util, please update your code')
return new_configobj_walker(cfg)
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/constructor.py b/lib/spack/external/_vendoring/ruamel/yaml/constructor.py
index 6aa6371779b..5085c997d2e 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/constructor.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/constructor.py
@@ -9,29 +9,29 @@
from collections.abc import Hashable, MutableSequence, MutableMapping
# fmt: off
-from ruamel.yaml.error import (MarkedYAMLError, MarkedYAMLFutureWarning,
+from _vendoring.ruamel.yaml.error import (MarkedYAMLError, MarkedYAMLFutureWarning,
MantissaNoDotYAML1_1Warning)
-from ruamel.yaml.nodes import * # NOQA
-from ruamel.yaml.nodes import (SequenceNode, MappingNode, ScalarNode)
-from ruamel.yaml.compat import (_F, builtins_module, # NOQA
+from _vendoring.ruamel.yaml.nodes import * # NOQA
+from _vendoring.ruamel.yaml.nodes import (SequenceNode, MappingNode, ScalarNode)
+from _vendoring.ruamel.yaml.compat import (_F, builtins_module, # NOQA
nprint, nprintf, version_tnf)
-from ruamel.yaml.compat import ordereddict
+from _vendoring.ruamel.yaml.compat import ordereddict
-from ruamel.yaml.comments import * # NOQA
-from ruamel.yaml.comments import (CommentedMap, CommentedOrderedMap, CommentedSet,
+from _vendoring.ruamel.yaml.comments import * # NOQA
+from _vendoring.ruamel.yaml.comments import (CommentedMap, CommentedOrderedMap, CommentedSet,
CommentedKeySeq, CommentedSeq, TaggedScalar,
CommentedKeyMap,
C_KEY_PRE, C_KEY_EOL, C_KEY_POST,
C_VALUE_PRE, C_VALUE_EOL, C_VALUE_POST,
)
-from ruamel.yaml.scalarstring import (SingleQuotedScalarString, DoubleQuotedScalarString,
+from _vendoring.ruamel.yaml.scalarstring import (SingleQuotedScalarString, DoubleQuotedScalarString,
LiteralScalarString, FoldedScalarString,
PlainScalarString, ScalarString,)
-from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
-from ruamel.yaml.scalarfloat import ScalarFloat
-from ruamel.yaml.scalarbool import ScalarBoolean
-from ruamel.yaml.timestamp import TimeStamp
-from ruamel.yaml.util import timestamp_regexp, create_timestamp
+from _vendoring.ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
+from _vendoring.ruamel.yaml.scalarfloat import ScalarFloat
+from _vendoring.ruamel.yaml.scalarbool import ScalarBoolean
+from _vendoring.ruamel.yaml.timestamp import TimeStamp
+from _vendoring.ruamel.yaml.util import timestamp_regexp, create_timestamp
if False: # MYPY
from typing import Any, Dict, List, Set, Generator, Union, Optional # NOQA
@@ -1282,7 +1282,7 @@ def construct_rt_sequence(self, node, seqtyp, deep=False):
if node.comment:
nprintf('nc3', node.comment)
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
seqtyp.yaml_set_anchor(node.anchor)
@@ -1418,7 +1418,7 @@ def construct_mapping(self, node, maptyp, deep=False): # type: ignore
for cmnt in self.comments(node.comment, 0):
maptyp.ca.pre.append(cmnt)
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
maptyp.yaml_set_anchor(node.anchor)
@@ -1517,7 +1517,7 @@ def construct_setting(self, node, typ, deep=False):
if node.comment:
nprintf('nc6', node.comment)
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
typ.yaml_set_anchor(node.anchor)
@@ -1592,8 +1592,8 @@ def construct_yaml_object(self, node, cls):
else:
data.__dict__.update(state)
if node.anchor:
- from ruamel.yaml.serializer import templated_id
- from ruamel.yaml.anchor import Anchor
+ from _vendoring.ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.anchor import Anchor
if not templated_id(node.anchor):
if not hasattr(data, Anchor.attrib):
@@ -1691,7 +1691,7 @@ def construct_undefined(self, node):
data.yaml_set_tag(node.tag)
yield data
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
data.yaml_set_anchor(node.anchor)
@@ -1704,7 +1704,7 @@ def construct_undefined(self, node):
data2.yaml_set_tag(node.tag)
yield data2
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
data2.yaml_set_anchor(node.anchor, always_dump=True)
@@ -1719,7 +1719,7 @@ def construct_undefined(self, node):
data3.yaml_set_tag(node.tag)
yield data3
if node.anchor:
- from ruamel.yaml.serializer import templated_id
+ from _vendoring.ruamel.yaml.serializer import templated_id
if not templated_id(node.anchor):
data3.yaml_set_anchor(node.anchor)
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/cyaml.py b/lib/spack/external/_vendoring/ruamel/yaml/cyaml.py
index 0ab2828dc2f..2f65d7ed9eb 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/cyaml.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/cyaml.py
@@ -1,14 +1,14 @@
# coding: utf-8
-from _ruamel_yaml import CParser, CEmitter # type: ignore
+from __vendoring.ruamel.yaml import CParser, CEmitter # type: ignore
-from ruamel.yaml.constructor import Constructor, BaseConstructor, SafeConstructor
-from ruamel.yaml.representer import Representer, SafeRepresenter, BaseRepresenter
-from ruamel.yaml.resolver import Resolver, BaseResolver
+from _vendoring.ruamel.yaml.constructor import Constructor, BaseConstructor, SafeConstructor
+from _vendoring.ruamel.yaml.representer import Representer, SafeRepresenter, BaseRepresenter
+from _vendoring.ruamel.yaml.resolver import Resolver, BaseResolver
if False: # MYPY
from typing import Any, Union, Optional # NOQA
- from ruamel.yaml.compat import StreamTextType, StreamType, VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import StreamTextType, StreamType, VersionType # NOQA
__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', 'CBaseDumper', 'CSafeDumper', 'CDumper']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/dumper.py b/lib/spack/external/_vendoring/ruamel/yaml/dumper.py
index 7e9bf01dedb..e53715c3d8a 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/dumper.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/dumper.py
@@ -1,18 +1,18 @@
# coding: utf-8
-from ruamel.yaml.emitter import Emitter
-from ruamel.yaml.serializer import Serializer
-from ruamel.yaml.representer import (
+from _vendoring.ruamel.yaml.emitter import Emitter
+from _vendoring.ruamel.yaml.serializer import Serializer
+from _vendoring.ruamel.yaml.representer import (
Representer,
SafeRepresenter,
BaseRepresenter,
RoundTripRepresenter,
)
-from ruamel.yaml.resolver import Resolver, BaseResolver, VersionedResolver
+from _vendoring.ruamel.yaml.resolver import Resolver, BaseResolver, VersionedResolver
if False: # MYPY
from typing import Any, Dict, List, Union, Optional # NOQA
- from ruamel.yaml.compat import StreamType, VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import StreamType, VersionType # NOQA
__all__ = ['BaseDumper', 'SafeDumper', 'Dumper', 'RoundTripDumper']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/emitter.py b/lib/spack/external/_vendoring/ruamel/yaml/emitter.py
index f9611ee1918..67d6e1f4aa7 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/emitter.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/emitter.py
@@ -8,17 +8,17 @@
# mapping ::= MAPPING-START (node node)* MAPPING-END
import sys
-from ruamel.yaml.error import YAMLError, YAMLStreamError
-from ruamel.yaml.events import * # NOQA
+from _vendoring.ruamel.yaml.error import YAMLError, YAMLStreamError
+from _vendoring.ruamel.yaml.events import * # NOQA
# fmt: off
-from ruamel.yaml.compat import _F, nprint, dbg, DBG_EVENT, \
+from _vendoring.ruamel.yaml.compat import _F, nprint, dbg, DBG_EVENT, \
check_anchorname_char, nprintf # NOQA
# fmt: on
if False: # MYPY
from typing import Any, Dict, List, Union, Text, Tuple, Optional # NOQA
- from ruamel.yaml.compat import StreamType # NOQA
+ from _vendoring.ruamel.yaml.compat import StreamType # NOQA
__all__ = ['Emitter', 'EmitterError']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/error.py b/lib/spack/external/_vendoring/ruamel/yaml/error.py
index 30b114a01b3..1a43eba1f2c 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/error.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/error.py
@@ -3,7 +3,7 @@
import warnings
import textwrap
-from ruamel.yaml.compat import _F
+from _vendoring.ruamel.yaml.compat import _F
if False: # MYPY
from typing import Any, Dict, Optional, List, Text # NOQA
@@ -240,11 +240,11 @@ class ReusedAnchorWarning(YAMLWarning):
class UnsafeLoaderWarning(YAMLWarning):
text = """
The default 'Loader' for 'load(stream)' without further arguments can be unsafe.
-Use 'load(stream, Loader=ruamel.yaml.Loader)' explicitly if that is OK.
+Use 'load(stream, Loader=_vendoring.ruamel.yaml.Loader)' explicitly if that is OK.
Alternatively include the following in your code:
import warnings
- warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)
+ warnings.simplefilter('ignore', _vendoring.ruamel.yaml.error.UnsafeLoaderWarning)
In most other cases you should consider using 'safe_load(stream)'"""
pass
@@ -273,7 +273,7 @@ def __str__(self):
or alternatively include the following in your code:
import warnings
- warnings.simplefilter('ignore', ruamel.yaml.error.MantissaNoDotYAML1_1Warning)
+ warnings.simplefilter('ignore', _vendoring.ruamel.yaml.error.MantissaNoDotYAML1_1Warning)
""".format(
self.flt, line, col
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/events.py b/lib/spack/external/_vendoring/ruamel/yaml/events.py
index 2a895ff3593..f1df4d19cf7 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/events.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/events.py
@@ -1,6 +1,6 @@
# coding: utf-8
-from ruamel.yaml.compat import _F
+from _vendoring.ruamel.yaml.compat import _F
# Abstract classes.
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/loader.py b/lib/spack/external/_vendoring/ruamel/yaml/loader.py
index 7234ee12143..97d0632bcf3 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/loader.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/loader.py
@@ -1,20 +1,20 @@
# coding: utf-8
-from ruamel.yaml.reader import Reader
-from ruamel.yaml.scanner import Scanner, RoundTripScanner
-from ruamel.yaml.parser import Parser, RoundTripParser
-from ruamel.yaml.composer import Composer
-from ruamel.yaml.constructor import (
+from _vendoring.ruamel.yaml.reader import Reader
+from _vendoring.ruamel.yaml.scanner import Scanner, RoundTripScanner
+from _vendoring.ruamel.yaml.parser import Parser, RoundTripParser
+from _vendoring.ruamel.yaml.composer import Composer
+from _vendoring.ruamel.yaml.constructor import (
BaseConstructor,
SafeConstructor,
Constructor,
RoundTripConstructor,
)
-from ruamel.yaml.resolver import VersionedResolver
+from _vendoring.ruamel.yaml.resolver import VersionedResolver
if False: # MYPY
from typing import Any, Dict, List, Union, Optional # NOQA
- from ruamel.yaml.compat import StreamTextType, VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import StreamTextType, VersionType # NOQA
__all__ = ['BaseLoader', 'SafeLoader', 'Loader', 'RoundTripLoader']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/main.py b/lib/spack/external/_vendoring/ruamel/yaml/main.py
index 20bd8d3eb1b..bb4c81aa44a 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/main.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/main.py
@@ -7,39 +7,39 @@
from importlib import import_module
-import ruamel.yaml
-from ruamel.yaml.error import UnsafeLoaderWarning, YAMLError # NOQA
+import _vendoring.ruamel.yaml
+from _vendoring.ruamel.yaml.error import UnsafeLoaderWarning, YAMLError # NOQA
-from ruamel.yaml.tokens import * # NOQA
-from ruamel.yaml.events import * # NOQA
-from ruamel.yaml.nodes import * # NOQA
+from _vendoring.ruamel.yaml.tokens import * # NOQA
+from _vendoring.ruamel.yaml.events import * # NOQA
+from _vendoring.ruamel.yaml.nodes import * # NOQA
-from ruamel.yaml.loader import BaseLoader, SafeLoader, Loader, RoundTripLoader # NOQA
-from ruamel.yaml.dumper import BaseDumper, SafeDumper, Dumper, RoundTripDumper # NOQA
-from ruamel.yaml.compat import StringIO, BytesIO, with_metaclass, nprint, nprintf # NOQA
-from ruamel.yaml.resolver import VersionedResolver, Resolver # NOQA
-from ruamel.yaml.representer import (
+from _vendoring.ruamel.yaml.loader import BaseLoader, SafeLoader, Loader, RoundTripLoader # NOQA
+from _vendoring.ruamel.yaml.dumper import BaseDumper, SafeDumper, Dumper, RoundTripDumper # NOQA
+from _vendoring.ruamel.yaml.compat import StringIO, BytesIO, with_metaclass, nprint, nprintf # NOQA
+from _vendoring.ruamel.yaml.resolver import VersionedResolver, Resolver # NOQA
+from _vendoring.ruamel.yaml.representer import (
BaseRepresenter,
SafeRepresenter,
Representer,
RoundTripRepresenter,
)
-from ruamel.yaml.constructor import (
+from _vendoring.ruamel.yaml.constructor import (
BaseConstructor,
SafeConstructor,
Constructor,
RoundTripConstructor,
)
-from ruamel.yaml.loader import Loader as UnsafeLoader
-from ruamel.yaml.comments import CommentedMap, CommentedSeq, C_PRE
+from _vendoring.ruamel.yaml.loader import Loader as UnsafeLoader
+from _vendoring.ruamel.yaml.comments import CommentedMap, CommentedSeq, C_PRE
if False: # MYPY
from typing import List, Set, Dict, Union, Any, Callable, Optional, Text # NOQA
- from ruamel.yaml.compat import StreamType, StreamTextType, VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import StreamType, StreamTextType, VersionType # NOQA
from pathlib import Path
try:
- from _ruamel_yaml import CParser, CEmitter # type: ignore
+ from __vendoring.ruamel.yaml import CParser, CEmitter # type: ignore
except: # NOQA
CParser = CEmitter = None
@@ -74,7 +74,7 @@ def __init__(self, *, typ=None, pure=False, output=None, plug_ins=None): # inpu
for pu in ([] if plug_ins is None else plug_ins) + self.official_plug_ins():
file_name = pu.replace(os.sep, '.')
self.plug_ins.append(import_module(file_name))
- self.Resolver = ruamel.yaml.resolver.VersionedResolver # type: Any
+ self.Resolver = _vendoring.ruamel.yaml.resolver.VersionedResolver # type: Any
self.allow_unicode = True
self.Reader = None # type: Any
self.Representer = None # type: Any
@@ -89,37 +89,37 @@ def __init__(self, *, typ=None, pure=False, output=None, plug_ins=None): # inpu
setup_rt = True
elif 'safe' in self.typ:
self.Emitter = (
- ruamel.yaml.emitter.Emitter if pure or CEmitter is None else CEmitter
+ _vendoring.ruamel.yaml.emitter.Emitter if pure or CEmitter is None else CEmitter
)
- self.Representer = ruamel.yaml.representer.SafeRepresenter
- self.Parser = ruamel.yaml.parser.Parser if pure or CParser is None else CParser
- self.Composer = ruamel.yaml.composer.Composer
- self.Constructor = ruamel.yaml.constructor.SafeConstructor
+ self.Representer = _vendoring.ruamel.yaml.representer.SafeRepresenter
+ self.Parser = _vendoring.ruamel.yaml.parser.Parser if pure or CParser is None else CParser
+ self.Composer = _vendoring.ruamel.yaml.composer.Composer
+ self.Constructor = _vendoring.ruamel.yaml.constructor.SafeConstructor
elif 'base' in self.typ:
- self.Emitter = ruamel.yaml.emitter.Emitter
- self.Representer = ruamel.yaml.representer.BaseRepresenter
- self.Parser = ruamel.yaml.parser.Parser if pure or CParser is None else CParser
- self.Composer = ruamel.yaml.composer.Composer
- self.Constructor = ruamel.yaml.constructor.BaseConstructor
+ self.Emitter = _vendoring.ruamel.yaml.emitter.Emitter
+ self.Representer = _vendoring.ruamel.yaml.representer.BaseRepresenter
+ self.Parser = _vendoring.ruamel.yaml.parser.Parser if pure or CParser is None else CParser
+ self.Composer = _vendoring.ruamel.yaml.composer.Composer
+ self.Constructor = _vendoring.ruamel.yaml.constructor.BaseConstructor
elif 'unsafe' in self.typ:
self.Emitter = (
- ruamel.yaml.emitter.Emitter if pure or CEmitter is None else CEmitter
+ _vendoring.ruamel.yaml.emitter.Emitter if pure or CEmitter is None else CEmitter
)
- self.Representer = ruamel.yaml.representer.Representer
- self.Parser = ruamel.yaml.parser.Parser if pure or CParser is None else CParser
- self.Composer = ruamel.yaml.composer.Composer
- self.Constructor = ruamel.yaml.constructor.Constructor
+ self.Representer = _vendoring.ruamel.yaml.representer.Representer
+ self.Parser = _vendoring.ruamel.yaml.parser.Parser if pure or CParser is None else CParser
+ self.Composer = _vendoring.ruamel.yaml.composer.Composer
+ self.Constructor = _vendoring.ruamel.yaml.constructor.Constructor
elif 'rtsc' in self.typ:
self.default_flow_style = False
# no optimized rt-dumper yet
- self.Emitter = ruamel.yaml.emitter.Emitter
- self.Serializer = ruamel.yaml.serializer.Serializer
- self.Representer = ruamel.yaml.representer.RoundTripRepresenter
- self.Scanner = ruamel.yaml.scanner.RoundTripScannerSC
+ self.Emitter = _vendoring.ruamel.yaml.emitter.Emitter
+ self.Serializer = _vendoring.ruamel.yaml.serializer.Serializer
+ self.Representer = _vendoring.ruamel.yaml.representer.RoundTripRepresenter
+ self.Scanner = _vendoring.ruamel.yaml.scanner.RoundTripScannerSC
# no optimized rt-parser yet
- self.Parser = ruamel.yaml.parser.RoundTripParserSC
- self.Composer = ruamel.yaml.composer.Composer
- self.Constructor = ruamel.yaml.constructor.RoundTripConstructor
+ self.Parser = _vendoring.ruamel.yaml.parser.RoundTripParserSC
+ self.Composer = _vendoring.ruamel.yaml.composer.Composer
+ self.Constructor = _vendoring.ruamel.yaml.constructor.RoundTripConstructor
self.comment_handling = C_PRE
else:
setup_rt = True
@@ -127,14 +127,14 @@ def __init__(self, *, typ=None, pure=False, output=None, plug_ins=None): # inpu
if setup_rt:
self.default_flow_style = False
# no optimized rt-dumper yet
- self.Emitter = ruamel.yaml.emitter.Emitter
- self.Serializer = ruamel.yaml.serializer.Serializer
- self.Representer = ruamel.yaml.representer.RoundTripRepresenter
- self.Scanner = ruamel.yaml.scanner.RoundTripScanner
+ self.Emitter = _vendoring.ruamel.yaml.emitter.Emitter
+ self.Serializer = _vendoring.ruamel.yaml.serializer.Serializer
+ self.Representer = _vendoring.ruamel.yaml.representer.RoundTripRepresenter
+ self.Scanner = _vendoring.ruamel.yaml.scanner.RoundTripScanner
# no optimized rt-parser yet
- self.Parser = ruamel.yaml.parser.RoundTripParser
- self.Composer = ruamel.yaml.composer.Composer
- self.Constructor = ruamel.yaml.constructor.RoundTripConstructor
+ self.Parser = _vendoring.ruamel.yaml.parser.RoundTripParser
+ self.Composer = _vendoring.ruamel.yaml.composer.Composer
+ self.Constructor = _vendoring.ruamel.yaml.constructor.RoundTripConstructor
del setup_rt
self.stream = None
self.canonical = None
@@ -477,20 +477,20 @@ def get_constructor_parser(self, stream):
"""
if self.Parser is not CParser:
if self.Reader is None:
- self.Reader = ruamel.yaml.reader.Reader
+ self.Reader = _vendoring.ruamel.yaml.reader.Reader
if self.Scanner is None:
- self.Scanner = ruamel.yaml.scanner.Scanner
+ self.Scanner = _vendoring.ruamel.yaml.scanner.Scanner
self.reader.stream = stream
else:
if self.Reader is not None:
if self.Scanner is None:
- self.Scanner = ruamel.yaml.scanner.Scanner
- self.Parser = ruamel.yaml.parser.Parser
+ self.Scanner = _vendoring.ruamel.yaml.scanner.Scanner
+ self.Parser = _vendoring.ruamel.yaml.parser.Parser
self.reader.stream = stream
elif self.Scanner is not None:
if self.Reader is None:
- self.Reader = ruamel.yaml.reader.Reader
- self.Parser = ruamel.yaml.parser.Parser
+ self.Reader = _vendoring.ruamel.yaml.reader.Reader
+ self.Parser = _vendoring.ruamel.yaml.parser.Parser
self.reader.stream = stream
else:
# combined C level reader>scanner>parser
@@ -498,8 +498,8 @@ def get_constructor_parser(self, stream):
# if you just initialise the CParser, to much of resolver.py
# is actually used
rslvr = self.Resolver
- # if rslvr is ruamel.yaml.resolver.VersionedResolver:
- # rslvr = ruamel.yaml.resolver.Resolver
+ # if rslvr is _vendoring.ruamel.yaml.resolver.VersionedResolver:
+ # rslvr = _vendoring.ruamel.yaml.resolver.Resolver
class XLoader(self.Parser, self.Constructor, rslvr): # type: ignore
def __init__(selfx, stream, version=self.version, preserve_quotes=None):
@@ -640,7 +640,7 @@ def get_serializer_representer_emitter(self, stream, tlca):
# we have only .Serializer to deal with (vs .Reader & .Scanner), much simpler
if self.Emitter is not CEmitter:
if self.Serializer is None:
- self.Serializer = ruamel.yaml.serializer.Serializer
+ self.Serializer = _vendoring.ruamel.yaml.serializer.Serializer
self.emitter.stream = stream
self.emitter.top_level_colon_align = tlca
if self.scalar_after_indicator is not None:
@@ -648,7 +648,7 @@ def get_serializer_representer_emitter(self, stream, tlca):
return self.serializer, self.representer, self.emitter
if self.Serializer is not None:
# cannot set serializer with CEmitter
- self.Emitter = ruamel.yaml.emitter.Emitter
+ self.Emitter = _vendoring.ruamel.yaml.emitter.Emitter
self.emitter.stream = stream
self.emitter.top_level_colon_align = tlca
if self.scalar_after_indicator is not None:
@@ -657,9 +657,9 @@ def get_serializer_representer_emitter(self, stream, tlca):
# C routines
rslvr = (
- ruamel.yaml.resolver.BaseResolver
+ _vendoring.ruamel.yaml.resolver.BaseResolver
if 'base' in self.typ
- else ruamel.yaml.resolver.Resolver
+ else _vendoring.ruamel.yaml.resolver.Resolver
)
class XDumper(CEmitter, self.Representer, rslvr): # type: ignore
@@ -743,7 +743,7 @@ def official_plug_ins(self):
single file installers that are not properly emulating a file-system (issue 324)
no plug-ins will be found. If any are packaged, you know which file that are
and you can explicitly provide it during instantiation:
- yaml = ruamel.yaml.YAML(plug_ins=['ruamel/yaml/jinja2/__plug_in__'])
+ yaml = _vendoring.ruamel.yaml.YAML(plug_ins=['_vendoring.ruamel.yaml/_vendoring.jinja2/__plug_in__'])
"""
try:
bd = os.path.dirname(__file__)
@@ -982,7 +982,7 @@ def f_y(constructor, node):
########################################################################################
def warn_deprecation(fun, method, arg=''):
# type: (Any, Any, str) -> None
- from ruamel.yaml.compat import _F
+ from _vendoring.ruamel.yaml.compat import _F
warnings.warn(
_F(
@@ -1469,7 +1469,7 @@ def add_implicit_resolver(
if hasattr(Loader, 'add_implicit_resolver'):
Loader.add_implicit_resolver(tag, regexp, first)
elif issubclass(
- Loader, (BaseLoader, SafeLoader, ruamel.yaml.loader.Loader, RoundTripLoader)
+ Loader, (BaseLoader, SafeLoader, _vendoring.ruamel.yaml.loader.Loader, RoundTripLoader)
):
Resolver.add_implicit_resolver(tag, regexp, first)
else:
@@ -1478,7 +1478,7 @@ def add_implicit_resolver(
if hasattr(Dumper, 'add_implicit_resolver'):
Dumper.add_implicit_resolver(tag, regexp, first)
elif issubclass(
- Dumper, (BaseDumper, SafeDumper, ruamel.yaml.dumper.Dumper, RoundTripDumper)
+ Dumper, (BaseDumper, SafeDumper, _vendoring.ruamel.yaml.dumper.Dumper, RoundTripDumper)
):
Resolver.add_implicit_resolver(tag, regexp, first)
else:
@@ -1501,7 +1501,7 @@ def add_path_resolver(tag, path, kind=None, Loader=None, Dumper=None, resolver=R
if hasattr(Loader, 'add_path_resolver'):
Loader.add_path_resolver(tag, path, kind)
elif issubclass(
- Loader, (BaseLoader, SafeLoader, ruamel.yaml.loader.Loader, RoundTripLoader)
+ Loader, (BaseLoader, SafeLoader, _vendoring.ruamel.yaml.loader.Loader, RoundTripLoader)
):
Resolver.add_path_resolver(tag, path, kind)
else:
@@ -1510,7 +1510,7 @@ def add_path_resolver(tag, path, kind=None, Loader=None, Dumper=None, resolver=R
if hasattr(Dumper, 'add_path_resolver'):
Dumper.add_path_resolver(tag, path, kind)
elif issubclass(
- Dumper, (BaseDumper, SafeDumper, ruamel.yaml.dumper.Dumper, RoundTripDumper)
+ Dumper, (BaseDumper, SafeDumper, _vendoring.ruamel.yaml.dumper.Dumper, RoundTripDumper)
):
Resolver.add_path_resolver(tag, path, kind)
else:
@@ -1560,7 +1560,7 @@ def add_multi_constructor(tag_prefix, multi_constructor, Loader=None, constructo
BaseConstructor.add_multi_constructor(tag_prefix, multi_constructor)
elif issubclass(Loader, SafeLoader):
SafeConstructor.add_multi_constructor(tag_prefix, multi_constructor)
- elif issubclass(Loader, ruamel.yaml.loader.Loader):
+ elif issubclass(Loader, _vendoring.ruamel.yaml.loader.Loader):
Constructor.add_multi_constructor(tag_prefix, multi_constructor)
elif issubclass(Loader, RoundTripLoader):
RoundTripConstructor.add_multi_constructor(tag_prefix, multi_constructor)
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/nodes.py b/lib/spack/external/_vendoring/ruamel/yaml/nodes.py
index c76bb4e2cc7..c4365900184 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/nodes.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/nodes.py
@@ -2,7 +2,7 @@
import sys
-from ruamel.yaml.compat import _F
+from _vendoring.ruamel.yaml.compat import _F
if False: # MYPY
from typing import Dict, Any, Text # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/parser.py b/lib/spack/external/_vendoring/ruamel/yaml/parser.py
index a2fab43ce71..dbcca0103f6 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/parser.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/parser.py
@@ -74,13 +74,13 @@
# and for Jython too
-from ruamel.yaml.error import MarkedYAMLError
-from ruamel.yaml.tokens import * # NOQA
-from ruamel.yaml.events import * # NOQA
-from ruamel.yaml.scanner import Scanner, RoundTripScanner, ScannerError # NOQA
-from ruamel.yaml.scanner import BlankLineComment
-from ruamel.yaml.comments import C_PRE, C_POST, C_SPLIT_ON_FIRST_BLANK
-from ruamel.yaml.compat import _F, nprint, nprintf # NOQA
+from _vendoring.ruamel.yaml.error import MarkedYAMLError
+from _vendoring.ruamel.yaml.tokens import * # NOQA
+from _vendoring.ruamel.yaml.events import * # NOQA
+from _vendoring.ruamel.yaml.scanner import Scanner, RoundTripScanner, ScannerError # NOQA
+from _vendoring.ruamel.yaml.scanner import BlankLineComment
+from _vendoring.ruamel.yaml.comments import C_PRE, C_POST, C_SPLIT_ON_FIRST_BLANK
+from _vendoring.ruamel.yaml.compat import _F, nprint, nprintf # NOQA
if False: # MYPY
from typing import Any, Dict, Optional, List, Optional # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/reader.py b/lib/spack/external/_vendoring/ruamel/yaml/reader.py
index 4aac40a4f7f..380f2af61fb 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/reader.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/reader.py
@@ -21,13 +21,13 @@
import codecs
-from ruamel.yaml.error import YAMLError, FileMark, StringMark, YAMLStreamError
-from ruamel.yaml.compat import _F # NOQA
-from ruamel.yaml.util import RegExp
+from _vendoring.ruamel.yaml.error import YAMLError, FileMark, StringMark, YAMLStreamError
+from _vendoring.ruamel.yaml.compat import _F # NOQA
+from _vendoring.ruamel.yaml.util import RegExp
if False: # MYPY
from typing import Any, Dict, Optional, List, Union, Text, Tuple, Optional # NOQA
-# from ruamel.yaml.compat import StreamTextType # NOQA
+# from _vendoring.ruamel.yaml.compat import StreamTextType # NOQA
__all__ = ['Reader', 'ReaderError']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/representer.py b/lib/spack/external/_vendoring/ruamel/yaml/representer.py
index 820559b5c4a..0c4c6c25718 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/representer.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/representer.py
@@ -1,17 +1,17 @@
# coding: utf-8
-from ruamel.yaml.error import * # NOQA
-from ruamel.yaml.nodes import * # NOQA
-from ruamel.yaml.compat import ordereddict
-from ruamel.yaml.compat import _F, nprint, nprintf # NOQA
-from ruamel.yaml.scalarstring import (
+from _vendoring.ruamel.yaml.error import * # NOQA
+from _vendoring.ruamel.yaml.nodes import * # NOQA
+from _vendoring.ruamel.yaml.compat import ordereddict
+from _vendoring.ruamel.yaml.compat import _F, nprint, nprintf # NOQA
+from _vendoring.ruamel.yaml.scalarstring import (
LiteralScalarString,
FoldedScalarString,
SingleQuotedScalarString,
DoubleQuotedScalarString,
PlainScalarString,
)
-from ruamel.yaml.comments import (
+from _vendoring.ruamel.yaml.comments import (
CommentedMap,
CommentedOrderedMap,
CommentedSeq,
@@ -22,11 +22,11 @@
merge_attrib,
TaggedScalar,
)
-from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
-from ruamel.yaml.scalarfloat import ScalarFloat
-from ruamel.yaml.scalarbool import ScalarBoolean
-from ruamel.yaml.timestamp import TimeStamp
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
+from _vendoring.ruamel.yaml.scalarfloat import ScalarFloat
+from _vendoring.ruamel.yaml.scalarbool import ScalarBoolean
+from _vendoring.ruamel.yaml.timestamp import TimeStamp
+from _vendoring.ruamel.yaml.anchor import Anchor
import datetime
import sys
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/resolver.py b/lib/spack/external/_vendoring/ruamel/yaml/resolver.py
index 969b9a928db..bd547139a4f 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/resolver.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/resolver.py
@@ -4,12 +4,12 @@
if False: # MYPY
from typing import Any, Dict, List, Union, Text, Optional # NOQA
- from ruamel.yaml.compat import VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import VersionType # NOQA
-from ruamel.yaml.compat import _DEFAULT_YAML_VERSION, _F # NOQA
-from ruamel.yaml.error import * # NOQA
-from ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode # NOQA
-from ruamel.yaml.util import RegExp # NOQA
+from _vendoring.ruamel.yaml.compat import _DEFAULT_YAML_VERSION, _F # NOQA
+from _vendoring.ruamel.yaml.error import * # NOQA
+from _vendoring.ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode # NOQA
+from _vendoring.ruamel.yaml.util import RegExp # NOQA
__all__ = ['BaseResolver', 'Resolver', 'VersionedResolver']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/scalarbool.py b/lib/spack/external/_vendoring/ruamel/yaml/scalarbool.py
index 60242b43836..a32be10a245 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/scalarbool.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/scalarbool.py
@@ -9,7 +9,7 @@
You can use these in an if statement, but not when testing equivalence
"""
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.anchor import Anchor
if False: # MYPY
from typing import Text, Any, Dict, List # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/scalarfloat.py b/lib/spack/external/_vendoring/ruamel/yaml/scalarfloat.py
index b9f8bdfb889..bba92682c8c 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/scalarfloat.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/scalarfloat.py
@@ -1,7 +1,7 @@
# coding: utf-8
import sys
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.anchor import Anchor
if False: # MYPY
from typing import Text, Any, Dict, List # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/scalarint.py b/lib/spack/external/_vendoring/ruamel/yaml/scalarint.py
index 1572b0f16c3..2ce2a0717dc 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/scalarint.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/scalarint.py
@@ -1,6 +1,6 @@
# coding: utf-8
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.anchor import Anchor
if False: # MYPY
from typing import Text, Any, Dict, List # NOQA
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/scalarstring.py b/lib/spack/external/_vendoring/ruamel/yaml/scalarstring.py
index 7538ab71551..2ca39a3ac1d 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/scalarstring.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/scalarstring.py
@@ -1,6 +1,6 @@
# coding: utf-8
-from ruamel.yaml.anchor import Anchor
+from _vendoring.ruamel.yaml.anchor import Anchor
if False: # MYPY
from typing import Text, Any, Dict, List # NOQA
@@ -121,7 +121,7 @@ def walk_tree(base, map=None):
You can also provide an explicit (ordered) mapping for multiple transforms
(first of which is executed):
- map = ruamel.yaml.compat.ordereddict
+ map = _vendoring.ruamel.yaml.compat.ordereddict
map['\n'] = preserve_literal
map[':'] = SingleQuotedScalarString
walk_tree(data, map=map)
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/scanner.py b/lib/spack/external/_vendoring/ruamel/yaml/scanner.py
index 61cae63103b..a3cd833cf32 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/scanner.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/scanner.py
@@ -29,13 +29,13 @@
#
import inspect
-from ruamel.yaml.error import MarkedYAMLError, CommentMark # NOQA
-from ruamel.yaml.tokens import * # NOQA
-from ruamel.yaml.compat import _F, check_anchorname_char, nprint, nprintf # NOQA
+from _vendoring.ruamel.yaml.error import MarkedYAMLError, CommentMark # NOQA
+from _vendoring.ruamel.yaml.tokens import * # NOQA
+from _vendoring.ruamel.yaml.compat import _F, check_anchorname_char, nprint, nprintf # NOQA
if False: # MYPY
from typing import Any, Dict, Optional, List, Union, Text # NOQA
- from ruamel.yaml.compat import VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import VersionType # NOQA
__all__ = ['Scanner', 'RoundTripScanner', 'ScannerError']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/serializer.py b/lib/spack/external/_vendoring/ruamel/yaml/serializer.py
index cc2329dcc4e..7acbfd18164 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/serializer.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/serializer.py
@@ -1,10 +1,10 @@
# coding: utf-8
-from ruamel.yaml.error import YAMLError
-from ruamel.yaml.compat import nprint, DBG_NODE, dbg, nprintf # NOQA
-from ruamel.yaml.util import RegExp
+from _vendoring.ruamel.yaml.error import YAMLError
+from _vendoring.ruamel.yaml.compat import nprint, DBG_NODE, dbg, nprintf # NOQA
+from _vendoring.ruamel.yaml.util import RegExp
-from ruamel.yaml.events import (
+from _vendoring.ruamel.yaml.events import (
StreamStartEvent,
StreamEndEvent,
MappingStartEvent,
@@ -16,11 +16,11 @@
DocumentStartEvent,
DocumentEndEvent,
)
-from ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode
+from _vendoring.ruamel.yaml.nodes import MappingNode, ScalarNode, SequenceNode
if False: # MYPY
from typing import Any, Dict, Union, Text, Optional # NOQA
- from ruamel.yaml.compat import VersionType # NOQA
+ from _vendoring.ruamel.yaml.compat import VersionType # NOQA
__all__ = ['Serializer', 'SerializerError']
diff --git a/lib/spack/external/_vendoring/ruamel/yaml/tokens.py b/lib/spack/external/_vendoring/ruamel/yaml/tokens.py
index bc302ba3162..702bec0d55d 100644
--- a/lib/spack/external/_vendoring/ruamel/yaml/tokens.py
+++ b/lib/spack/external/_vendoring/ruamel/yaml/tokens.py
@@ -1,6 +1,6 @@
# coding: utf-8
-from ruamel.yaml.compat import _F, nprintf # NOQA
+from _vendoring.ruamel.yaml.compat import _F, nprintf # NOQA
if False: # MYPY
from typing import Text, Any, Dict, Optional, List # NOQA
diff --git a/lib/spack/external/_vendoring/six.py b/lib/spack/external/_vendoring/six.py
index 4e15675d8b5..6373c58a3d0 100644
--- a/lib/spack/external/_vendoring/six.py
+++ b/lib/spack/external/_vendoring/six.py
@@ -513,7 +513,7 @@ def add_move(move):
def remove_move(name):
- """Remove item from six.moves."""
+ """Remove item from _vendoring.six.moves."""
try:
delattr(_MovedItems, name)
except AttributeError:
diff --git a/lib/spack/external/_vendoring/typing_extensions.py b/lib/spack/external/_vendoring/typing_extensions.py
index 194731cd3c6..3c2c2e942b7 100644
--- a/lib/spack/external/_vendoring/typing_extensions.py
+++ b/lib/spack/external/_vendoring/typing_extensions.py
@@ -194,7 +194,7 @@ def __subclasscheck__(self, cls):
class _FinalForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
item = typing._type_check(parameters,
@@ -321,7 +321,7 @@ def IntVar(name):
class _LiteralForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
return typing._GenericAlias(self, parameters)
@@ -405,7 +405,7 @@ class _ExtensionsGenericMeta(GenericMeta):
def __subclasscheck__(self, subclass):
"""This mimics a more modern GenericMeta.__subclasscheck__() logic
(that does not have problems with recursion) to work around interactions
- between collections, typing, and typing_extensions on older
+ between collections, typing, and _vendoring.typing_extensions on older
versions of Python, see https://github.com/python/typing/issues/501.
"""
if self.__origin__ is not None:
@@ -629,7 +629,7 @@ def func(x: Proto) -> int:
func(C()) # Passes static type check
See PEP 544 for details. Protocol classes decorated with
- @typing_extensions.runtime act as simple-minded runtime protocol that checks
+ @_vendoring.typing_extensions.runtime act as simple-minded runtime protocol that checks
only the presence of given attributes, ignoring their type signatures.
Protocol classes can be generic, they are defined as::
@@ -985,7 +985,7 @@ def func(x: Proto) -> int:
func(C()) # Passes static type check
See PEP 544 for details. Protocol classes decorated with
- @typing_extensions.runtime act as simple-minded runtime protocol that checks
+ @_vendoring.typing_extensions.runtime act as simple-minded runtime protocol that checks
only the presence of given attributes, ignoring their type signatures.
Protocol classes can be generic, they are defined as::
@@ -1334,7 +1334,7 @@ def copy_with(self, params):
return _AnnotatedAlias(new_type, self.__metadata__)
def __repr__(self):
- return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, "
+ return (f"_vendoring.typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, "
f"{', '.join(repr(a) for a in self.__metadata__)}]")
def __reduce__(self):
@@ -1629,7 +1629,7 @@ def get_args(tp):
elif sys.version_info[:2] >= (3, 9):
class _TypeAliasForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
@_TypeAliasForm
def TypeAlias(self, parameters):
@@ -1648,7 +1648,7 @@ def TypeAlias(self, parameters):
elif sys.version_info[:2] >= (3, 7):
class _TypeAliasForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
TypeAlias = _TypeAliasForm('TypeAlias',
doc="""Special marker indicating that an assignment should
@@ -1667,7 +1667,7 @@ class _TypeAliasMeta(typing.TypingMeta):
"""Metaclass for TypeAlias"""
def __repr__(self):
- return 'typing_extensions.TypeAlias'
+ return '_vendoring.typing_extensions.TypeAlias'
class _TypeAliasBase(typing._FinalTypingBase, metaclass=_TypeAliasMeta, _root=True):
"""Special marker indicating that an assignment should
@@ -1689,7 +1689,7 @@ def __subclasscheck__(self, cls):
raise TypeError("TypeAlias cannot be used with issubclass().")
def __repr__(self):
- return 'typing_extensions.TypeAlias'
+ return '_vendoring.typing_extensions.TypeAlias'
TypeAlias = _TypeAliasBase(_root=True)
@@ -1836,7 +1836,7 @@ def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
except (AttributeError, ValueError):
def_mod = None
- if def_mod != 'typing_extensions':
+ if def_mod != '_vendoring.typing_extensions':
self.__module__ = def_mod
def __repr__(self):
@@ -1952,7 +1952,7 @@ def Concatenate(self, parameters):
elif sys.version_info[:2] >= (3, 7):
class _ConcatenateForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
return _concatenate_getitem(self, parameters)
@@ -1975,7 +1975,7 @@ class _ConcatenateAliasMeta(typing.TypingMeta):
"""Metaclass for Concatenate."""
def __repr__(self):
- return 'typing_extensions.Concatenate'
+ return '_vendoring.typing_extensions.Concatenate'
class _ConcatenateAliasBase(typing._FinalTypingBase,
metaclass=_ConcatenateAliasMeta,
@@ -1999,7 +1999,7 @@ def __subclasscheck__(self, cls):
raise TypeError("Concatenate cannot be used with issubclass().")
def __repr__(self):
- return 'typing_extensions.Concatenate'
+ return '_vendoring.typing_extensions.Concatenate'
def __getitem__(self, parameters):
return _concatenate_getitem(self, parameters)
@@ -2013,7 +2013,7 @@ def __getitem__(self, parameters):
elif sys.version_info[:2] >= (3, 9):
class _TypeGuardForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
@_TypeGuardForm
def TypeGuard(self, parameters):
@@ -2066,7 +2066,7 @@ def is_str(val: Union[str, float]):
class _TypeGuardForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
item = typing._type_check(parameters,
@@ -2221,7 +2221,7 @@ def __mro_entries__(self, bases):
raise TypeError(f"Cannot subclass {self!r}")
def __repr__(self):
- return f'typing_extensions.{self._name}'
+ return f'_vendoring.typing_extensions.{self._name}'
def __reduce__(self):
return self._name
@@ -2255,7 +2255,7 @@ def LiteralString(self, params):
Example::
- from typing_extensions import LiteralString
+ from _vendoring.typing_extensions import LiteralString
def query(sql: LiteralString) -> ...:
...
@@ -2273,7 +2273,7 @@ class _LiteralString(typing._FinalTypingBase, _root=True):
Example::
- from typing_extensions import LiteralString
+ from _vendoring.typing_extensions import LiteralString
def query(sql: LiteralString) -> ...:
...
@@ -2351,7 +2351,7 @@ def Never(self, params):
This can be used to define a function that should never be
called, or a function that never returns::
- from typing_extensions import Never
+ from _vendoring.typing_extensions import Never
def never_call_me(arg: Never) -> None:
pass
@@ -2376,7 +2376,7 @@ class _Never(typing._FinalTypingBase, _root=True):
This can be used to define a function that should never be
called, or a function that never returns::
- from typing_extensions import Never
+ from _vendoring.typing_extensions import Never
def never_call_me(arg: Never) -> None:
pass
@@ -2410,7 +2410,7 @@ def __subclasscheck__(self, cls):
elif sys.version_info[:2] >= (3, 9):
class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
@_ExtensionsSpecialForm
def Required(self, parameters):
@@ -2452,7 +2452,7 @@ class Movie(TypedDict):
elif sys.version_info[:2] >= (3, 7):
class _RequiredForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
item = typing._type_check(parameters,
@@ -2567,7 +2567,7 @@ class Movie(TypedDict):
if sys.version_info[:2] >= (3, 9):
class _UnpackSpecialForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
class _UnpackAlias(typing._GenericAlias, _root=True):
__class__ = typing.TypeVar
@@ -2596,7 +2596,7 @@ class _UnpackAlias(typing._GenericAlias, _root=True):
class _UnpackForm(typing._SpecialForm, _root=True):
def __repr__(self):
- return 'typing_extensions.' + self._name
+ return '_vendoring.typing_extensions.' + self._name
def __getitem__(self, parameters):
item = typing._type_check(parameters,
@@ -2736,7 +2736,7 @@ def __init__(self, name):
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
except (AttributeError, ValueError):
def_mod = None
- if def_mod != 'typing_extensions':
+ if def_mod != '_vendoring.typing_extensions':
self.__module__ = def_mod
self.__unpacked__ = Unpack[self]
@@ -2831,7 +2831,7 @@ def dataclass_transform(
Example:
- from typing_extensions import dataclass_transform
+ from _vendoring.typing_extensions import dataclass_transform
_T = TypeVar("_T")
diff --git a/lib/spack/external/patches/jsonschema.attr.patch b/lib/spack/external/patches/jsonschema.attr.patch
new file mode 100644
index 00000000000..92b6ccd894a
--- /dev/null
+++ b/lib/spack/external/patches/jsonschema.attr.patch
@@ -0,0 +1,60 @@
+diff --git a/lib/spack/external/_vendoring/jsonschema/_types.py b/lib/spack/external/_vendoring/jsonschema/_types.py
+index 4c05bf773b..cfd21cfcf7 100644
+--- a/lib/spack/external/_vendoring/jsonschema/_types.py
++++ b/lib/spack/external/_vendoring/jsonschema/_types.py
+@@ -45,7 +45,7 @@ def is_any(checker, instance):
+ return True
+
+
+-@attr.s(frozen=True)
++@_vendoring.attr.s(frozen=True)
+ class TypeChecker(object):
+ """
+ A ``type`` property checker.
+@@ -61,7 +61,7 @@ class TypeChecker(object):
+
+ The initial mapping of types to their checking functions.
+ """
+- _type_checkers = attr.ib(default=pmap(), converter=pmap)
++ _type_checkers = _vendoring.attr.ib(default=pmap(), converter=pmap)
+
+ def is_type(self, instance, type):
+ """
+@@ -131,7 +131,7 @@ def redefine_many(self, definitions=()):
+
+ A new `TypeChecker` instance.
+ """
+- return attr.evolve(
++ return _vendoring.attr.evolve(
+ self, type_checkers=self._type_checkers.update(definitions),
+ )
+
+@@ -162,7 +162,7 @@ def remove(self, *types):
+ checkers = checkers.remove(each)
+ except KeyError:
+ raise UndefinedTypeCheck(each)
+- return attr.evolve(self, type_checkers=checkers)
++ return _vendoring.attr.evolve(self, type_checkers=checkers)
+
+
+ draft3_type_checker = TypeChecker(
+diff --git a/lib/spack/external/_vendoring/jsonschema/exceptions.py b/lib/spack/external/_vendoring/jsonschema/exceptions.py
+index 492c2c174a..1d891701c0 100644
+--- a/lib/spack/external/_vendoring/jsonschema/exceptions.py
++++ b/lib/spack/external/_vendoring/jsonschema/exceptions.py
+@@ -149,13 +149,13 @@ class SchemaError(_Error):
+ _word_for_instance_in_error_message = "schema"
+
+
+-@attr.s(hash=True)
++@_vendoring.attr.s(hash=True)
+ class RefResolutionError(Exception):
+ """
+ A ref could not be resolved.
+ """
+
+- _cause = attr.ib()
++ _cause = _vendoring.attr.ib()
+
+ def __str__(self):
+ return str(self._cause)
diff --git a/lib/spack/external/patches/jsonschema.vendoring.patch b/lib/spack/external/patches/jsonschema.vendoring.patch
new file mode 100644
index 00000000000..7385b4a0d5f
--- /dev/null
+++ b/lib/spack/external/patches/jsonschema.vendoring.patch
@@ -0,0 +1,13 @@
+diff --git a/lib/spack/external/_vendoring/jsonschema/_utils.py b/lib/spack/external/_vendoring/jsonschema/_utils.py
+index eeab638f22..452eecc96f 100644
+--- a/lib/spack/external/_vendoring/jsonschema/_utils.py
++++ b/lib/spack/external/_vendoring/jsonschema/_utils.py
+@@ -51,7 +51,7 @@ def load_schema(name):
+ Load a schema from ./schemas/``name``.json and return it.
+ """
+
+- data = pkgutil.get_data("jsonschema", "schemas/{0}.json".format(name))
++ data = pkgutil.get_data("_vendoring.jsonschema", "schemas/{0}.json".format(name))
+ return json.loads(data.decode("utf-8"))
+
+
diff --git a/lib/spack/spack/bootstrap/_common.py b/lib/spack/spack/bootstrap/_common.py
index ade85ff5457..ee79f988fa5 100644
--- a/lib/spack/spack/bootstrap/_common.py
+++ b/lib/spack/spack/bootstrap/_common.py
@@ -12,7 +12,7 @@
import warnings
from typing import Optional, Sequence, Union
-from typing_extensions import TypedDict
+from _vendoring.typing_extensions import TypedDict
import archspec.cpu
diff --git a/lib/spack/spack/ci/gitlab.py b/lib/spack/spack/ci/gitlab.py
index 15d46ada01a..7215fdb051b 100644
--- a/lib/spack/spack/ci/gitlab.py
+++ b/lib/spack/spack/ci/gitlab.py
@@ -6,7 +6,7 @@
import shutil
from typing import List, Optional
-import ruamel.yaml
+import _vendoring.ruamel.yaml
import llnl.util.tty as tty
@@ -422,4 +422,4 @@ def main_script_replacements(cmd):
syaml.anchorify(sorted_output)
with open(output_file, "w", encoding="utf-8") as f:
- ruamel.yaml.YAML().dump(sorted_output, f)
+ _vendoring.ruamel.yaml.YAML().dump(sorted_output, f)
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index 85ea55a5847..717dfa0c511 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -37,7 +37,7 @@
import sys
from typing import Any, Callable, Dict, Generator, List, NamedTuple, Optional, Tuple, Union
-import jsonschema
+from _vendoring import jsonschema
from llnl.util import filesystem, lang, tty
diff --git a/lib/spack/spack/container/__init__.py b/lib/spack/spack/container/__init__.py
index b134aea05d0..d70d575d4bb 100644
--- a/lib/spack/spack/container/__init__.py
+++ b/lib/spack/spack/container/__init__.py
@@ -6,7 +6,7 @@
"""
import warnings
-import jsonschema
+import _vendoring.jsonschema
import spack.environment as ev
import spack.schema.env as env
@@ -83,5 +83,5 @@ def validate(configuration_file):
)
warnings.warn(msg)
- jsonschema.validate(config, schema=env.schema)
+ _vendoring.jsonschema.validate(config, schema=env.schema)
return config
diff --git a/lib/spack/spack/container/writers.py b/lib/spack/spack/container/writers.py
index e521527be6c..ddd5b2ea344 100644
--- a/lib/spack/spack/container/writers.py
+++ b/lib/spack/spack/container/writers.py
@@ -9,7 +9,7 @@
from collections import namedtuple
from typing import Optional
-import jsonschema
+import _vendoring.jsonschema
import spack.environment as ev
import spack.error
@@ -201,7 +201,7 @@ def manifest(self):
manifest = {"spack": manifest}
# Validate the manifest file
- jsonschema.validate(manifest, schema=spack.schema.env.schema)
+ _vendoring.jsonschema.validate(manifest, schema=spack.schema.env.schema)
return syaml.dump(manifest, default_flow_style=False).strip()
diff --git a/lib/spack/spack/cray_manifest.py b/lib/spack/spack/cray_manifest.py
index 573e0614304..44918b2068a 100644
--- a/lib/spack/spack/cray_manifest.py
+++ b/lib/spack/spack/cray_manifest.py
@@ -8,8 +8,8 @@
import warnings
from typing import Any, Dict, Iterable, List, Optional
-import jsonschema
-import jsonschema.exceptions
+from _vendoring import jsonschema
+from _vendoring.jsonschema import exceptions
import llnl.util.tty as tty
@@ -227,7 +227,7 @@ def read(path, apply_updates):
json_data = json.load(json_file)
jsonschema.validate(json_data, manifest_schema)
- except (jsonschema.exceptions.ValidationError, decode_exception_type) as e:
+ except (exceptions.ValidationError, decode_exception_type) as e:
raise ManifestValidationError("error parsing manifest JSON:", str(e)) from e
specs = entries_to_specs(json_data["specs"])
diff --git a/lib/spack/spack/deptypes.py b/lib/spack/spack/deptypes.py
index b8249e0e727..c4b4d5a7b4a 100644
--- a/lib/spack/spack/deptypes.py
+++ b/lib/spack/spack/deptypes.py
@@ -5,7 +5,7 @@
from typing import Iterable, List, Tuple, Union
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
#: Type hint for the low-level dependency input (enum.Flag is too slow)
DepFlag = int
diff --git a/lib/spack/spack/detection/test.py b/lib/spack/spack/detection/test.py
index 0d21ce4376b..97114f37e06 100644
--- a/lib/spack/spack/detection/test.py
+++ b/lib/spack/spack/detection/test.py
@@ -85,11 +85,11 @@ def _mock_layout(self) -> Generator[List[str], None, None]:
self.tmpdir.cleanup()
def _create_executable_scripts(self, mock_executables: MockExecutables) -> List[pathlib.Path]:
- import jinja2
+ import _vendoring.jinja2
relative_paths = mock_executables.executables
script = mock_executables.script
- script_template = jinja2.Template("#!/bin/bash\n{{ script }}\n")
+ script_template = _vendoring.jinja2.Template("#!/bin/bash\n{{ script }}\n")
result = []
for mock_exe_path in relative_paths:
rel_path = pathlib.Path(mock_exe_path)
diff --git a/lib/spack/spack/filesystem_view.py b/lib/spack/spack/filesystem_view.py
index bc2c6725c7a..11641b08bdf 100644
--- a/lib/spack/spack/filesystem_view.py
+++ b/lib/spack/spack/filesystem_view.py
@@ -12,7 +12,7 @@
import tempfile
from typing import Callable, Dict, List, Optional
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
from llnl.string import comma_or
from llnl.util import tty
diff --git a/lib/spack/spack/modules/common.py b/lib/spack/spack/modules/common.py
index b38ffba186c..f310e6feed9 100644
--- a/lib/spack/spack/modules/common.py
+++ b/lib/spack/spack/modules/common.py
@@ -872,12 +872,12 @@ def write(self, overwrite=False):
# Get the template for the module
template_name = self._get_template()
- import jinja2
+ import _vendoring.jinja2
try:
env = tengine.make_environment()
template = env.get_template(template_name)
- except jinja2.TemplateNotFound:
+ except _vendoring.jinja2.TemplateNotFound:
# If the template was not found raise an exception with a little
# more information
msg = "template '{0}' was not found for '{1}'"
diff --git a/lib/spack/spack/operating_systems/linux_distro.py b/lib/spack/spack/operating_systems/linux_distro.py
index 808b39ec9d7..bc11dd4df05 100644
--- a/lib/spack/spack/operating_systems/linux_distro.py
+++ b/lib/spack/spack/operating_systems/linux_distro.py
@@ -38,7 +38,7 @@ class LinuxDistro(OperatingSystem):
def __init__(self):
try:
# This will throw an error if imported on a non-Linux platform.
- import distro
+ from _vendoring import distro
distname, version = distro.id(), distro.version()
except ImportError:
diff --git a/lib/spack/spack/package_base.py b/lib/spack/spack/package_base.py
index c4e7fc20f5f..98459a86402 100644
--- a/lib/spack/spack/package_base.py
+++ b/lib/spack/spack/package_base.py
@@ -23,7 +23,7 @@
import traceback
from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Tuple, Type, TypeVar, Union
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
import llnl.util.filesystem as fsys
import llnl.util.tty as tty
diff --git a/lib/spack/spack/relocate.py b/lib/spack/spack/relocate.py
index 2e1481ee4cb..4be813676c4 100644
--- a/lib/spack/spack/relocate.py
+++ b/lib/spack/spack/relocate.py
@@ -8,8 +8,8 @@
import sys
from typing import Dict, Iterable, List, Optional
-import macholib.mach_o
-import macholib.MachO
+import _vendoring.macholib.mach_o
+import _vendoring.macholib.MachO
import llnl.util.filesystem as fs
import llnl.util.lang
@@ -132,7 +132,7 @@ def _macholib_get_paths(cur_path):
"""Get rpaths, dependent libraries, and library id of mach-o objects."""
headers = []
try:
- headers = macholib.MachO.MachO(cur_path).headers
+ headers = _vendoring.macholib.MachO.MachO(cur_path).headers
except ValueError:
pass
if not headers:
@@ -147,9 +147,9 @@ def _macholib_get_paths(cur_path):
tty.warn("File is a stub, not a full library: {0}".format(cur_path))
commands = headers[-1].commands
- LC_ID_DYLIB = macholib.mach_o.LC_ID_DYLIB
- LC_LOAD_DYLIB = macholib.mach_o.LC_LOAD_DYLIB
- LC_RPATH = macholib.mach_o.LC_RPATH
+ LC_ID_DYLIB = _vendoring.macholib.mach_o.LC_ID_DYLIB
+ LC_LOAD_DYLIB = _vendoring.macholib.mach_o.LC_LOAD_DYLIB
+ LC_RPATH = _vendoring.macholib.mach_o.LC_RPATH
ident = None
rpaths = []
diff --git a/lib/spack/spack/schema/__init__.py b/lib/spack/spack/schema/__init__.py
index 45474dfdc78..b495ff1e074 100644
--- a/lib/spack/spack/schema/__init__.py
+++ b/lib/spack/spack/schema/__init__.py
@@ -6,8 +6,8 @@
import typing
import warnings
-import jsonschema
-import jsonschema.validators
+from _vendoring import jsonschema
+from _vendoring.jsonschema import validators
from spack.error import SpecSyntaxError
@@ -66,7 +66,7 @@ def _deprecated_properties(validator, deprecated, instance, schema):
yield jsonschema.ValidationError("\n".join(errors))
-Validator = jsonschema.validators.extend(
+Validator = validators.extend(
jsonschema.Draft7Validator,
{"additionalKeysAreSpecs": _validate_spec, "deprecatedProperties": _deprecated_properties},
)
diff --git a/lib/spack/spack/schema/mirrors.py b/lib/spack/spack/schema/mirrors.py
index 45e1f5adbf9..d69259057e0 100644
--- a/lib/spack/spack/schema/mirrors.py
+++ b/lib/spack/spack/schema/mirrors.py
@@ -9,7 +9,7 @@
"""
from typing import Any, Dict
-import jsonschema
+import _vendoring.jsonschema
#: Common properties for connection specification
connection = {
@@ -123,4 +123,4 @@ def check_access_pair(name, section):
check_access_pair(name, section.get("push"))
if errors:
- raise jsonschema.ValidationError("\n".join(errors))
+ raise _vendoring.jsonschema.ValidationError("\n".join(errors))
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index a5b1b0c8f03..e2e2d365264 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -74,7 +74,7 @@
overload,
)
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
import archspec.cpu
diff --git a/lib/spack/spack/tengine.py b/lib/spack/spack/tengine.py
index 6bda66dda50..c5cebcc4387 100644
--- a/lib/spack/spack/tengine.py
+++ b/lib/spack/spack/tengine.py
@@ -69,7 +69,7 @@ def to_dict(self):
def make_environment(dirs: Optional[Tuple[str, ...]] = None):
"""Returns a configured environment for template rendering."""
# Import at this scope to avoid slowing Spack startup down
- import jinja2
+ import _vendoring.jinja2
if dirs is None:
# Default directories where to search for templates
@@ -78,9 +78,9 @@ def make_environment(dirs: Optional[Tuple[str, ...]] = None):
dirs = tuple(canonicalize_path(d) for d in itertools.chain(builtins, extensions))
# Loader for the templates
- loader = jinja2.FileSystemLoader(dirs)
+ loader = _vendoring.jinja2.FileSystemLoader(dirs)
# Environment of the template engine
- env = jinja2.Environment(loader=loader, trim_blocks=True, lstrip_blocks=True)
+ env = _vendoring.jinja2.Environment(loader=loader, trim_blocks=True, lstrip_blocks=True)
# Custom filters
_set_filters(env)
return env
diff --git a/lib/spack/spack/test/cmd/ci.py b/lib/spack/spack/test/cmd/ci.py
index d2894a08a79..4cd70c58353 100644
--- a/lib/spack/spack/test/cmd/ci.py
+++ b/lib/spack/spack/test/cmd/ci.py
@@ -7,7 +7,7 @@
import shutil
from typing import NamedTuple
-import jsonschema
+import _vendoring.jsonschema
import pytest
from llnl.util.filesystem import mkdirp, working_dir
@@ -860,7 +860,7 @@ def test_push_to_build_cache(
)
index_fetcher = spack.binary_distribution.DefaultIndexFetcher(url_and_version, None)
result = index_fetcher.conditional_fetch()
- jsonschema.validate(json.loads(result.data), db_idx_schema)
+ _vendoring.jsonschema.validate(json.loads(result.data), db_idx_schema)
# Now that index is regenerated, validate "buildcache list" output
assert "patchelf" in buildcache_cmd("list", output=str)
diff --git a/lib/spack/spack/test/concretization/core.py b/lib/spack/spack/test/concretization/core.py
index 6241f148e05..04bfbf23f09 100644
--- a/lib/spack/spack/test/concretization/core.py
+++ b/lib/spack/spack/test/concretization/core.py
@@ -4,7 +4,7 @@
import os
import sys
-import jinja2
+import _vendoring.jinja2
import pytest
import archspec.cpu
@@ -266,7 +266,7 @@ def change(self, changes=None):
del sys.modules["spack.pkg.changing"]
# Change the recipe
- t = jinja2.Template(changing_template)
+ t = _vendoring.jinja2.Template(changing_template)
changing_pkg_str = t.render(**context)
package_py = packages_dir / "changing" / "package.py"
package_py.parent.mkdir(parents=True, exist_ok=True)
diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py
index 7fe94a43bb1..7000068f46f 100644
--- a/lib/spack/spack/test/database.py
+++ b/lib/spack/spack/test/database.py
@@ -24,7 +24,7 @@
except ImportError:
_use_uuid = False
-import jsonschema
+import _vendoring.jsonschema
import llnl.util.lock as lk
from llnl.util.tty.colify import colify
@@ -487,7 +487,7 @@ def test_005_db_exists(database):
with open(index_file, encoding="utf-8") as fd:
index_object = json.load(fd)
- jsonschema.validate(index_object, schema)
+ _vendoring.jsonschema.validate(index_object, schema)
def test_010_all_install_sanity(database):
@@ -783,7 +783,7 @@ def test_old_external_entries_prefix(mutable_database):
with open(spack.store.STORE.db._index_path, "r", encoding="utf-8") as f:
db_obj = json.loads(f.read())
- jsonschema.validate(db_obj, schema)
+ _vendoring.jsonschema.validate(db_obj, schema)
s = spack.concretize.concretize_one("externaltool")
diff --git a/lib/spack/spack/test/schema.py b/lib/spack/spack/test/schema.py
index dfd3bce8378..2bc3348ba51 100644
--- a/lib/spack/spack/test/schema.py
+++ b/lib/spack/spack/test/schema.py
@@ -5,8 +5,8 @@
import json
import os
-import jsonschema
import pytest
+from _vendoring import jsonschema
import spack.paths
import spack.schema
diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py
index a3b09a2e66f..3652d960673 100644
--- a/lib/spack/spack/test/spec_yaml.py
+++ b/lib/spack/spack/test/spec_yaml.py
@@ -15,8 +15,8 @@
import os
import pickle
+import _vendoring.ruamel.yaml
import pytest
-import ruamel.yaml
import spack.concretize
import spack.config
@@ -449,7 +449,7 @@ def test_anchorify_1():
# Check if anchors are used
out = io.StringIO()
- ruamel.yaml.YAML().dump(after, out)
+ _vendoring.ruamel.yaml.YAML().dump(after, out)
assert (
out.getvalue()
== """\
@@ -472,7 +472,7 @@ def test_anchorify_2():
# Check if anchors are used
out = io.StringIO()
- ruamel.yaml.YAML().dump(after, out)
+ _vendoring.ruamel.yaml.YAML().dump(after, out)
assert (
out.getvalue()
== """\
diff --git a/lib/spack/spack/traverse.py b/lib/spack/spack/traverse.py
index 0d408a23972..479075dcf49 100644
--- a/lib/spack/spack/traverse.py
+++ b/lib/spack/spack/traverse.py
@@ -17,7 +17,7 @@
overload,
)
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
import spack.deptypes as dt
import spack.spec
diff --git a/lib/spack/spack/url_buildcache.py b/lib/spack/spack/url_buildcache.py
index 29caa91806d..4d520ffe2d2 100644
--- a/lib/spack/spack/url_buildcache.py
+++ b/lib/spack/spack/url_buildcache.py
@@ -14,7 +14,7 @@
from tempfile import TemporaryDirectory
from typing import Any, Dict, List, Optional, Tuple, Type
-import jsonschema
+import _vendoring.jsonschema
import llnl.util.filesystem as fsys
import llnl.util.tty as tty
@@ -132,7 +132,7 @@ def to_dict(self):
@classmethod
def from_dict(cls, manifest_json: Dict[str, Any]) -> "BuildcacheManifest":
- jsonschema.validate(manifest_json, buildcache_manifest_schema)
+ _vendoring.jsonschema.validate(manifest_json, buildcache_manifest_schema)
return BuildcacheManifest(
layout_version=manifest_json["version"],
data=[BlobRecord.from_dict(blob_json) for blob_json in manifest_json["data"]],
diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py
index e61a1af7ec5..a8b34437493 100644
--- a/lib/spack/spack/util/executable.py
+++ b/lib/spack/spack/util/executable.py
@@ -9,7 +9,7 @@
from pathlib import Path, PurePath
from typing import Callable, Dict, List, Optional, Sequence, TextIO, Type, Union, overload
-from typing_extensions import Literal
+from _vendoring.typing_extensions import Literal
import llnl.util.tty as tty
diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py
index 0a1549e6d25..356451c9bed 100644
--- a/lib/spack/spack/util/spack_yaml.py
+++ b/lib/spack/spack/util/spack_yaml.py
@@ -18,8 +18,7 @@
import re
from typing import IO, Any, Callable, Dict, List, Optional, Union
-import ruamel.yaml
-from ruamel.yaml import comments, constructor, emitter, error, representer
+from _vendoring.ruamel.yaml import YAML, comments, constructor, emitter, error, representer
from llnl.util.tty.color import cextra, clen, colorize
@@ -332,7 +331,7 @@ class ConfigYAML:
"""Handles the loading and dumping of Spack's YAML files."""
def __init__(self, yaml_type: YAMLType) -> None:
- self.yaml = ruamel.yaml.YAML(typ="rt", pure=True)
+ self.yaml = YAML(typ="rt", pure=True)
if yaml_type == YAMLType.GENERIC_YAML:
self.yaml.Representer = SafeRepresenter
elif yaml_type == YAMLType.ANNOTATED_SPACK_CONFIG_FILE:
diff --git a/lib/spack/spack/util/typing.py b/lib/spack/spack/util/typing.py
index ea1e863dc13..8a484ca865d 100644
--- a/lib/spack/spack/util/typing.py
+++ b/lib/spack/spack/util/typing.py
@@ -4,7 +4,7 @@
from typing import Any
-from typing_extensions import Protocol
+from _vendoring.typing_extensions import Protocol
class SupportsRichComparison(Protocol):
diff --git a/lib/spack/spack_installable/main.py b/lib/spack/spack_installable/main.py
index 86041d4cead..136d814c6ad 100644
--- a/lib/spack/spack_installable/main.py
+++ b/lib/spack/spack_installable/main.py
@@ -10,10 +10,8 @@ def get_spack_sys_paths(spack_prefix):
"""Given a spack prefix, return all the paths Spack needs to function."""
spack_libs = os.path.join(spack_prefix, "lib", "spack")
external_libs = os.path.join(spack_libs, "external")
- vendored_libs = os.path.join(external_libs, "_vendoring")
-
# spack externals take precedence, then vendored packages, then spack itself
- return [external_libs, vendored_libs, spack_libs]
+ return [external_libs, spack_libs]
def main(argv=None):
diff --git a/pyproject.toml b/pyproject.toml
index e5f3978308b..321f4a02ddc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -251,7 +251,20 @@ protected-files = ["__init__.py", "README.rst", "vendor.txt"]
patches-dir = "lib/spack/external/patches"
[tool.vendoring.transformations]
-substitute = []
+substitute = [
+ { match = "typing_extensions", replace = "_vendoring.typing_extensions" },
+ { match = "ruamel.yaml", replace = "_vendoring.ruamel.yaml" },
+ { match = "altgraph", replace = "_vendoring.altgraph" },
+ { match = "macholib", replace = "_vendoring.macholib" },
+ { match = "from six", replace = "from _vendoring.six" },
+ { match = "markupsafe", replace = "_vendoring.markupsafe" },
+ { match = "jinja2", replace = "_vendoring.jinja2" },
+ { match = "pyrsistent", replace = "_vendoring.pyrsistent" },
+ { match = "import attr\n", replace = "import _vendoring.attr\n" },
+ { match = "from attr", replace = "from _vendoring.attr" },
+ { match = "import jsonschema", replace = "import _vendoring.jsonschema" },
+ { match = "from jsonschema", replace = "from _vendoring.jsonschema" },
+]
drop = [
# contains unnecessary scripts
"bin/",
@@ -270,6 +283,8 @@ drop = [
# ruamel.yaml installs unneded files
"ruamel.*.pth",
"pvectorc.*.so",
+ # Trim jsonschema tests
+ "jsonschema/tests",
]
[tool.vendoring.typing-stubs]
diff --git a/var/spack/repos/spack_repo/builtin/packages/gcc_runtime/package.py b/var/spack/repos/spack_repo/builtin/packages/gcc_runtime/package.py
index 2c12f6eee99..cd5118a2cdd 100644
--- a/var/spack/repos/spack_repo/builtin/packages/gcc_runtime/package.py
+++ b/var/spack/repos/spack_repo/builtin/packages/gcc_runtime/package.py
@@ -6,7 +6,7 @@
import os
import re
-from macholib import MachO, mach_o
+from _vendoring.macholib import MachO, mach_o
from spack.package import *
from spack.util.elf import delete_needed_from_elf, parse_elf