From 0831e5228570b63553f54c773870fb3f338de032 Mon Sep 17 00:00:00 2001 From: Steven Loria Date: Sat, 14 Sep 2019 14:20:14 -0400 Subject: [PATCH] Address all collections.abc DeprecationWarnings --- flex/_compat.py | 5 +++++ flex/constants.py | 6 ++---- flex/core.py | 4 ++-- flex/datastructures.py | 5 +++-- flex/exceptions.py | 11 ++++++----- flex/paths.py | 3 ++- flex/utils.py | 8 ++++---- flex/validation/common.py | 5 +++-- flex/validation/schema.py | 8 ++++---- tests/core/test_load_source.py | 4 ++-- tests/utils.py | 7 ++++--- 11 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 flex/_compat.py diff --git a/flex/_compat.py b/flex/_compat.py new file mode 100644 index 0000000..a88932b --- /dev/null +++ b/flex/_compat.py @@ -0,0 +1,5 @@ +"""Python 2/3 compatibility module.""" +try: + from collections.abc import Mapping, Sequence # noqa: F401 +except ImportError: # Python 2 + from collections import Mapping, Sequence # noqa: F401 diff --git a/flex/constants.py b/flex/constants.py index 7e7292f..07aa042 100644 --- a/flex/constants.py +++ b/flex/constants.py @@ -1,12 +1,10 @@ from __future__ import unicode_literals import numbers -try: - from collections.abc import Sequence, Mapping -except ImportError: # Python 2 - from collections import Sequence, Mapping import six +from flex._compat import Sequence, Mapping + SCHEMES = ( 'http', 'https', 'ws', 'wss', diff --git a/flex/core.py b/flex/core.py index 05a74ac..de91f7e 100644 --- a/flex/core.py +++ b/flex/core.py @@ -2,7 +2,6 @@ from six.moves import urllib_parse as urlparse import os -import collections import requests from copy import deepcopy @@ -10,6 +9,7 @@ import json import yaml +from flex._compat import Mapping from flex.context_managers import ErrorDict from flex.exceptions import ValidationError from flex.loading.definitions import ( @@ -42,7 +42,7 @@ def load_source(source): - json string. - yaml string. """ - if isinstance(source, collections.Mapping): + if isinstance(source, Mapping): return deepcopy(source) elif hasattr(source, 'read') and callable(source.read): raw_source = source.read() diff --git a/flex/datastructures.py b/flex/datastructures.py index 77bca40..000a5fc 100644 --- a/flex/datastructures.py +++ b/flex/datastructures.py @@ -1,5 +1,6 @@ import collections +from flex._compat import Mapping from flex.exceptions import ( ValidationError, ErrorDict, @@ -28,7 +29,7 @@ def __init__(self, value=None): def add_validator(self, validator): if is_non_string_iterable(validator)\ - and not isinstance(validator, collections.Mapping): + and not isinstance(validator, Mapping): for value in validator: self.add_validator(value) else: @@ -50,7 +51,7 @@ class ValidationDict(collections.defaultdict): def __init__(self, validators=None): super(ValidationDict, self).__init__(ValidationList) if validators is not None: - if not isinstance(validators, collections.Mapping): + if not isinstance(validators, Mapping): raise ValueError("ValidationDict may only be instantiated with a mapping") for key, validator in validators.items(): self.add_validator(key, validator) diff --git a/flex/exceptions.py b/flex/exceptions.py index f172904..85a8542 100644 --- a/flex/exceptions.py +++ b/flex/exceptions.py @@ -3,6 +3,7 @@ import six import collections +from flex._compat import Mapping from flex.utils import ( is_non_string_iterable, prettify_errors, @@ -37,7 +38,7 @@ def add_error(self, error): Otherwise, the value is appended. """ - if is_non_string_iterable(error) and not isinstance(error, collections.Mapping): + if is_non_string_iterable(error) and not isinstance(error, Mapping): for value in error: self.add_error(value) else: @@ -56,13 +57,13 @@ def add_error(self, key, error): class ValidationError(ValueError): def __init__(self, error): - if not isinstance(error, collections.Mapping) and \ + if not isinstance(error, Mapping) and \ is_non_string_iterable(error) and \ len(error) == 1: error = error[0] self._error = error - if isinstance(self._error, collections.Mapping): + if isinstance(self._error, Mapping): self.error_dict = self._error elif is_non_string_iterable(self._error): self.error_list = self._error @@ -80,7 +81,7 @@ def __str__(self): def detail(self): if isinstance(self._error, six.string_types): return [self._error] - elif isinstance(self._error, collections.Mapping): + elif isinstance(self._error, Mapping): return self._error return self._error @@ -88,7 +89,7 @@ def detail(self): def messages(self): if isinstance(self._error, six.string_types): return [self._error] - elif isinstance(self._error, collections.Mapping): + elif isinstance(self._error, Mapping): return [self._error] return self._error diff --git a/flex/paths.py b/flex/paths.py index bc04917..8104bc7 100644 --- a/flex/paths.py +++ b/flex/paths.py @@ -3,6 +3,7 @@ import functools import re +from flex._compat import Mapping from flex.exceptions import MultiplePathsFound from flex.error_messages import MESSAGES from flex.constants import ( @@ -146,7 +147,7 @@ def match_path_to_api_path(path_definitions, target_path, base_path='', """ if context is None: context = {} - assert isinstance(context, collections.Mapping) + assert isinstance(context, Mapping) if target_path.startswith(base_path): # Convert all of the api paths into Path instances for easier regex # matching. diff --git a/flex/utils.py b/flex/utils.py index fabbe62..85ddee0 100644 --- a/flex/utils.py +++ b/flex/utils.py @@ -1,5 +1,4 @@ import math -import collections import numbers from six.moves import urllib_parse as urlparse @@ -7,6 +6,7 @@ import jsonpointer +from flex._compat import Mapping, Sequence from flex.constants import ( PRIMITIVE_TYPES, NULL, @@ -43,7 +43,7 @@ def is_non_string_iterable(value): def pluralize(value): - if is_non_string_iterable(value) and not isinstance(value, collections.Mapping): + if is_non_string_iterable(value) and not isinstance(value, Mapping): return value return [value] @@ -127,7 +127,7 @@ def get_type_for_value(value): def is_single_item_iterable(value): if is_non_string_iterable(value): - if isinstance(value, collections.Sequence): + if isinstance(value, Sequence): if len(value) == 1: return True return False @@ -161,7 +161,7 @@ def format_errors(errors, indent=0, prefix='', suffix=''): if isinstance(errors, SINGULAR_TYPES): yield indent_message(repr(errors), indent, prefix=prefix, suffix=suffix) - elif isinstance(errors, collections.Mapping): + elif isinstance(errors, Mapping): for key, value in errors.items(): assert isinstance(key, SINGULAR_TYPES), type(key) if isinstance(value, SINGULAR_TYPES): diff --git a/flex/validation/common.py b/flex/validation/common.py index 3526bf9..eb64c54 100644 --- a/flex/validation/common.py +++ b/flex/validation/common.py @@ -11,6 +11,7 @@ import six +from flex._compat import Mapping, Sequence from flex.exceptions import ( ValidationError, ErrorDict, @@ -458,11 +459,11 @@ def generate_value_processor(type_, collectionFormat=None, items=None, **kwargs) # strip off any whitespace processors.append(functools.partial(map, operator.methodcaller('strip'))) if items is not None: - if isinstance(items, collections.Mapping): + if isinstance(items, Mapping): items_processors = itertools.repeat( generate_value_processor(**items) ) - elif isinstance(items, collections.Sequence): + elif isinstance(items, Sequence): items_processors = itertools.chain( (generate_value_processor(**item) for item in items), itertools.repeat(lambda v: v), diff --git a/flex/validation/schema.py b/flex/validation/schema.py index 5eefe9a..ff41a7b 100644 --- a/flex/validation/schema.py +++ b/flex/validation/schema.py @@ -1,9 +1,9 @@ import itertools -import collections import functools import six +from flex._compat import Mapping, Sequence from flex.exceptions import ( ValidationError, ErrorList, @@ -93,7 +93,7 @@ def generate_max_properties_validator(maxProperties, **kwargs): def construct_items_validators(items, context): - if isinstance(items, collections.Mapping): + if isinstance(items, Mapping): items_validators = construct_schema_validators( schema=items, context=context, @@ -126,7 +126,7 @@ def validate_items(objs, field_validators, **kwargs): def generate_items_validator(items, context, **kwargs): - if isinstance(items, collections.Mapping): + if isinstance(items, Mapping): # If items is a reference or a schema, we pass it through as an # ever repeating list of the same validation dictionary, thus # validating all of the objects against the same schema. @@ -134,7 +134,7 @@ def generate_items_validator(items, context, **kwargs): items, context, )) - elif isinstance(items, collections.Sequence): + elif isinstance(items, Sequence): # We generate a list of validator dictionaries and then chain it # with an empty schema that repeats forever. This ensures that if # the array of objects to be validated is longer than the array of diff --git a/tests/core/test_load_source.py b/tests/core/test_load_source.py index f218e9e..aa14053 100644 --- a/tests/core/test_load_source.py +++ b/tests/core/test_load_source.py @@ -1,13 +1,13 @@ from __future__ import unicode_literals import tempfile -import collections import six import json import yaml +from flex._compat import Mapping from flex.core import load_source @@ -105,7 +105,7 @@ def test_url(httpbin): } source = httpbin.url + '/get' result = load_source(source) - assert isinstance(result, collections.Mapping) + assert isinstance(result, Mapping) result.pop('headers') result.pop('url') assert result == native diff --git a/tests/utils.py b/tests/utils.py index 979f9d8..2a461a8 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,7 +1,8 @@ import functools -import collections import re import six + +from flex._compat import Mapping from flex.validation.common import validate_object from flex.loading.schema.paths.path_item.operation.responses.single.schema import ( schema_validator, @@ -57,7 +58,7 @@ def _find_message_in_errors(message, errors, namespace=''): if isinstance(errors, six.string_types): if check_if_error_message_equal(errors, message): yield namespace - elif isinstance(errors, collections.Mapping): + elif isinstance(errors, Mapping): for key, error in errors.items(): for match in _find_message_in_errors( message, @@ -124,7 +125,7 @@ def assert_message_not_in_errors(message, errors): def _enumerate_error_paths(errors, namespace=''): if isinstance(errors, six.string_types): yield namespace - elif isinstance(errors, collections.Mapping): + elif isinstance(errors, Mapping): for key, error in errors.items(): for match in _enumerate_error_paths( error,