Beispiel #1
0
def setup(app: web.Application,
          *,
          title: str,
          version: str,
          description: str,
          openapi_version: str = "3.0.2",
          path: str = "/api/spec.json",
          validate: bool = False) -> None:

    app["spec"] = APISpec(
        title=title,
        version=version,
        openapi_version=openapi_version,
        info={"description": description},
        plugins=[MarshmallowPlugin()],
    )

    app.router.add_get(path, handler, name="api.spec")

    for route in app.router.routes():
        if hasattr(route.handler, "spec") and route.resource:
            operation_spec = route.handler.spec["operation"]  # type: ignore
            app["spec"].path(
                path=route.resource.canonical,
                operations={route.method.lower(): operation_spec},
            )

    if validate:
        validate_spec(app["spec"])
Beispiel #2
0
def test_openapi_tools_validate_v2():
    ma_plugin = MarshmallowPlugin()
    spec = APISpec(
        title="Pets", version="0.1", plugins=(ma_plugin,), openapi_version="2.0"
    )
    openapi = ma_plugin.converter

    spec.components.schema("Category", schema=CategorySchema)
    spec.components.schema("Pet", {"discriminator": "name"}, schema=PetSchema)

    spec.path(
        view=None,
        path="/category/{category_id}",
        operations={
            "get": {
                "parameters": [
                    {"name": "q", "in": "query", "type": "string"},
                    {
                        "name": "category_id",
                        "in": "path",
                        "required": True,
                        "type": "string",
                    },
                    openapi.field2parameter(
                        field=fields.List(
                            fields.Str(),
                            validate=validate.OneOf(["freddie", "roger"]),
                            location="querystring",
                        ),
                        default_in=None,
                        name="body",
                    ),
                ]
                + openapi.schema2parameters(PageSchema, default_in="query"),
                "responses": {200: {"schema": PetSchema, "description": "A pet"}},
            },
            "post": {
                "parameters": (
                    [
                        {
                            "name": "category_id",
                            "in": "path",
                            "required": True,
                            "type": "string",
                        }
                    ]
                    + openapi.schema2parameters(CategorySchema, default_in="body")
                ),
                "responses": {201: {"schema": PetSchema, "description": "A pet"}},
            },
        },
    )
    try:
        utils.validate_spec(spec)
    except exceptions.OpenAPIError as error:
        pytest.fail(str(error))
    def generate_schema(self) -> dict:
        endpoints = self.declaration.endpoints
        for url_prefix, endpoint_declaration in endpoints.items():
            endpoint, name = endpoint_declaration
            self.spec.add_path(
                path='/' + url_prefix,  # TODO: normalize url
                operations=self._operations_from_endpoint(endpoint),
            )

        validate_spec(self.spec)
        return self.spec.to_dict()
    def run(self, filename):
        try:
            validate_spec(spec)
        except OpenAPIError:
            print(f'API spec is not valid')
            exit(1)

        with open(filename, 'w') as fp:
            fp.write(spec.to_yaml())

        print(f'API spec has been written into {filename}')
Beispiel #5
0
def test_swagger_tools_validate():
    spec = APISpec(
        title='Pets',
        version='0.1',
        plugins=['apispec.ext.marshmallow'],
    )

    spec.definition('Category', schema=CategorySchema)
    spec.definition('Pet', schema=PetSchema, extra_fields={'discriminator': 'name'})

    spec.add_path(
        view=None,
        path='/category/{category_id}',
        operations={
            'get': {
                'parameters': [
                    {'name': 'q', 'in': 'query', 'type': 'string'},
                    {'name': 'category_id', 'in': 'path', 'required': True, 'type': 'string'},
                    field2parameter(
                        field=fields.List(
                            fields.Str(),
                            validate=validate.OneOf(['freddie', 'roger']),
                            location='querystring',
                        ),
                        name='body',
                        use_refs=False,
                    ),
                ] + swagger.schema2parameters(PageSchema, default_in='query'),
                'responses': {
                    200: {
                        'schema': PetSchema,
                        'description': 'A pet',
                    },
                },
            },
            'post': {
                'parameters': (
                    [{'name': 'category_id', 'in': 'path', 'required': True, 'type': 'string'}] +
                    swagger.schema2parameters(CategorySchema, spec=spec, default_in='body')
                ),
                'responses': {
                    201: {
                        'schema': PetSchema,
                        'description': 'A pet',
                    },
                },
            }
        },
    )
    try:
        utils.validate_spec(spec)
    except exceptions.SwaggerError as error:
        pytest.fail(str(error))
Beispiel #6
0
    def on_get(self, req, resp):
        if validate_spec(self.spec):
            resp.status = falcon.HTTP_200
            resp.set_header("content-type", "application/json")

            resp.media = self.spec.to_dict()
        else:
            log.error("OpenAPI spec did not pass validation")
            resp.status = falcon.HTTP_500
