Skip to content

Commit ab8e170

Browse files
authored
Merge pull request #119 from guokr/revert-118-ref_resolver
Revert "resolver"
2 parents fd02724 + c309463 commit ab8e170

File tree

9 files changed

+73
-104
lines changed

9 files changed

+73
-104
lines changed

swagger_py_codegen/jsonschema.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from inspect import getsource
66

77
from .base import Code, CodeGenerator
8-
from .parser import RefNode
8+
from .parser import schema_var_name
99

1010

1111
class Schema(Code):
@@ -89,8 +89,10 @@ def build_data(swagger):
8989
scopes[(endpoint, method)] = list(security.values()).pop()
9090
break
9191

92+
schemas = OrderedDict([(schema_var_name(path), swagger.get(path)) for path in swagger.definitions])
93+
9294
data = dict(
93-
definitions={'definitions':swagger.origin_data.get('definitions', {})},
95+
schemas=schemas,
9496
validators=validators,
9597
filters=filters,
9698
scopes=scopes,
@@ -107,7 +109,7 @@ def _process(self):
107109
yield Schema(build_data(self.swagger))
108110

109111

110-
def merge_default(schema, value, get_first=True, resolver=None):
112+
def merge_default(schema, value, get_first=True):
111113
# TODO: more types support
112114
type_defaults = {
113115
'integer': 9573,
@@ -117,17 +119,17 @@ def merge_default(schema, value, get_first=True, resolver=None):
117119
'boolean': False
118120
}
119121

120-
results = normalize(schema, value, type_defaults, resolver=resolver)
122+
results = normalize(schema, value, type_defaults)
121123
if get_first:
122124
return results[0]
123125
return results
124126

125127

126-
def build_default(schema, resolver=None):
127-
return merge_default(schema, None, resolver=resolver)
128+
def build_default(schema):
129+
return merge_default(schema, None)
128130

129131

130-
def normalize(schema, data, required_defaults=None, resolver=None):
132+
def normalize(schema, data, required_defaults=None):
131133
if required_defaults is None:
132134
required_defaults = {}
133135
errors = []
@@ -215,7 +217,7 @@ def _normalize_dict(schema, data):
215217

216218
def _normalize_list(schema, data):
217219
result = []
218-
if hasattr(data, '__iter__') and not isinstance(data, (dict, RefNode)):
220+
if hasattr(data, '__iter__') and not isinstance(data, dict):
219221
for item in data:
220222
result.append(_normalize(schema.get('items'), item))
221223
elif 'default' in schema:
@@ -228,15 +230,6 @@ def _normalize_default(schema, data):
228230
else:
229231
return data
230232

231-
def _normalize_ref(schema, data):
232-
if resolver == None:
233-
raise TypeError("resolver must be provided")
234-
ref = schema.get(u"$ref")
235-
scope, resolved = resolver.resolve(ref)
236-
return _normalize(resolved, data)
237-
238-
239-
240233
def _normalize(schema, data):
241234
if schema is True or schema == {}:
242235
return data
@@ -246,13 +239,10 @@ def _normalize(schema, data):
246239
'object': _normalize_dict,
247240
'array': _normalize_list,
248241
'default': _normalize_default,
249-
'ref': _normalize_ref
250242
}
251243
type_ = schema.get('type', 'object')
252244
if type_ not in funcs:
253245
type_ = 'default'
254-
if schema.get(u'$ref', None):
255-
type_ = 'ref'
256246

257247
return funcs[type_](schema, data)
258248

swagger_py_codegen/parser.py

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,14 @@ def schema_var_name(path):
1313
return ''.join(map(str.capitalize, map(str, path)))
1414

1515

16-
class RefNode(object):
16+
class RefNode(dict):
1717

1818
def __init__(self, data, ref):
1919
self.ref = ref
20-
self._data = data
21-
22-
def __getitem__(self, key):
23-
return self._data.__getitem__(key)
24-
25-
def __settiem__(self, key, value):
26-
return self._data.__settiem__(key, value)
27-
28-
def get(self, key, default=None):
29-
return self._data.get(key, default)
30-
31-
def has(self, key, default=None):
32-
return self._data.has(key)
33-
34-
def keys(self):
35-
return self._data.keys()
36-
37-
def __iter__(self):
38-
return self._data.__iter__()
20+
super(RefNode, self).__init__(data)
3921

4022
def __repr__(self):
41-
return repr({'$ref':self.ref})
42-
43-
def __eq__(self, other):
44-
if isinstance(other, RefNode):
45-
return self._data == other._data and self.ref == other.ref
46-
else:
47-
return object.__eq__(other)
23+
return schema_var_name(self.ref)
4824

4925

