Skip to content

Commit 5928d98

Browse files
committed
Python 3.10+ modernization
1 parent a0fbc59 commit 5928d98

File tree

7 files changed

+97
-87
lines changed

7 files changed

+97
-87
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
default_stages: [commit, push]
2+
default_stages: [pre-commit, pre-push]
33
default_language_version:
44
# force all unspecified python hooks to run python3
55
python: python3

openapi_schema_validator/_format.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
from base64 import b64decode
33
from base64 import b64encode
44
from numbers import Number
5-
from typing import Any
6-
from typing import Union
75

86
from jsonschema._format import FormatChecker
97

108

11-
def is_int32(instance: Any) -> bool:
9+
def is_int32(instance: object) -> bool:
1210
# bool inherits from int, so ensure bools aren't reported as ints
1311
if isinstance(instance, bool):
1412
return True
@@ -17,7 +15,7 @@ def is_int32(instance: Any) -> bool:
1715
return ~(1 << 31) < instance < 1 << 31
1816

1917

20-
def is_int64(instance: Any) -> bool:
18+
def is_int64(instance: object) -> bool:
2119
# bool inherits from int, so ensure bools aren't reported as ints
2220
if isinstance(instance, bool):
2321
return True
@@ -26,7 +24,7 @@ def is_int64(instance: Any) -> bool:
2624
return ~(1 << 63) < instance < 1 << 63
2725

2826

29-
def is_float(instance: Any) -> bool:
27+
def is_float(instance: object) -> bool:
3028
# bool inherits from int
3129
if isinstance(instance, int):
3230
return True
@@ -35,7 +33,7 @@ def is_float(instance: Any) -> bool:
3533
return isinstance(instance, float)
3634

3735

38-
def is_double(instance: Any) -> bool:
36+
def is_double(instance: object) -> bool:
3937
# bool inherits from int
4038
if isinstance(instance, int):
4139
return True
@@ -46,15 +44,15 @@ def is_double(instance: Any) -> bool:
4644
return isinstance(instance, float)
4745

4846

49-
def is_binary(instance: Any) -> bool:
47+
def is_binary(instance: object) -> bool:
5048
if not isinstance(instance, (str, bytes)):
5149
return True
5250
if isinstance(instance, str):
5351
return False
5452
return True
5553

5654

57-
def is_byte(instance: Union[str, bytes]) -> bool:
55+
def is_byte(instance: object) -> bool:
5856
if not isinstance(instance, (str, bytes)):
5957
return True
6058
if isinstance(instance, str):
@@ -64,7 +62,7 @@ def is_byte(instance: Union[str, bytes]) -> bool:
6462
return encoded == instance
6563

6664

67-
def is_password(instance: Any) -> bool:
65+
def is_password(instance: object) -> bool:
6866
# A hint to UIs to obscure input
6967
return True
7068

openapi_schema_validator/_keywords.py

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
1-
from copy import deepcopy
21
from typing import Any
3-
from typing import Dict
4-
from typing import Hashable
5-
from typing import ItemsView
62
from typing import Iterator
7-
from typing import List
83
from typing import Mapping
9-
from typing import Union
4+
from typing import cast
105

116
from jsonschema._keywords import allOf as _allOf
127
from jsonschema._keywords import anyOf as _anyOf
@@ -15,11 +10,10 @@
1510
from jsonschema._utils import find_additional_properties
1611
from jsonschema.exceptions import FormatError
1712
from jsonschema.exceptions import ValidationError
18-
from jsonschema.protocols import Validator
1913

2014

