Skip to content

Commit 836db7c

Browse files
committed
Deprecate jsonschema.validators.validators and .meta_schemas.
Besides having confusing names, these expose mutable global state in a way that makes maintenance hard. Today, jsonschema.validators.validator_for(schema) can be used to look up an appropriate Validator given an arbitrary schema.
1 parent 1d275e9 commit 836db7c

File tree

4 files changed

+72
-26
lines changed

4 files changed

+72
-26
lines changed

jsonschema/tests/_suite.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
import attr
1515

16-
from jsonschema.validators import validators
16+
from jsonschema.validators import _VALIDATORS
1717
import jsonschema
1818

1919

@@ -51,10 +51,10 @@ def _remotes(self):
5151
}
5252

5353
def benchmark(self, runner): # pragma: no cover
54-
for name in validators:
54+
for name, Validator in _VALIDATORS.items():
5555
self.version(name=name).benchmark(
5656
runner=runner,
57-
Validator=validators[name],
57+
Validator=Validator,
5858
)
5959

6060
def version(self, name):

jsonschema/tests/test_deprecations.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from unittest import TestCase
22

3-
from jsonschema.validators import Draft7Validator, RefResolver
3+
from jsonschema import validators
44

55

66
class TestDeprecations(TestCase):
@@ -33,12 +33,44 @@ def test_validators_ErrorTree(self):
3333
),
3434
)
3535

36+
def test_validators_validators(self):
37+
"""
38+
As of v4.0.0, accessing jsonschema.validators.validators is
39+
deprecated.
40+
"""
41+
42+
with self.assertWarns(DeprecationWarning) as w:
43+
value = validators.validators
44+
self.assertEqual(value, validators._VALIDATORS)
45+
46+
self.assertTrue(
47+
str(w.warning).startswith(
48+
"Accessing jsonschema.validators.validators is deprecated",
49+
),
50+
)
51+
52+
def test_validators_meta_schemas(self):
53+
"""
54+
As of v4.0.0, accessing jsonschema.validators.meta_schemas is
55+
deprecated.
56+
"""
57+
58+
with self.assertWarns(DeprecationWarning) as w:
59+
value = validators.meta_schemas
60+
self.assertEqual(value, validators._META_SCHEMAS)
61+
62+
self.assertTrue(
63+
str(w.warning).startswith(
64+
"Accessing jsonschema.validators.meta_schemas is deprecated",
65+
),
66+
)
67+
3668
def test_RefResolver_in_scope(self):
3769
"""
3870
As of v4.0.0, RefResolver.in_scope is deprecated.
3971
"""
4072

41-
resolver = RefResolver.from_schema({})
73+
resolver = validators.RefResolver.from_schema({})
4274
with self.assertWarns(DeprecationWarning) as w:
4375
with resolver.in_scope("foo"):
4476
pass
@@ -55,7 +87,7 @@ def test_Validator_is_valid_two_arguments(self):
5587
different schema) is deprecated.
5688
"""
5789

58-
validator = Draft7Validator({})
90+
validator = validators.Draft7Validator({})
5991
with self.assertWarns(DeprecationWarning) as w:
6092
result = validator.is_valid("foo", {"type": "number"})
6193

@@ -72,7 +104,7 @@ def test_Validator_iter_errors_two_arguments(self):
72104
different schema) is deprecated.
73105
"""
74106

75-
validator = Draft7Validator({})
107+
validator = validators.Draft7Validator({})
76108
with self.assertWarns(DeprecationWarning) as w:
77109
error, = validator.iter_errors("foo", {"type": "number"})
78110

jsonschema/tests/test_validators.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class TestCreateAndExtend(SynchronousTestCase):
2727
def setUp(self):
2828
self.addCleanup(
2929
self.assertEqual,
30-
validators.meta_schemas,
31-
dict(validators.meta_schemas),
30+
validators._META_SCHEMAS,
31+
dict(validators._META_SCHEMAS),
3232
)
3333

3434
self.meta_schema = {"$id": "some://meta/schema"}
@@ -99,7 +99,7 @@ def test_if_a_version_is_provided_it_is_registered(self):
9999
meta_schema={"$id": "something"},
100100
version="my version",
101101
)
102-
self.addCleanup(validators.meta_schemas.pop, "something")
102+
self.addCleanup(validators._META_SCHEMAS.pop, "something")
103103
self.assertEqual(Validator.__name__, "MyVersionValidator")
104104
self.assertEqual(Validator.__qualname__, "MyVersionValidator")
105105