5026
class Swagger(object):
@@ -64,10 +40,14 @@ def _process_ref(self):
6440
"""
6541
resolve all references util no reference exists
6642
"""
67-
for path, ref in self.search(['**', '$ref']):
68-
data = resolve(self.data, ref)
69-
path = path[:-1]
70-
self.set(path, RefNode(data, ref))
43+
while 1:
44+
li = list(self.search(['**', '$ref']))
45+
if not li:
46+
break
47+
for path, ref in li:
48+
data = resolve(self.data, ref)
49+
path = path[:-1]
50+
self.set(path, data)
7151

7252
def _resolve_definitions(self):
7353
"""
@@ -96,19 +76,17 @@ def get_definition_refs():
9676
while definition_refs:
9777
ready = {
9878
definition for definition, refs
99-
in six.iteritems(definition_refs)
79+
in six.iteritems(definition_refs) if not refs
10080
}
10181
if not ready:
102-
continue
103-
#msg = '$ref circular references found!\n'
104-
#raise ValueError(msg)
82+
msg = '$ref circular references found!\n'
83+
raise ValueError(msg)
10584
for definition in ready:
10685
del definition_refs[definition]
10786
for refs in six.itervalues(definition_refs):
10887
refs.difference_update(ready)
10988

11089
self._definitions += ready
111-
self._definitions.sort(key=lambda x :x[1])
11290

11391
def search(self, path):
11492
for p, d in dpath.util.search(

swagger_py_codegen/templates/falcon/validators.tpl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ from werkzeug.datastructures import MultiDict, Headers
1414
from jsonschema import Draft4Validator
1515

1616
from .schemas import (
17-
validators, filters, scopes, resolver, security, base_path, normalize)
17+
validators, filters, scopes, security, base_path, normalize)
1818

1919

2020
if six.PY3:
@@ -44,7 +44,7 @@ class JSONEncoder(json.JSONEncoder):
4444
class FalconValidatorAdaptor(object):
4545

4646
def __init__(self, schema):
47-
self.validator = Draft4Validator(schema, resolver=resolver)
47+
self.validator = Draft4Validator(schema)
4848

4949
def validate_number(self, type_, value):
5050
try:
@@ -87,7 +87,7 @@ class FalconValidatorAdaptor(object):
8787
def validate(self, value):
8888
value = self.type_convert(value)
8989
errors = {e.path[0]: e.message for e in self.validator.iter_errors(value)}
90-
return normalize(self.validator.schema, value, resolver=resolver)[0], errors
90+
return normalize(self.validator.schema, value)[0], errors
9191

9292

9393
def request_validate(req, resp, resource, params):
@@ -154,15 +154,15 @@ def response_filter(req, resp, resource):
154154
'Not defined',
155155
description='`%d` is not a defined status code.' % status)
156156

157-
_resp, errors = normalize(schemas['schema'], req.context['result'], resolver=resolver)
157+
_resp, errors = normalize(schemas['schema'], req.context['result'])
158158
if schemas['headers']:
159159
headers, header_errors = normalize(
160-
{'properties': schemas['headers']}, headers, resolver=resolver)
160+
{'properties': schemas['headers']}, headers)
161161
errors.extend(header_errors)
162162
if errors:
163163
raise falcon.HTTPInternalServerError(title='Expectation Failed',
164164
description=errors)
165165

166166
if 'result' not in req.context:
167167
return
168-
resp.body = json.dumps(_resp)
168+
resp.body = json.dumps(_resp)

swagger_py_codegen/templates/flask/validators.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ from flask_restful.utils import unpack
1515
from jsonschema import Draft4Validator
1616

1717
from .schemas import (
18-
validators, filters, scopes, resolver, security, merge_default, normalize)
18+
validators, filters, scopes, security, merge_default, normalize)
1919

2020

2121
class JSONEncoder(json.JSONEncoder):
@@ -29,7 +29,7 @@ class JSONEncoder(json.JSONEncoder):
2929
class FlaskValidatorAdaptor(object):
3030

3131
def __init__(self, schema):
32-
self.validator = Draft4Validator(schema, resolver=resolver)
32+
self.validator = Draft4Validator(schema)
3333

3434
def validate_number(self, type_, value):
3535
try:
@@ -72,7 +72,7 @@ class FlaskValidatorAdaptor(object):
7272
def validate(self, value):
7373
value = self.type_convert(value)
7474
errors = list(e.message for e in self.validator.iter_errors(value))
75-
return normalize(self.validator.schema, value, resolver=resolver)[0], errors
75+
return normalize(self.validator.schema, value)[0], errors
7676

7777

7878
def request_validate(view):
@@ -136,10 +136,10 @@ def response_filter(view):
136136
# return resp, status, headers
137137
abort(500, message='`%d` is not a defined status code.' % status)
138138

139-
resp, errors = normalize(schemas['schema'], resp, resolver=resolver)
139+
resp, errors = normalize(schemas['schema'], resp)
140140
if schemas['headers']:
141141
headers, header_errors = normalize(
142-
{'properties': schemas['headers']}, headers, resolver=resolver)
142+
{'properties': schemas['headers']}, headers)
143143
errors.extend(header_errors)
144144
if errors:
145145
abort(500, message='Expectation Failed', errors=errors)

swagger_py_codegen/templates/jsonschema/schemas.tpl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
# -*- coding: utf-8 -*-
22

33
import six
4-
from jsonschema import RefResolver
5-
from swagger_py_codegen.parser import RefNode
64

75
# TODO: datetime support
86

9-
107
{% include '_do_not_change.tpl' %}
118

129
base_path = '{{base_path}}'
1310

14-
definitions = {{ definitions }}
11+
{% for name, value in schemas.items() %}
12+
{{ name }} = {{ value }}
13+
{%- endfor %}
1514

1615
validators = {
1716
{%- for name, value in validators.items() %}
@@ -31,7 +30,6 @@ scopes = {
3130
{%- endfor %}
3231
}
3332

34-
resolver = RefResolver.from_schema(definitions)
3533

3634
class Security(object):
3735

swagger_py_codegen/templates/sanic/validators.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ from sanic.request import RequestParameters
1717
from jsonschema import Draft4Validator
1818

1919
from .schemas import (
20-
validators, filters, scopes, security, resolver, base_path, normalize, current)
20+
validators, filters, scopes, security, base_path, normalize, current)
2121

2222

2323
def unpack(value):
@@ -63,7 +63,7 @@ class JSONEncoder(json.JSONEncoder):
6363
class SanicValidatorAdaptor(object):
6464

6565
def __init__(self, schema):
66-
self.validator = Draft4Validator(schema, resolver=resolver)
66+
self.validator = Draft4Validator(schema)
6767

6868
def validate_number(self, type_, value):
6969
try:
@@ -106,7 +106,7 @@ class SanicValidatorAdaptor(object):
106106
def validate(self, value):
107107
value = self.type_convert(value)
108108
errors = list(e.message for e in self.validator.iter_errors(value))
109-
return normalize(self.validator.schema, value, resolver=resolver)[0], errors
109+
return normalize(self.validator.schema, value)[0], errors
110110

111111

112112
def request_validate(view):
@@ -175,10 +175,10 @@ def response_filter(view):
175175
# return resp, status, headers
176176
raise ServerError('`%d` is not a defined status code.' % status, 500)
177177

178-
resp, errors = normalize(schemas['schema'], resp, resolver=resolver)
178+
resp, errors = normalize(schemas['schema'], resp)
179179
if schemas['headers']:
180180
headers, header_errors = normalize(
181-
{'properties': schemas['headers']}, headers, resolver=resolver)
181+
{'properties': schemas['headers']}, headers)
182182
errors.extend(header_errors)
183183
if errors:
184184
raise ServerError('Expectation Failed', 500)

swagger_py_codegen/templates/tornado/validators.tpl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import six
1111
from functools import wraps
1212
from jsonschema import Draft4Validator
1313

14-
from .schemas import validators, scopes, resolver, normalize, filters
14+
from .schemas import validators, scopes, normalize, filters
1515

1616

1717
class ValidatorAdaptor(object):
1818

1919
def __init__(self, schema):
20-
self.validator = Draft4Validator(schema, resolver=resolver)
20+
self.validator = Draft4Validator(schema)
2121

2222
def validate_number(self, type_, value):
2323
try:
@@ -66,7 +66,7 @@ class ValidatorAdaptor(object):
6666
def validate(self, value):
6767
value = self.type_convert(value)
6868
errors = list(e.message for e in self.validator.iter_errors(value))
69-
return normalize(self.validator.schema, value, resolver=resolver)[0], errors
69+
return normalize(self.validator.schema, value)[0], errors
7070

7171
def request_validate(obj):
7272
def _request_validate(view):
@@ -134,10 +134,10 @@ def response_filter(obj):
134134
raise tornado.web.HTTPError(
135135
500, message='`%d` is not a defined status code.' % status)
136136

137-
resp, errors = normalize(schemas['schema'], resp, resolver=resolver)
137+
resp, errors = normalize(schemas['schema'], resp)
138138
if schemas['headers']:
139139
headers, header_errors = normalize(
140-
{'properties': schemas['headers']}, headers, resolver=resolver)
140+
{'properties': schemas['headers']}, headers)
141141
errors.extend(header_errors)
142142
if errors:
143143
raise tornado.web.HTTPError(
@@ -167,4 +167,4 @@ def unpack(value):
167167
except ValueError:
168168
pass
169169

170-
return value, 200, {}
170+
return value, 200, {}

0 commit comments

Comments
 (0)