Skip to content

Commit a9e9f27

Browse files
authored
Merge pull request #294 from python-openapi/feature/validate-and-validate-url-shortcuts
validate and validate_url shortcuts
2 parents 5f24987 + 8564cc6 commit a9e9f27

File tree

8 files changed

+77
-38
lines changed

8 files changed

+77
-38
lines changed

README.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,15 @@ Python package
9898

9999
.. code:: python
100100
101-
from openapi_spec_validator import validate_spec
101+
from openapi_spec_validator import validate
102102
from openapi_spec_validator.readers import read_from_filename
103103
104104
spec_dict, base_uri = read_from_filename('openapi.yaml')
105105
106-
# If no exception is raised by validate_spec(), the spec is valid.
107-
validate_spec(spec_dict)
106+
# If no exception is raised by validate(), the spec is valid.
107+
validate(spec_dict)
108108
109-
validate_spec({'openapi': '3.1.0'})
109+
validate({'openapi': '3.1.0'})
110110
111111
Traceback (most recent call last):
112112
...

docs/python.rst

+10-10
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ By default, OpenAPI spec version is detected. To validate spec:
55

66
.. code:: python
77
8-
from openapi_spec_validator import validate_spec
8+
from openapi_spec_validator import validate
99
from openapi_spec_validator.readers import read_from_filename
1010
1111
spec_dict, base_uri = read_from_filename('openapi.yaml')
1212
13-
# If no exception is raised by validate_spec(), the spec is valid.
14-
validate_spec(spec_dict)
13+
# If no exception is raised by validate(), the spec is valid.
14+
validate(spec_dict)
1515
16-
validate_spec({'openapi': '3.1.0'})
16+
validate({'openapi': '3.1.0'})
1717
1818
Traceback (most recent call last):
1919
...
@@ -23,28 +23,28 @@ Add ``base_uri`` to validate spec with relative files:
2323

2424
.. code:: python
2525
26-
validate_spec(spec_dict, base_uri='file:///path/to/spec/openapi.yaml')
26+
validate(spec_dict, base_uri='file:///path/to/spec/openapi.yaml')
2727
2828
You can also validate spec from url:
2929

3030
.. code:: python
3131
32-
from openapi_spec_validator import validate_spec_url
32+
from openapi_spec_validator import validate_url
3333
34-
# If no exception is raised by validate_spec_url(), the spec is valid.
35-
validate_spec_url('http://example.com/openapi.json')
34+
# If no exception is raised by validate_url(), the spec is valid.
35+
validate_url('http://example.com/openapi.json')
3636
3737
In order to explicitly validate a:
3838

3939
* Swagger / OpenAPI 2.0 spec, import ``OpenAPIV2SpecValidator``
4040
* OpenAPI 3.0 spec, import ``OpenAPIV30SpecValidator``
4141
* OpenAPI 3.1 spec, import ``OpenAPIV31SpecValidator``
4242

43-
and pass the validator class to ``validate_spec`` or ``validate_spec_url`` function:
43+
and pass the validator class to ``validate`` or ``validate_url`` function:
4444

4545
.. code:: python
4646
47-
validate_spec(spec_dict, cls=OpenAPIV31SpecValidator)
47+
validate(spec_dict, cls=OpenAPIV31SpecValidator)
4848
4949
You can also explicitly import ``OpenAPIV3SpecValidator`` which is a shortcut to the latest v3 release.
5050

