File: util.py

package info (click to toggle)
swagger-spec-validator 3.0.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 696 kB
  • sloc: python: 2,321; makefile: 28; sh: 2
file content (62 lines) | stat: -rw-r--r-- 2,258 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from __future__ import annotations

import logging
from types import ModuleType
from typing import Any

from swagger_spec_validator import validator12
from swagger_spec_validator import validator20
from swagger_spec_validator.common import read_url
from swagger_spec_validator.common import SwaggerValidationError
from swagger_spec_validator.common import wrap_exception


log = logging.getLogger(__name__)


def get_validator(spec_json: dict[str, Any], origin: str = "unknown") -> ModuleType:
    """
    :param spec_json: Dict representation of the json API spec
    :param origin: filename or url of the spec - only use for error messages
    :return: module responsible for validation based on Swagger version in the
        spec
    """
    swagger12_version = spec_json.get("swaggerVersion")
    swagger20_version = spec_json.get("swagger")

    if swagger12_version and swagger20_version:
        raise SwaggerValidationError(
            "You've got conflicting keys for the Swagger version in your spec. "
            "Expected `swaggerVersion` or `swagger`, but not both."
        )
    elif swagger12_version and swagger12_version == "1.2":
        # we don't care about versions prior to 1.2
        return validator12
    elif swagger20_version and swagger20_version == "2.0":
        return validator20
    elif swagger12_version is None and swagger20_version is None:
        raise SwaggerValidationError(
            "Swagger spec {} missing version. Expected "
            "`swaggerVersion` or `swagger`".format(origin)
        )
    else:
        raise SwaggerValidationError(
            "Swagger version {} not supported.".format(
                swagger12_version or swagger20_version
            )
        )


@wrap_exception
def validate_spec_url(spec_url: str) -> None:
    """Validates a Swagger spec given its URL.

    :param spec_url:
        For Swagger 1.2, this is the URL to the resource listing in api-docs.
        For Swagger 2.0, this is the URL to swagger.json in api-docs.
        If given as ``file://``, this must be an absolute url for cross-refs
        to work correctly.
    """
    spec_json = read_url(spec_url)
    validator = get_validator(spec_json, spec_url)
    validator.validate_spec(spec_json, spec_url)