Simplified SchedulerMiddlewareManager (to be removed in Scrapy 0.11) by making it inherit from MiddlewareManager

This commit is contained in:
Pablo Hoffman 2010-09-07 13:10:49 -03:00
parent 5918d0163e
commit 23b13f0cc8
1 changed files with 13 additions and 49 deletions

View File

@ -1,58 +1,31 @@
"""
This module implements the Scheduler Middleware manager.
For more information see the Scheduler Middleware doc in:
docs/topics/scheduler-middleware.rst
Scheduler Middleware manager
TODO: To be removed in Scrapy 0.11
"""
from collections import defaultdict
from twisted.internet.defer import Deferred
from scrapy import log
from scrapy.exceptions import NotConfigured
from scrapy.utils.misc import load_object
from scrapy.middleware import MiddlewareManager
from scrapy.utils.defer import mustbe_deferred
from scrapy.utils.conf import build_component_list
from scrapy.conf import settings
class SchedulerMiddlewareManager(object):
class SchedulerMiddlewareManager(MiddlewareManager):
def __init__(self):
self.loaded = False
self.enabled = {}
self.disabled = {}
self.mw_cbs = defaultdict(list)
self.load()
component_name = 'scheduler middleware'
def load(self):
"""Load middleware defined in settings module"""
mwlist = build_component_list(settings['SCHEDULER_MIDDLEWARES_BASE'], \
settings['SCHEDULER_MIDDLEWARES'])
self.enabled.clear()
self.disabled.clear()
for mwpath in mwlist:
try:
cls = load_object(mwpath)
mw = cls()
self.enabled[cls.__name__] = mw
self._add_middleware(mw)
except NotConfigured, e:
self.disabled[cls.__name__] = mwpath
if e.args:
log.msg(e)
log.msg("Enabled scheduler middlewares: %s" % ", ".join(self.enabled.keys()), \
level=log.DEBUG)
self.loaded = True
@classmethod
def _get_mwlist_from_settings(cls, settings):
return build_component_list(settings['DOWNLOADER_MIDDLEWARES_BASE'], \
settings['DOWNLOADER_MIDDLEWARES'])
def _add_middleware(self, mw):
for name in ['enqueue_request', 'open_spider', 'close_spider']:
mwfunc = getattr(mw, name, None)
if mwfunc:
self.mw_cbs[name].append(mwfunc)
if hasattr(mw, 'enqueue_request'):
self.methods['enqueue_request'].append(mw.enqueue_request)
def enqueue_request(self, wrappedfunc, spider, request):
def _enqueue_request(request):
for mwfunc in self.mw_cbs['enqueue_request']:
for mwfunc in self.methods['enqueue_request']:
result = mwfunc(spider=spider, request=request)
assert result is None or isinstance(result, Deferred), \
'Middleware %s.enqueue_request must return None or Deferred, got %s' % \
@ -63,12 +36,3 @@ class SchedulerMiddlewareManager(object):
deferred = mustbe_deferred(_enqueue_request, request)
return deferred
def open_spider(self, spider):
for mwfunc in self.mw_cbs['open_spider']:
mwfunc(spider)
def close_spider(self, spider):
for mwfunc in self.mw_cbs['close_spider']:
mwfunc(spider)