Skip to content

Commit c4d4ed8

Browse files
committed
Server missing fields
1 parent d7840d0 commit c4d4ed8

File tree

6 files changed

+41
-5
lines changed

6 files changed

+41
-5
lines changed

openapi_core/schema/operations/generators.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from openapi_core.schema.request_bodies.factories import RequestBodyFactory
1313
from openapi_core.schema.responses.generators import ResponsesGenerator
1414
from openapi_core.schema.security.factories import SecurityRequirementFactory
15+
from openapi_core.schema.servers.generators import ServersGenerator
1516

1617

1718
class OperationsGenerator(object):
@@ -39,6 +40,9 @@ def generate(self, path_name, path):
3940
summary = operation_deref.get('summary')
4041
description = operation_deref.get('description')
4142
security_requirements_list = operation_deref.get('security', [])
43+
servers_spec = operation_deref.get('servers', [])
44+
45+
servers = self.servers_generator.generate(servers_spec)
4246

4347
security = None
4448
if security_requirements_list:
@@ -66,6 +70,7 @@ def generate(self, path_name, path):
6670
external_docs=external_docs, security=security,
6771
request_body=request_body, deprecated=deprecated,
6872
operation_id=operation_id, tags=list(tags_list),
73+
servers=servers,
6974
),
7075
)
7176

@@ -93,3 +98,8 @@ def request_body_factory(self):
9398
@lru_cache()
9499
def security_requirement_factory(self):
95100
return SecurityRequirementFactory(self.dereferencer)
101+
102+
@property
103+
@lru_cache()
104+
def servers_generator(self):
105+
return ServersGenerator(self.dereferencer)

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):

openapi_core/schema/specs/factories.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def create(self, spec_dict, spec_url=''):
3030
paths = spec_dict_deref.get('paths', {})
3131
components_spec = spec_dict_deref.get('components', {})
3232

33+
if not servers_spec:
34+
servers_spec = [
35+
{'url': '/'},
36+
]
37+
3338
info = self.info_factory.create(info_spec)
3439
servers = self.servers_generator.generate(servers_spec)
3540
paths = self.paths_generator.generate(paths)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ paths:
7070
- petstore_auth:
7171
- write:pets
7272
- read:pets
73+
servers:
74+
- url: https://development.gigantic-server.com/v1
75+
description: Development server
76+
- url: https://staging.gigantic-server.com/v1
77+
description: Staging server
7378
operationId: createPets
7479
tags:
7580
- pets

tests/integration/schema/test_spec.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,23 @@ def test_spec(self, spec, spec_dict):
100100
assert sec_req.name == sec_req_nam
101101
assert sec_req.scope_names == sec_req_spec[sec_req_nam]
102102

103+
servers_spec = operation_spec.get('servers', [])
104+
for idx, server in enumerate(operation.servers):
105+
assert type(server) == Server
106+
107+
server_spec = servers_spec[idx]
108+
assert server.url == server_spec['url']
109+
assert server.default_url == server_spec['url']
110+
assert server.description == server_spec.get('description')
111+
112+
for variable_name, variable in iteritems(server.variables):
113+
assert type(variable) == ServerVariable
114+
assert variable.name == variable_name
115+
116+
variable_spec = server_spec['variables'][variable_name]
117+
assert variable.default == variable_spec['default']
118+
assert variable.enum == variable_spec.get('enum')
119+
103120
responses_spec = operation_spec.get('responses')
104121

105122
for http_status, response in iteritems(operation.responses):

0 commit comments

Comments
 (0)