Skip to content

Commit b58823f

Browse files
committed
properly remove six dependency (closes #482)
1 parent 1461b01 commit b58823f

File tree

9 files changed

+53
-57
lines changed

9 files changed

+53
-57
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515
strategy:
1616
matrix:
17-
python-version: ["3.7", "3.8", "3.9", "3.10", "pypy3"]
17+
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "pypy3"]
1818
steps:
1919
- name: Set up Python ${{ matrix.python-version }}
2020
uses: actions/setup-python@v1

CHANGELOG.rst

+12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ Releases prior to 0.3.0 were “best effort” filled out, but are missing
2525
some info. If you see your contribution missing info, please open a PR
2626
on the Changelog!
2727

28+
.. _section-1.0.2:
29+
1.0.2
30+
-----
31+
32+
.. _bug_fixes-1.0.2
33+
Bug Fixes
34+
~~~~~~~~~
35+
36+
::
37+
38+
* Properly remove six dependency
39+
2840
.. _section-1.0.1:
2941
1.0.1
3042
-----

flask_restx/postman.py

+9-14
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
# -*- coding: utf-8 -*-
2-
from __future__ import unicode_literals, absolute_import
3-
42
from time import time
53
from uuid import uuid5, NAMESPACE_URL
64

7-
from six import iteritems
8-
from six.moves.urllib.parse import urlencode
5+
from urllib.parse import urlencode
96

107

118
def clean(data):
129
"""Remove all keys where value is None"""
13-
return dict((k, v) for k, v in iteritems(data) if v is not None)
10+
return dict((k, v) for k, v in data.items() if v is not None)
1411

1512

1613
DEFAULT_VARS = {
@@ -56,15 +53,15 @@ def headers(self):
5653

5754
# Add security headers if needed (global then local)
5855
for security in self.collection.api.__schema__.get("security", []):
59-
for key, header in iteritems(self.collection.apikeys):
56+
for key, header in self.collection.apikeys.items():
6057
if key in security:
6158
headers[header] = ""
6259
for security in self.operation.get("security", []):
63-
for key, header in iteritems(self.collection.apikeys):
60+
for key, header in self.collection.apikeys.items():
6461
if key in security:
6562
headers[header] = ""
6663

67-
lines = [":".join(line) for line in iteritems(headers)]
64+
lines = [":".join(line) for line in headers.items()]
6865
return "\n".join(lines)
6966

7067
@property
@@ -103,7 +100,7 @@ def process_url(self, urlvars=False):
103100
)
104101
if not params:
105102
return url, None
106-
for name, param in iteritems(params):
103+
for name, param in params.items():
107104
if param["in"] == "path":
108105
url = url.replace("{%s}" % name, ":%s" % name)
109106
path_vars[name] = DEFAULT_VARS.get(param["type"], "")
@@ -171,10 +168,10 @@ def requests(self):
171168
},
172169
)
173170
# Then iter over API paths and methods
174-
for path, operations in iteritems(self.api.__schema__["paths"]):
171+
for path, operations in self.api.__schema__["paths"].items():
175172
path_params = operations.get("parameters", [])
176173

177-
for method, operation in iteritems(operations):
174+
for method, operation in operations.items():
178175
if method != "parameters":
179176
yield Request(self, path, path_params, method, operation)
180177

@@ -187,9 +184,7 @@ def folders(self):
187184
def apikeys(self):
188185
return dict(
189186
(name, secdef["name"])
190-
for name, secdef in iteritems(
191-
self.api.__schema__.get("securityDefinitions")
192-
)
187+
for name, secdef in self.api.__schema__.get("securityDefinitions").items()
193188
if secdef.get("in") == "header" and secdef.get("type") == "apiKey"
194189
)
195190

flask_restx/swagger.py

+23-34
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
# -*- coding: utf-8 -*-
2-
from __future__ import unicode_literals, absolute_import
3-
42
import itertools
53
import re
64

75
from inspect import isclass, getdoc
86
from collections import OrderedDict
97

10-
try:
11-
from collections.abc import Hashable
12-
except ImportError:
13-
# TODO Remove this to drop Python2 support
14-
from collections import Hashable
15-
from six import string_types, itervalues, iteritems, iterkeys
8+
from collections.abc import Hashable
169

