from unittest import TestCase import importlib import subprocess import sys from jsonschema import FormatChecker, validators class TestDeprecations(TestCase): def test_version(self): """ As of v4.0.0, __version__ is deprecated in favor of importlib.metadata. """ with self.assertWarns(DeprecationWarning) as w: from jsonschema import __version__ # noqa self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.__version__ is deprecated", ), ) def test_validators_ErrorTree(self): """ As of v4.0.0, importing ErrorTree from jsonschema.validators is deprecated in favor of doing so from jsonschema.exceptions. """ with self.assertWarns(DeprecationWarning) as w: from jsonschema.validators import ErrorTree # noqa self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Importing ErrorTree from jsonschema.validators is deprecated", ), ) def test_validators_validators(self): """ As of v4.0.0, accessing jsonschema.validators.validators is deprecated. """ with self.assertWarns(DeprecationWarning) as w: value = validators.validators self.assertEqual(value, validators._VALIDATORS) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.validators.validators is deprecated", ), ) def test_validators_meta_schemas(self): """ As of v4.0.0, accessing jsonschema.validators.meta_schemas is deprecated. """ with self.assertWarns(DeprecationWarning) as w: value = validators.meta_schemas self.assertEqual(value, validators._META_SCHEMAS) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.validators.meta_schemas is deprecated", ), ) def test_RefResolver_in_scope(self): """ As of v4.0.0, RefResolver.in_scope is deprecated. """ resolver = validators.RefResolver.from_schema({}) with self.assertWarns(DeprecationWarning) as w: with resolver.in_scope("foo"): pass self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "jsonschema.RefResolver.in_scope is deprecated ", ), ) def test_Validator_is_valid_two_arguments(self): """ As of v4.0.0, calling is_valid with two arguments (to provide a different schema) is deprecated. """ validator = validators.Draft7Validator({}) with self.assertWarns(DeprecationWarning) as w: result = validator.is_valid("foo", {"type": "number"}) self.assertFalse(result) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Passing a schema to Validator.is_valid is deprecated ", ), ) def test_Validator_iter_errors_two_arguments(self): """ As of v4.0.0, calling iter_errors with two arguments (to provide a different schema) is deprecated. """ validator = validators.Draft7Validator({}) with self.assertWarns(DeprecationWarning) as w: error, = validator.iter_errors("foo", {"type": "number"}) self.assertEqual(error.validator, "type") self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Passing a schema to Validator.iter_errors is deprecated ", ), ) def test_Validator_subclassing(self): """ As of v4.12.0, subclassing a validator class produces an explicit deprecation warning. This was never intended to be public API (and some comments over the years in issues said so, but obviously that's not a great way to make sure it's followed). A future version will explicitly raise an error. """ with self.assertWarns(DeprecationWarning) as w: class Subclass(validators.Draft202012Validator): pass self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith("Subclassing validator classes is "), ) with self.assertWarns(DeprecationWarning) as w: class AnotherSubclass(validators.create(meta_schema={})): pass def test_FormatChecker_cls_checks(self): """ As of v4.14.0, FormatChecker.cls_checks is deprecated without replacement. """ self.addCleanup(FormatChecker.checkers.pop, "boom", None) with self.assertWarns(DeprecationWarning) as w: FormatChecker.cls_checks("boom") self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith("FormatChecker.cls_checks "), ) def test_draftN_format_checker(self): """ As of v4.16.0, accessing jsonschema.draftn_format_checker is deprecated in favor of Validator.FORMAT_CHECKER. """ with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft202012_format_checker # noqa self.assertIs( draft202012_format_checker, validators.Draft202012Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft202012_format_checker is ", ), msg=w.warning, ) with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft201909_format_checker # noqa self.assertIs( draft201909_format_checker, validators.Draft201909Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft201909_format_checker is ", ), msg=w.warning, ) with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft7_format_checker # noqa self.assertIs( draft7_format_checker, validators.Draft7Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft7_format_checker is ", ), msg=w.warning, ) with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft6_format_checker # noqa self.assertIs( draft6_format_checker, validators.Draft6Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft6_format_checker is ", ), msg=w.warning, ) with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft4_format_checker # noqa self.assertIs( draft4_format_checker, validators.Draft4Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft4_format_checker is ", ), msg=w.warning, ) with self.assertWarns(DeprecationWarning) as w: from jsonschema import draft3_format_checker # noqa self.assertIs( draft3_format_checker, validators.Draft3Validator.FORMAT_CHECKER, ) self.assertEqual(w.filename, __file__) self.assertTrue( str(w.warning).startswith( "Accessing jsonschema.draft3_format_checker is ", ), msg=w.warning, ) with self.assertRaises(ImportError): from jsonschema import draft1234_format_checker # noqa def test_import_cli(self): """ As of v4.17.0, importing jsonschema.cli is deprecated. """ with self.assertWarns(DeprecationWarning) as w: import jsonschema.cli importlib.reload(jsonschema.cli) self.assertEqual(w.filename, importlib.__file__) self.assertTrue( str(w.warning).startswith( "The jsonschema CLI is deprecated and will be removed ", ), ) def test_cli(self): """ As of v4.17.0, the jsonschema CLI is deprecated. """ process = subprocess.run( [sys.executable, "-m", "jsonschema"], capture_output=True, ) self.assertIn(b"The jsonschema CLI is deprecated ", process.stderr)