From 5937569eb7d340bf8f1d5c93113eb91585cbe048 Mon Sep 17 00:00:00 2001 From: Mardix Date: Sun, 24 May 2015 01:00:51 -0400 Subject: [PATCH] 0.2.0 - Add extension to object_name - Use source name as object name if empty --- CHANGELOG | 3 ++ flask_cloudstorage.py | 48 ++++++++++++++++++++----------- setup.py | 3 +- tests/data/{hello,js => hello.js} | 0 tests/test_cloudstorage.py | 20 ++++++++++++- 5 files changed, 56 insertions(+), 18 deletions(-) rename tests/data/{hello,js => hello.js} (100%) diff --git a/CHANGELOG b/CHANGELOG index d45d49b..95f3dc2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.2.0 + - Add extension of original file on upload if object_name doesn't have an extension + - Use the original file name as object name, if object name is None 0.1.0 - First \ No newline at end of file diff --git a/flask_cloudstorage.py b/flask_cloudstorage.py index 186652a..0ecd655 100644 --- a/flask_cloudstorage.py +++ b/flask_cloudstorage.py @@ -30,15 +30,10 @@ ALL_EXTENSIONS = EXTENSIONS["TEXT"] \ + EXTENSIONS["AUDIO"] \ + EXTENSIONS["DATA"] -def get_filename(filename): - return os.path.splitext(filename)[0] +def get_file_name(filename): + return os.path.basename(filename) def get_file_extension(filename): - """ - Return the file extension without the dot - :param filename: - :return: - """ return os.path.splitext(filename)[1][1:].lower() def get_file_extension_type(filename): @@ -166,33 +161,53 @@ class Storage(object): meta_data=meta_data, container=self.container, driver=self.driver) - return StorageObject(obj, cloudstorage=self) + return StorageObject(obj=obj, cloudstorage=self) - def upload(self, file, object_name, + def upload(self, + file, + object_name=None, acl="private", meta_data={}, allowed_extensions=None, overwrite=False): - + """ + To upload file + :param file: + :param object_name: + :param acl: + :param meta_data: + :param allowed_extensions: + :param overwrite: + :return: StorageObject + """ extra = { "meta_data": meta_data, "acl": acl } - object_name = object_name.strip("/").strip() - - if isinstance(self.driver, LocalStorageDriver): - object_name = secure_filename(object_name) if isinstance(file, FileStorage): extension = get_file_extension(file.filename) else: extension = get_file_extension(file) + if not object_name: + if isinstance(file, FileStorage): + object_name = get_file_name(file.filename) + else: + object_name = get_file_name(file) + object_name = object_name.strip("/").strip() + if not allowed_extensions: allowed_extensions = self.allowed_extensions if extension.lower() not in allowed_extensions: raise InvalidExtensionError("Invalid file extension") + if isinstance(self.driver, LocalStorageDriver): + object_name = secure_filename(object_name) + + if get_file_extension(object_name).strip() == "": + object_name += "." + extension + if not overwrite: object_name = self._safe_object_name(object_name) @@ -226,11 +241,12 @@ class Storage(object): str A safe filenaem to use when writting the file """ - filename = get_filename(object_name) extension = get_file_extension(object_name) + filename = get_file_name(object_name) + file_name = filename.strip("." + extension) while self.object_exists(object_name): uuid = shortuuid.uuid() - object_name = "%s_%s.%s" % (filename, uuid, extension) + object_name = "%s__%s.%s" % (file_name, uuid, extension) return object_name class StorageObject(object): diff --git a/setup.py b/setup.py index dcc50a1..02dc2ab 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ from setuptools import setup, find_packages __NAME__ = "flask-CloudStorage" -__version__ = "0.1.0" +__version__ = "0.2.0" __author__ = "Mardix" __license__ = "MIT" __copyright__ = "2015" @@ -36,6 +36,7 @@ setup( include_package_data=True, packages=find_packages(), install_requires=[ + "werkzeug==0.10.1", "apache-libcloud==0.17.0", "lockfile==0.10.2", "shortuuid==0.1" diff --git a/tests/data/hello,js b/tests/data/hello.js similarity index 100% rename from tests/data/hello,js rename to tests/data/hello.js diff --git a/tests/test_cloudstorage.py b/tests/test_cloudstorage.py index 72a663f..25358c2 100644 --- a/tests/test_cloudstorage.py +++ b/tests/test_cloudstorage.py @@ -6,6 +6,7 @@ from libcloud.storage.base import (StorageDriver, from tests import config from flask_cloudstorage import (get_file_extension, get_file_extension_type, + get_file_name, Storage, StorageObject, InvalidExtensionError) @@ -36,6 +37,11 @@ def test_get_file_extension_type(): filename = "hello.mp3" assert get_file_extension_type(filename) == "AUDIO" +def test_get_file_name(): + filename = "/dir1/dir2/dir3/hello.jpg" + assert get_file_name(filename) == "hello.jpg" + + #--- app = App() @@ -112,4 +118,16 @@ def test_storage_upload(): storage.upload(CWD + "/data/hello.txt", object_name) o = storage.upload(CWD + "/data/hello.txt", object_name) assert isinstance(o, StorageObject) - assert o.name != object_name \ No newline at end of file + assert o.name != object_name + +def test_storage_upload_use_filename_name(): + storage = app_storage() + object_name = "hello.js" + o = storage.upload(CWD + "/data/hello.js", overwrite=True, allowed_extensions=["js"]) + assert o.name == object_name + +def test_storage_upload_append_extension(): + storage = app_storage() + object_name = "my-txt-hello-hello" + o = storage.upload(CWD + "/data/hello.txt", object_name, overwrite=True) + assert get_file_extension(o.name) == "txt" \ No newline at end of file