Skip to content

Commit 57cc70a

Browse files
authored
Merge pull request #169 from p1c2u/feature/operations-more-fields
Operations fields
2 parents 4c4636a + c4d4ed8 commit 57cc70a

File tree

13 files changed

+155
-7
lines changed

13 files changed

+155
-7
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: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
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
15+
from openapi_core.schema.servers.generators import ServersGenerator
1116

1217

1318
class OperationsGenerator(object):
@@ -32,6 +37,24 @@ def generate(self, path_name, path):
3237
parameters_list)
3338
operation_id = operation_deref.get('operationId')
3439
tags_list = operation_deref.get('tags', [])
40+
summary = operation_deref.get('summary')
41+
description = operation_deref.get('description')
42+
security_requirements_list = operation_deref.get('security', [])
43+
servers_spec = operation_deref.get('servers', [])
44+
45+
servers = self.servers_generator.generate(servers_spec)
46+
47+
security = None
48+
if security_requirements_list:
49+
security = list(map(
50+
self.security_requirement_factory.create,
51+
security_requirements_list))
52+
53+
external_docs = None
54+
if 'externalDocs' in operation_deref:
55+
external_docs_spec = operation_deref.get('externalDocs')
56+
external_docs = self.external_docs_factory.create(
57+
external_docs_spec)
3558

3659
request_body = None
3760
if 'requestBody' in operation_deref:
@@ -43,8 +66,11 @@ def generate(self, path_name, path):
4366
http_method,
4467
Operation(
4568
http_method, path_name, responses, list(parameters),
69+
summary=summary, description=description,
70+
external_docs=external_docs, security=security,
4671
request_body=request_body, deprecated=deprecated,
47-
operation_id=operation_id, tags=list(tags_list)
72+
operation_id=operation_id, tags=list(tags_list),
73+
servers=servers,
4874
),
4975
)
5076

@@ -58,7 +84,22 @@ def responses_generator(self):
5884
def parameters_generator(self):
5985
return ParametersGenerator(self.dereferencer, self.schemas_registry)
6086

87+
@property
88+
@lru_cache()
89+
def external_docs_factory(self):
90+
return ExternalDocumentationFactory(self.dereferencer)
91+
6192
@property
6293
@lru_cache()
6394
def request_body_factory(self):
6495
return RequestBodyFactory(self.dereferencer, self.schemas_registry)
96+
97+
@property
98+
@lru_cache()
99+
def security_requirement_factory(self):
100+
return SecurityRequirementFactory(self.dereferencer)
101+
102+
@property
103+
@lru_cache()
104+
def servers_generator(self):
105+
return ServersGenerator(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 []

openapi_core/schema/servers/generators.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,16 @@ def __init__(self, dereferencer):
1212

1313
def generate(self, servers_spec):
1414
servers_deref = self.dereferencer.dereference(servers_spec)
15-
if not servers_deref:
16-
yield Server('/')
17-
return
1815
for server_spec in servers_deref:
1916
url = server_spec['url']
2017
variables_spec = server_spec.get('variables', {})
18+
description = server_spec.get('description')
2119

2220
variables = None
2321
if variables_spec:
2422
variables = self.variables_generator.generate(variables_spec)
2523

26-
yield Server(url, variables=variables)
24+
yield Server(url, variables=variables, description=description)
2725

2826
@property
2927
@lru_cache()

openapi_core/schema/servers/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
class Server(object):
66

7-
def __init__(self, url, variables=None):
7+
def __init__(self, url, variables=None, description=None):
88
self.url = url
99
self.variables = variables and dict(variables) or {}
10+
self.description = description
1011

1112
@property
1213
def default_url(self):

0 commit comments

Comments
 (0)