-
- Notifications
You must be signed in to change notification settings - Fork 604
Closed
Labels
BugSomething doesn't work the way it should.Something doesn't work the way it should.
Description
Looking at the following MCVE:
import jsonschema null = None schema = { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "tag:example.com,2022:test.schema.json", # "$id": "worksfinewithoutcolon", "$ref": "#/$defs/foo", "$defs": { "foo": { "properties": { "bar": { "$ref": "#/$defs/bar" } } }, "bar": { } } } instance = { "bar": 42 } jsonschema.validate(instance, schema)This raises:
Full Traceback
Traceback (most recent call last): File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 898, in resolve_from_url document = self.store[url] File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/_utils.py", line 28, in __getitem__ return self.store[self.normalize(uri)] KeyError: '' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 901, in resolve_from_url document = self.resolve_remote(url) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 1007, in resolve_remote with urlopen(uri) as url: File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/urllib/request.py", line 216, in urlopen return opener.open(url, data, timeout) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/urllib/request.py", line 503, in open req = Request(fullurl, data) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/urllib/request.py", line 322, in __init__ self.full_url = url File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/urllib/request.py", line 348, in full_url self._parse() File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/urllib/request.py", line 377, in _parse raise ValueError("unknown url type: %r" % self.full_url) ValueError: unknown url type: '' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/spyder_kernels/py3compat.py", line 356, in compat_exec exec(code, globals, locals) File "/home/lukas/Desktop/scratch/schemaref.py", line 41, in <module> jsonschema.validate(instance, schema, resolver=resolver) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 1108, in validate error = exceptions.best_match(validator.iter_errors(instance)) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/exceptions.py", line 382, in best_match best = next(errors, None) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 278, in iter_errors for error in errors: File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/_validators.py", line 332, in properties yield from validator.descend( File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 295, in descend for error in self.evolve(schema=schema).iter_errors(instance): File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 278, in iter_errors for error in errors: File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/_validators.py", line 298, in ref yield from validator.descend(instance, resolved) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 295, in descend for error in self.evolve(schema=schema).iter_errors(instance): File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 278, in iter_errors for error in errors: File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/_validators.py", line 294, in ref scope, resolved = validator.resolver.resolve(ref) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 887, in resolve return url, self._remote_cache(url) File "/home/lukas/anaconda3/envs/ifos_test/lib/python3.10/site-packages/jsonschema/validators.py", line 903, in resolve_from_url raise exceptions.RefResolutionError(exc) RefResolutionError: unknown url type: '' RefResolutionError: unknown url type: '' According to my reading of the spec, this should validate just fine. Hyperjump also finds these JSONs valid (after removing the # comment line).
However, jsonschema fails here. It looks like two things are needed for the error to happen:
- A URI in the
"$id"field wherejsonschemadoesn't know the scheme (or a string that looks like a URI). - Nested
"$ref"statements.
According to the spec:
The $id keyword defines a URI for the schema, and the base URI that other URI references within the schema are resolved against.
jsonschema validates the file just fine if the "$id" doesn't contain a colon. I don't even understand why it tries to resolve the "$id".
Related: #313
Metadata
Metadata
Assignees
Labels
BugSomething doesn't work the way it should.Something doesn't work the way it should.