Skip to content

Commit d7840d0

Browse files
committed
Operations more fields
1 parent 4c4636a commit d7840d0

File tree

10 files changed

+114
-2
lines changed

10 files changed

+114
-2
lines changed

openapi_core/schema/external_docs/__init__.py

Whitespace-only changes.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""OpenAPI core external docs factories module"""
2+
from openapi_core.schema.external_docs.models import ExternalDocumentation
3+
4+
5+
class ExternalDocumentationFactory(object):
6+
7+
def __init__(self, dereferencer):
8+
self.dereferencer = dereferencer
9+
10+
def create(self, external_doc_spec):
11+
url = external_doc_spec['url']
12+
description = external_doc_spec.get('description')
13+
14+
return ExternalDocumentation(url, description=description)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""OpenAPI core external docs models module"""
2+
3+
4+
class ExternalDocumentation(object):
5+
"""Represents an OpenAPI External Documentation."""
6+
7+
def __init__(self, url, description=None):
8+
self.url = url
9+
self.description = description

openapi_core/schema/operations/generators.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
from openapi_spec_validator.validators import PathItemValidator
55

66
from openapi_core.compat import lru_cache
7+
from openapi_core.schema.external_docs.factories import (
8+
ExternalDocumentationFactory,
9+
)
710
from openapi_core.schema.operations.models import Operation
811
from openapi_core.schema.parameters.generators import ParametersGenerator
912
from openapi_core.schema.request_bodies.factories import RequestBodyFactory
1013
from openapi_core.schema.responses.generators import ResponsesGenerator
14+
from openapi_core.schema.security.factories import SecurityRequirementFactory
1115

1216

1317
class OperationsGenerator(object):
@@ -32,6 +36,21 @@ def generate(self, path_name, path):
3236
parameters_list)
3337
operation_id = operation_deref.get('operationId')
3438
tags_list = operation_deref.get('tags', [])
39+
summary = operation_deref.get('summary')
40+
description = operation_deref.get('description')
41+
security_requirements_list = operation_deref.get('security', [])
42+
43+
security = None
44+
if security_requirements_list:
45+
security = list(map(
46+
self.security_requirement_factory.create,
47+
security_requirements_list))
48+
49+
external_docs = None
50+
if 'externalDocs' in operation_deref:
51+
external_docs_spec = operation_deref.get('externalDocs')
52+
external_docs = self.external_docs_factory.create(
53+
external_docs_spec)
3554

3655
request_body = None
3756
if 'requestBody' in operation_deref:
@@ -43,8 +62,10 @@ def generate(self, path_name, path):
4362
http_method,
4463
Operation(
4564
http_method, path_name, responses, list(parameters),
65+
summary=summary, description=description,
66+
external_docs=external_docs, security=security,
4667
request_body=request_body, deprecated=deprecated,
47-
operation_id=operation_id, tags=list(tags_list)
68+
operation_id=operation_id, tags=list(tags_list),
4869
),
4970
)
5071

@@ -58,7 +79,17 @@ def responses_generator(self):
5879
def parameters_generator(self):
5980
return ParametersGenerator(self.dereferencer, self.schemas_registry)
6081

82+
@property
83+
@lru_cache()
84+
def external_docs_factory(self):
85+
return ExternalDocumentationFactory(self.dereferencer)
86+
6187
@property
6288
@lru_cache()
6389
def request_body_factory(self):
6490
return RequestBodyFactory(self.dereferencer, self.schemas_registry)
91+
92+
@property
93+
@lru_cache()
94+
def security_requirement_factory(self):
95+
return SecurityRequirementFactory(self.dereferencer)

openapi_core/schema/operations/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,22 @@ class Operation(object):
88

99
def __init__(
1010
self, http_method, path_name, responses, parameters,
11-
request_body=None, deprecated=False, operation_id=None, tags=None):
11+
summary=None, description=None, external_docs=None, security=None,
12+
request_body=None, deprecated=False, operation_id=None, tags=None,
13+
servers=None):
1214
self.http_method = http_method
1315
self.path_name = path_name
1416
self.responses = dict(responses)
1517
self.parameters = dict(parameters)
18+
self.summary = summary
19+
self.description = description
20+
self.external_docs = external_docs
21+
self.security = security
1622
self.request_body = request_body
1723
self.deprecated = deprecated
1824
self.operation_id = operation_id
1925
self.tags = tags
26+
self.servers = servers
2027

2128
def __getitem__(self, name):
2229
return self.parameters[name]

openapi_core/schema/security/__init__.py

Whitespace-only changes.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""OpenAPI core security factories module"""
2+
from openapi_core.schema.security.models import SecurityRequirement
3+
4+
5+
class SecurityRequirementFactory(object):
6+
7+
def __init__(self, dereferencer):
8+
self.dereferencer = dereferencer
9+
10+
def create(self, security_requirement_spec):
11+
name = next(iter(security_requirement_spec))
12+
scope_names = security_requirement_spec[name]
13+
14+
return SecurityRequirement(name, scope_names=scope_names)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""OpenAPI core security models module"""
2+
3+
4+
class SecurityRequirement(object):
5+
"""Represents an OpenAPI Security Requirement."""
6+
7+
def __init__(self, name, scope_names=None):
8+
self.name = name
9+
self.scope_names = scope_names or []

tests/integration/data/v3.0/petstore.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ paths:
6262
$ref: "#/components/responses/PetsResponse"
6363
post:
6464
summary: Create a pet
65+
description: Creates new pet entry
66+
externalDocs:
67+
url: https://example.com
68+
description: Find more info here
69+
security:
70+
- petstore_auth:
71+
- write:pets
72+
- read:pets
6573
operationId: createPets
6674
tags:
6775
- pets

tests/integration/schema/test_spec.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from openapi_core.schema.request_bodies.models import RequestBody
1010
from openapi_core.schema.responses.models import Response
1111
from openapi_core.schema.schemas.models import Schema
12+
from openapi_core.schema.security.models import SecurityRequirement
1213
from openapi_core.schema.servers.models import Server, ServerVariable
1314
from openapi_core.shortcuts import create_spec
1415
from openapi_core.validation.request.validators import RequestValidator
@@ -79,6 +80,25 @@ def test_spec(self, spec, spec_dict):
7980
assert operation.http_method == http_method
8081
assert operation.operation_id is not None
8182
assert operation.tags == operation_spec['tags']
83+
assert operation.summary == operation_spec.get('summary')
84+
assert operation.description == operation_spec.get(
85+
'description')
86+
87+
ext_docs_spec = operation_spec.get('externalDocs')
88+
if ext_docs_spec:
89+
ext_docs = operation.external_docs
90+
assert ext_docs.url == ext_docs_spec['url']
91+
assert ext_docs.description == ext_docs_spec.get(
92+
'description')
93+
94+
security_spec = operation_spec.get('security')
95+
if security_spec:
96+
for idx, sec_req in enumerate(operation.security):
97+
assert type(sec_req) == SecurityRequirement
98+
sec_req_spec = security_spec[idx]
99+
sec_req_nam = next(iter(sec_req_spec))
100+
assert sec_req.name == sec_req_nam
101+
assert sec_req.scope_names == sec_req_spec[sec_req_nam]
82102

83103
responses_spec = operation_spec.get('responses')
84104

0 commit comments

Comments
 (0)