From 9e59f4713391c5b84c8563802e19263cf49c7b9d Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Fri, 2 Oct 2020 18:27:05 -0400 Subject: [PATCH 1/3] Use much faster TypeChecker --- libcove/lib/common.py | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/libcove/lib/common.py b/libcove/lib/common.py index aea125a..9b09dc6 100644 --- a/libcove/lib/common.py +++ b/libcove/lib/common.py @@ -4,10 +4,12 @@ import fcntl import functools import json +import numbers import os import re from collections import OrderedDict -from urllib.parse import urljoin, urlparse +from urllib.parse import urljoin, urlparse, urlsplit +from urllib.request import urlopen import jsonref import jsonschema.validators @@ -18,16 +20,41 @@ from flattentool.schema import get_property_type_set from jsonschema import FormatChecker, RefResolver from jsonschema._utils import uniq -from jsonschema.compat import urlopen, urlsplit -from jsonschema.exceptions import ValidationError +from jsonschema.exceptions import UndefinedTypeCheck, ValidationError from .exceptions import cove_spreadsheet_conversion_error from .tools import decimal_default, get_request + +class TypeChecker: + def is_type(self, instance, type): + if type == "object": + return isinstance(instance, dict) + if type == "string": + return isinstance(instance, str) + if type == "array": + return isinstance(instance, list) + if type == "integer": + if isinstance(instance, bool): + return False + return isinstance(instance, int) + if type == "number": + if isinstance(instance, bool): + return False + return isinstance(instance, numbers.Number) + if type == "bool": + return isinstance(instance, bool) + if type == "null": + return instance is None + raise UndefinedTypeCheck(type) + + # Because we will be changing items on this validator, it's important we take a copy! # Otherwise we could cause conflicts with other software in the same process. validator = jsonschema.validators.extend( - jsonschema.validators.Draft4Validator, validators={} + jsonschema.validators.Draft4Validator, + validators={}, + type_checker=TypeChecker(), ) uniqueItemsValidator = validator.VALIDATORS.pop("uniqueItems") From 2605a6ca878fadb178a1a0baefbd7d6f7b829dca Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Fri, 2 Oct 2020 19:40:17 -0400 Subject: [PATCH 2/3] Fix "bool" to "boolean", put types in rough order of frequency --- libcove/lib/common.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libcove/lib/common.py b/libcove/lib/common.py index 9b09dc6..c638d32 100644 --- a/libcove/lib/common.py +++ b/libcove/lib/common.py @@ -28,12 +28,12 @@ class TypeChecker: def is_type(self, instance, type): - if type == "object": - return isinstance(instance, dict) if type == "string": return isinstance(instance, str) if type == "array": return isinstance(instance, list) + if type == "object": + return isinstance(instance, dict) if type == "integer": if isinstance(instance, bool): return False @@ -42,7 +42,7 @@ def is_type(self, instance, type): if isinstance(instance, bool): return False return isinstance(instance, numbers.Number) - if type == "bool": + if type == "boolean": return isinstance(instance, bool) if type == "null": return instance is None From 27f6afa8d79d43ed8f4a8f525d2155c2fd667a3e Mon Sep 17 00:00:00 2001 From: Ben Webb Date: Fri, 3 Sep 2021 16:51:33 +0100 Subject: [PATCH 3/3] integration tests: Use branch of cove-bods (As this updates the version of jsonschema used to be compatible) https://github.com/openownership/cove-bods/pull/70 --- .github/workflows/integration.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 136a0af..b102712 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,6 +31,9 @@ jobs: if: matrix.cove == 'bods' run: | git clone https://github.com/openownership/cove-bods.git + cd cove-bods + git checkout update-requirements-jsonschema + cd .. git clone https://github.com/openownership/lib-cove-bods.git - name: Install