Skip to content

Commit

Permalink
Mypy static type check
Browse files Browse the repository at this point in the history
  • Loading branch information
p1c2u committed Sep 1, 2022
1 parent 6d78075 commit 48bf5e3
Show file tree
Hide file tree
Showing 19 changed files with 668 additions and 450 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/python-test.yml
Expand Up @@ -57,5 +57,8 @@ jobs:
PYTEST_ADDOPTS: "--color=yes"
run: poetry run pytest

- name: Static type check
run: poetry run mypy

- name: Upload coverage
uses: codecov/codecov-action@v1
1 change: 1 addition & 0 deletions MANIFEST.in
@@ -1,5 +1,6 @@
include README.md
include requirements.txt
include requirements_dev.txt
include openapi_spec_validator/py.typed
include openapi_spec_validator/resources/schemas/*/*
include LICENSE
56 changes: 27 additions & 29 deletions openapi_spec_validator/__init__.py
@@ -1,62 +1,60 @@
# -*- coding: utf-8 -*-
from jsonschema_spec.handlers import default_handlers

from openapi_spec_validator.shortcuts import validate_spec_detect_factory
from openapi_spec_validator.shortcuts import validate_spec_url_detect_factory
from openapi_spec_validator.shortcuts import validate_spec_factory
from openapi_spec_validator.shortcuts import validate_spec_url_detect_factory
from openapi_spec_validator.shortcuts import validate_spec_url_factory
from openapi_spec_validator.validation import openapi_v2_spec_validator
from openapi_spec_validator.validation import openapi_v3_spec_validator
from openapi_spec_validator.validation import openapi_v30_spec_validator
from openapi_spec_validator.validation import openapi_v31_spec_validator

__author__ = 'Artur Maciag'
__email__ = 'maciag.artur@gmail.com'
__version__ = '0.5.0a3'
__url__ = 'https://github.com/p1c2u/openapi-spec-validator'
__license__ = 'Apache License, Version 2.0'
__author__ = "Artur Maciag"
__email__ = "maciag.artur@gmail.com"
__version__ = "0.5.0a3"
__url__ = "https://github.com/p1c2u/openapi-spec-validator"
__license__ = "Apache License, Version 2.0"

__all__ = [
'openapi_v2_spec_validator',
'openapi_v3_spec_validator',
'openapi_v30_spec_validator',
'openapi_v31_spec_validator',
'validate_v2_spec',
'validate_v3_spec',
'validate_v30_spec',
'validate_v31_spec',
'validate_spec',
'validate_v2_spec_url',
'validate_v3_spec_url',
'validate_v30_spec_url',
'validate_v31_spec_url',
'validate_spec_url',
"openapi_v2_spec_validator",
"openapi_v3_spec_validator",
"openapi_v30_spec_validator",
"openapi_v31_spec_validator",
"validate_v2_spec",
"validate_v3_spec",
"validate_v30_spec",
"validate_v31_spec",
"validate_spec",
"validate_v2_spec_url",
"validate_v3_spec_url",
"validate_v30_spec_url",
"validate_v31_spec_url",
"validate_spec_url",
]

# shortcuts
validate_spec = validate_spec_detect_factory({
validate_spec = validate_spec_detect_factory(
{
("swagger", "2.0"): openapi_v2_spec_validator,
("openapi", "3.0"): openapi_v30_spec_validator,
("openapi", "3.1"): openapi_v31_spec_validator,
},
)
validate_spec_url = validate_spec_url_detect_factory({
validate_spec_url = validate_spec_url_detect_factory(
{
("swagger", "2.0"): openapi_v2_spec_validator,
("openapi", "3.0"): openapi_v30_spec_validator,
("openapi", "3.1"): openapi_v31_spec_validator,
},
)
validate_v2_spec = validate_spec_factory(openapi_v2_spec_validator)
validate_v2_spec_url = validate_spec_url_factory(
openapi_v2_spec_validator)
validate_v2_spec_url = validate_spec_url_factory(openapi_v2_spec_validator)

validate_v30_spec = validate_spec_factory(openapi_v30_spec_validator)
validate_v30_spec_url = validate_spec_url_factory(
openapi_v30_spec_validator)
validate_v30_spec_url = validate_spec_url_factory(openapi_v30_spec_validator)

validate_v31_spec = validate_spec_factory(openapi_v31_spec_validator)
validate_v31_spec_url = validate_spec_url_factory(
openapi_v31_spec_validator)
validate_v31_spec_url = validate_spec_url_factory(openapi_v31_spec_validator)

# aliases to the latest v3 version
validate_v3_spec = validate_v31_spec
Expand Down
39 changes: 19 additions & 20 deletions openapi_spec_validator/__main__.py
@@ -1,21 +1,20 @@
import logging
import argparse
import logging
import sys

from jsonschema.exceptions import best_match

from openapi_spec_validator import (
openapi_v2_spec_validator,
openapi_v30_spec_validator,
openapi_v31_spec_validator,
)
from openapi_spec_validator import openapi_v2_spec_validator
from openapi_spec_validator import openapi_v30_spec_validator
from openapi_spec_validator import openapi_v31_spec_validator
from openapi_spec_validator.readers import read_from_filename
from openapi_spec_validator.readers import read_from_stdin
from openapi_spec_validator.validation.exceptions import ValidationError
from openapi_spec_validator.readers import read_from_stdin, read_from_filename

logger = logging.getLogger(__name__)
logging.basicConfig(
format='%(asctime)s %(levelname)s %(name)s %(message)s',
level=logging.WARNING
format="%(asctime)s %(levelname)s %(name)s %(message)s",
level=logging.WARNING,
)


Expand All @@ -35,14 +34,14 @@ def print_validationerror(exc, errors="best-match"):
print("## " + str(best_match(exc.context)))
if len(exc.context) > 1:
print(
"\n({} more subschemas errors,".format(len(exc.context) - 1),
f"\n({len(exc.context) - 1} more subschemas errors,",
"use --errors=all to see them.)",
)


def main(args=None):
parser = argparse.ArgumentParser()
parser.add_argument('filename', help="Absolute or relative path to file")
parser.add_argument("filename", help="Absolute or relative path to file")
parser.add_argument(
"--errors",
choices=("best-match", "all"),
Expand All @@ -51,17 +50,17 @@ def main(args=None):
"""use "all" to get all subschema errors.""",
)
parser.add_argument(
'--schema',
"--schema",
help="OpenAPI schema (default: 3.1.0)",
type=str,
choices=['2.0', '3.0.0', '3.1.0'],
default='3.1.0'
choices=["2.0", "3.0.0", "3.1.0"],
default="3.1.0",
)
args = parser.parse_args(args)

# choose source
reader = read_from_filename
if args.filename in ['-', '/-']:
if args.filename in ["-", "/-"]:
reader = read_from_stdin

# read source
Expand All @@ -73,9 +72,9 @@ def main(args=None):

# choose the validator
validators = {
'2.0': openapi_v2_spec_validator,
'3.0.0': openapi_v30_spec_validator,
'3.1.0': openapi_v31_spec_validator,
"2.0": openapi_v2_spec_validator,
"3.0.0": openapi_v30_spec_validator,
"3.1.0": openapi_v31_spec_validator,
}
validator = validators[args.schema]

Expand All @@ -89,8 +88,8 @@ def main(args=None):
print(exc)
sys.exit(2)
else:
print('OK')
print("OK")


if __name__ == '__main__':
if __name__ == "__main__":
main()
Empty file added openapi_spec_validator/py.typed
Empty file.
7 changes: 4 additions & 3 deletions openapi_spec_validator/readers.py
Expand Up @@ -2,16 +2,17 @@
import pathlib
import sys

from jsonschema_spec.handlers import file_handler, all_urls_handler
from jsonschema_spec.handlers import all_urls_handler
from jsonschema_spec.handlers import file_handler


def read_from_stdin(filename):
return file_handler(sys.stdin), ''
return file_handler(sys.stdin), ""


def read_from_filename(filename):
if not os.path.isfile(filename):
raise IOError("No such file: {0}".format(filename))
raise OSError(f"No such file: {filename}")

filename = os.path.abspath(filename)
uri = pathlib.Path(filename).as_uri()
Expand Down
6 changes: 3 additions & 3 deletions openapi_spec_validator/schemas/__init__.py
Expand Up @@ -3,9 +3,9 @@

__all__ = ["schema_v2", "schema_v3", "schema_v30", "schema_v31"]

schema_v2, _ = get_schema('2.0')
schema_v30, _ = get_schema('3.0')
schema_v31, _ = get_schema('3.1')
schema_v2, _ = get_schema("2.0")
schema_v30, _ = get_schema("3.0")
schema_v31, _ = get_schema("3.1")

# alias to the latest v3 version
schema_v3 = schema_v31
5 changes: 2 additions & 3 deletions openapi_spec_validator/schemas/utils.py
Expand Up @@ -2,13 +2,12 @@
from os import path

import importlib_resources

from jsonschema_spec.readers import FilePathReader


def get_schema(version):
schema_path = 'resources/schemas/v{0}/schema.json'.format(version)
ref = importlib_resources.files('openapi_spec_validator') / schema_path
schema_path = f"resources/schemas/v{version}/schema.json"
ref = importlib_resources.files("openapi_spec_validator") / schema_path
with importlib_resources.as_file(ref) as resource_path:
schema_path_full = path.join(path.dirname(__file__), resource_path)
return FilePathReader(schema_path_full).read()
8 changes: 6 additions & 2 deletions openapi_spec_validator/shortcuts.py
Expand Up @@ -14,15 +14,17 @@ def detect_validator(choices, spec):


def validate_spec_detect_factory(choices):
def validate(spec, spec_url=''):
def validate(spec, spec_url=""):
validator_class = detect_validator(choices, spec)
return validator_class.validate(spec, spec_url=spec_url)

return validate


def validate_spec_factory(validator_class):
def validate(spec, spec_url=''):
def validate(spec, spec_url=""):
return validator_class.validate(spec, spec_url=spec_url)

return validate


Expand All @@ -31,11 +33,13 @@ def validate(spec_url):
spec = all_urls_handler(spec_url)
validator_class = detect_validator(choices, spec)
return validator_class.validate(spec, spec_url=spec_url)

return validate


def validate_spec_url_factory(validator_class):
def validate(spec_url):
spec = all_urls_handler(spec_url)
return validator_class.validate(spec, spec_url=spec_url)

return validate
23 changes: 14 additions & 9 deletions openapi_spec_validator/validation/__init__.py
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
from jsonschema.validators import Draft202012Validator
from jsonschema.validators import Draft4Validator
from jsonschema.validators import Draft202012Validator
from jsonschema_spec.handlers import default_handlers
from openapi_schema_validator import oas30_format_checker
from openapi_schema_validator import oas31_format_checker
Expand All @@ -13,30 +12,36 @@
from openapi_spec_validator.validation.validators import SpecValidator

__all__ = [
'openapi_v2_spec_validator',
'openapi_v3_spec_validator',
'openapi_v30_spec_validator',
'openapi_v31_spec_validator',
"openapi_v2_spec_validator",
"openapi_v3_spec_validator",
"openapi_v30_spec_validator",
"openapi_v31_spec_validator",
]

# v2.0 spec
openapi_v2_schema_validator = Draft4Validator(schema_v2)
openapi_v2_spec_validator = SpecValidator(
openapi_v2_schema_validator, OAS30Validator, oas30_format_checker,
openapi_v2_schema_validator,
OAS30Validator,
oas30_format_checker,
resolver_handlers=default_handlers,
)

# v3.0 spec
openapi_v30_schema_validator = Draft4Validator(schema_v30)
openapi_v30_spec_validator = SpecValidator(
openapi_v30_schema_validator, OAS30Validator, oas30_format_checker,
openapi_v30_schema_validator,
OAS30Validator,
oas30_format_checker,
resolver_handlers=default_handlers,
)

# v3.1 spec
openapi_v31_schema_validator = Draft202012Validator(schema_v31)
openapi_v31_spec_validator = SpecValidator(
openapi_v31_schema_validator, OAS31Validator, oas31_format_checker,
openapi_v31_schema_validator,
OAS31Validator,
oas31_format_checker,
resolver_handlers=default_handlers,
)

Expand Down
6 changes: 3 additions & 3 deletions openapi_spec_validator/validation/decorators.py
@@ -1,12 +1,11 @@
"""OpenAPI spec validator validation decorators module."""
from functools import wraps
import logging
from functools import wraps

log = logging.getLogger(__name__)


class ValidationErrorWrapper(object):

class ValidationErrorWrapper:
def __init__(self, error_class):
self.error_class = error_class

Expand All @@ -20,4 +19,5 @@ def wrapper(*args, **kwds):
yield self.error_class.create_from(err)
else:
yield err

return wrapper

0 comments on commit 48bf5e3

Please sign in to comment.