diff --git a/changelogs/internal/newsfragments/1786.clarification b/changelogs/internal/newsfragments/1786.clarification new file mode 100644 index 00000000..1810c632 --- /dev/null +++ b/changelogs/internal/newsfragments/1786.clarification @@ -0,0 +1 @@ +Upgrade jsonschema and python-jsonpath CI scripts dependencies. diff --git a/scripts/check-event-schema-examples.py b/scripts/check-event-schema-examples.py index 9058ff4e..fae129f6 100755 --- a/scripts/check-event-schema-examples.py +++ b/scripts/check-event-schema-examples.py @@ -42,6 +42,12 @@ except ImportError as e: import_error("jsonschema", "jsonschema", "jsonschema", e) raise +try: + import referencing +except ImportError as e: + import_error("referencing", "referencing", "referencing", e) + raise + try: import yaml except ImportError as e: @@ -56,13 +62,14 @@ def check_example_file(examplepath, schemapath): with open(schemapath) as f: schema = yaml.safe_load(f) + # $id as a URI with scheme is necessary to make registry resolver work. fileurl = "file://" + os.path.abspath(schemapath) - schema["id"] = fileurl - resolver = jsonschema.RefResolver(fileurl, schema, handlers={"file": helpers.load_file_from_uri}) + schema["$id"] = fileurl print ("Checking schema for: %r %r" % (examplepath, schemapath)) try: - validator = jsonschema.Draft202012Validator(schema, resolver) + registry = referencing.Registry(retrieve=helpers.load_resource_from_uri) + validator = jsonschema.validators.Draft202012Validator(schema, registry=registry) validator.validate(example) except Exception as e: raise ValueError("Error validating JSON schema for %r %r" % ( diff --git a/scripts/check-json-schemas.py b/scripts/check-json-schemas.py index 06b24106..5e0ceaa3 100755 --- a/scripts/check-json-schemas.py +++ b/scripts/check-json-schemas.py @@ -42,6 +42,12 @@ except ImportError as e: import_error("jsonschema", "jsonschema", "jsonschema", e) raise +try: + import referencing +except ImportError as e: + import_error("referencing", "referencing", "referencing", e) + raise + try: import yaml except ImportError as e: @@ -70,10 +76,12 @@ class SchemaDirReport: self.errors += other_report.errors def check_example(path, schema, example): - # URI with scheme is necessary to make RefResolver work. + # $id as a URI with scheme is necessary to make registry resolver work. fileurl = "file://" + os.path.abspath(path) - resolver = jsonschema.RefResolver(fileurl, schema, handlers={"file": helpers.load_file_from_uri}) - validator = jsonschema.Draft202012Validator(schema, resolver) + schema["$id"] = fileurl + + registry = referencing.Registry(retrieve=helpers.load_resource_from_uri) + validator = jsonschema.validators.Draft202012Validator(schema, registry=registry) validator.validate(example) @@ -128,7 +136,7 @@ def check_schema_file(schema_path): # Check schema is valid. try: - validator = jsonschema.Draft202012Validator + validator = jsonschema.validators.Draft202012Validator validator.check_schema(schema) except Exception as e: print(f"Failed to validate JSON schema: {e}") diff --git a/scripts/check-openapi-sources.py b/scripts/check-openapi-sources.py index 7f28d860..4ba0392e 100755 --- a/scripts/check-openapi-sources.py +++ b/scripts/check-openapi-sources.py @@ -42,6 +42,12 @@ except ImportError as e: import_error("jsonschema", "jsonschema", "jsonschema", e) raise +try: + import referencing +except ImportError as e: + import_error("referencing", "referencing", "referencing", e) + raise + try: import yaml except ImportError as e: @@ -50,8 +56,11 @@ except ImportError as e: def check_schema(filepath, example, schema): - resolver = jsonschema.RefResolver(filepath, schema, handlers={"file": helpers.load_file_from_uri}) - validator = jsonschema.Draft202012Validator(schema, resolver) + # $id as a URI with scheme is necessary to make registry resolver work. + schema["$id"] = filepath + + registry = referencing.Registry(retrieve=helpers.load_resource_from_uri) + validator = jsonschema.validators.Draft202012Validator(schema, registry=registry) validator.validate(example) diff --git a/scripts/helpers.py b/scripts/helpers.py index c35e8e2a..a30b2831 100755 --- a/scripts/helpers.py +++ b/scripts/helpers.py @@ -19,6 +19,7 @@ import json import os import os.path +import referencing import urllib.parse import yaml @@ -84,4 +85,15 @@ def load_file_from_uri(path): else: # We have to assume it's YAML because some of the YAML examples # do not have file extensions. - return yaml.safe_load(f) \ No newline at end of file + return yaml.safe_load(f) + +def load_resource_from_uri(path): + """Load a JSON or YAML JSON Schema, as a `referencing.Resource` object, from + a file:// URI. + """ + contents = load_file_from_uri(path) + resource = referencing.Resource( + contents=contents, + specification=referencing.jsonschema.DRAFT202012 + ) + return resource diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 5878b9cc..4d508bf4 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,10 +1,11 @@ # no doubt older versions would be fine for many of these but these were # current at the time of writing -# we need at least version 4.0.0 for support of JSON Schema Draft 2020-12. -jsonschema == 4.17.3 +# we need at least version 4.18.0 for support of referencing library. +jsonschema >= 4.18.0 +referencing >= 0.28.4 -python-jsonpath == 0.9.0 +python-jsonpath >= 1.0.0 attrs >= 23.1.0 PyYAML >= 3.12 requests >= 2.18.4