Change FilesPipeline class attributes to instance attributes.

modified:   scrapy/pipelines/files.py
	modified:   tests/test_pipeline_files.py
This commit is contained in:
djunzu 2016-03-31 19:20:39 -03:00
parent c7fc17866f
commit 8228a0c491
2 changed files with 16 additions and 10 deletions

View File

@ -22,6 +22,7 @@ except ImportError:
from twisted.internet import defer, threads
from scrapy.pipelines.media import MediaPipeline
from scrapy.settings import Settings
from scrapy.exceptions import NotConfigured, IgnoreRequest
from scrapy.http import Request
from scrapy.utils.misc import md5sum
@ -219,10 +220,18 @@ class FilesPipeline(MediaPipeline):
's3': S3FilesStore,
}
def __init__(self, store_uri, download_func=None):
def __init__(self, store_uri, download_func=None, settings=None):
if not store_uri:
raise NotConfigured
if isinstance(settings, dict) or settings is None:
settings = Settings(settings)
self.store = self._get_store(store_uri)
self.expires = settings.getint('FILES_EXPIRES')
self.files_urls_field = settings.get('FILES_URLS_FIELD')
self.files_result_field = settings.get('FILES_RESULT_FIELD')
super(FilesPipeline, self).__init__(download_func=download_func)
@classmethod
@ -232,11 +241,8 @@ class FilesPipeline(MediaPipeline):
s3store.AWS_SECRET_ACCESS_KEY = settings['AWS_SECRET_ACCESS_KEY']
s3store.POLICY = settings['FILES_STORE_S3_ACL']
cls.FILES_URLS_FIELD = settings.get('FILES_URLS_FIELD')
cls.FILES_RESULT_FIELD = settings.get('FILES_RESULT_FIELD')
cls.EXPIRES = settings.getint('FILES_EXPIRES')
store_uri = settings['FILES_STORE']
return cls(store_uri)
return cls(store_uri, settings=settings)
def _get_store(self, uri):
if os.path.isabs(uri): # to support win32 paths like: C:\\some\dir
@ -257,7 +263,7 @@ class FilesPipeline(MediaPipeline):
age_seconds = time.time() - last_modified
age_days = age_seconds / 60 / 60 / 24
if age_days > self.EXPIRES:
if age_days > self.expires:
return # returning None force download
referer = referer_str(request)
@ -356,7 +362,7 @@ class FilesPipeline(MediaPipeline):
### Overridable Interface
def get_media_requests(self, item, info):
return [Request(x) for x in item.get(self.FILES_URLS_FIELD, [])]
return [Request(x) for x in item.get(self.files_urls_field, [])]
def file_downloaded(self, response, request, info):
path = self.file_path(request, response=response, info=info)
@ -367,8 +373,8 @@ class FilesPipeline(MediaPipeline):
return checksum
def item_completed(self, results, item, info):
if isinstance(item, dict) or self.FILES_RESULT_FIELD in item.fields:
item[self.FILES_RESULT_FIELD] = [x for ok, x in results if ok]
if isinstance(item, dict) or self.files_result_field in item.fields:
item[self.files_result_field] = [x for ok, x in results if ok]
return item
def file_path(self, request, response=None, info=None):

View File

@ -91,7 +91,7 @@ class FilesPipelineTestCase(unittest.TestCase):
patchers = [
mock.patch.object(FSFilesStore, 'stat_file', return_value={
'checksum': 'abc',
'last_modified': time.time() - (FilesPipeline.EXPIRES * 60 * 60 * 24 * 2)}),
'last_modified': time.time() - (self.pipeline.expires * 60 * 60 * 24 * 2)}),
mock.patch.object(FilesPipeline, 'get_media_requests',
return_value=[_prepare_request_object(item_url)]),
mock.patch.object(FilesPipeline, 'inc_stats', return_value=True)