Skip to content

Commit fc2d4f9

Browse files
committed
Intentionally break mixing the new and old type interfaces.
1 parent 5487011 commit fc2d4f9

File tree

2 files changed

+33
-17
lines changed

2 files changed

+33
-17
lines changed

jsonschema/tests/test_validators.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -165,22 +165,6 @@ def test_default_types_used_if_no_type_checker_given(self):
165165

166166
self.assertEqual(set(Validator.DEFAULT_TYPES), expected_types)
167167

168-
@unittest.skip("This logic is actually incorrect.")
169-
def test_default_types_update_type_checker(self):
170-
Validator = validators.create(
171-
meta_schema=self.meta_schema,
172-
validators=self.validators,
173-
default_types={u"array": list}
174-
)
175-
176-
self.assertEqual(set(Validator.DEFAULT_TYPES), {u"array"})
177-
Extended = validators.extend(
178-
Validator,
179-
type_checker=Validator.TYPE_CHECKER.remove(u"array")
180-
)
181-
182-
self.assertEqual(set(Extended.DEFAULT_TYPES), {})
183-
184168
def test_types_redefines_the_validators_type_checker(self):
185169
schema = {"type": "string"}
186170
self.assertFalse(validators.Draft7Validator(schema).is_valid(12))
@@ -243,6 +227,29 @@ def test_providing_default_types_with_type_checker_errors(self):
243227
)
244228
self.assertFalse(self.flushWarnings())
245229

230+
def test_extending_a_legacy_validator_with_a_type_checker_errors(self):
231+
Validator = validators.create(
232+
meta_schema={},
233+
validators={},
234+
default_types={u"array": list}
235+
)
236+
with self.assertRaises(TypeError) as e:
237+
validators.extend(
238+
Validator,
239+
validators={},
240+
type_checker=TypeChecker(),
241+
)
242+
243+
self.assertIn(
244+
(
245+
"Cannot extend a validator created with default_types "
246+
"with a type_checker. Update the validator to use a "
247+
"type_checker when created."
248+
),
249+
str(e.exception),
250+
)
251+
self.flushWarnings()
252+
246253
def test_extending_a_legacy_validator_does_not_rewarn(self):
247254
Validator = validators.create(meta_schema={}, default_types={})
248255
self.assertTrue(self.flushWarnings())

jsonschema/validators.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ def create(
200200
raise TypeError(
201201
"Do not specify default_types when providing a type checker.",
202202
)
203+
_created_with_default_types = True
203204
warn(
204205
(
205206
"The default_types argument is deprecated. "
@@ -213,6 +214,7 @@ def create(
213214
)
214215
else:
215216
default_types = _DEPRECATED_DEFAULT_TYPES
217+
_created_with_default_types = False
216218
if type_checker is None:
217219
type_checker = _types.TypeChecker()
218220

@@ -226,6 +228,7 @@ class Validator(object):
226228

227229
DEFAULT_TYPES = property(_DEFAULT_TYPES)
228230
_DEFAULT_TYPES = dict(default_types)
231+
_CREATED_WITH_DEFAULT_TYPES = _created_with_default_types
229232

230233
def __init__(
231234
self,
@@ -393,8 +396,14 @@ def extend(validator, validators=(), version=None, type_checker=None):
393396
all_validators = dict(validator.VALIDATORS)
394397
all_validators.update(validators)
395398

396-
if not type_checker:
399+
if type_checker is None:
397400
type_checker = validator.TYPE_CHECKER
401+
elif validator._CREATED_WITH_DEFAULT_TYPES:
402+
raise TypeError(
403+
"Cannot extend a validator created with default_types "
404+
"with a type_checker. Update the validator to use a "
405+
"type_checker when created."
406+
)
398407

399408
# Set the default_types to None during class creation to avoid
400409
# overwriting the type checker (and triggering the deprecation warning).

0 commit comments

Comments
 (0)