From 142a6e06405ba0e0e622ce1de652f50394b8b522 Mon Sep 17 00:00:00 2001 From: Aditya Bhardwaj <0023aditya@gmail.com> Date: Thu, 8 Feb 2018 12:22:59 +0530 Subject: [PATCH] Add support for strict type validation --- jsonschema/_validators.py | 21 ++++++++++++++++++++- jsonschema/validators.py | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/jsonschema/_validators.py b/jsonschema/_validators.py index d0baec812..b3e758e08 100644 --- a/jsonschema/_validators.py +++ b/jsonschema/_validators.py @@ -286,8 +286,27 @@ def extends_draft3(validator, extends, instance, schema): def type_draft4(validator, types, instance, schema): types = _utils.ensure_list(types) + pass_strict_validation = any(validator.is_type(instance, type) for type in types) - if not any(validator.is_type(instance, type) for type in types): + if validator.strict_validation: + if not pass_strict_validation: + yield ValidationError(_utils.types_msg(instance, types)) + return + + is_int = is_float = False + if 'integer' in types: + try: + is_int = any(validator.is_type(int(instance), type) for type in types) + except (ValueError, TypeError): + pass + + if 'number' in types: + try: + is_float = any(validator.is_type(float(instance), type) for type in types) + except (ValueError, TypeError): + pass + + if not pass_strict_validation and not is_int and not is_float: yield ValidationError(_utils.types_msg(instance, types)) diff --git a/jsonschema/validators.py b/jsonschema/validators.py index c35d669b8..de72b18ef 100644 --- a/jsonschema/validators.py +++ b/jsonschema/validators.py @@ -211,6 +211,7 @@ def __init__( types=(), resolver=None, format_checker=None, + strict_validation=True, ): if types: warn( @@ -233,6 +234,7 @@ def __init__( self.resolver = resolver self.format_checker = format_checker self.schema = schema + self.strict_validation = strict_validation @classmethod def check_schema(cls, schema):