1710
from flask import current_app
1811

@@ -22,10 +15,7 @@
2215
from .utils import merge, not_none, not_none_sorted
2316
from ._http import HTTPStatus
2417

25-
try:
26-
from urllib.parse import quote
27-
except ImportError:
28-
from urllib import quote
18+
from urllib.parse import quote
2919

3020
#: Maps Flask/Werkzeug rooting types to Swagger ones
3121
PATH_TYPES = {
@@ -147,7 +137,7 @@ def _param_to_header(param):
147137

148138

149139
def _clean_header(header):
150-
if isinstance(header, string_types):
140+
if isinstance(header, str):
151141
header = {"description": header}
152142
typedef = header.get("type", "string")
153143
if isinstance(typedef, Hashable) and typedef in PY_TYPES:
@@ -306,7 +296,7 @@ def as_dict(self):
306296
"basePath": basepath,
307297
"paths": not_none_sorted(paths),
308298
"info": infos,
309-
"produces": list(iterkeys(self.api.representations)),
299+
"produces": list(self.api.representations.keys()),
310300
"consumes": ["application/json"],
311301
"securityDefinitions": self.api.authorizations or None,
312302
"security": self.security_requirements(self.api.security) or None,
@@ -327,7 +317,7 @@ def extract_tags(self, api):
327317
tags = []
328318
by_name = {}
329319
for tag in api.tags:
330-
if isinstance(tag, string_types):
320+
if isinstance(tag, str):
331321
tag = {"name": tag}
332322
elif isinstance(tag, (list, tuple)):
333323
tag = {"name": tag[0], "description": tag[1]}
@@ -389,7 +379,7 @@ def extract_resource_doc(self, resource, url, route_doc=None):
389379
method_params = self.expected_params(method_doc)
390380
method_params = merge(method_params, method_doc.get("params", {}))
391381
inherited_params = OrderedDict(
392-
(k, v) for k, v in iteritems(params) if k in method_params
382+
(k, v) for k, v in params.items() if k in method_params
393383
)
394384
method_doc["params"] = merge(inherited_params, method_params)
395385
for name, param in method_doc["params"].items():
@@ -469,7 +459,7 @@ def expected_params(self, doc):
469459

470460
def register_errors(self):
471461
responses = {}
472-
for exception, handler in iteritems(self.api.error_handlers):
462+
for exception, handler in self.api.error_handlers.items():
473463
doc = parse_docstring(handler)
474464
response = {"description": doc["summary"]}
475465
apidoc = getattr(handler, "__apidoc__", {})
@@ -530,7 +520,7 @@ def vendor_fields(self, doc, method):
530520
"""
531521
return dict(
532522
(k if k.startswith("x-") else "x-{0}".format(k), v)
533-
for k, v in iteritems(doc[method].get("vendor", {}))
523+
for k, v in doc[method].get("vendor", {}).items()
534524
)
535525

536526
def description_for(self, doc, method):
@@ -555,7 +545,7 @@ def operation_id_for(self, doc, method):
555545

556546
def parameters_for(self, doc):
557547
params = []
558-
for name, param in iteritems(doc["params"]):
548+
for name, param in doc["params"].items():
559549
param["name"] = name
560550
if "type" not in param and "schema" not in param:
561551
param["type"] = "string"
@@ -584,7 +574,7 @@ def parameters_for(self, doc):
584574
"format": "mask",
585575
"description": "An optional fields mask",
586576
}
587-
if isinstance(mask, string_types):
577+
if isinstance(mask, str):
588578
param["default"] = mask
589579
params.append(param)
590580

@@ -596,9 +586,9 @@ def responses_for(self, doc, method):
596586

597587
for d in doc, doc[method]:
598588
if "responses" in d:
599-
for code, response in iteritems(d["responses"]):
589+
for code, response in d["responses"].items():
600590
code = str(code)
601-
if isinstance(response, string_types):
591+
if isinstance(response, str):
602592
description = response
603593
model = None
604594
kwargs = {}
@@ -632,8 +622,8 @@ def responses_for(self, doc, method):
632622
responses[code]["schema"] = self.serialize_schema(d["model"])
633623

634624
if "docstring" in d:
635-
for name, description in iteritems(d["docstring"]["raises"]):
636-
for exception, handler in iteritems(self.api.error_handlers):
625+
for name, description in d["docstring"]["raises"].items():
626+
for exception, handler in self.api.error_handlers.items():
637627
error_responses = getattr(handler, "__apidoc__", {}).get(
638628
"responses", {}
639629
)
@@ -658,17 +648,16 @@ def process_headers(self, response, doc, method=None, headers=None):
658648
response["headers"] = dict(
659649
(k, _clean_header(v))
660650
for k, v in itertools.chain(
661-
iteritems(doc.get("headers", {})),
662-
iteritems(method_doc.get("headers", {})),
663-
iteritems(headers or {}),
651+
doc.get("headers", {}).items(),
652+
method_doc.get("headers", {}).items(),
653+
(headers or {}).items(),
664654
)
665655
)
666656
return response
667657

668658
def serialize_definitions(self):
669659
return dict(
670-
(name, model.__schema__)
671-
for name, model in iteritems(self._registered_models)
660+
(name, model.__schema__) for name, model in self._registered_models.items()
672661
)
673662

674663
def serialize_schema(self, model):
@@ -683,7 +672,7 @@ def serialize_schema(self, model):
683672
self.register_model(model)
684673
return ref(model)
685674

686-
elif isinstance(model, string_types):
675+
elif isinstance(model, str):
687676
self.register_model(model)
688677
return ref(model)
689678

@@ -710,13 +699,13 @@ def register_model(self, model):
710699
for parent in specs.__parents__:
711700
self.register_model(parent)
712701
if isinstance(specs, (Model, OrderedModel)):
713-
for field in itervalues(specs):
702+
for field in specs.values():
714703
self.register_field(field)
715704
return ref(model)
716705

717706
def register_field(self, field):
718707
if isinstance(field, fields.Polymorph):
719-
for model in itervalues(field.mapping):
708+
for model in field.mapping.values():
720709
self.register_model(model)
721710
elif isinstance(field, fields.Nested):
722711
self.register_model(field.nested)
@@ -745,12 +734,12 @@ def security_requirements(self, value):
745734
return []
746735

747736
def security_requirement(self, value):
748-
if isinstance(value, (string_types)):
737+
if isinstance(value, (str)):
749738
return {value: []}
750739
elif isinstance(value, dict):
751740
return dict(
752741
(k, v if isinstance(v, (list, tuple)) else [v])
753-
for k, v in iteritems(value)
742+
for k, v in value.items()
754743
)
755744
else:
756745
return None

requirements/develop.pip

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
tox
2-
black; python_version >= '3.6'
2+
black

requirements/doc.pip

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
alabaster==0.7.12
2-
Sphinx==2.1.2
3-
sphinx-issues==1.2.0
2+
Sphinx==5.3.0
3+
sphinx-issues==3.0.1

requirements/install.pip

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
aniso8601==8.0.0; python_version < '3.5'
2-
aniso8601>=0.82; python_version >= '3.5'
1+
aniso8601>=0.82
32
jsonschema
43
Flask>=0.8, !=2.0.0
54
werkzeug !=2.0.0

setup.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,11 @@ def pip(filename):
102102
"Topic :: System :: Software Distribution",
103103
"Programming Language :: Python",
104104
"Programming Language :: Python :: 3",
105-
"Programming Language :: Python :: 3.5",
106-
"Programming Language :: Python :: 3.6",
107105
"Programming Language :: Python :: 3.7",
108106
"Programming Language :: Python :: 3.8",
107+
"Programming Language :: Python :: 3.9",
108+
"Programming Language :: Python :: 3.10",
109+
"Programming Language :: Python :: 3.11",
109110
"Programming Language :: Python :: Implementation :: PyPy",
110111
"Topic :: Software Development :: Libraries :: Python Modules",
111112
"License :: OSI Approved :: BSD License",

tox.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# and then run "tox" from this directory.
55

66
[tox]
7-
envlist = py{37, 38, 39, 310}, pypy3, doc
7+
envlist = py{37, 38, 39, 310, 311}, pypy3, doc
88

99
[testenv]
1010
commands = {posargs:inv test qa}

0 commit comments

Comments
 (0)