From 882dfcefa5187f332e7469c90b15f3464cff1bca Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Tue, 10 Dec 2019 19:21:13 +0530 Subject: [PATCH 1/2] Import ABC from collections.abc for Python 3.9 compatibility. --- moto/cloudformation/parsing.py | 5 +++-- moto/compat.py | 5 +++++ moto/datapipeline/utils.py | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/moto/cloudformation/parsing.py b/moto/cloudformation/parsing.py index 77e3c271..6a9504cf 100644 --- a/moto/cloudformation/parsing.py +++ b/moto/cloudformation/parsing.py @@ -11,6 +11,7 @@ from moto.awslambda import models as lambda_models from moto.batch import models as batch_models from moto.cloudwatch import models as cloudwatch_models from moto.cognitoidentity import models as cognitoidentity_models +from moto.compat import collections_abc from moto.datapipeline import models as datapipeline_models from moto.dynamodb2 import models as dynamodb2_models from moto.ec2 import models as ec2_models @@ -404,7 +405,7 @@ def parse_output(output_logical_id, output_json, resources_map): return output -class ResourceMap(collections.Mapping): +class ResourceMap(collections_abc.Mapping): """ This is a lazy loading map for resources. This allows us to create resources without needing to create a full dependency tree. Upon creation, each @@ -633,7 +634,7 @@ class ResourceMap(collections.Mapping): raise last_exception -class OutputMap(collections.Mapping): +class OutputMap(collections_abc.Mapping): def __init__(self, resources, template, stack_id): self._template = template self._stack_id = stack_id diff --git a/moto/compat.py b/moto/compat.py index d7f5ab5e..a2bf7b0e 100644 --- a/moto/compat.py +++ b/moto/compat.py @@ -3,3 +3,8 @@ try: except ImportError: # python 2.6 or earlier, use backport from ordereddict import OrderedDict # noqa + +try: + import collections.abc as collections_abc +except ImportError: + import collections as collections_abc diff --git a/moto/datapipeline/utils.py b/moto/datapipeline/utils.py index 9135181e..b14fe6f1 100644 --- a/moto/datapipeline/utils.py +++ b/moto/datapipeline/utils.py @@ -1,5 +1,5 @@ -import collections import six +from moto.compat import collections_abc from moto.core.utils import get_random_hex @@ -8,13 +8,13 @@ def get_random_pipeline_id(): def remove_capitalization_of_dict_keys(obj): - if isinstance(obj, collections.Mapping): + if isinstance(obj, collections_abc.Mapping): result = obj.__class__() for key, value in obj.items(): normalized_key = key[:1].lower() + key[1:] result[normalized_key] = remove_capitalization_of_dict_keys(value) return result - elif isinstance(obj, collections.Iterable) and not isinstance( + elif isinstance(obj, collections_abc.Iterable) and not isinstance( obj, six.string_types ): result = obj.__class__() From af853dc48f8fba80e923c1c96f91b79fbc0bcfd7 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Tue, 17 Dec 2019 21:35:52 +0530 Subject: [PATCH 2/2] Fix linter errors. --- moto/cloudformation/parsing.py | 1 - moto/compat.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/moto/cloudformation/parsing.py b/moto/cloudformation/parsing.py index 6a9504cf..50bce517 100644 --- a/moto/cloudformation/parsing.py +++ b/moto/cloudformation/parsing.py @@ -1,5 +1,4 @@ from __future__ import unicode_literals -import collections import functools import logging import copy diff --git a/moto/compat.py b/moto/compat.py index a2bf7b0e..c0acd28a 100644 --- a/moto/compat.py +++ b/moto/compat.py @@ -5,6 +5,6 @@ except ImportError: from ordereddict import OrderedDict # noqa try: - import collections.abc as collections_abc + import collections.abc as collections_abc # noqa except ImportError: - import collections as collections_abc + import collections as collections_abc # noqa