Fixed FileField comparision

Refs hmarr/mongoengine#547
This commit is contained in:
Ross Lawley 2012-08-01 13:28:28 +01:00
parent 48f988acd7
commit 8df81571fc
3 changed files with 73 additions and 59 deletions

View File

@ -2,6 +2,10 @@
Changelog Changelog
========= =========
Changes in 0.6.X
================
- Fixed FileField comparision (hmarr/mongoengine#547)
Changes in 0.6.18 Changes in 0.6.18
================= =================

View File

@ -907,6 +907,8 @@ class GridFSProxy(object):
return '<%s: %s>' % (self.__class__.__name__, self.grid_id) return '<%s: %s>' % (self.__class__.__name__, self.grid_id)
def __cmp__(self, other): def __cmp__(self, other):
if not isinstance(other, GridFSProxy):
return -1
return cmp((self.grid_id, self.collection_name, self.db_alias), return cmp((self.grid_id, self.collection_name, self.db_alias),
(other.grid_id, other.collection_name, other.db_alias)) (other.grid_id, other.collection_name, other.db_alias))

View File

@ -1567,13 +1567,13 @@ class FieldTest(unittest.TestCase):
"""Ensure that file fields can be written to and their data retrieved """Ensure that file fields can be written to and their data retrieved
""" """
class PutFile(Document): class PutFile(Document):
file = FileField() the_file = FileField()
class StreamFile(Document): class StreamFile(Document):
file = FileField() the_file = FileField()
class SetFile(Document): class SetFile(Document):
file = FileField() the_file = FileField()
text = 'Hello, World!' text = 'Hello, World!'
more_text = 'Foo Bar' more_text = 'Foo Bar'
@ -1584,14 +1584,14 @@ class FieldTest(unittest.TestCase):
SetFile.drop_collection() SetFile.drop_collection()
putfile = PutFile() putfile = PutFile()
putfile.file.put(text, content_type=content_type) putfile.the_file.put(text, content_type=content_type)
putfile.save() putfile.save()
putfile.validate() putfile.validate()
result = PutFile.objects.first() result = PutFile.objects.first()
self.assertTrue(putfile == result) self.assertTrue(putfile == result)
self.assertEquals(result.file.read(), text) self.assertEquals(result.the_file.read(), text)
self.assertEquals(result.file.content_type, content_type) self.assertEquals(result.the_file.content_type, content_type)
result.file.delete() # Remove file from GridFS result.the_file.delete() # Remove file from GridFS
PutFile.objects.delete() PutFile.objects.delete()
# Ensure file-like objects are stored # Ensure file-like objects are stored
@ -1599,53 +1599,53 @@ class FieldTest(unittest.TestCase):
putstring = StringIO.StringIO() putstring = StringIO.StringIO()
putstring.write(text) putstring.write(text)
putstring.seek(0) putstring.seek(0)
putfile.file.put(putstring, content_type=content_type) putfile.the_file.put(putstring, content_type=content_type)
putfile.save() putfile.save()
putfile.validate() putfile.validate()
result = PutFile.objects.first() result = PutFile.objects.first()
self.assertTrue(putfile == result) self.assertTrue(putfile == result)
self.assertEquals(result.file.read(), text) self.assertEquals(result.the_file.read(), text)
self.assertEquals(result.file.content_type, content_type) self.assertEquals(result.the_file.content_type, content_type)
result.file.delete() result.the_file.delete()
streamfile = StreamFile() streamfile = StreamFile()
streamfile.file.new_file(content_type=content_type) streamfile.the_file.new_file(content_type=content_type)
streamfile.file.write(text) streamfile.the_file.write(text)
streamfile.file.write(more_text) streamfile.the_file.write(more_text)
streamfile.file.close() streamfile.the_file.close()
streamfile.save() streamfile.save()
streamfile.validate() streamfile.validate()
result = StreamFile.objects.first() result = StreamFile.objects.first()
self.assertTrue(streamfile == result) self.assertTrue(streamfile == result)
self.assertEquals(result.file.read(), text + more_text) self.assertEquals(result.the_file.read(), text + more_text)
self.assertEquals(result.file.content_type, content_type) self.assertEquals(result.the_file.content_type, content_type)
result.file.seek(0) result.the_file.seek(0)
self.assertEquals(result.file.tell(), 0) self.assertEquals(result.the_file.tell(), 0)
self.assertEquals(result.file.read(len(text)), text) self.assertEquals(result.the_file.read(len(text)), text)
self.assertEquals(result.file.tell(), len(text)) self.assertEquals(result.the_file.tell(), len(text))
self.assertEquals(result.file.read(len(more_text)), more_text) self.assertEquals(result.the_file.read(len(more_text)), more_text)
self.assertEquals(result.file.tell(), len(text + more_text)) self.assertEquals(result.the_file.tell(), len(text + more_text))
result.file.delete() result.the_file.delete()
# Ensure deleted file returns None # Ensure deleted file returns None
self.assertTrue(result.file.read() == None) self.assertTrue(result.the_file.read() == None)
setfile = SetFile() setfile = SetFile()
setfile.file = text setfile.the_file = text
setfile.save() setfile.save()
setfile.validate() setfile.validate()
result = SetFile.objects.first() result = SetFile.objects.first()
self.assertTrue(setfile == result) self.assertTrue(setfile == result)
self.assertEquals(result.file.read(), text) self.assertEquals(result.the_file.read(), text)
# Try replacing file with new one # Try replacing file with new one
result.file.replace(more_text) result.the_file.replace(more_text)
result.save() result.save()
result.validate() result.validate()
result = SetFile.objects.first() result = SetFile.objects.first()
self.assertTrue(setfile == result) self.assertTrue(setfile == result)
self.assertEquals(result.file.read(), more_text) self.assertEquals(result.the_file.read(), more_text)
result.file.delete() result.the_file.delete()
PutFile.drop_collection() PutFile.drop_collection()
StreamFile.drop_collection() StreamFile.drop_collection()
@ -1653,7 +1653,7 @@ class FieldTest(unittest.TestCase):
# Make sure FileField is optional and not required # Make sure FileField is optional and not required
class DemoFile(Document): class DemoFile(Document):
file = FileField() the_file = FileField()
DemoFile.objects.create() DemoFile.objects.create()
@ -1704,20 +1704,20 @@ class FieldTest(unittest.TestCase):
""" """
class TestFile(Document): class TestFile(Document):
name = StringField() name = StringField()
file = FileField() the_file = FileField()
# First instance # First instance
testfile = TestFile() test_file = TestFile()
testfile.name = "Hello, World!" test_file.name = "Hello, World!"
testfile.file.put('Hello, World!') test_file.the_file.put('Hello, World!')
testfile.save() test_file.save()
# Second instance # Second instance
testfiledupe = TestFile() test_file_dupe = TestFile()
data = testfiledupe.file.read() # Should be None data = test_file_dupe.the_file.read() # Should be None
self.assertTrue(testfile.name != testfiledupe.name) self.assertTrue(test_file.name != test_file_dupe.name)
self.assertTrue(testfile.file.read() != data) self.assertTrue(test_file.the_file.read() != data)
TestFile.drop_collection() TestFile.drop_collection()
@ -1725,17 +1725,25 @@ class FieldTest(unittest.TestCase):
"""Ensure that a boolean test of a FileField indicates its presence """Ensure that a boolean test of a FileField indicates its presence
""" """
class TestFile(Document): class TestFile(Document):
file = FileField() the_file = FileField()
testfile = TestFile() test_file = TestFile()
self.assertFalse(bool(testfile.file)) self.assertFalse(bool(test_file.the_file))
testfile.file = 'Hello, World!' test_file.the_file = 'Hello, World!'
testfile.file.content_type = 'text/plain' test_file.the_file.content_type = 'text/plain'
testfile.save() test_file.save()
self.assertTrue(bool(testfile.file)) self.assertTrue(bool(test_file.the_file))
TestFile.drop_collection() TestFile.drop_collection()
def test_file_cmp(self):
"""Test comparing against other types"""
class TestFile(Document):
the_file = FileField()
test_file = TestFile()
self.assertFalse(test_file.the_file in [{"test": 1}])
def test_image_field(self): def test_image_field(self):
class TestImage(Document): class TestImage(Document):
@ -1799,30 +1807,30 @@ class FieldTest(unittest.TestCase):
def test_file_multidb(self): def test_file_multidb(self):
register_connection('testfiles', 'testfiles') register_connection('test_files', 'test_files')
class TestFile(Document): class TestFile(Document):
name = StringField() name = StringField()
file = FileField(db_alias="testfiles", the_file = FileField(db_alias="test_files",
collection_name="macumba") collection_name="macumba")
TestFile.drop_collection() TestFile.drop_collection()
# delete old filesystem # delete old filesystem
get_db("testfiles").macumba.files.drop() get_db("test_files").macumba.files.drop()
get_db("testfiles").macumba.chunks.drop() get_db("test_files").macumba.chunks.drop()
# First instance # First instance
testfile = TestFile() test_file = TestFile()
testfile.name = "Hello, World!" test_file.name = "Hello, World!"
testfile.file.put('Hello, World!', test_file.the_file.put('Hello, World!',
name="hello.txt") name="hello.txt")
testfile.save() test_file.save()
data = get_db("testfiles").macumba.files.find_one() data = get_db("test_files").macumba.files.find_one()
self.assertEquals(data.get('name'), 'hello.txt') self.assertEquals(data.get('name'), 'hello.txt')
testfile = TestFile.objects.first() test_file = TestFile.objects.first()
self.assertEquals(testfile.file.read(), self.assertEquals(test_file.the_file.read(),
'Hello, World!') 'Hello, World!')
def test_geo_indexes(self): def test_geo_indexes(self):