
Our `jsonschema` external won't support Python 3.10, so we need to upgrade it. It currently generates this warning: lib/spack/external/jsonschema/compat.py:6: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working This upgrades `jsonschema` to 3.2.0, the latest version with support for Python 2.7. The next version after this (4.0.0) drops support for 2.7 and 3.6, so we'll have to wait to upgrade to it. Dependencies have been added in prior commits.
91 lines
2.3 KiB
Python
91 lines
2.3 KiB
Python
"""
|
|
The ``jsonschema`` command line.
|
|
"""
|
|
from __future__ import absolute_import
|
|
import argparse
|
|
import json
|
|
import sys
|
|
|
|
from jsonschema import __version__
|
|
from jsonschema._reflect import namedAny
|
|
from jsonschema.validators import validator_for
|
|
|
|
|
|
def _namedAnyWithDefault(name):
|
|
if "." not in name:
|
|
name = "jsonschema." + name
|
|
return namedAny(name)
|
|
|
|
|
|
def _json_file(path):
|
|
with open(path) as file:
|
|
return json.load(file)
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="JSON Schema Validation CLI",
|
|
)
|
|
parser.add_argument(
|
|
"-i", "--instance",
|
|
action="append",
|
|
dest="instances",
|
|
type=_json_file,
|
|
help=(
|
|
"a path to a JSON instance (i.e. filename.json) "
|
|
"to validate (may be specified multiple times)"
|
|
),
|
|
)
|
|
parser.add_argument(
|
|
"-F", "--error-format",
|
|
default="{error.instance}: {error.message}\n",
|
|
help=(
|
|
"the format to use for each error output message, specified in "
|
|
"a form suitable for passing to str.format, which will be called "
|
|
"with 'error' for each error"
|
|
),
|
|
)
|
|
parser.add_argument(
|
|
"-V", "--validator",
|
|
type=_namedAnyWithDefault,
|
|
help=(
|
|
"the fully qualified object name of a validator to use, or, for "
|
|
"validators that are registered with jsonschema, simply the name "
|
|
"of the class."
|
|
),
|
|
)
|
|
parser.add_argument(
|
|
"--version",
|
|
action="version",
|
|
version=__version__,
|
|
)
|
|
parser.add_argument(
|
|
"schema",
|
|
help="the JSON Schema to validate with (i.e. schema.json)",
|
|
type=_json_file,
|
|
)
|
|
|
|
|
|
def parse_args(args):
|
|
arguments = vars(parser.parse_args(args=args or ["--help"]))
|
|
if arguments["validator"] is None:
|
|
arguments["validator"] = validator_for(arguments["schema"])
|
|
return arguments
|
|
|
|
|
|
def main(args=sys.argv[1:]):
|
|
sys.exit(run(arguments=parse_args(args=args)))
|
|
|
|
|
|
def run(arguments, stdout=sys.stdout, stderr=sys.stderr):
|
|
error_format = arguments["error_format"]
|
|
validator = arguments["validator"](schema=arguments["schema"])
|
|
|
|
validator.check_schema(arguments["schema"])
|
|
|
|
errored = False
|
|
for instance in arguments["instances"] or ():
|
|
for error in validator.iter_errors(instance):
|
|
stderr.write(error_format.format(error=error))
|
|
errored = True
|
|
return errored
|