Merge pull request #1148 from Curita/verify-spidermanager-interface

Verify SPIDER_MANAGER_CLASS interface while loading it in CrawlerRunner
This commit is contained in:
Pablo Hoffman 2015-04-13 14:25:32 -03:00
commit 71c0aface7
2 changed files with 20 additions and 0 deletions

View File

@ -3,9 +3,11 @@ import signal
import warnings
from twisted.internet import reactor, defer
from zope.interface.verify import verifyClass
from scrapy.core.engine import ExecutionEngine
from scrapy.resolver import CachingThreadedResolver
from scrapy.interfaces import ISpiderManager
from scrapy.extension import ExtensionManager
from scrapy.signalmanager import SignalManager
from scrapy.exceptions import ScrapyDeprecationWarning
@ -78,6 +80,7 @@ class CrawlerRunner(object):
def __init__(self, settings):
self.settings = settings
smcls = load_object(settings['SPIDER_MANAGER_CLASS'])
verifyClass(ISpiderManager, smcls)
self.spiders = smcls.from_settings(settings.frozencopy())
self.crawlers = set()
self._active = set()

View File

@ -2,6 +2,7 @@ import warnings
import unittest
from twisted.internet import defer
from zope.interface.verify import DoesNotImplement
from scrapy.crawler import Crawler, CrawlerRunner
from scrapy.settings import Settings
@ -42,3 +43,19 @@ class CrawlerTestCase(unittest.TestCase):
self.assertFalse(settings.frozen)
self.assertTrue(crawler.settings.frozen)
def SpiderManagerWithWrongInterface(object):
def unneeded_method(self):
pass
class CrawlerRunnerTestCase(unittest.TestCase):
def test_spider_manager_verify_interface(self):
settings = Settings({
'SPIDER_MANAGER_CLASS': 'tests.test_crawler.SpiderManagerWithWrongInterface'
})
with self.assertRaises(DoesNotImplement):
CrawlerRunner(settings)