Adding a copy_locally() method to the StorageInterface and giving it a test.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Sat, 11 Jun 2011 17:04:30 +0000 (12:04 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Sat, 11 Jun 2011 17:04:30 +0000 (12:04 -0500)
mediagoblin/storage.py
mediagoblin/tests/test_storage.py

index 685039b2745210ce433bd943a60dc0c27f35d03d..ba6ac0173d5d46811e64ca9e217b5409f469eba6 100644 (file)
@@ -16,6 +16,7 @@
 
 import os
 import re
+import shutil
 import urlparse
 import uuid
 
@@ -141,6 +142,24 @@ class StorageInterface(object):
         # Subclasses should override this method, if applicable.
         self.__raise_not_implemented()
 
+    def copy_locally(self, filepath, dest_path):
+        """
+        Copy this file locally.
+
+        A basic working method for this is provided that should
+        function both for local_storage systems and remote storge
+        systems, but if more efficient systems for copying locally
+        apply to your system, override this method with something more
+        appropriate.
+        """
+        if self.local_storage:
+            shutil.copy(
+                self.get_local_path(filepath), dest_path)
+        else:
+            with self.get_file(filepath, 'rb') as source_file:
+                with file(dest_path, 'wb') as dest_file:
+                    dest_file.write(source_file.read())
+
 
 class BasicFileStorage(StorageInterface):
     """
@@ -272,3 +291,5 @@ def storage_system_from_paste_config(paste_config, storage_prefix):
 
     storage_class = util.import_component(storage_class)
     return storage_class(**config_params)
+
+
index 5efed405cb4397caef01f123d270a75d9b6d93f4..83f893f1bda56395c8088d9707cf4cbe22633fad 100644 (file)
@@ -231,3 +231,19 @@ def test_basic_storage_get_local_path():
 def test_basic_storage_is_local():
     tmpdir, this_storage = get_tmp_filestorage()
     assert this_storage.local_storage is True
+
+
+def test_basic_storage_copy_locally():
+    tmpdir, this_storage = get_tmp_filestorage()
+
+    dest_tmpdir = tempfile.mkdtemp()
+
+    filepath = ['dir1', 'dir2', 'ourfile.txt']
+    with this_storage.get_file(filepath, 'w') as our_file:
+        our_file.write('Testing this file')
+
+    new_file_dest = os.path.join(dest_tmpdir, 'file2.txt')
+
+    this_storage.copy_locally(filepath, new_file_dest)
+    
+    assert file(new_file_dest).read() == 'Testing this file'