Support passing all keyword arguments to ExecutionQueue append_spider_name and append_url

This commit is contained in:
Pablo Hoffman 2010-08-27 13:45:14 -03:00
parent 4eb0383dd2
commit ffad8e08e7
2 changed files with 22 additions and 4 deletions

View File

@ -57,25 +57,29 @@ class ExecutionQueue(object):
if spider:
self.spider_requests.append((spider, [request]))
def append_url(self, url, spider=None, **kwargs):
def append_url(self, url=None, spider=None, **kwargs):
"""Append a URL to crawl with the given spider. If the spider is not
given, a spider will be looked up based on the URL
"""
if url is None:
raise ValueError("A url is required")
if spider is None:
spider = self._spiders.create_for_request(Request(url), **kwargs)
if spider:
requests = arg_to_iter(spider.make_requests_from_url(url))
self.spider_requests.append((spider, requests))
def append_spider_name(self, spider_name, **spider_kwargs):
def append_spider_name(self, name=None, **spider_kwargs):
"""Append a spider to crawl given its name and optional arguments,
which are used to instantiate it. The SpiderManager is used to lookup
the spider
"""
if name is None:
raise ValueError("A spider name is required")
try:
spider = self._spiders.create(spider_name, **spider_kwargs)
spider = self._spiders.create(name, **spider_kwargs)
except KeyError:
log.msg('Unable to find spider: %s' % spider_name, log.ERROR)
log.msg('Unable to find spider: %s' % name, log.ERROR)
else:
self.append_spider(spider)

View File

@ -71,6 +71,14 @@ class ExecutionQueueTest(unittest.TestCase):
self._assert_request_urls(self.queue.spider_requests[0][1], \
['http://www.example.com/asd/make1', 'http://www.example.com/asd/make2'])
def test_append_url_kwarg(self):
spider = TestSpider()
url = 'http://www.example.com/asd'
self.queue.append_url(url=url, spider=spider)
self.assert_(self.queue.spider_requests[0][0] is spider)
self._assert_request_urls(self.queue.spider_requests[0][1], \
['http://www.example.com/asd/make1', 'http://www.example.com/asd/make2'])
def test_append_url2(self):
url = 'http://www.example.com/asd'
self.queue.append_url(url, arg='123')
@ -86,6 +94,12 @@ class ExecutionQueueTest(unittest.TestCase):
self.assert_(spider.name == 'test123')
self.assert_(spider.arg == '123')
def test_append_spider_name_kwarg(self):
self.queue.append_spider_name(name='test123', arg='123')
spider = self.queue.spider_requests[0][0]
self.assert_(spider.name == 'test123')
self.assert_(spider.arg == '123')
def _assert_request_urls(self, requests, urls):
assert all(isinstance(x, Request) for x in requests)
self.assertEqual([x.url for x in requests], urls)