Merge pull request #69 from p1c2u/kcem-master

Python2 compatibility module
This commit is contained in:
A 2018-07-29 00:26:41 +01:00 committed by GitHub
commit 3964ea9ecb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 74 additions and 24 deletions

1
.gitignore vendored
View file

@ -2,6 +2,7 @@
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
.pytest_cache/
# C extensions # C extensions
*.so *.so

View file

@ -2,6 +2,7 @@ language: python
sudo: false sudo: false
matrix: matrix:
include: include:
- python: 2.7
- python: 3.4 - python: 3.4
- python: 3.5 - python: 3.5
- python: 3.6 - python: 3.6

View file

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""OpenAPI core module""" """OpenAPI core module"""
from openapi_core.shortcuts import ( from openapi_core.shortcuts import (
create_spec, validate_parameters, validate_body, validate_data, create_spec, validate_parameters, validate_body, validate_data,

12
openapi_core/compat.py Normal file
View file

@ -0,0 +1,12 @@
"""OpenAPI core python 2.7 compatibility module"""
try:
from functools import lru_cache
except ImportError:
from backports.functools_lru_cache import lru_cache
try:
from functools import partialmethod
except ImportError:
from backports.functools_partialmethod import partialmethod
__all__ = ['lru_cache', 'partialmethod']

View file

@ -1,5 +1,4 @@
from functools import lru_cache from openapi_core.compat import lru_cache
from openapi_core.schema.components.models import Components from openapi_core.schema.components.models import Components
from openapi_core.schema.schemas.generators import SchemasGenerator from openapi_core.schema.schemas.generators import SchemasGenerator

View file

@ -1,10 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""OpenAPI core operations models module""" """OpenAPI core operations models module"""
from functools import lru_cache
from six import iteritems from six import iteritems
from openapi_spec_validator.validators import PathItemValidator from openapi_spec_validator.validators import PathItemValidator
from openapi_core.compat import lru_cache
from openapi_core.schema.operations.models import Operation from openapi_core.schema.operations.models import Operation
from openapi_core.schema.parameters.generators import ParametersGenerator from openapi_core.schema.parameters.generators import ParametersGenerator
from openapi_core.schema.request_bodies.factories import RequestBodyFactory from openapi_core.schema.request_bodies.factories import RequestBodyFactory

View file

@ -1,8 +1,7 @@
"""OpenAPI core parameters generators module""" """OpenAPI core parameters generators module"""
from functools import lru_cache
from six import iteritems from six import iteritems
from openapi_core.compat import lru_cache
from openapi_core.schema.parameters.factories import ParameterFactory from openapi_core.schema.parameters.factories import ParameterFactory

View file

@ -1,8 +1,7 @@
"""OpenAPI core paths generators module""" """OpenAPI core paths generators module"""
from functools import lru_cache
from six import iteritems from six import iteritems
from openapi_core.compat import lru_cache
from openapi_core.schema.operations.generators import OperationsGenerator from openapi_core.schema.operations.generators import OperationsGenerator
from openapi_core.schema.paths.models import Path from openapi_core.schema.paths.models import Path

View file

@ -1,6 +1,5 @@
"""OpenAPI core request bodies factories module""" """OpenAPI core request bodies factories module"""
from functools import lru_cache from openapi_core.compat import lru_cache
from openapi_core.schema.media_types.generators import MediaTypeGenerator from openapi_core.schema.media_types.generators import MediaTypeGenerator
from openapi_core.schema.request_bodies.models import RequestBody from openapi_core.schema.request_bodies.models import RequestBody

View file

@ -1,8 +1,7 @@
"""OpenAPI core responses generators module""" """OpenAPI core responses generators module"""
from functools import lru_cache
from six import iteritems from six import iteritems
from openapi_core.compat import lru_cache
from openapi_core.schema.media_types.generators import MediaTypeGenerator from openapi_core.schema.media_types.generators import MediaTypeGenerator
from openapi_core.schema.parameters.generators import ParametersGenerator from openapi_core.schema.parameters.generators import ParametersGenerator
from openapi_core.schema.responses.models import Response from openapi_core.schema.responses.models import Response

View file

@ -1,7 +1,7 @@
"""OpenAPI core schemas factories module""" """OpenAPI core schemas factories module"""
import logging import logging
from functools import lru_cache
from openapi_core.compat import lru_cache
from openapi_core.schema.properties.generators import PropertiesGenerator from openapi_core.schema.properties.generators import PropertiesGenerator
from openapi_core.schema.schemas.models import Schema from openapi_core.schema.schemas.models import Schema

View file

@ -81,7 +81,7 @@ class Schema(object):
) )
def get_all_required_properties_names(self): def get_all_required_properties_names(self):
required = self.required.copy() required = self.required[:]
for subschema in self.all_of: for subschema in self.all_of:
subschema_req = subschema.get_all_required_properties() subschema_req = subschema.get_all_required_properties()

