Skip to content

Commit 3cf1d13

Browse files
committed
Set __qualname__ for validator classes.
Also switch to using attrs to instantiate / repr them.
1 parent 211c548 commit 3cf1d13

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

jsonschema/tests/test_validators.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,46 @@ def test_if_a_version_is_provided_it_is_registered(self):
8383
)
8484
self.addCleanup(validators.meta_schemas.pop, "something")
8585
self.assertEqual(Validator.__name__, "MyVersionValidator")
86+
self.assertEqual(Validator.__qualname__, "MyVersionValidator")
87+
88+
def test_repr(self):
89+
Validator = validators.create(
90+
meta_schema={"$id": "something"},
91+
version="my version",
92+
)
93+
self.addCleanup(validators.meta_schemas.pop, "something")
94+
self.assertEqual(
95+
repr(Validator({})),
96+
"MyVersionValidator(schema={}, format_checker=None)",
97+
)
98+
99+
def test_long_repr(self):
100+
Validator = validators.create(
101+
meta_schema={"$id": "something"},
102+
version="my version",
103+
)
104+
self.addCleanup(validators.meta_schemas.pop, "something")
105+
self.assertEqual(
106+
repr(Validator({"a": list(range(1000))})), (
107+
"MyVersionValidator(schema={'a': [0, 1, 2, 3, 4, 5, ...]}, "
108+
"format_checker=None)"
109+
),
110+
)
111+
112+
def test_repr_no_version(self):
113+
Validator = validators.create(meta_schema={})
114+
self.assertEqual(
115+
repr(Validator({})),
116+
"Validator(schema={}, format_checker=None)",
117+
)
86118

87119
def test_dashes_are_stripped_from_validator_names(self):
88120
Validator = validators.create(
89121
meta_schema={"$id": "something"},
90122
version="foo-bar",
91123
)
92124
self.addCleanup(validators.meta_schemas.pop, "something")
93-
self.assertEqual(Validator.__name__, "FooBarValidator")
125+
self.assertEqual(Validator.__qualname__, "FooBarValidator")
94126

95127
def test_if_a_version_is_not_provided_it_is_not_registered(self):
96128
original = dict(validators.meta_schemas)

jsonschema/validators.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
from warnings import warn
1010
import contextlib
1111
import json
12+
import reprlib
1213
import warnings
1314

15+
import attr
16+
1417
from jsonschema import (
1518
_legacy_validators,
1619
_types,
@@ -144,6 +147,7 @@ def create(
144147
a new `jsonschema.IValidator` class
145148
"""
146149

150+
@attr.s
147151
class Validator:
148152

149153
VALIDATORS = dict(validators)
@@ -152,13 +156,16 @@ class Validator:
152156
TYPE_CHECKER = type_checker
153157
ID_OF = staticmethod(id_of)
154158

155-
def __init__(self, schema, resolver=None, format_checker=None):
156-
if resolver is None:
157-
resolver = RefResolver.from_schema(schema, id_of=id_of)
159+
schema = attr.ib(repr=reprlib.repr)
160+
resolver = attr.ib(default=None, repr=False)
161+
format_checker = attr.ib(default=None)
158162

159-
self.resolver = resolver
160-
self.format_checker = format_checker
161-
self.schema = schema
163+
def __attrs_post_init__(self):
164+
if self.resolver is None:
165+
self.resolver = RefResolver.from_schema(
166+
self.schema,
167+
id_of=id_of,
168+
)
162169

163170
@classmethod
164171
def check_schema(cls, schema):
@@ -229,10 +236,9 @@ def is_valid(self, instance, _schema=None):
229236
return error is None
230237

231238
if version is not None:
239+
safe = version.title().replace(" ", "").replace("-", "")
240+
Validator.__name__ = Validator.__qualname__ = f"{safe}Validator"
232241
Validator = validates(version)(Validator)
233-
Validator.__name__ = (
234-
version.title().replace(" ", "").replace("-", "") + "Validator"
235-
)
236242

237243
return Validator
238244

0 commit comments

Comments
 (0)