|
|
- from __future__ import absolute_import
- import argparse
- import json
- import sys
-
- 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(
- "schema",
- help="the JSON Schema to validate with (i.e. filename.schema)",
- 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
|