summaryrefslogtreecommitdiff
path: root/json/bin
diff options
context:
space:
mode:
authorJulian Berman <Julian@GrayVines.com>2022-08-06 11:49:26 +0300
committerJulian Berman <Julian@GrayVines.com>2022-08-06 11:49:26 +0300
commit7a5fd08611cb2fb07b8200860a4e352eb33ae7bf (patch)
treeaedb96380b759ae33aa4da1a332a8186bb8b7d48 /json/bin
parentb0f44a5d2e95c0f2b04bf59f74e0cdf43ea45729 (diff)
downloadjsonschema-7a5fd08611cb2fb07b8200860a4e352eb33ae7bf.tar.gz
Squashed 'json/' changes from 2782d7c29..f82764080
f82764080 Merge pull request #579 from json-schema-org/sanity-check-strengthening e5d5e0a2a Also prevent 'tests that' from descriptions. eaf06b1e8 Remove the last few 'shoulds' from items descriptions. b7da24fba Kill more shoulds from ECMA and ref tests. 85899fdf4 More description cleanup for Bengali non-ASCII tests. b84b900f3 Remove 'should' from a format test which anyhow needed a clearer description. 721397c1f Prevent tests from using 'should' in sanity check. 68f380c6f Fix the last non-unique case descriptions. 6383ef638 Remove mistakenly duplicated anyOf tests in draft{4,6,7}. a5b459fa0 Make sure bignum cases have unique descriptions. b82b18cdf Assert case descriptions are also unique in sanity checks. d3d082219 Also check case description length in sanity checks. 5e7804c52 Use subtests when running sanity checks. 8ade92340 Fix two last clashing $ids in draft-next too. git-subtree-dir: json git-subtree-split: f8276408005489aa134ec857f5fd3f0fb3ec5954
Diffstat (limited to 'json/bin')
-rwxr-xr-xjson/bin/jsonschema_suite268
1 files changed, 0 insertions, 268 deletions
diff --git a/json/bin/jsonschema_suite b/json/bin/jsonschema_suite
deleted file mode 100755
index a859dcf..0000000
--- a/json/bin/jsonschema_suite
+++ /dev/null
@@ -1,268 +0,0 @@
-#! /usr/bin/env python3
-from pathlib import Path
-import argparse
-import errno
-import json
-import os
-import random
-import shutil
-import sys
-import textwrap
-import unittest
-import warnings
-
-try:
- import jsonschema.validators
-except ImportError:
- jsonschema = None
- VALIDATORS = {}
-else:
- VALIDATORS = {
- "draft3": jsonschema.validators.Draft3Validator,
- "draft4": jsonschema.validators.Draft4Validator,
- "draft6": jsonschema.validators.Draft6Validator,
- "draft7": jsonschema.validators.Draft7Validator,
- "draft2019-09": jsonschema.validators.Draft201909Validator,
- "draft2020-12": jsonschema.validators.Draft202012Validator,
- "latest": jsonschema.validators.Draft202012Validator,
- }
-
-
-ROOT_DIR = Path(__file__).parent.parent
-SUITE_ROOT_DIR = ROOT_DIR / "tests"
-REMOTES_DIR = ROOT_DIR / "remotes"
-
-TESTSUITE_SCHEMA = json.loads((ROOT_DIR / "test-schema.json").read_text())
-
-
-def files(paths):
- """
- Each test file in the provided paths, as an array of test cases.
- """
- for path in paths:
- yield json.loads(path.read_text())
-
-
-def cases(paths):
- """
- Each test case within each file in the provided paths.
- """
- for test_file in files(paths):
- yield from test_file
-
-
-def tests(paths):
- """
- Each individual test within all cases within the provided paths.
- """
- for case in cases(paths):
- for test in case["tests"]:
- test["schema"] = case["schema"]
- yield test
-
-
-def collect(root_dir):
- """
- All of the test file paths within the given root directory, recursively.
- """
- return root_dir.glob("**/*.json")
-
-
-class SanityTests(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- print(f"Looking for tests in {SUITE_ROOT_DIR}")
- print(f"Looking for remotes in {REMOTES_DIR}")
-
- cls.test_files = list(collect(SUITE_ROOT_DIR))
- assert cls.test_files, "Didn't find the test files!"
- print(f"Found {len(cls.test_files)} test files")
-
- cls.remote_files = list(collect(REMOTES_DIR))
- assert cls.remote_files, "Didn't find the remote files!"
- print(f"Found {len(cls.remote_files)} remote files")
-
- def test_all_test_files_are_valid_json(self):
- """
- All test files contain valid JSON.
- """
- for path in self.test_files:
- try:
- json.loads(path.read_text())
- except ValueError as error:
- self.fail(f"{path} contains invalid JSON ({error})")
-
- def test_all_remote_files_are_valid_json(self):
- """
- All remote files contain valid JSON.
- """
- for path in self.remote_files:
- try:
- json.loads(path.read_text())
- except ValueError as error:
- self.fail(f"{path} contains invalid JSON ({error})")
-
- def test_all_descriptions_have_reasonable_length(self):
- """
- All tests have reasonably long descriptions.
- """
- for count, test in enumerate(tests(self.test_files)):
- description = test["description"]
- self.assertLess(
- len(description),
- 70,
- f"{description!r} is too long! (keep it to less than 70 chars)"
- )
- print(f"Found {count} tests.")
-
- def test_all_descriptions_are_unique(self):
- """
- All test cases have unique test descriptions in their tests.
- """
- for count, case in enumerate(cases(self.test_files)):
- descriptions = set(test["description"] for test in case["tests"])
- self.assertEqual(
- len(descriptions),
- len(case["tests"]),
- f"{case!r} contains a duplicate description",
- )
- print(f"Found {count} test cases.")
-
- @unittest.skipIf(jsonschema is None, "Validation library not present!")
- def test_all_schemas_are_valid(self):
- """
- All schemas are valid under their metaschemas.
- """
- for version in SUITE_ROOT_DIR.iterdir():
- if not version.is_dir():
- continue
-
- Validator = VALIDATORS.get(version.name)
- if Validator is not None:
- test_files = collect(version)
- for case in cases(test_files):
- try:
- Validator.check_schema(case["schema"])
- except jsonschema.SchemaError as error:
- self.fail(
- f"{case} contains an invalid schema ({error})",
- )
- else:
- warnings.warn(f"No schema validator for {version.name}")
-
- @unittest.skipIf(jsonschema is None, "Validation library not present!")
- def test_suites_are_valid(self):
- """
- All test files are valid under test-schema.json.
- """
- Validator = jsonschema.validators.validator_for(TESTSUITE_SCHEMA)
- validator = Validator(TESTSUITE_SCHEMA)
- for tests in files(self.test_files):
- try:
- validator.validate(tests)
- except jsonschema.ValidationError as error:
- self.fail(str(error))
-
-
-def main(arguments):
- if arguments.command == "check":
- suite = unittest.TestLoader().loadTestsFromTestCase(SanityTests)
- result = unittest.TextTestRunner().run(suite)
- sys.exit(not result.wasSuccessful())
- elif arguments.command == "flatten":
- selected_cases = [case for case in cases(collect(arguments.version))]
-
- if arguments.randomize:
- random.shuffle(selected_cases)
-
- json.dump(selected_cases, sys.stdout, indent=4, sort_keys=True)
- elif arguments.command == "remotes":
- remotes = {}
- for path in collect(REMOTES_DIR):
- relative_path = os.path.relpath(path, REMOTES_DIR)
- remotes[relative_path] = json.loads(path.read_text())
- json.dump(remotes, sys.stdout, indent=4, sort_keys=True)
- elif arguments.command == "dump_remotes":
- if arguments.update:
- shutil.rmtree(arguments.out_dir, ignore_errors=True)
-
- try:
- shutil.copytree(REMOTES_DIR, arguments.out_dir)
- except FileExistsError:
- print(f"{arguments.out_dir} already exists. Aborting.")
- sys.exit(1)
- elif arguments.command == "serve":
- try:
- import flask
- except ImportError:
- print(textwrap.dedent("""
- The Flask library is required to serve the remote schemas.
-
- You can install it by running `pip install Flask`.
-
- Alternatively, see the `jsonschema_suite remotes` or
- `jsonschema_suite dump_remotes` commands to create static files
- that can be served with your own web server.
- """.strip("\n")))
- sys.exit(1)
-
- app = flask.Flask(__name__)
-
- @app.route("/<path:path>")
- def serve_path(path):
- return flask.send_from_directory(REMOTES_DIR, path)
-
- app.run(port=1234)
-
-
-parser = argparse.ArgumentParser(
- description="JSON Schema Test Suite utilities",
-)
-subparsers = parser.add_subparsers(
- help="utility commands", dest="command", metavar="COMMAND"
-)
-subparsers.required = True
-
-check = subparsers.add_parser("check", help="Sanity check the test suite.")
-
-flatten = subparsers.add_parser(
- "flatten",
- help="Output a flattened file containing a selected version's test cases."
-)
-flatten.add_argument(
- "--randomize",
- action="store_true",
- help="Randomize the order of the outputted cases.",
-)
-flatten.add_argument(
- "version", help="The directory containing the version to output",
-)
-
-remotes = subparsers.add_parser(
- "remotes",
- help="Output the expected URLs and their associated schemas for remote "
- "ref tests as a JSON object."
-)
-
-dump_remotes = subparsers.add_parser(
- "dump_remotes", help="Dump the remote ref schemas into a file tree",
-)
-dump_remotes.add_argument(
- "--update",
- action="store_true",
- help="Update the remotes in an existing directory.",
-)
-dump_remotes.add_argument(
- "--out-dir",
- default=REMOTES_DIR,
- type=os.path.abspath,
- help="The output directory to create as the root of the file tree",
-)
-
-serve = subparsers.add_parser(
- "serve",
- help="Start a webserver to serve schemas used by remote ref tests."
-)
-
-if __name__ == "__main__":
- main(parser.parse_args())