From 58f5565357ed532970772cd55c2d17d1e00198a9 Mon Sep 17 00:00:00 2001 From: Eugenio Lacuesta Date: Thu, 11 Oct 2018 11:23:12 -0300 Subject: [PATCH] Move MutableChain to scrapy.utils.python --- scrapy/core/spidermw.py | 21 +-------------------- scrapy/utils/python.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/scrapy/core/spidermw.py b/scrapy/core/spidermw.py index 4268c91d6..d776430e5 100644 --- a/scrapy/core/spidermw.py +++ b/scrapy/core/spidermw.py @@ -11,32 +11,13 @@ from scrapy.exceptions import _InvalidOutput from scrapy.middleware import MiddlewareManager from scrapy.utils.defer import mustbe_deferred from scrapy.utils.conf import build_component_list +from scrapy.utils.python import MutableChain def _isiterable(possible_iterator): return hasattr(possible_iterator, '__iter__') -class MutableChain: - """ - Thin wrapper around itertools.chain, allowing to add iterables "in-place" - """ - def __init__(self, *args): - self.data = chain(*args) - - def extend(self, *iterables): - self.data = chain(self.data, *iterables) - - def __iter__(self): - return self.data.__iter__() - - def __next__(self): # py3 - return self.data.__next__() - - def next(self): # py2 - return self.data.next() - - class SpiderMiddlewareManager(MiddlewareManager): component_name = 'spider middleware' diff --git a/scrapy/utils/python.py b/scrapy/utils/python.py index 732ca13a0..7971b4dde 100644 --- a/scrapy/utils/python.py +++ b/scrapy/utils/python.py @@ -9,6 +9,7 @@ import weakref import errno import six from functools import partial, wraps +from itertools import chain import sys from scrapy.utils.decorators import deprecated @@ -387,3 +388,23 @@ if hasattr(sys, "pypy_version_info"): else: def garbage_collect(): gc.collect() + + +class MutableChain(object): + """ + Thin wrapper around itertools.chain, allowing to add iterables "in-place" + """ + def __init__(self, *args): + self.data = chain(*args) + + def extend(self, *iterables): + self.data = chain(self.data, *iterables) + + def __iter__(self): + return self.data.__iter__() + + def __next__(self): # py3 + return self.data.__next__() + + def next(self): # py2 + return self.data.next()