From 62f3e22481145bf023cb43b95388dbcfd75a198d Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Sat, 13 Jul 2019 22:44:57 -0300 Subject: [PATCH 1/2] Deprecate scrapy.utils.datatypes.MergeDict in favor of collections.ChainMap --- scrapy/loader/processors.py | 11 +++++++---- scrapy/utils/datatypes.py | 7 +++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/scrapy/loader/processors.py b/scrapy/loader/processors.py index 468aec2cc..2acdc8093 100644 --- a/scrapy/loader/processors.py +++ b/scrapy/loader/processors.py @@ -3,10 +3,13 @@ This module provides some commonly used processors for Item Loaders. See documentation in docs/topics/loaders.rst """ +try: + from collections import ChainMap +except ImportError: + from scrapy.utils.datatypes import MergeDict as ChainMap from scrapy.utils.misc import arg_to_iter -from scrapy.utils.datatypes import MergeDict -from .common import wrap_loader_context +from scrapy.loader.common import wrap_loader_context class MapCompose(object): @@ -18,7 +21,7 @@ class MapCompose(object): def __call__(self, value, loader_context=None): values = arg_to_iter(value) if loader_context: - context = MergeDict(loader_context, self.default_loader_context) + context = ChainMap(loader_context, self.default_loader_context) else: context = self.default_loader_context wrapped_funcs = [wrap_loader_context(f, context) for f in self.functions] @@ -45,7 +48,7 @@ class Compose(object): def __call__(self, value, loader_context=None): if loader_context: - context = MergeDict(loader_context, self.default_loader_context) + context = ChainMap(loader_context, self.default_loader_context) else: context = self.default_loader_context wrapped_funcs = [wrap_loader_context(f, context) for f in self.functions] diff --git a/scrapy/utils/datatypes.py b/scrapy/utils/datatypes.py index eb373c501..fbc41f760 100644 --- a/scrapy/utils/datatypes.py +++ b/scrapy/utils/datatypes.py @@ -245,6 +245,13 @@ class MergeDict(object): first occurrence will be used. """ def __init__(self, *dicts): + if six.PY3: + warnings.warn( + "scrapy.utils.datatypes.MergeDict is deprecated in favor " + "of collections.ChainMap (introduced in Python 3.3)", + category=ScrapyDeprecationWarning, + stacklevel=2, + ) self.dicts = dicts def __getitem__(self, key): From d7074d86d26c936c6907dea7c550a4f251667d8b Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Tue, 16 Jul 2019 14:13:45 -0300 Subject: [PATCH 2/2] Change condition to raise deprecation warning --- scrapy/utils/datatypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy/utils/datatypes.py b/scrapy/utils/datatypes.py index fbc41f760..231234e3d 100644 --- a/scrapy/utils/datatypes.py +++ b/scrapy/utils/datatypes.py @@ -245,7 +245,7 @@ class MergeDict(object): first occurrence will be used. """ def __init__(self, *dicts): - if six.PY3: + if not six.PY2: warnings.warn( "scrapy.utils.datatypes.MergeDict is deprecated in favor " "of collections.ChainMap (introduced in Python 3.3)",