summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Berman <Julian@GrayVines.com>2023-03-15 14:42:11 -0400
committerJulian Berman <Julian@GrayVines.com>2023-03-15 14:42:11 -0400
commitdb1e18591333fa72c30fac3b7dfc7ef175612578 (patch)
treeebf4723b1870eb78ebd6e94ed518a177b1e7a44f
parent61bd0b18822bec24fdd3a15cdaba040d65781384 (diff)
downloadjsonschema-db1e18591333fa72c30fac3b7dfc7ef175612578.tar.gz
flake8 -> ruff, a mostly painless affair.
-rw-r--r--.flake813
-rw-r--r--jsonschema/__init__.py18
-rw-r--r--jsonschema/__main__.py3
-rw-r--r--jsonschema/_format.py8
-rw-r--r--jsonschema/_legacy_validators.py2
-rw-r--r--jsonschema/_types.py13
-rw-r--r--jsonschema/exceptions.py8
-rw-r--r--jsonschema/protocols.py2
-rw-r--r--jsonschema/tests/test_jsonschema_test_suite.py2
-rw-r--r--jsonschema/tests/test_validators.py6
-rw-r--r--jsonschema/validators.py13
-rw-r--r--pyproject.toml53
-rw-r--r--tox.ini11
13 files changed, 85 insertions, 67 deletions
diff --git a/.flake8 b/.flake8
deleted file mode 100644
index 00987e6..0000000
--- a/.flake8
+++ /dev/null
@@ -1,13 +0,0 @@
-[flake8]
-ban-relative-imports = true
-inline-quotes = "
-exclude =
- jsonschema/__init__.py
- jsonschema/_reflect.py
-ignore =
- # Barring function calls in default args. Ha, no.
- B008,
- # See https://github.com/PyCQA/flake8-bugbear/issues/131
- B306,
- # (flake8 default) old PEP8 boolean operator line breaks
- W503,
diff --git a/jsonschema/__init__.py b/jsonschema/__init__.py
index ad7affc..efa59f4 100644
--- a/jsonschema/__init__.py
+++ b/jsonschema/__init__.py
@@ -1,5 +1,5 @@
"""
-An implementation of JSON Schema for Python
+An implementation of JSON Schema for Python.
The main functionality is provided by the validator classes for each of the
supported JSON Schema versions.
@@ -98,3 +98,19 @@ def __getattr__(name):
return ValidatorForFormat.FORMAT_CHECKER
raise AttributeError(f"module {__name__} has no attribute {name}")
+
+
+__all__ = [
+ "Draft201909Validator",
+ "Draft202012Validator",
+ "Draft3Validator",
+ "Draft4Validator",
+ "Draft6Validator",
+ "Draft7Validator",
+ "FormatChecker",
+ "SchemaError",
+ "TypeChecker",
+ "ValidationError",
+ "Validator",
+ "validate",
+]
diff --git a/jsonschema/__main__.py b/jsonschema/__main__.py
index fdc21e2..fb260ae 100644
--- a/jsonschema/__main__.py
+++ b/jsonschema/__main__.py
@@ -1,3 +1,6 @@
+"""
+The jsonschema CLI is now deprecated in favor of check-jsonschema.
+"""
from jsonschema.cli import main
main()
diff --git a/jsonschema/_format.py b/jsonschema/_format.py
index 6a7f4a8..d274c5f 100644
--- a/jsonschema/_format.py
+++ b/jsonschema/_format.py
@@ -51,9 +51,9 @@ class FormatChecker:
self.checkers = {k: self.checkers[k] for k in formats}
def __repr__(self):
- return "<FormatChecker checkers={}>".format(sorted(self.checkers))
+ return f"<FormatChecker checkers={sorted(self.checkers)}>"
- def checks(
+ def checks( # noqa: D417,D214,D405 (charliermarsh/ruff#3547)
self, format: str, raises: _RaisesType = (),
) -> typing.Callable[[_F], _F]:
"""
@@ -73,7 +73,7 @@ class FormatChecker:
The exception object will be accessible as the
`jsonschema.exceptions.ValidationError.cause` attribute of the
resulting validation error.
- """
+ """ # noqa: D417,D214,D405 (charliermarsh/ruff#3547)
def _checks(func: _F) -> _F:
self.checkers[format] = (func, raises)
@@ -126,7 +126,6 @@ class FormatChecker:
if the instance does not conform to ``format``
"""
-
if format not in self.checkers:
return
@@ -157,7 +156,6 @@ class FormatChecker:
bool: whether it conformed
"""
-
try:
self.check(instance, format)
except FormatError:
diff --git a/jsonschema/_legacy_validators.py b/jsonschema/_legacy_validators.py
index 9a211f3..a338624 100644
--- a/jsonschema/_legacy_validators.py
+++ b/jsonschema/_legacy_validators.py
@@ -222,7 +222,7 @@ def recursiveRef(validator, recursiveRef, instance, schema):
def find_evaluated_item_indexes_by_schema(validator, instance, schema):
"""
- Get all indexes of items that get evaluated under the current schema
+ Get all indexes of items that get evaluated under the current schema.
Covers all keywords related to unevaluatedItems: items, prefixItems, if,
then, else, contains, unevaluatedItems, allOf, oneOf, anyOf
diff --git a/jsonschema/_types.py b/jsonschema/_types.py
index 9f8dfa0..d142810 100644
--- a/jsonschema/_types.py
+++ b/jsonschema/_types.py
@@ -14,8 +14,8 @@ from jsonschema.exceptions import UndefinedTypeCheck
# the concrete type of a type checker mapping
# this "do nothing" wrapper presents the correct information to mypy
def _typed_map_converter(
- init_val: Mapping[str, Callable[["TypeChecker", Any], bool]],
-) -> HashTrieMap[str, Callable[["TypeChecker", Any], bool]]:
+ init_val: Mapping[str, Callable[[TypeChecker, Any], bool]],
+) -> HashTrieMap[str, Callable[[TypeChecker, Any], bool]]:
return HashTrieMap.convert(init_val)
@@ -79,7 +79,7 @@ class TypeChecker:
"""
_type_checkers: HashTrieMap[
- str, Callable[["TypeChecker", Any], bool],
+ str, Callable[[TypeChecker, Any], bool],
] = attr.ib(
default=HashTrieMap(),
converter=_typed_map_converter,
@@ -116,7 +116,7 @@ class TypeChecker:
return fn(self, instance)
- def redefine(self, type: str, fn) -> "TypeChecker":
+ def redefine(self, type: str, fn) -> TypeChecker:
"""
Produce a new checker with the given type redefined.
@@ -135,7 +135,7 @@ class TypeChecker:
"""
return self.redefine_many({type: fn})
- def redefine_many(self, definitions=()) -> "TypeChecker":
+ def redefine_many(self, definitions=()) -> TypeChecker:
"""
Produce a new checker with the given types redefined.
@@ -148,7 +148,7 @@ class TypeChecker:
type_checkers = self._type_checkers.update(definitions)
return attr.evolve(self, type_checkers=type_checkers)
- def remove(self, *types) -> "TypeChecker":
+ def remove(self, *types) -> TypeChecker:
"""
Produce a new checker with the given types forgotten.
@@ -164,7 +164,6 @@ class TypeChecker:
if any given type is unknown to this object
"""
-
type_checkers = self._type_checkers
for each in types:
try:
diff --git a/jsonschema/exceptions.py b/jsonschema/exceptions.py
index 5e88d74..d1ee50a 100644
--- a/jsonschema/exceptions.py
+++ b/jsonschema/exceptions.py
@@ -51,7 +51,7 @@ class _Error(Exception):
parent=None,
type_checker=_unset,
):
- super(_Error, self).__init__(
+ super().__init__(
message,
validator,
path,
@@ -252,7 +252,7 @@ class FormatError(Exception):
"""
def __init__(self, message, cause=None):
- super(FormatError, self).__init__(message, cause)
+ super().__init__(message, cause)
self.message = message
self.cause = self.__cause__ = cause
@@ -283,7 +283,6 @@ class ErrorTree:
"""
Check whether ``instance[index]`` has any errors.
"""
-
return index in self._contents
def __getitem__(self, index):
@@ -295,7 +294,6 @@ class ErrorTree:
by ``instance.__getitem__`` will be propagated (usually this is
some subclass of `LookupError`.
"""
-
if self._instance is not _unset and index not in self:
self._instance[index]
return self._contents[index]
@@ -310,7 +308,6 @@ class ErrorTree:
"""
Iterate (non-recursively) over the indices in the instance with errors.
"""
-
return iter(self._contents)
def __len__(self):
@@ -329,7 +326,6 @@ class ErrorTree:
"""
The total number of errors in the entire tree, including children.
"""
-
child_errors = sum(len(tree) for _, tree in self._contents.items())
return len(self.errors) + child_errors
diff --git a/jsonschema/protocols.py b/jsonschema/protocols.py
index f324ea1..4ad43e7 100644
--- a/jsonschema/protocols.py
+++ b/jsonschema/protocols.py
@@ -206,7 +206,7 @@ class Validator(Protocol):
ValidationError: [2, 3, 4] is too long
"""
- def evolve(self, **kwargs) -> "Validator":
+ def evolve(self, **kwargs) -> Validator:
"""
Create a new validator like this one, but with given changes.
diff --git a/jsonschema/tests/test_jsonschema_test_suite.py b/jsonschema/tests/test_jsonschema_test_suite.py
index fd2c499..9c63714 100644
--- a/jsonschema/tests/test_jsonschema_test_suite.py
+++ b/jsonschema/tests/test_jsonschema_test_suite.py
@@ -39,7 +39,7 @@ def missing_format(Validator):
):
return
- return "Format checker {0!r} not found.".format(schema["format"])
+ return f"Format checker {schema['format']!r} not found."
return missing_format
diff --git a/jsonschema/tests/test_validators.py b/jsonschema/tests/test_validators.py
index 6a5756b..8afdbe4 100644
--- a/jsonschema/tests/test_validators.py
+++ b/jsonschema/tests/test_validators.py
@@ -1522,7 +1522,7 @@ class MetaSchemaTestsMixin:
)
-class ValidatorTestMixin(MetaSchemaTestsMixin, object):
+class ValidatorTestMixin(MetaSchemaTestsMixin):
def test_it_implements_the_validator_protocol(self):
self.assertIsInstance(self.Validator({}), protocols.Validator)
@@ -1632,7 +1632,7 @@ class ValidatorTestMixin(MetaSchemaTestsMixin, object):
elif value == "bad":
raise bad
else: # pragma: no cover
- self.fail("What is {}? [Baby Don't Hurt Me]".format(value))
+ self.fail(f"What is {value}? [Baby Don't Hurt Me]")
validator = self.Validator(
{"format": "foo"}, format_checker=checker,
@@ -2201,7 +2201,7 @@ class TestRefResolver(TestCase):
self.addCleanup(os.remove, tempf.name)
json.dump({"foo": "bar"}, tempf)
- ref = "file://{}#foo".format(pathname2url(tempf.name))
+ ref = f"file://{pathname2url(tempf.name)}#foo"
with self.resolver.resolving(ref) as resolved:
self.assertEqual(resolved, "bar")
diff --git a/jsonschema/validators.py b/jsonschema/validators.py
index ae4e921..5487b84 100644
--- a/jsonschema/validators.py
+++ b/jsonschema/validators.py
@@ -518,7 +518,6 @@ def extend(
likely be made before modifying it, in order to not affect the
old validator.
"""
-
all_validators = dict(validator.VALIDATORS)
all_validators.update(validators)
@@ -892,7 +891,7 @@ class _RefResolver:
self._remote_cache = remote_cache
@classmethod
- def from_schema(
+ def from_schema( # noqa: D417
cls,
schema,
id_of=referencing.jsonschema.DRAFT202012.id_of,
@@ -912,7 +911,6 @@ class _RefResolver:
`_RefResolver`
"""
-
return cls(base_uri=id_of(schema) or "", referrer=schema, *args, **kwargs) # noqa: B026, E501
def push_scope(self, scope):
@@ -992,7 +990,6 @@ class _RefResolver:
The reference to resolve
"""
-
url, resolved = self.resolve(ref)
self.push_scope(url)
try:
@@ -1003,7 +1000,7 @@ class _RefResolver:
def _find_in_referrer(self, key):
return self._get_subschemas_cache()[key]
- @lru_cache() # noqa: B019
+ @lru_cache # noqa: B019
def _get_subschemas_cache(self):
cache = {key: [] for key in _SUBSCHEMAS_KEYWORDS}
for keyword, subschema in _search_schema(
@@ -1012,7 +1009,7 @@ class _RefResolver:
cache[keyword].append(subschema)
return cache
- @lru_cache() # noqa: B019
+ @lru_cache # noqa: B019
def _find_in_subschemas(self, url):
subschemas = self._get_subschemas_cache()["$id"]
if not subschemas:
@@ -1073,7 +1070,6 @@ class _RefResolver:
a URI fragment to resolve within it
"""
-
fragment = fragment.lstrip("/")
if not fragment:
@@ -1196,7 +1192,7 @@ def _search_schema(schema, matcher):
values.extendleft(value.values())
-def validate(instance, schema, cls=None, *args, **kwargs):
+def validate(instance, schema, cls=None, *args, **kwargs): # noqa: D417
"""
Validate an instance under the given schema.
@@ -1323,7 +1319,6 @@ def validator_for(schema, default=_UNSET):
recommended.
"""
-
DefaultValidator = _LATEST_VERSION if default is _UNSET else default
if schema is True or schema is False or "$schema" not in schema:
diff --git a/pyproject.toml b/pyproject.toml
index f709c9f..859ff71 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -111,15 +111,46 @@ multi_line_output = 3
ignore_missing_imports = true
show_error_codes = true
-[tool.pydocstyle]
-match = "(?!(test_|_|compat|cli)).*\\.py" # see PyCQA/pydocstyle#323
-add-select = [
- "D410", # Trailing whitespace plz
-]
-add-ignore = [
- "D107", # Hah, no
- "D200", # 1-line docstrings don't need to be on one line
- "D202", # One line is fine.
- "D412", # Trailing whitespace plz
- "D413", # No trailing whitespace plz
+[tool.ruff]
+line-length = 79
+target-version = "py38"
+select = ["B", "D", "D204", "E", "F", "Q", "UP", "W"]
+ignore = [
+ # It's totally OK to call functions for default arguments.
+ "B008",
+ # raise SomeException(...) is fine.
+ "B904",
+ # It's fine to not have docstrings for magic methods.
+ "D105",
+ # __init__ especially doesn't need a docstring
+ "D107",
+ # This rule makes diffs uglier when expanding docstrings (and it's uglier)
+ "D200",
+ # No blank lines before docstrings.
+ "D203",
+ # Start docstrings on the second line.
+ "D212",
+ # This rule misses sassy docstrings ending with ! or ?.
+ "D400",
+ # Section headers should end with a colon not a newline
+ "D406",
+ # Underlines aren't needed
+ "D407",
+ # Plz spaces after section headers
+ "D412",
]
+extend-exclude = ["json"]
+
+[tool.ruff.flake8-quotes]
+docstring-quotes = "double"
+
+[tool.ruff.per-file-ignores]
+"docs/*" = ["D"]
+"jsonschema/cli.py" = ["D", "UP"]
+"jsonschema/_utils.py" = ["D"]
+"jsonschema/benchmarks/*" = ["D"]
+"jsonschema/tests/*" = ["D"]
+
+[tool.ruff.pyupgrade]
+# We support 3.8 + 3.9
+keep-runtime-typing = true
diff --git a/tox.ini b/tox.ini
index 83bf9c2..d13a7b9 100644
--- a/tox.ini
+++ b/tox.ini
@@ -76,15 +76,8 @@ deps = detect-secrets
commands = {envbindir}/detect-secrets scan {toxinidir}
[testenv:style]
-deps =
- flake8
- flake8-broken-line
- flake8-bugbear
- flake8-commas
- flake8-quotes
- flake8-tidy-imports
-commands =
- {envpython} -m flake8 {posargs} {toxinidir}/jsonschema {toxinidir}/docs
+deps = ruff
+commands = {envpython} -m ruff check {toxinidir}
[testenv:typing]
skip_install = true