Skip to content

Commit 3964ea9

Browse files
authored
Merge pull request #69 from p1c2u/kcem-master
Python2 compatibility module
2 parents a2ee03f + a9d858e commit 3964ea9

File tree

21 files changed

+74
-24
lines changed

21 files changed

+74
-24
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
__pycache__/
33
*.py[cod]
44
*$py.class
5+
.pytest_cache/
56

67
# C extensions
78
*.so

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ language: python
22
sudo: false
33
matrix:
44
include:
5+
- python: 2.7
56
- python: 3.4
67
- python: 3.5
78
- python: 3.6

openapi_core/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
"""OpenAPI core module"""
23
from openapi_core.shortcuts import (
34
create_spec, validate_parameters, validate_body, validate_data,

openapi_core/compat.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""OpenAPI core python 2.7 compatibility module"""
2+
try:
3+
from functools import lru_cache
4+
except ImportError:
5+
from backports.functools_lru_cache import lru_cache
6+
7+
try:
8+
from functools import partialmethod
9+
except ImportError:
10+
from backports.functools_partialmethod import partialmethod
11+
12+
__all__ = ['lru_cache', 'partialmethod']

openapi_core/schema/components/factories.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from functools import lru_cache
2-
1+
from openapi_core.compat import lru_cache
32
from openapi_core.schema.components.models import Components
43
from openapi_core.schema.schemas.generators import SchemasGenerator
54

openapi_core/schema/operations/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core operations models module"""
3-
from functools import lru_cache
4-
53
from six import iteritems
64
from openapi_spec_validator.validators import PathItemValidator
75

6+
from openapi_core.compat import lru_cache
87
from openapi_core.schema.operations.models import Operation
98
from openapi_core.schema.parameters.generators import ParametersGenerator
109
from openapi_core.schema.request_bodies.factories import RequestBodyFactory

openapi_core/schema/parameters/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"""OpenAPI core parameters generators module"""
2-
from functools import lru_cache
3-
42
from six import iteritems
53

4+
from openapi_core.compat import lru_cache
65
from openapi_core.schema.parameters.factories import ParameterFactory
76

87

openapi_core/schema/paths/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"""OpenAPI core paths generators module"""
2-
from functools import lru_cache
3-
42
from six import iteritems
53

4+
from openapi_core.compat import lru_cache
65
from openapi_core.schema.operations.generators import OperationsGenerator
76
from openapi_core.schema.paths.models import Path
87

openapi_core/schema/request_bodies/factories.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""OpenAPI core request bodies factories module"""
2-
from functools import lru_cache
3-
2+
from openapi_core.compat import lru_cache
43
from openapi_core.schema.media_types.generators import MediaTypeGenerator
54
from openapi_core.schema.request_bodies.models import RequestBody
65

openapi_core/schema/responses/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"""OpenAPI core responses generators module"""
2-
from functools import lru_cache
3-
42
from six import iteritems
53

4+
from openapi_core.compat import lru_cache
65
from openapi_core.schema.media_types.generators import MediaTypeGenerator
76
from openapi_core.schema.parameters.generators import ParametersGenerator
87
from openapi_core.schema.responses.models import Response

openapi_core/schema/schemas/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""OpenAPI core schemas factories module"""
22
import logging
3-
from functools import lru_cache
43

4+
from openapi_core.compat import lru_cache
55
from openapi_core.schema.properties.generators import PropertiesGenerator
66
from openapi_core.schema.schemas.models import Schema
77

openapi_core/schema/schemas/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def _get_all_required_properties(self):
8181
)
8282

8383
def get_all_required_properties_names(self):
84-
required = self.required.copy()
84+
required = self.required[:]
8585

8686
for subschema in self.all_of:
8787
subschema_req = subschema.get_all_required_properties()

