Skip to content

Commit

Permalink
Merge pull request #25 from rodcloutier/list_files_support
Browse files Browse the repository at this point in the history
Added support to list files in the Storage bucket
  • Loading branch information
noirbizarre committed May 15, 2017
2 parents 14fe798 + ac93069 commit 4786d0f
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Current
- Improved backend documentation
- Use setuptools entry points to register backends.
- Added `NONE` extensions specification
- Added `list_files` to `Storage` to list the current bucket files

0.3.0 (2017-03-05)
------------------
Expand Down
4 changes: 4 additions & 0 deletions flask_fs/backends/gridfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ def delete(self, filename):
for version in self.fs.find({'filename': filename}):
self.fs.delete(version._id)

def list_files(self):
for f in self.fs.list():
yield f

def serve(self, filename):
file = self.fs.get_last_version(filename)
return send_file(file, mimetype=file.content_type)
5 changes: 5 additions & 0 deletions flask_fs/backends/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ def save(self, file_or_wfs, filename):
copyfileobj(file_or_wfs, out)
return filename

def list_files(self):
for dirpath, dirnames, filenames in os.walk(self.root):
for f in filenames:
yield f

def path(self, filename):
'''Return the full path for a given filename in the storage'''
return os.path.join(self.root, filename)
Expand Down
4 changes: 4 additions & 0 deletions flask_fs/backends/s3.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ def write(self, filename, content):
def delete(self, filename):
self.bucket.Object(filename).delete()

def list_files(self):
for f in self.bucket.objects.all():
yield f.key

# def serve(self, filename):
# file = self.fs.get_last_version(filename)
# return send_file(file, mimetype=file.content_type)
5 changes: 5 additions & 0 deletions flask_fs/backends/swift.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,8 @@ def write(self, filename, content):

def delete(self, filename):
self.conn.delete_object(self.name, filename)

def list_files(self):
headers, items = self.conn.get_container(self.name)
for i in items:
yield i['name']
6 changes: 6 additions & 0 deletions flask_fs/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,12 @@ def save(self, file_or_wfs, filename=None, prefix=None, overwrite=None):

return filename

def list_files(self):
'''
Returns a filename generator to iterate through all the file in the storage bucket
'''
return self.backend.list_files()

def __contains__(self, value):
return self.exists(value)

Expand Down
7 changes: 7 additions & 0 deletions tests/test_backend_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,10 @@ def test_save_with_filename(self, faker, utils):
self.backend.save(storage, filename)

self.assert_text_equal(filename, content)

def test_list_files(self, faker, utils):
for f in ['first.test', 'second.test']:
content = six.text_type(faker.sentence())
self.put_file(f, content)

assert sorted(list(self.backend.list_files())) == ['first.test', 'second.test']
10 changes: 10 additions & 0 deletions tests/test_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -409,3 +409,13 @@ def test_path_not_supported(app, mock_backend):

with pytest.raises(fs.OperationNotSupported):
storage.path('file.test')


def test_list_files(app, mock_backend):
storage = fs.Storage('test')
backend = mock_backend.return_value
backend.list_files.return_value = ['one.txt']

app.configure(storage)

assert storage.list_files() == ['one.txt']
6 changes: 5 additions & 1 deletion tests/test_swift_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,13 @@ def setup(self):
yield

try:
headers, items = self.conn.get_container(self.backend.name)
for i in items:
self.conn.delete_object(self.backend.name, i['name'])

self.conn.delete_container(self.backend.name)
except swiftclient.ClientException as e:
print(e)
assert False, "Failed to delete container ->" + str(e)

def put_file(self, filename, content):
self.conn.put_object(self.container, filename, contents=content)
Expand Down

0 comments on commit 4786d0f

Please sign in to comment.