From ffad8e08e727162e05f3f791b615d2b67bb6725a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Fri, 27 Aug 2010 13:45:14 -0300 Subject: [PATCH] Support passing all keyword arguments to ExecutionQueue append_spider_name and append_url --- scrapy/queue.py | 12 ++++++++---- scrapy/tests/test_core_queue.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/scrapy/queue.py b/scrapy/queue.py index 17ba27272..89a95e381 100644 --- a/scrapy/queue.py +++ b/scrapy/queue.py @@ -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) diff --git a/scrapy/tests/test_core_queue.py b/scrapy/tests/test_core_queue.py index 6d1b37d85..38a294ad6 100644 --- a/scrapy/tests/test_core_queue.py +++ b/scrapy/tests/test_core_queue.py @@ -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)