openapi_spec_validator/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""OpenAPI spec validator module."""
2+
from openapi_spec_validator.shortcuts import validate
23
from openapi_spec_validator.shortcuts import validate_spec
34
from openapi_spec_validator.shortcuts import validate_spec_url
5+
from openapi_spec_validator.shortcuts import validate_url
46
from openapi_spec_validator.validation import OpenAPIV2SpecValidator
57
from openapi_spec_validator.validation import OpenAPIV3SpecValidator
68
from openapi_spec_validator.validation import OpenAPIV30SpecValidator
@@ -25,6 +27,8 @@
2527
"OpenAPIV3SpecValidator",
2628
"OpenAPIV30SpecValidator",
2729
"OpenAPIV31SpecValidator",
30+
"validate",
31+
"validate_url",
2832
"validate_spec",
2933
"validate_spec_url",
3034
]

openapi_spec_validator/__main__.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from openapi_spec_validator.readers import read_from_filename
1111
from openapi_spec_validator.readers import read_from_stdin
12-
from openapi_spec_validator.shortcuts import get_validator_cls
12+
from openapi_spec_validator.shortcuts import validate
1313
from openapi_spec_validator.validation import OpenAPIV2SpecValidator
1414
from openapi_spec_validator.validation import OpenAPIV30SpecValidator
1515
from openapi_spec_validator.validation import OpenAPIV31SpecValidator
@@ -91,22 +91,19 @@ def main(args: Optional[Sequence[str]] = None) -> None:
9191

9292
# choose the validator
9393
validators = {
94+
"detect": None,
9495
"2.0": OpenAPIV2SpecValidator,
9596
"3.0": OpenAPIV30SpecValidator,
9697
"3.1": OpenAPIV31SpecValidator,
9798
# backward compatibility
9899
"3.0.0": OpenAPIV30SpecValidator,
99100
"3.1.0": OpenAPIV31SpecValidator,
100101
}
101-
if args_parsed.schema == "detect":
102-
validator_cls = get_validator_cls(spec)
103-
else:
104-
validator_cls = validators[args_parsed.schema]
102+
validator_cls = validators[args_parsed.schema]
105103

106-
validator = validator_cls(spec, base_uri=base_uri)
107104
# validate
108105
try:
109-
validator.validate()
106+
validate(spec, base_uri=base_uri, cls=validator_cls)
110107
except ValidationError as exc:
111108
print_validationerror(filename, exc, args_parsed.errors)
112109
sys.exit(1)

openapi_spec_validator/shortcuts.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import Optional
55
from typing import Type
66

7+
from jsonschema_path import SchemaPath
78
from jsonschema_path.handlers import all_urls_handler
89
from jsonschema_path.typing import Schema
910

@@ -35,13 +36,37 @@ def get_validator_cls(spec: Schema) -> SpecValidatorType:
3536
return SPEC2VALIDATOR[spec_version]
3637

3738

39+
def validate(
40+
spec: Schema,
41+
base_uri: str = "",
42+
cls: Optional[SpecValidatorType] = None,
43+
) -> None:
44+
if cls is None:
45+
cls = get_validator_cls(spec)
46+
sp = SchemaPath.from_dict(spec, base_uri=base_uri)
47+
v = cls(sp)
48+
return v.validate()
49+
50+
51+
def validate_url(
52+
spec_url: str,
53+
cls: Optional[Type[SpecValidator]] = None,
54+
) -> None:
55+
spec = all_urls_handler(spec_url)
56+
return validate(spec, base_uri=spec_url, cls=cls)
57+
58+
3859
def validate_spec(
3960
spec: Schema,
4061
base_uri: str = "",
4162
validator: Optional[SupportsValidation] = None,
4263
cls: Optional[SpecValidatorType] = None,
4364
spec_url: Optional[str] = None,
4465
) -> None:
66+
warnings.warn(
67+
"validate_spec shortcut is deprecated. Use validate instead.",
68+
DeprecationWarning,
69+
)
4570
if validator is not None:
4671
warnings.warn(
4772
"validator parameter is deprecated. Use cls instead.",
@@ -59,5 +84,15 @@ def validate_spec_url(
5984
validator: Optional[SupportsValidation] = None,
6085
cls: Optional[Type[SpecValidator]] = None,
6186
) -> None:
62-
spec = all_urls_handler(spec_url)
63-
return validate_spec(spec, base_uri=spec_url, validator=validator, cls=cls)
87+
warnings.warn(
88+
"validate_spec_url shortcut is deprecated. Use validate_url instead.",
89+
DeprecationWarning,
90+
)
91+
if validator is not None:
92+
warnings.warn(
93+
"validator parameter is deprecated. Use cls instead.",
94+
DeprecationWarning,
95+
)
96+
spec = all_urls_handler(spec_url)
97+
return validator.validate(spec, base_uri=spec_url)
98+
return validate_url(spec_url, cls=cls)

openapi_spec_validator/validation/validators.py

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from jsonschema.protocols import Validator
1414
from jsonschema_path.handlers import default_handlers
1515
from jsonschema_path.paths import SchemaPath
16-
from jsonschema_path.typing import Schema
1716

1817
from openapi_spec_validator.schemas import openapi_v2_schema_validator
1918
from openapi_spec_validator.schemas import openapi_v30_schema_validator

tests/integration/test_shortcuts.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
from openapi_spec_validator import OpenAPIV30SpecValidator
55
from openapi_spec_validator import openapi_v2_spec_validator
66
from openapi_spec_validator import openapi_v30_spec_validator
7+
from openapi_spec_validator import validate
78
from openapi_spec_validator import validate_spec
89
from openapi_spec_validator import validate_spec_url
10+
from openapi_spec_validator import validate_url
911
from openapi_spec_validator.validation.exceptions import OpenAPIValidationError
1012
from openapi_spec_validator.validation.exceptions import ValidatorDetectError
1113

@@ -15,7 +17,7 @@ def test_spec_schema_version_not_detected(self):
1517
spec = {}
1618

1719
with pytest.raises(ValidatorDetectError):
18-
validate_spec(spec)
20+
validate(spec)
1921

2022

2123
class TestLocalValidateSpecUrl:
@@ -24,7 +26,7 @@ def test_spec_schema_version_not_detected(self, factory):
2426
spec_url = factory.spec_file_url(spec_path)
2527

2628
with pytest.raises(ValidatorDetectError):
27-
validate_spec_url(spec_url)
29+
validate_url(spec_url)
2830

2931

3032
class TestLiocalValidatev2Spec:
@@ -43,8 +45,8 @@ def test_valid(self, factory, spec_file):
4345
spec_path = self.local_test_suite_file_path(spec_file)
4446
spec = factory.spec_from_file(spec_path)
4547

46-
validate_spec(spec)
47-
validate_spec(spec, cls=OpenAPIV2SpecValidator)
48+
validate(spec)
49+
validate(spec, cls=OpenAPIV2SpecValidator)
4850
with pytest.warns(DeprecationWarning):
4951
validate_spec(spec, validator=openapi_v2_spec_validator)
5052

@@ -59,7 +61,7 @@ def test_falied(self, factory, spec_file):
5961
spec = factory.spec_from_file(spec_path)
6062

6163
with pytest.raises(OpenAPIValidationError):
62-
validate_spec(spec, cls=OpenAPIV2SpecValidator)
64+
validate(spec, cls=OpenAPIV2SpecValidator)
6365
with pytest.warns(DeprecationWarning):
6466
with pytest.raises(OpenAPIValidationError):
6567
validate_spec(spec, validator=openapi_v2_spec_validator)
@@ -82,9 +84,10 @@ def test_valid(self, factory, spec_file):
8284
spec = factory.spec_from_file(spec_path)
8385
spec_url = factory.spec_file_url(spec_path)
8486

85-
validate_spec(spec)
86-
validate_spec(spec, spec_url=spec_url)
87-
validate_spec(spec, cls=OpenAPIV30SpecValidator)
87+
validate(spec)
88+
with pytest.warns(DeprecationWarning):
89+
validate_spec(spec, spec_url=spec_url)
90+
validate(spec, cls=OpenAPIV30SpecValidator)
8891
with pytest.warns(DeprecationWarning):
8992
validate_spec(spec, validator=openapi_v30_spec_validator)
9093

@@ -99,7 +102,7 @@ def test_falied(self, factory, spec_file):
99102
spec = factory.spec_from_file(spec_path)
100103

101104
with pytest.raises(OpenAPIValidationError):
102-
validate_spec(spec, cls=OpenAPIV30SpecValidator)
105+
validate(spec, cls=OpenAPIV30SpecValidator)
103106
with pytest.warns(DeprecationWarning):
104107
with pytest.raises(OpenAPIValidationError):
105108
validate_spec(spec, validator=openapi_v30_spec_validator)
@@ -128,9 +131,10 @@ def remote_test_suite_file_path(self, test_file):
128131
def test_valid(self, spec_file):
129132
spec_url = self.remote_test_suite_file_path(spec_file)
130133

131-
validate_spec_url(spec_url)
132-
validate_spec_url(spec_url, cls=OpenAPIV2SpecValidator)
134+
validate_url(spec_url)
135+
validate_url(spec_url, cls=OpenAPIV2SpecValidator)
133136
with pytest.warns(DeprecationWarning):
137+
validate_spec_url(spec_url)
134138
validate_spec_url(spec_url, validator=openapi_v2_spec_validator)
135139

136140

@@ -157,7 +161,7 @@ def remote_test_suite_file_path(self, test_file):
157161
def test_valid(self, spec_file):
158162
spec_url = self.remote_test_suite_file_path(spec_file)
159163

160-
validate_spec_url(spec_url)
161-
validate_spec_url(spec_url, cls=OpenAPIV30SpecValidator)
164+
validate_url(spec_url)
165+
validate_url(spec_url, cls=OpenAPIV30SpecValidator)
162166
with pytest.warns(DeprecationWarning):
163167
validate_spec_url(spec_url, validator=openapi_v30_spec_validator)

tests/integration/validation/test_validators.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
2+
from jsonschema_path import SchemaPath
23
from referencing.exceptions import Unresolvable
34

4-
from jsonschema_path import SchemaPath
55
from openapi_spec_validator import OpenAPIV2SpecValidator
66
from openapi_spec_validator import OpenAPIV30SpecValidator
77
from openapi_spec_validator import OpenAPIV31SpecValidator

0 commit comments

Comments
 (0)