@@ -108,7 +108,7 @@ def test_repr(self):
108108
meta_schema={"$id": "something"},
109109
version="my version",
110110
)
111-
self.addCleanup(validators.meta_schemas.pop, "something")
111+
self.addCleanup(validators._META_SCHEMAS.pop, "something")
112112
self.assertEqual(
113113
repr(Validator({})),
114114
"MyVersionValidator(schema={}, format_checker=None)",
@@ -119,7 +119,7 @@ def test_long_repr(self):
119119
meta_schema={"$id": "something"},
120120
version="my version",
121121
)
122-
self.addCleanup(validators.meta_schemas.pop, "something")
122+
self.addCleanup(validators._META_SCHEMAS.pop, "something")
123123
self.assertEqual(
124124
repr(Validator({"a": list(range(1000))})), (
125125
"MyVersionValidator(schema={'a': [0, 1, 2, 3, 4, 5, ...]}, "
@@ -139,13 +139,13 @@ def test_dashes_are_stripped_from_validator_names(self):
139139
meta_schema={"$id": "something"},
140140
version="foo-bar",
141141
)
142-
self.addCleanup(validators.meta_schemas.pop, "something")
142+
self.addCleanup(validators._META_SCHEMAS.pop, "something")
143143
self.assertEqual(Validator.__qualname__, "FooBarValidator")
144144

145145
def test_if_a_version_is_not_provided_it_is_not_registered(self):
146-
original = dict(validators.meta_schemas)
146+
original = dict(validators._META_SCHEMAS)
147147
validators.create(meta_schema={"id": "id"})
148-
self.assertEqual(validators.meta_schemas, original)
148+
self.assertEqual(validators._META_SCHEMAS, original)
149149

150150
def test_validates_registers_meta_schema_id(self):
151151
meta_schema_key = "meta schema id"
@@ -156,9 +156,9 @@ def test_validates_registers_meta_schema_id(self):
156156
version="my version",
157157
id_of=lambda s: s.get("id", ""),
158158
)
159-
self.addCleanup(validators.meta_schemas.pop, meta_schema_key)
159+
self.addCleanup(validators._META_SCHEMAS.pop, meta_schema_key)
160160

161-
self.assertIn(meta_schema_key, validators.meta_schemas)
161+
self.assertIn(meta_schema_key, validators._META_SCHEMAS)
162162

163163
def test_validates_registers_meta_schema_draft6_id(self):
164164
meta_schema_key = "meta schema $id"
@@ -168,9 +168,9 @@ def test_validates_registers_meta_schema_draft6_id(self):
168168
meta_schema=my_meta_schema,
169169
version="my version",
170170
)
171-
self.addCleanup(validators.meta_schemas.pop, meta_schema_key)
171+
self.addCleanup(validators._META_SCHEMAS.pop, meta_schema_key)
172172

173-
self.assertIn(meta_schema_key, validators.meta_schemas)
173+
self.assertIn(meta_schema_key, validators._META_SCHEMAS)
174174

175175
def test_create_default_types(self):
176176
Validator = validators.create(meta_schema={}, validators=())

jsonschema/validators.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
exceptions,
2323
)
2424

25-
validators = {}
26-
meta_schemas = _utils.URIDict()
25+
_VALIDATORS = {}
26+
_META_SCHEMAS = _utils.URIDict()
2727
_VOCABULARIES = _utils.URIDict()
2828

2929

@@ -36,6 +36,20 @@ def __getattr__(name):
3636
)
3737
from jsonschema.exceptions import ErrorTree
3838
return ErrorTree
39+
elif name == "validators":
40+
warnings.warn(
41+
"Accessing jsonschema.validators.validators is deprecated. "
42+
"Use jsonschema.validators.validator_for with a given schema.",
43+
DeprecationWarning,
44+
)
45+
return _VALIDATORS
46+
elif name == "meta_schemas":
47+
warnings.warn(
48+
"Accessing jsonschema.validators.meta_schemas is deprecated. "
49+
"Use jsonschema.validators.validator_for with a given schema.",
50+
DeprecationWarning,
51+
)
52+
return _META_SCHEMAS
3953
raise AttributeError(f"module {__name__} has no attribute {name}")
4054

4155

@@ -60,9 +74,9 @@ def validates(version):
6074
"""
6175

6276
def _validates(cls):
63-
validators[version] = cls
77+
_VALIDATORS[version] = cls
6478
meta_schema_id = cls.ID_OF(cls.META_SCHEMA)
65-
meta_schemas[meta_schema_id] = cls
79+
_META_SCHEMAS[meta_schema_id] = cls
6680

6781
for vocabulary in cls.VOCABULARY_SCHEMAS:
6882
vocabulary_id = cls.ID_OF(vocabulary)
@@ -80,7 +94,7 @@ def _id_of(schema):
8094

8195
def _store_schema_list():
8296
return [
83-
(id, validator.META_SCHEMA) for id, validator in meta_schemas.items()
97+
(id, validator.META_SCHEMA) for id, validator in _META_SCHEMAS.items()
8498
] + [
8599
(id, schema) for id, schema in _VOCABULARIES.items()
86100
]
@@ -982,7 +996,7 @@ def validator_for(schema, default=_LATEST_VERSION):
982996
"""
983997
if schema is True or schema is False or "$schema" not in schema:
984998
return default
985-
if schema["$schema"] not in meta_schemas:
999+
if schema["$schema"] not in _META_SCHEMAS:
9861000
warn(
9871001
(
9881002
"The metaschema specified by $schema was not found. "
@@ -992,4 +1006,4 @@ def validator_for(schema, default=_LATEST_VERSION):
9921006
DeprecationWarning,
9931007
stacklevel=2,
9941008
)
995-
return meta_schemas.get(schema["$schema"], _LATEST_VERSION)
1009+
return _META_SCHEMAS.get(schema["$schema"], _LATEST_VERSION)

0 commit comments

Comments
 (0)