CallbackKeywordArgumentsContract

This commit is contained in:
Eugenio Lacuesta 2019-08-28 18:28:31 -03:00
parent ede91478e5
commit b6b76df057
No known key found for this signature in database
GPG Key ID: DA3EF2D0913E9810
3 changed files with 22 additions and 5 deletions

View File

@ -92,7 +92,7 @@ class ContractsManager(object):
@wraps(cb)
def cb_wrapper(response):
try:
output = cb(response)
output = cb(response, **request.cb_kwargs)
output = list(iterate_spider_output(output))
except Exception:
case = _create_testcase(method, 'callback')
@ -133,7 +133,7 @@ class Contract(object):
else:
results.addSuccess(self.testcase_pre)
finally:
return list(iterate_spider_output(cb(response)))
return list(iterate_spider_output(cb(response, **request.cb_kwargs)))
request.callback = wrapper
@ -145,7 +145,7 @@ class Contract(object):
@wraps(cb)
def wrapper(response):
output = list(iterate_spider_output(cb(response)))
output = list(iterate_spider_output(cb(response, **request.cb_kwargs)))
try:
results.startTest(self.testcase_post)
self.post_process(output)

View File

@ -1,3 +1,5 @@
import json
from scrapy.item import BaseItem
from scrapy.http import Request
from scrapy.exceptions import ContractFail
@ -18,6 +20,20 @@ class UrlContract(Contract):
return args
class CallbackKeywordArgumentsContract(Contract):
""" Contract to set the keyword arguments for the request.
The value should be a JSON-encoded dictionary, e.g.:
@cb_kwargs {"arg1": "some value"}
"""
name = 'cb_kwargs'
def adjust_request_args(self, args):
args['cb_kwargs'] = json.loads(' '.join(self.args))
return args
class ReturnsContract(Contract):
""" Contract to check the output of a callback

View File

@ -291,6 +291,7 @@ TELNETCONSOLE_PASSWORD = None
SPIDER_CONTRACTS = {}
SPIDER_CONTRACTS_BASE = {
'scrapy.contracts.default.UrlContract': 1,
'scrapy.contracts.default.ReturnsContract': 2,
'scrapy.contracts.default.ScrapesContract': 3,
'scrapy.contracts.default.CallbackKeywordArgumentsContract': 2,
'scrapy.contracts.default.ReturnsContract': 3,
'scrapy.contracts.default.ScrapesContract': 4,
}