openapi_core/schema/schemas/util.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""OpenAPI core schemas util module"""
22
from distutils.util import strtobool
33
from json import dumps
4+
from six import string_types
45

56

67
def forcebool(val):
7-
if isinstance(val, str):
8+
if isinstance(val, string_types):
89
val = strtobool(val)
910

1011
return bool(val)

openapi_core/schema/servers/generators.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"""OpenAPI core servers generators module"""
2-
from functools import lru_cache
3-
42
from six import iteritems
53

4+
from openapi_core.compat import lru_cache
65
from openapi_core.schema.servers.models import Server, ServerVariable
76

87

openapi_core/schema/specs/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core specs factories module"""
3-
from functools import lru_cache
43

54
from openapi_spec_validator import openapi_v3_spec_validator
65

6+
from openapi_core.compat import lru_cache
77
from openapi_core.schema.components.factories import ComponentsFactory
88
from openapi_core.schema.infos.factories import InfoFactory
99
from openapi_core.schema.paths.generators import PathsGenerator

openapi_core/schema/specs/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core specs models module"""
33
import logging
4-
from functools import partialmethod
54

5+
from openapi_core.compat import partialmethod
66
from openapi_core.schema.operations.exceptions import InvalidOperation
77
from openapi_core.schema.servers.exceptions import InvalidServer
88

openapi_core/validation/util.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
"""OpenAPI core validation util module"""
2-
from yarl import URL
2+
from six.moves.urllib.parse import urlparse
3+
4+
5+
def is_absolute(url):
6+
return url.startswith('//') or '://' in url
7+
8+
9+
def path_qs(url):
10+
pr = urlparse(url)
11+
result = pr.path
12+
if pr.query:
13+
result += '?' + pr.query
14+
return result
315

416

517
def get_operation_pattern(server_url, request_url_pattern):
618
"""Return an updated request URL pattern with the server URL removed."""
719
if server_url[-1] == "/":
820
# operations have to start with a slash, so do not remove it
921
server_url = server_url[:-1]
10-
if URL(server_url).is_absolute():
22+
if is_absolute(server_url):
1123
return request_url_pattern.replace(server_url, "", 1)
12-
return URL(request_url_pattern).path_qs.replace(server_url, "", 1)
24+
return path_qs(request_url_pattern).replace(server_url, "", 1)

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
openapi-spec-validator
22
six
3-
yarl<1.2.0
43
lazy-object-proxy

requirements_2.7.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
openapi-spec-validator
2+
six
3+
lazy-object-proxy
4+
backports.functools-lru-cache
5+
backports.functools-partialmethod
6+
enum34

setup.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ def get_metadata(init_file):
2525
return dict(re.findall("__([a-z]+)__ = '([^']+)'", init_file))
2626

2727

28+
def install_requires():
29+
py27 = '_2.7' if sys.version_info < (3,) else ''
30+
return read_requirements('requirements{}.txt'.format(py27))
31+
32+
2833
class PyTest(TestCommand):
2934

3035
"""Command to run unit tests after in-place build."""
@@ -68,12 +73,13 @@ def run_tests(self):
6873
'Intended Audience :: Developers',
6974
"Topic :: Software Development :: Libraries :: Python Modules",
7075
"Operating System :: OS Independent",
76+
'Programming Language :: Python :: 2.7',
7177
'Programming Language :: Python :: 3.4',
7278
'Programming Language :: Python :: 3.5',
7379
'Programming Language :: Python :: 3.6',
7480
'Topic :: Software Development :: Libraries',
7581
],
76-
install_requires=read_requirements('requirements.txt'),
82+
install_requires=install_requires(),
7783
tests_require=read_requirements('requirements_dev.txt'),
7884
extras_require={
7985
'flask': ["werkzeug"],

tests/unit/validation/test_util.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from openapi_core.validation.util import path_qs
2+
3+
4+
class TestPathQs(object):
5+
6+
def test_path(self):
7+
url = 'https://test.com:1234/path'
8+
9+
result = path_qs(url)
10+
11+
assert result == '/path'
12+
13+
def test_query(self):
14+
url = 'https://test.com:1234/path?query=1'
15+
16+
result = path_qs(url)
17+
18+
assert result == '/path?query=1'

0 commit comments

Comments
 (0)