diff --git a/connexion/decorators/validation.py b/connexion/decorators/validation.py index 86a5ecbf8..17d75a78f 100644 --- a/connexion/decorators/validation.py +++ b/connexion/decorators/validation.py @@ -4,8 +4,10 @@ import logging import sys +import pkg_resources import six from jsonschema import Draft4Validator, ValidationError, draft4_format_checker +from jsonschema.validators import extend from werkzeug.datastructures import FileStorage from ..exceptions import ExtraParameterProblem @@ -14,6 +16,10 @@ from ..problem import problem from ..utils import all_json, boolean, is_json_mimetype, is_null, is_nullable +_jsonschema_3_or_newer = pkg_resources.parse_version( + pkg_resources.get_distribution("jsonschema").version) >= \ + pkg_resources.parse_version("3.0.0") + logger = logging.getLogger('connexion.decorators.validation') TYPE_MAP = { @@ -261,10 +267,19 @@ def validate_parameter(parameter_type, value, param, param_name=None): del param['required'] try: if parameter_type == 'formdata' and param.get('type') == 'file': - Draft4Validator( - param, - format_checker=draft4_format_checker, - types={'file': FileStorage}).validate(converted_value) + if _jsonschema_3_or_newer: + extend( + Draft4Validator, + type_checker=Draft4Validator.TYPE_CHECKER.redefine( + "file", + lambda checker, instance: isinstance(instance, FileStorage) + ) + )(param, format_checker=draft4_format_checker).validate(converted_value) + else: + Draft4Validator( + param, + format_checker=draft4_format_checker, + types={'file': FileStorage}).validate(converted_value) else: Draft4Validator( param, format_checker=draft4_format_checker).validate(converted_value) diff --git a/setup.py b/setup.py index a5ff0e82f..daeae8e23 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def read_version(package): install_requires = [ 'clickclick>=1.2', - 'jsonschema>=2.5.1,<3.0.0', + 'jsonschema>=2.5.1', 'PyYAML>=5.1', 'requests>=2.9.1', 'six>=1.9',