View file

@ -1,10 +1,11 @@
"""OpenAPI core schemas util module""" """OpenAPI core schemas util module"""
from distutils.util import strtobool from distutils.util import strtobool
from json import dumps from json import dumps
from six import string_types
def forcebool(val): def forcebool(val):
if isinstance(val, str): if isinstance(val, string_types):
val = strtobool(val) val = strtobool(val)
return bool(val) return bool(val)

View file

@ -1,8 +1,7 @@
"""OpenAPI core servers generators module""" """OpenAPI core servers generators module"""
from functools import lru_cache
from six import iteritems from six import iteritems
from openapi_core.compat import lru_cache
from openapi_core.schema.servers.models import Server, ServerVariable from openapi_core.schema.servers.models import Server, ServerVariable

View file

@ -1,9 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""OpenAPI core specs factories module""" """OpenAPI core specs factories module"""
from functools import lru_cache
from openapi_spec_validator import openapi_v3_spec_validator from openapi_spec_validator import openapi_v3_spec_validator
from openapi_core.compat import lru_cache
from openapi_core.schema.components.factories import ComponentsFactory from openapi_core.schema.components.factories import ComponentsFactory
from openapi_core.schema.infos.factories import InfoFactory from openapi_core.schema.infos.factories import InfoFactory
from openapi_core.schema.paths.generators import PathsGenerator from openapi_core.schema.paths.generators import PathsGenerator

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""OpenAPI core specs models module""" """OpenAPI core specs models module"""
import logging import logging
from functools import partialmethod
from openapi_core.compat import partialmethod
from openapi_core.schema.operations.exceptions import InvalidOperation from openapi_core.schema.operations.exceptions import InvalidOperation
from openapi_core.schema.servers.exceptions import InvalidServer from openapi_core.schema.servers.exceptions import InvalidServer

View file

@ -1,5 +1,17 @@
"""OpenAPI core validation util module""" """OpenAPI core validation util module"""
from yarl import URL from six.moves.urllib.parse import urlparse
def is_absolute(url):
return url.startswith('//') or '://' in url
def path_qs(url):
pr = urlparse(url)
result = pr.path
if pr.query:
result += '?' + pr.query
return result
def get_operation_pattern(server_url, request_url_pattern): def get_operation_pattern(server_url, request_url_pattern):
@ -7,6 +19,6 @@ def get_operation_pattern(server_url, request_url_pattern):
if server_url[-1] == "/": if server_url[-1] == "/":
# operations have to start with a slash, so do not remove it # operations have to start with a slash, so do not remove it
server_url = server_url[:-1] server_url = server_url[:-1]
if URL(server_url).is_absolute(): if is_absolute(server_url):
return request_url_pattern.replace(server_url, "", 1) return request_url_pattern.replace(server_url, "", 1)
return URL(request_url_pattern).path_qs.replace(server_url, "", 1) return path_qs(request_url_pattern).replace(server_url, "", 1)

View file

@ -1,4 +1,3 @@
openapi-spec-validator openapi-spec-validator
six six
yarl<1.2.0
lazy-object-proxy lazy-object-proxy

6
requirements_2.7.txt Normal file
View file

@ -0,0 +1,6 @@
openapi-spec-validator
six
lazy-object-proxy
backports.functools-lru-cache
backports.functools-partialmethod
enum34

View file

@ -25,6 +25,11 @@ def get_metadata(init_file):
return dict(re.findall("__([a-z]+)__ = '([^']+)'", init_file)) return dict(re.findall("__([a-z]+)__ = '([^']+)'", init_file))
def install_requires():
py27 = '_2.7' if sys.version_info < (3,) else ''
return read_requirements('requirements{}.txt'.format(py27))
class PyTest(TestCommand): class PyTest(TestCommand):
"""Command to run unit tests after in-place build.""" """Command to run unit tests after in-place build."""
@ -68,12 +73,13 @@ setup(
'Intended Audience :: Developers', 'Intended Audience :: Developers',
"Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Libraries :: Python Modules",
"Operating System :: OS Independent", "Operating System :: OS Independent",
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',
'Topic :: Software Development :: Libraries', 'Topic :: Software Development :: Libraries',
], ],
install_requires=read_requirements('requirements.txt'), install_requires=install_requires(),
tests_require=read_requirements('requirements_dev.txt'), tests_require=read_requirements('requirements_dev.txt'),
extras_require={ extras_require={
'flask': ["werkzeug"], 'flask': ["werkzeug"],

View file

@ -0,0 +1,18 @@
from openapi_core.validation.util import path_qs
class TestPathQs(object):
def test_path(self):
url = 'https://test.com:1234/path'
result = path_qs(url)
assert result == '/path'
def test_query(self):
url = 'https://test.com:1234/path?query=1'
result = path_qs(url)
assert result == '/path?query=1'