2115
def handle_discriminator(
22-
validator: Validator, _: Any, instance: Any, schema: Mapping[Hashable, Any]
16+
validator: Any, _: Any, instance: Any, schema: Mapping[str, Any]
2317
) -> Iterator[ValidationError]:
2418
"""
2519
Handle presence of discriminator in anyOf, oneOf and allOf.
@@ -45,16 +39,14 @@ def handle_discriminator(
4539
if not isinstance(ref, str):
4640
# this is a schema error
4741
yield ValidationError(
48-
"{!r} mapped value for {!r} should be a string, was {!r}".format(
49-
instance, prop_value, ref
50-
),
42+
f"{instance!r} mapped value for {prop_value!r} should be a string, was {ref!r}",
5143
context=[],
5244
)
5345
return
5446

5547
try:
5648
validator._validate_reference(ref=ref, instance=instance)
57-
except:
49+
except Exception:
5850
yield ValidationError(
5951
f"{instance!r} reference {ref!r} could not be resolved",
6052
context=[],
@@ -65,54 +57,63 @@ def handle_discriminator(
6557

6658

6759
def anyOf(
68-
validator: Validator,
69-
anyOf: List[Mapping[Hashable, Any]],
60+
validator: Any,
61+
anyOf: list[Mapping[str, Any]],
7062
instance: Any,
71-
schema: Mapping[Hashable, Any],
63+
schema: Mapping[str, Any],
7264
) -> Iterator[ValidationError]:
7365
if "discriminator" not in schema:
74-
yield from _anyOf(validator, anyOf, instance, schema)
66+
yield from cast(
67+
Iterator[ValidationError],
68+
_anyOf(validator, anyOf, instance, schema),
69+
)
7570
else:
7671
yield from handle_discriminator(validator, anyOf, instance, schema)
7772

7873

7974
def oneOf(
80-
validator: Validator,
81-
oneOf: List[Mapping[Hashable, Any]],
75+
validator: Any,
76+
oneOf: list[Mapping[str, Any]],
8277
instance: Any,
83-
schema: Mapping[Hashable, Any],
78+
schema: Mapping[str, Any],
8479
) -> Iterator[ValidationError]:
8580
if "discriminator" not in schema:
86-
yield from _oneOf(validator, oneOf, instance, schema)
81+
yield from cast(
82+
Iterator[ValidationError],
83+
_oneOf(validator, oneOf, instance, schema),
84+
)
8785
else:
8886
yield from handle_discriminator(validator, oneOf, instance, schema)
8987

9088

9189
def allOf(
92-
validator: Validator,
93-
allOf: List[Mapping[Hashable, Any]],
90+
validator: Any,
91+
allOf: list[Mapping[str, Any]],
9492
instance: Any,
95-
schema: Mapping[Hashable, Any],
93+
schema: Mapping[str, Any],
9694
) -> Iterator[ValidationError]:
9795
if "discriminator" not in schema:
98-
yield from _allOf(validator, allOf, instance, schema)
96+
yield from cast(
97+
Iterator[ValidationError],
98+
_allOf(validator, allOf, instance, schema),
99+
)
99100
else:
100101
yield from handle_discriminator(validator, allOf, instance, schema)
101102

102103

103104
def type(
104-
validator: Validator,
105+
validator: Any,
105106
data_type: str,
106107
instance: Any,
107-
schema: Mapping[Hashable, Any],
108+
schema: Mapping[str, Any],
108109
) -> Iterator[ValidationError]:
109110
if instance is None:
110111
# nullable implementation based on OAS 3.0.3
111112
# * nullable is only meaningful if its value is true
112113
# * nullable: true is only meaningful in combination with a type
113114
# assertion specified in the same Schema Object.
114115
# * nullable: true operates within a single Schema Object
115-
if "nullable" in schema and schema["nullable"] == True:
116+
if schema.get("nullable") is True:
116117
return
117118
yield ValidationError("None for not nullable")
118119

@@ -122,10 +123,10 @@ def type(
122123

123124

124125
def format(
125-
validator: Validator,
126+
validator: Any,
126127
format: str,
127128
instance: Any,
128-
schema: Mapping[Hashable, Any],
129+
schema: Mapping[str, Any],
129130
) -> Iterator[ValidationError]:
130131
if instance is None:
131132
return
@@ -138,10 +139,10 @@ def format(
138139

139140

140141
def items(
141-
validator: Validator,
142-
items: Mapping[Hashable, Any],
142+
validator: Any,
143+
items: Mapping[str, Any],
143144
instance: Any,
144-
schema: Mapping[Hashable, Any],
145+
schema: Mapping[str, Any],
145146
) -> Iterator[ValidationError]:
146147
if not validator.is_type(instance, "array"):
147148
return
@@ -151,10 +152,10 @@ def items(
151152

152153

153154
def required(
154-
validator: Validator,
155-
required: List[str],
155+
validator: Any,
156+
required: list[str],
156157
instance: Any,
157-
schema: Mapping[Hashable, Any],
158+
schema: Mapping[str, Any],
158159
) -> Iterator[ValidationError]:
159160
if not validator.is_type(instance, "object"):
160161
return
@@ -175,10 +176,10 @@ def required(
175176

176177

177178
def read_required(
178-
validator: Validator,
179-
required: List[str],
179+
validator: Any,
180+
required: list[str],
180181
instance: Any,
181-
schema: Mapping[Hashable, Any],
182+
schema: Mapping[str, Any],
182183
) -> Iterator[ValidationError]:
183184
if not validator.is_type(instance, "object"):
184185
return
@@ -193,10 +194,10 @@ def read_required(
193194

194195

195196
def write_required(
196-
validator: Validator,
197-
required: List[str],
197+
validator: Any,
198+
required: list[str],
198199
instance: Any,
199-
schema: Mapping[Hashable, Any],
200+
schema: Mapping[str, Any],
200201
) -> Iterator[ValidationError]:
201202
if not validator.is_type(instance, "object"):
202203
return
@@ -211,10 +212,10 @@ def write_required(
211212

212213

213214
def additionalProperties(
214-
validator: Validator,
215-
aP: Union[Mapping[Hashable, Any], bool],
215+
validator: Any,
216+
aP: Any,
216217
instance: Any,
217-
schema: Mapping[Hashable, Any],
218+
schema: Mapping[str, Any],
218219
) -> Iterator[ValidationError]:
219220
if not validator.is_type(instance, "object"):
220221
return
@@ -235,28 +236,27 @@ def additionalProperties(
235236

236237

237238
def write_readOnly(
238-
validator: Validator,
239+
validator: Any,
239240
ro: bool,
240241
instance: Any,
241-
schema: Mapping[Hashable, Any],
242+
schema: Mapping[str, Any],
242243
) -> Iterator[ValidationError]:
243244
yield ValidationError(f"Tried to write read-only property with {instance}")
244245

245246

246247
def read_writeOnly(
247-
validator: Validator,
248+
validator: Any,
248249
wo: bool,
249250
instance: Any,
250-
schema: Mapping[Hashable, Any],
251+
schema: Mapping[str, Any],
251252
) -> Iterator[ValidationError]:
252253
yield ValidationError(f"Tried to read write-only property with {instance}")
253254

254255

255256
def not_implemented(
256-
validator: Validator,
257+
validator: Any,
257258
value: Any,
258259
instance: Any,
259-
schema: Mapping[Hashable, Any],
260+
schema: Mapping[str, Any],
260261
) -> Iterator[ValidationError]:
261-
return
262-
yield
262+
yield from ()

openapi_schema_validator/_types.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import Any
2+
from typing import cast
23

34
from jsonschema._types import TypeChecker
45
from jsonschema._types import draft202012_type_checker
@@ -9,18 +10,21 @@
910
from jsonschema._types import is_object
1011

1112

12-
def is_string(checker: TypeChecker, instance: Any) -> bool:
13+
def is_string(checker: Any, instance: Any) -> bool:
1314
return isinstance(instance, (str, bytes))
1415

1516

1617
oas30_type_checker = TypeChecker(
17-
{
18-
"string": is_string,
19-
"number": is_number,
20-
"integer": is_integer,
21-
"boolean": is_bool,
22-
"array": is_array,
23-
"object": is_object,
24-
},
18+
cast(
19+
Any,
20+
{
21+
"string": is_string,
22+
"number": is_number,
23+
"integer": is_integer,
24+
"boolean": is_bool,
25+
"array": is_array,
26+
"object": is_object,
27+
},
28+
),
2529
)
2630
oas31_type_checker = draft202012_type_checker
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from typing import Any
2-
from typing import Hashable
32
from typing import Mapping
4-
from typing import Type
3+
from typing import cast
54

65
from jsonschema.exceptions import best_match
76
from jsonschema.protocols import Validator
@@ -11,13 +10,16 @@
1110

1211
def validate(
1312
instance: Any,
14-
schema: Mapping[Hashable, Any],
15-
cls: Type[Validator] = OAS31Validator,
13+
schema: Mapping[str, Any],
14+
cls: type[Validator] = OAS31Validator,
1615
*args: Any,
1716
**kwargs: Any
1817
) -> None:
19-
cls.check_schema(schema)
20-
validator = cls(schema, *args, **kwargs)
21-
error = best_match(validator.evolve(schema=schema).iter_errors(instance))
18+
schema_dict = cast(dict[str, Any], schema)
19+
cls.check_schema(schema_dict)
20+
validator = cls(schema_dict, *args, **kwargs)
21+
error = best_match(
22+
validator.evolve(schema=schema_dict).iter_errors(instance)
23+
)
2224
if error is not None:
2325
raise error

0 commit comments

Comments
 (0)