Beispiel #7
0
def setup_openapi(
    app: Application,
    *,
    title: str,
    version: str,
    description: str,
    operations: List[Operation],
    openapi_version: str = "3.0.2",
    path: str = "/api/spec.json",
    security: Optional[Tuple[str, Dict[str, str]]] = None,
) -> None:

    app["spec"] = APISpec(
        title=title,
        version=version,
        openapi_version=openapi_version,
        info={"description": description},
        plugins=[MarshmallowPlugin()],
    )

    if security:
        app["spec"].components.security_scheme(*security)

    app.router.add_get(path, openapi.handler, name="api.spec")

    for method, path, view in operations:
        app.router.add_route(method, path, view.handle)

        operation = view.spec.generate()
        operation.setdefault("description", view.__doc__)

        app["spec"].path(
            path=path,
            operations={method.lower(): operation},
        )

    validate_spec(app["spec"])
Beispiel #8
0
 def test_swagger_valid(self):
     try:
         utils.validate_spec(spec)
     except exceptions.SwaggerError as error:
         self.fail(str(error))
Beispiel #9
0
def test_openapi_tools_validate_v3():
    ma_plugin = MarshmallowPlugin()
    spec = APISpec(
        title='Pets',
        version='0.1',
        plugins=(ma_plugin, ),
        openapi_version='3.0.0',
    )
    #openapi = ma_plugin.openapi

    spec.definition('Category', schema=CategorySchema)
    spec.definition('Pet', schema=PetSchemaV3)

    spec.add_path(
        view=None,
        path='/category/{category_id}',
        operations={
            'get': {
                'parameters': [
                    {
                        'name': 'q',
                        'in': 'query',
                        'schema': {
                            'type': 'string'
                        },
                    },
                    {
                        'name': 'category_id',
                        'in': 'path',
                        'required': True,
                        'schema': {
                            'type': 'string'
                        },
                    },
                ],  # + openapi.schema2parameters(PageSchema, default_in='query'),
                'responses': {
                    200: {
                        'description': 'success',
                        'content': {
                            'application/json': {
                                'schema': PetSchemaV3,
                            },
                        },
                    },
                },
            },
            'post': {
                'parameters': ([
                    {
                        'name': 'category_id',
                        'in': 'path',
                        'required': True,
                        'schema': {
                            'type': 'string'
                        },
                    },
                ]),
                'requestBody': {
                    'content': {
                        'application/json': {
                            'schema': CategorySchema,
                        },
                    },
                },
                'responses': {
                    201: {
                        'description': 'created',
                        'content': {
                            'application/json': {
                                'schema': PetSchemaV3,
                            },
                        },
                    },
                },
            },
        },
    )
    try:
        utils.validate_spec(spec)
    except exceptions.OpenAPIError as error:
        pytest.fail(str(error))
Beispiel #10
0
 def test_spec_is_valid(self):
     """Test generated spec file is valid"""
     spec = self.app.extensions['flask-rest-api']['ext_obj'].spec
     assert validate_spec(spec)
Beispiel #11
0
def test_openapi_tools_validate_v2():
    ma_plugin = MarshmallowPlugin()
    spec = APISpec(
        title='Pets',
        version='0.1',
        plugins=(ma_plugin, ),
        openapi_version='2.0',
    )
    openapi = ma_plugin.openapi

    spec.components.schema('Category', schema=CategorySchema)
    spec.components.schema('Pet',
                           schema=PetSchema,
                           extra_fields={'discriminator': 'name'})

    spec.path(
        view=None,
        path='/category/{category_id}',
        operations={
            'get': {
                'parameters': [
                    {
                        'name': 'q',
                        'in': 'query',
                        'type': 'string'
                    },
                    {
                        'name': 'category_id',
                        'in': 'path',
                        'required': True,
                        'type': 'string'
                    },
                    openapi.field2parameter(
                        field=fields.List(
                            fields.Str(),
                            validate=validate.OneOf(['freddie', 'roger']),
                            location='querystring',
                        ),
                        name='body',
                        use_refs=False,
                    ),
                ] + openapi.schema2parameters(PageSchema, default_in='query'),
                'responses': {
                    200: {
                        'schema': PetSchema,
                        'description': 'A pet',
                    },
                },
            },
            'post': {
                'parameters': ([{
                    'name': 'category_id',
                    'in': 'path',
                    'required': True,
                    'type': 'string'
                }] + openapi.schema2parameters(CategorySchema,
                                               default_in='body')),
                'responses': {
                    201: {
                        'schema': PetSchema,
                        'description': 'A pet',
                    },
                },
            },
        },
    )
    try:
        utils.validate_spec(spec)
    except exceptions.OpenAPIError as error:
        pytest.fail(str(error))
def test_spec__should_be_valid():
    assert validate_spec(spec)