Skip to content

Commit 095b061

Browse files
authored
Merge pull request #74 from rowillia/support_python3
Support Python 3 and generate Python 3 compatible code
2 parents 5457d04 + 9c60171 commit 095b061

File tree

19 files changed

+71
-29
lines changed

19 files changed

+71
-29
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
language: python
22
python:
33
- "2.7"
4+
- "3.5"
45
install:
56
- python setup.py install
67
before_script:

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import absolute_import
12
import re
23
import ast
34
from setuptools import setup
@@ -23,11 +24,12 @@
2324
'swagger_py_codegen=swagger_py_codegen:generate'
2425
]
2526
},
26-
install_requires=['PyYAML', 'click', 'jinja2', 'dpath'],
27+
install_requires=['PyYAML', 'click', 'jinja2', 'dpath', 'six'],
2728
tests_require=['pytest'],
2829
classifiers=[
2930
'Development Status :: 3 - Alpha',
3031
'License :: OSI Approved :: MIT License',
3132
'Programming Language :: Python :: 2.7',
33+
'Programming Language :: Python :: 3',
3234
],
3335
)

swagger_py_codegen/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import absolute_import
2+
13
from .command import generate
24

3-
__version__ = '0.1.20'
5+
__version__ = '0.2.00'

swagger_py_codegen/__main__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import absolute_import
2+
13
from .command import generate
24

35
generate()

swagger_py_codegen/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import absolute_import
12
import os
23

34
from jinja2 import Environment, FileSystemLoader

swagger_py_codegen/command.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import absolute_import
12
import codecs
23
try:
34
import simplejson as json

swagger_py_codegen/flask.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
from __future__ import absolute_import
12
import re
23
from collections import OrderedDict
34

45
from .base import Code, CodeGenerator
56
from .jsonschema import Schema, SchemaGenerator, build_default
7+
import six
68

79
SUPPORT_METHODS = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head']
810

@@ -94,13 +96,21 @@ def _type(parameters):
9496

9597
return url, params
9698

99+
if six.PY3:
100+
def _remove_characters(text, deletechars):
101+
return text.translate({ord(x): None for x in deletechars})
102+
else:
103+
def _remove_characters(text, deletechars):
104+
return text.translate(None, deletechars)
97105

98106
def _path_to_endpoint(swagger_path):
99-
return swagger_path.strip('/').replace('/', '_').replace('-', '_').translate(None, '{}')
107+
return _remove_characters(
108+
swagger_path.strip('/').replace('/', '_').replace('-', '_'),
109+
'{}')
100110

101111

102112
def _path_to_resource_name(swagger_path):
103-
return swagger_path.title().translate(None, '{}/_-')
113+
return _remove_characters(swagger_path.title(), '{}/_-')
104114

105115

106116
def _location(swagger_location):
@@ -130,18 +140,18 @@ def _dependence_callback(self, code):
130140
# use flask endpoint to replace default validator's key,
131141
# example: `('some_path_param', 'method')`
132142
validators = OrderedDict()
133-
for k, v in schemas.data['validators'].iteritems():
134-
locations = {_location(loc): val for loc, val in v.iteritems()}
143+
for k, v in six.iteritems(schemas.data['validators']):
144+
locations = {_location(loc): val for loc, val in six.iteritems(v)}
135145
validators[(_path_to_endpoint(k[0]), k[1])] = locations
136146

137147
# filters
138148
filters = OrderedDict()
139-
for k, v in schemas.data['filters'].iteritems():
149+
for k, v in six.iteritems(schemas.data['filters']):
140150
filters[(_path_to_endpoint(k[0]), k[1])] = v
141151

142152
# scopes
143153
scopes = OrderedDict()
144-
for k, v in schemas.data['scopes'].iteritems():
154+
for k, v in six.iteritems(schemas.data['scopes']):
145155
scopes[(_path_to_endpoint(k[0]), k[1])] = v
146156

