Skip to content

Commit 9a4043d

Browse files
committed
More type sprinkling in the suite loader.
Some minor renaming to go with it.
1 parent e5a6686 commit 9a4043d

File tree

2 files changed

+73
-87
lines changed

2 files changed

+73
-87
lines changed

jsonschema/tests/_suite.py

Lines changed: 37 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"""
44
from __future__ import annotations
55

6-
from collections.abc import Mapping
6+
from collections.abc import Iterable, Mapping
77
from functools import partial
88
from pathlib import Path
9-
from typing import Any
9+
from typing import TYPE_CHECKING, Any
1010
import json
1111
import os
1212
import re
@@ -16,6 +16,9 @@
1616

1717
from attrs import field, frozen
1818

19+
if TYPE_CHECKING:
20+
import pyperf
21+
1922
from jsonschema.validators import _VALIDATORS
2023
import jsonschema
2124

@@ -41,23 +44,23 @@ def _find_suite():
4144
@frozen
4245
class Suite:
4346

44-
_root = field(factory=_find_suite)
47+
_root: Path = field(factory=_find_suite)
4548

46-
def _remotes(self):
49+
def _remotes(self) -> Mapping[str, Mapping[str, Any] | bool]:
4750
jsonschema_suite = self._root.joinpath("bin", "jsonschema_suite")
4851
remotes = subprocess.check_output(
4952
[sys.executable, str(jsonschema_suite), "remotes"],
5053
)
5154
return json.loads(remotes.decode("utf-8"))
5255

53-
def benchmark(self, runner): # pragma: no cover
56+
def benchmark(self, runner: pyperf.Runner): # pragma: no cover
5457
for name, Validator in _VALIDATORS.items():
5558
self.version(name=name).benchmark(
5659
runner=runner,
5760
Validator=Validator,
5861
)
5962

60-
def version(self, name):
63+
def version(self, name) -> Version:
6164
return Version(
6265
name=name,
6366
path=self._root.joinpath("tests", name),
@@ -73,48 +76,30 @@ class Version:
7376

7477
name: str
7578

76-
def benchmark(self, runner, **kwargs): # pragma: no cover
77-
for suite in self.tests():
78-
for test in suite:
79+
def benchmark(self, runner: pyperf.Runner, **kwargs): # pragma: no cover
80+
for case in self.cases():
81+
for test in case:
7982
runner.bench_func(
8083
test.fully_qualified_name,
8184
partial(test.validate_ignoring_errors, **kwargs),
8285
)
8386

84-
def tests(self):
85-
return (
86-
test
87-
for child in self._path.glob("*.json")
88-
for test in self._tests_in(
89-
subject=child.name[:-5],
90-
path=child,
91-
)
92-
)
87+
def cases(self) -> Iterable[Iterable[_Test]]:
88+
return self._cases_in(paths=self._path.glob("*.json"))
9389

94-
def format_tests(self):
95-
path = self._path.joinpath("optional", "format")
96-
return (
97-
test
98-
for child in path.glob("*.json")
99-
for test in self._tests_in(
100-
subject=child.name[:-5],
101-
path=child,
102-
)
103-
)
90+
def format_cases(self) -> Iterable[Iterable[_Test]]:
91+
return self._cases_in(paths=self._path.glob("optional/format/*.json"))
10492

105-
def optional_tests_of(self, name):
106-
return self._tests_in(
107-
subject=name,
108-
path=self._path.joinpath("optional", name + ".json"),
109-
)
93+
def optional_cases_of(self, name: str) -> Iterable[Iterable[_Test]]:
94+
return self._cases_in(paths=[self._path / "optional" / f"{name}.json"])
11095

111-
def to_unittest_testcase(self, *suites, **kwargs):
96+
def to_unittest_testcase(self, *groups, **kwargs):
11297
name = kwargs.pop("name", "Test" + self.name.title().replace("-", ""))
11398
methods = {
11499
test.method_name: test.to_unittest_method(**kwargs)
115-
for suite in suites
116-
for tests in suite
117-
for test in tests
100+
for group in groups
101+
for case in group
102+
for test in case
118103
}
119104
cls = type(name, (unittest.TestCase,), methods)
120105

@@ -128,18 +113,19 @@ def to_unittest_testcase(self, *suites, **kwargs):
128113

129114
return cls
130115

131-
def _tests_in(self, subject, path):
132-
for each in json.loads(path.read_text(encoding="utf-8")):
133-
yield (
134-
_Test(
135-
version=self,
136-
subject=subject,
137-
case_description=each["description"],
138-
schema=each["schema"],
139-
remotes=self._remotes,
140-
**test,
141-
) for test in each["tests"]
142-
)
116+
def _cases_in(self, paths: Iterable[Path]) -> Iterable[Iterable[_Test]]:
117+
for path in paths:
118+
for case in json.loads(path.read_text(encoding="utf-8")):
119+
yield (
120+
_Test(
121+
version=self,
122+
subject=path.stem,
123+
case_description=case["description"],
124+
schema=case["schema"],
125+
remotes=self._remotes,
126+
**test,
127+
) for test in case["tests"]
128+
)
143129

144130

145131
@frozen(repr=False)
@@ -152,11 +138,11 @@ class _Test:
152138
description: str
153139

154140
data: Any
155-
schema: dict[str, Any] | bool
141+
schema: Mapping[str, Any] | bool
156142

157143
valid: bool
158144

159-
_remotes: dict[str, dict[str, Any] | bool]
145+
_remotes: Mapping[str, Mapping[str, Any] | bool]
160146

161147
comment: str | None = None
162148

jsonschema/tests/test_jsonschema_test_suite.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ def leap_second(test):
144144

145145

146146
TestDraft3 = DRAFT3.to_unittest_testcase(
147-
DRAFT3.tests(),
148-
DRAFT3.format_tests(),
149-
DRAFT3.optional_tests_of(name="bignum"),
150-
DRAFT3.optional_tests_of(name="non-bmp-regex"),
151-
DRAFT3.optional_tests_of(name="zeroTerminatedFloats"),
147+
DRAFT3.cases(),
148+
DRAFT3.format_cases(),
149+
DRAFT3.optional_cases_of(name="bignum"),
150+
DRAFT3.optional_cases_of(name="non-bmp-regex"),
151+
DRAFT3.optional_cases_of(name="zeroTerminatedFloats"),
152152
Validator=jsonschema.Draft3Validator,
153153
format_checker=jsonschema.Draft3Validator.FORMAT_CHECKER,
154154
skip=lambda test: (
@@ -168,12 +168,12 @@ def leap_second(test):
168168

169169

170170
TestDraft4 = DRAFT4.to_unittest_testcase(
171-
DRAFT4.tests(),
172-
DRAFT4.format_tests(),
173-
DRAFT4.optional_tests_of(name="bignum"),
174-
DRAFT4.optional_tests_of(name="float-overflow"),
175-
DRAFT4.optional_tests_of(name="non-bmp-regex"),
176-
DRAFT4.optional_tests_of(name="zeroTerminatedFloats"),
171+
DRAFT4.cases(),
172+
DRAFT4.format_cases(),
173+
DRAFT4.optional_cases_of(name="bignum"),
174+
DRAFT4.optional_cases_of(name="float-overflow"),
175+
DRAFT4.optional_cases_of(name="non-bmp-regex"),
176+
DRAFT4.optional_cases_of(name="zeroTerminatedFloats"),
177177
Validator=jsonschema.Draft4Validator,
178178
format_checker=jsonschema.Draft4Validator.FORMAT_CHECKER,
179179
skip=lambda test: (
@@ -230,11 +230,11 @@ def leap_second(test):
230230

231231

232232
TestDraft6 = DRAFT6.to_unittest_testcase(
233-
DRAFT6.tests(),
234-
DRAFT6.format_tests(),
235-
DRAFT6.optional_tests_of(name="bignum"),
236-
DRAFT6.optional_tests_of(name="float-overflow"),
237-
DRAFT6.optional_tests_of(name="non-bmp-regex"),
233+
DRAFT6.cases(),
234+
DRAFT6.format_cases(),
235+
DRAFT6.optional_cases_of(name="bignum"),
236+
DRAFT6.optional_cases_of(name="float-overflow"),
237+
DRAFT6.optional_cases_of(name="non-bmp-regex"),
238238
Validator=jsonschema.Draft6Validator,
239239
format_checker=jsonschema.Draft6Validator.FORMAT_CHECKER,
240240
skip=lambda test: (
@@ -253,12 +253,12 @@ def leap_second(test):
253253

254254

255255
TestDraft7 = DRAFT7.to_unittest_testcase(
256-
DRAFT7.tests(),
257-
DRAFT7.format_tests(),
258-
DRAFT7.optional_tests_of(name="bignum"),
259-
DRAFT7.optional_tests_of(name="cross-draft"),
260-
DRAFT7.optional_tests_of(name="float-overflow"),
261-
DRAFT7.optional_tests_of(name="non-bmp-regex"),
256+
DRAFT7.cases(),
257+
DRAFT7.format_cases(),
258+
DRAFT7.optional_cases_of(name="bignum"),
259+
DRAFT7.optional_cases_of(name="cross-draft"),
260+
DRAFT7.optional_cases_of(name="float-overflow"),
261+
DRAFT7.optional_cases_of(name="non-bmp-regex"),
262262
Validator=jsonschema.Draft7Validator,
263263
format_checker=jsonschema.Draft7Validator.FORMAT_CHECKER,
264264
skip=lambda test: (
@@ -285,12 +285,12 @@ def leap_second(test):
285285

286286

287287
TestDraft201909 = DRAFT201909.to_unittest_testcase(
288-
DRAFT201909.tests(),
289-
DRAFT201909.optional_tests_of(name="bignum"),
290-
DRAFT201909.optional_tests_of(name="cross-draft"),
291-
DRAFT201909.optional_tests_of(name="float-overflow"),
292-
DRAFT201909.optional_tests_of(name="non-bmp-regex"),
293-
DRAFT201909.optional_tests_of(name="refOfUnknownKeyword"),
288+
DRAFT201909.cases(),
289+
DRAFT201909.optional_cases_of(name="bignum"),
290+
DRAFT201909.optional_cases_of(name="cross-draft"),
291+
DRAFT201909.optional_cases_of(name="float-overflow"),
292+
DRAFT201909.optional_cases_of(name="non-bmp-regex"),
293+
DRAFT201909.optional_cases_of(name="refOfUnknownKeyword"),
294294
Validator=jsonschema.Draft201909Validator,
295295
skip=lambda test: (
296296
skip(
@@ -406,7 +406,7 @@ def leap_second(test):
406406

407407

408408
TestDraft201909Format = DRAFT201909.to_unittest_testcase(
409-
DRAFT201909.format_tests(),
409+
DRAFT201909.format_cases(),
410410
name="TestDraft201909Format",
411411
Validator=jsonschema.Draft201909Validator,
412412
format_checker=jsonschema.Draft201909Validator.FORMAT_CHECKER,
@@ -421,12 +421,12 @@ def leap_second(test):
421421

422422

423423
TestDraft202012 = DRAFT202012.to_unittest_testcase(
424-
DRAFT202012.tests(),
425-
DRAFT202012.optional_tests_of(name="bignum"),
426-
DRAFT202012.optional_tests_of(name="cross-draft"),
427-
DRAFT202012.optional_tests_of(name="float-overflow"),
428-
DRAFT202012.optional_tests_of(name="non-bmp-regex"),
429-
DRAFT202012.optional_tests_of(name="refOfUnknownKeyword"),
424+
DRAFT202012.cases(),
425+
DRAFT202012.optional_cases_of(name="bignum"),
426+
DRAFT202012.optional_cases_of(name="cross-draft"),
427+
DRAFT202012.optional_cases_of(name="float-overflow"),
428+
DRAFT202012.optional_cases_of(name="non-bmp-regex"),
429+
DRAFT202012.optional_cases_of(name="refOfUnknownKeyword"),
430430
Validator=jsonschema.Draft202012Validator,
431431
skip=lambda test: (
432432
narrow_unicode_build(test)
@@ -532,7 +532,7 @@ def leap_second(test):
532532

533533

534534
TestDraft202012Format = DRAFT202012.to_unittest_testcase(
535-
DRAFT202012.format_tests(),
535+
DRAFT202012.format_cases(),
536536
name="TestDraft202012Format",
537537
Validator=jsonschema.Draft202012Validator,
538538
format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER,

0 commit comments

Comments
 (0)