diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2011-09-05 21:14:22 -0500 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2011-09-05 21:14:22 -0500 |
commit | 949c7afd3762137b24c8a5e0c6cc6101de37eda7 (patch) | |
tree | c53beb11a0fd7b04dfced820380e56eb2f791b96 | |
parent | e8b517924ea5586c3249e4fbcf8b96c4dbeba49a (diff) | |
parent | 213285cd856359ad4429af8b2b93614eb6709558 (diff) | |
download | mediagoblin-949c7afd3762137b24c8a5e0c6cc6101de37eda7.tar.lz mediagoblin-949c7afd3762137b24c8a5e0c6cc6101de37eda7.tar.xz mediagoblin-949c7afd3762137b24c8a5e0c6cc6101de37eda7.zip |
Merge remote branch 'remotes/jwandborg/f571_closing_storage_objects'
-rw-r--r-- | mediagoblin/process_media/__init__.py | 19 | ||||
-rw-r--r-- | mediagoblin/storage.py | 31 |
2 files changed, 34 insertions, 16 deletions
diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index db913f5f..2b9eed6e 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -16,7 +16,6 @@ import Image -from contextlib import contextmanager from celery.task import Task from celery import registry @@ -36,14 +35,6 @@ def create_pub_filepath(entry, filename): filename]) -@contextmanager -def closing(callback): - try: - yield callback - finally: - pass - - ################################ # Media processing initial steps ################################ @@ -66,7 +57,7 @@ class ProcessMedia(Task): except BaseProcessingFail, exc: mark_entry_failed(entry[u'_id'], exc) return - + entry['state'] = u'processed' entry.save() @@ -144,7 +135,7 @@ def process_image(entry): thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg') thumb_file = mgg.public_store.get_file(thumb_filepath, 'w') - with closing(thumb_file): + with thumb_file: thumb.save(thumb_file, "JPEG", quality=90) # If the size of the original file exceeds the specified size of a `medium` @@ -162,7 +153,7 @@ def process_image(entry): medium_filepath = create_pub_filepath(entry, 'medium.jpg') medium_file = mgg.public_store.get_file(medium_filepath, 'w') - with closing(medium_file): + with medium_file: medium.save(medium_file, "JPEG", quality=90) medium_processed = True @@ -172,8 +163,8 @@ def process_image(entry): with queued_file: original_filepath = create_pub_filepath(entry, queued_filepath[-1]) - - with closing(mgg.public_store.get_file(original_filepath, 'wb')) as original_file: + + with mgg.public_store.get_file(original_filepath, 'wb') as original_file: original_file.write(queued_file.read()) mgg.queue_store.delete_file(queued_filepath) diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py index e3df72be..f9563031 100644 --- a/mediagoblin/storage.py +++ b/mediagoblin/storage.py @@ -291,7 +291,7 @@ class CloudFilesStorage(StorageInterface): if mimetype: obj.content_type = mimetype[0] - return StorageObjectWrapper(obj, *args, **kwargs) + return CloudFilesStorageObjectWrapper(obj, *args, **kwargs) def delete_file(self, filepath): # TODO: Also delete unused directories if empty (safely, with @@ -305,7 +305,7 @@ class CloudFilesStorage(StorageInterface): self._resolve_filepath(filepath)]) -class StorageObjectWrapper(): +class CloudFilesStorageObjectWrapper(): """ Wrapper for python-cloudfiles's cloudfiles.storage_object.Object used to circumvent the mystic `medium.jpg` corruption issue, where @@ -322,11 +322,38 @@ class StorageObjectWrapper(): return self.storage_object.read(*args, **kwargs) def write(self, data, *args, **kwargs): + """ + write data to the cloudfiles storage object + + The original motivation for this wrapper is to ensure + that buffered writing to a cloudfiles storage object does not overwrite + any preexisting data. + + Currently this method does not support any write modes except "append". + However if we should need it it would be easy implement. + """ if self.storage_object.size and type(data) == str: data = self.read() + data self.storage_object.write(data, *args, **kwargs) + def close(self): + pass + + def __enter__(self): + """ + Context Manager API implementation + http://docs.python.org/library/stdtypes.html#context-manager-types + """ + return self + + def __exit__(self, *exc_info): + """ + Context Manger API implementation + see self.__enter__() + """ + self.close() + # ------------ # MountStorage |