147157
schemas.data['validators'] = validators
@@ -169,9 +179,9 @@ def _process_data(self):
169179
methods[method] = {}
170180
validator = self.validators.get((endpoint, method.upper()))
171181
if validator:
172-
methods[method]['requests'] = validator.keys()
182+
methods[method]['requests'] = list(validator.keys())
173183

174-
for status, res_data in data[method].get('responses', {}).iteritems():
184+
for status, res_data in six.iteritems(data[method].get('responses', {})):
175185
if isinstance(status, int) or status.isdigit():
176186
example = res_data.get('examples', {}).get('application/json')
177187

swagger_py_codegen/jsonschema.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
from __future__ import absolute_import
12
from collections import OrderedDict
23
from inspect import getsource
34

45
from .base import Code, CodeGenerator
56
from .parser import schema_var_name
7+
import six
68

79

810
class Schema(Code):
@@ -74,7 +76,7 @@ def build_data(swagger):
7476
responses = data.get('responses')
7577
if responses:
7678
filter = {}
77-
for status, res_data in responses.iteritems():
79+
for status, res_data in six.iteritems(responses):
7880
if isinstance(status, int) or status.isdigit():
7981
filter[int(status)] = dict(
8082
headers=res_data.get('headers'),
@@ -84,7 +86,7 @@ def build_data(swagger):
8486

8587
# scopes
8688
for security in data.get('security', []):
87-
scopes[(endpoint, method)] = security.values().pop()
89+
scopes[(endpoint, method)] = list(security.values()).pop()
8890
break
8991

9092
schemas = OrderedDict([(schema_var_name(path), swagger.get(path)) for path in swagger.definitions])
@@ -150,8 +152,8 @@ def has(self, key):
150152

151153
def keys(self):
152154
if isinstance(self.data, dict):
153-
return self.data.keys()
154-
return vars(self.data).keys()
155+
return list(self.data.keys())
156+
return list(vars(self.data).keys())
155157

156158
def get_check(self, key, default=None):
157159
if isinstance(self.data, dict):
@@ -172,7 +174,7 @@ def _normalize_dict(schema, data):
172174
if not isinstance(data, DataWrapper):
173175
data = DataWrapper(data)
174176

175-
for key, _schema in schema.get('properties', {}).iteritems():
177+
for key, _schema in six.iteritems(schema.get('properties', {})):
176178
# set default
177179
type_ = _schema.get('type', 'object')
178180

swagger_py_codegen/parser.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
23
import string
34
import copy
45
import dpath.util
6+
import six
7+
from six.moves import map
58

69

710
def schema_var_name(path):
8-
return ''.join(map(string.capitalize, path))
11+
return ''.join(map(str.capitalize, path))
912

1013

1114
class RefNode(dict):
@@ -51,7 +54,7 @@ def get_definition_refs():
5154
ref = ref.lstrip('#/').split('/')
5255
ref = tuple(ref)
5356

54-
if schema in definition_refs.keys():
57+
if schema in list(definition_refs.keys()):
5558
definition_refs[schema].add(ref)
5659
else:
5760
definition_refs[schema] = set([ref])
@@ -61,13 +64,13 @@ def get_definition_refs():
6164

6265
definition_refs = get_definition_refs()
6366
while definition_refs:
64-
ready = {definition for definition, refs in definition_refs.iteritems() if not refs}
67+
ready = {definition for definition, refs in six.iteritems(definition_refs) if not refs}
6568
if not ready:
6669
msg = '$ref circular references found!\n'
6770
raise ValueError(msg)
6871
for definition in ready:
6972
del definition_refs[definition]
70-
for refs in definition_refs.itervalues():
73+
for refs in six.itervalues(definition_refs):
7174
refs.difference_update(ready)
7275

7376
self._definitions += ready
@@ -89,7 +92,7 @@ def definitions(self):
8992
@property
9093
def scopes_supported(self):
9194
for _, data in self.search(['securityDefinitions', '*', 'scopes']):
92-
return data.keys()
95+
return list(data.keys())
9396
return []
9497

9598
@property

swagger_py_codegen/templates/flask/api.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
24
import flask_restful as restful
35

46
from ..validators import request_validate, response_filter

0 commit comments

Comments
 (0)