Skip to content

Commit

Permalink
Merge pull request #9 from ecometrica/fix_bytes_content
Browse files Browse the repository at this point in the history
Fix _compute_hash if content received is bytes
  • Loading branch information
rebkwok authored Jan 16, 2018
2 parents a4e8257 + 3a0e7c0 commit 6cfa7ff
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 8 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
Release Notes
=============

2.1
-----
* Fix bug for bytes content
* Update setup.py and tox to support Django 2.0 for python version >= 3.4

2.0.1
-----
* Specify django <2.0 in setup.py
Expand Down
4 changes: 3 additions & 1 deletion django_hashedfilenamestorage/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ def _compute_hash(self, content, chunk_size=None):
data = content.read(chunk_size)
if not data:
break
hasher.update(data.encode('utf-8'))
if not isinstance(data, bytes):
data = data.encode('utf-8')
hasher.update(data)
return hasher.hexdigest()
finally:
content.seek(cursor)
Expand Down
64 changes: 62 additions & 2 deletions django_hashedfilenamestorage/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def stub_random_string(*args, **kwargs):

class HashedFilenameTestCase(TestCase):
CONTENT = 'Hello world!'
BCONTENT = b'Hello world!'
SHA1SUM = 'd3486ae9136e7856bc42212385ea797094475802'

def test_init(self):
Expand Down Expand Up @@ -91,6 +92,41 @@ def test_get_content_name(self):
'foo/%s.txt' % self.SHA1SUM
)

def test_get_bytes_content_name(self):
with media_root():
storage = HashedFilenameFileSystemStorage()
self.assertEqual(
storage._get_content_name(name='',
content=ContentFile(self.BCONTENT)),
'%s' % self.SHA1SUM
)
self.assertEqual(
storage._get_content_name(name='',
content=ContentFile(self.BCONTENT),
chunk_size=1),
'%s' % self.SHA1SUM
)
self.assertEqual(
storage._get_content_name(name='foo',
content=ContentFile(self.BCONTENT)),
'%s' % self.SHA1SUM
)
self.assertEqual(
storage._get_content_name(name='foo.txt',
content=ContentFile(self.BCONTENT)),
'%s.txt' % self.SHA1SUM
)
self.assertEqual(
storage._get_content_name(name='foo/bar',
content=ContentFile(self.BCONTENT)),
'foo/%s' % self.SHA1SUM
)
self.assertEqual(
storage._get_content_name(name='foo/bar.txt',
content=ContentFile(self.BCONTENT)),
'foo/%s.txt' % self.SHA1SUM
)

def test_compute_hash(self):
with media_root():
storage = HashedFilenameFileSystemStorage()
Expand All @@ -103,13 +139,21 @@ def test_compute_hash(self):
chunk_size=1),
self.SHA1SUM
)
self.assertEqual(
storage._compute_hash(content=ContentFile(self.BCONTENT)),
self.SHA1SUM
)
self.assertEqual(
storage._compute_hash(content=ContentFile(self.BCONTENT),
chunk_size=1),
self.SHA1SUM
)

def test_save(self):
with media_root():
storage = HashedFilenameFileSystemStorage()
name1 = storage.save('foo/bar.txt', ContentFile(self.CONTENT))
self.assertEqual(name1,
'foo/%s.txt' % self.SHA1SUM)
self.assertEqual(name1, 'foo/%s.txt' % self.SHA1SUM)
self.assertEqual(storage.open(name1, 'rt').read(), self.CONTENT)

storage.delete(name1)
Expand All @@ -121,6 +165,22 @@ def test_save(self):
self.assertEqual(name3, name1)
self.assertEqual(storage.open(name3, 'rt').read(), self.CONTENT)

def test_save_bytes_content(self):
with media_root():
storage = HashedFilenameFileSystemStorage()
name1 = storage.save('foo/bar.txt', ContentFile(self.BCONTENT))
self.assertEqual(name1, 'foo/%s.txt' % self.SHA1SUM)
self.assertEqual(storage.open(name1, 'rb').read(), self.BCONTENT)

storage.delete(name1)
name2 = storage.save('foo/bar.txt', ContentFile(self.BCONTENT))
self.assertEqual(name2, name1)
self.assertEqual(storage.open(name2, 'rb').read(), self.BCONTENT)

name3 = storage.save('foo/another.txt', ContentFile(self.BCONTENT))
self.assertEqual(name3, name1)
self.assertEqual(storage.open(name3, 'rb').read(), self.BCONTENT)


@contextmanager
def patch(namespace, **values):
Expand Down
13 changes: 11 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
#!/usr/bin/env python
import sys

from setuptools import setup


if sys.version_info < (3, 4):
install_requires = ['Django>=1.8,<2.0']
else:
install_requires = ['Django>=1.8,<2.1']


setup(
name='django-hashedfilenamestorage',
version='2.0.1',
version='2.1',
description=('A Django storage backend that names files by hash value.'),
long_description=open('README.rst', 'r').read(),
author='Ecometrica',
author_email='[email protected]',
url='http://github.com/ecometrica/django-hashedfilenamestorage/',
packages=['django_hashedfilenamestorage'],
install_requires=['Django>=1.8,<2.0'],
install_requires=install_requires,
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Web Environment',
Expand Down
7 changes: 4 additions & 3 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ setenv=
PYTHONPATH = {toxinidir}:{env:PYTHONPATH:}

envlist =
py36-django{1.11,1.10,1.9,1.8}
py35-django{1.11,1.10,1.9,1.8}
py36-django{2.0,1.11,1.10,1.9,1.8}
py35-django{2.0,1.11,1.10,1.9,1.8}
py27-django{1.11,1.10,1.9,1.8}

[testenv]
Expand All @@ -13,7 +13,8 @@ deps =
pytest
pytest-django
pytest-pythonpath
django1.11: Django>1.11,<2.0
django2.0: Django>=2.0,<2.1
django1.11: Django>=1.11,<2.0
django1.10: Django>=1.10,<1.11
django1.9: Django>=1.9,<1.10
django1.8: Django>=1.8,<1.9

0 comments on commit 6cfa7ff

Please sign in to comment.