diff --git a/mongoengine/base/datastructures.py b/mongoengine/base/datastructures.py index d1b5ae76..a9abf6ea 100644 --- a/mongoengine/base/datastructures.py +++ b/mongoengine/base/datastructures.py @@ -422,10 +422,10 @@ class StrictDict(object): return len(list(iteritems(self))) def __eq__(self, other): - return self.items() == other.items() + return list(self.items()) == list(other.items()) def __ne__(self, other): - return self.items() != other.items() + return list(self.items()) != list(other.items()) @classmethod def create(cls, allowed_keys): diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index ad691362..4948e672 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -92,7 +92,7 @@ class BaseDocument(object): # if so raise an Exception. if not self._dynamic and (self._meta.get("strict", True) or _created): _undefined_fields = set(values.keys()) - set( - self._fields.keys() + ["id", "pk", "_cls", "_text_score"] + list(self._fields.keys()) + ["id", "pk", "_cls", "_text_score"] ) if _undefined_fields: msg = ('The fields "{0}" do not exist on the document "{1}"').format( @@ -670,7 +670,7 @@ class BaseDocument(object): del set_data["_id"] # Determine if any changed items were actually unset. - for path, value in set_data.items(): + for path, value in list(set_data.items()): if value or isinstance( value, (numbers.Number, bool) ): # Account for 0 and True that are truthy diff --git a/mongoengine/fields.py b/mongoengine/fields.py index f8f527a3..bef85dd7 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -8,6 +8,7 @@ import uuid from operator import itemgetter from bson import Binary, DBRef, ObjectId, SON +from bson.int64 import Int64 import gridfs import pymongo from pymongo import ReturnDocument @@ -21,11 +22,6 @@ except ImportError: else: import dateutil.parser -try: - from bson.int64 import Int64 -except ImportError: - Int64 = long - from mongoengine.base import ( BaseDocument, @@ -53,8 +49,6 @@ except ImportError: ImageOps = None if six.PY3: - # Useless as long as 2to3 gets executed - # as it turns `long` into `int` blindly long = int diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index a648391e..d3176050 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -989,7 +989,7 @@ class BaseQuerySet(object): .. versionchanged:: 0.5 - Added subfield support """ fields = {f: QueryFieldList.ONLY for f in fields} - self.only_fields = fields.keys() + self.only_fields = list(fields.keys()) return self.fields(True, **fields) def exclude(self, *fields): diff --git a/setup.py b/setup.py index ceb5afad..c6e99f53 100644 --- a/setup.py +++ b/setup.py @@ -118,8 +118,8 @@ extra_opts = { "Pillow>=2.0.0", ], } + if sys.version_info[0] == 3: - extra_opts["use_2to3"] = True if "test" in sys.argv: extra_opts["packages"] = find_packages() extra_opts["package_data"] = { @@ -143,7 +143,7 @@ setup( long_description=LONG_DESCRIPTION, platforms=["any"], classifiers=CLASSIFIERS, - install_requires=["pymongo>=3.4", "six>=1.10.0"], + install_requires=['pymongo>=3.4', 'six', 'future'], cmdclass={"test": PyTest}, **extra_opts ) diff --git a/tests/fields/test_embedded_document_field.py b/tests/fields/test_embedded_document_field.py index eeddac1e..b80f4d8c 100644 --- a/tests/fields/test_embedded_document_field.py +++ b/tests/fields/test_embedded_document_field.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from builtins import str + import pytest from mongoengine import ( @@ -75,7 +77,7 @@ class TestEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: Person.objects(settings__notexist="bar").first() - assert unicode(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == u'Cannot resolve field "notexist"' with pytest.raises(LookUpError): Person.objects.only("settings.notexist") @@ -111,7 +113,7 @@ class TestEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: assert Person.objects(settings__notexist="bar").first().id == p.id - assert unicode(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == u'Cannot resolve field "notexist"' # Test existing attribute assert Person.objects(settings__base_foo="basefoo").first().id == p.id @@ -319,7 +321,7 @@ class TestGenericEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: Person.objects(settings__notexist="bar").first() - assert unicode(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == u'Cannot resolve field "notexist"' with pytest.raises(LookUpError): Person.objects.only("settings.notexist") @@ -347,7 +349,7 @@ class TestGenericEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: assert Person.objects(settings__notexist="bar").first().id == p.id - assert unicode(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == u'Cannot resolve field "notexist"' # Test existing attribute assert Person.objects(settings__base_foo="basefoo").first().id == p.id diff --git a/tests/fields/test_long_field.py b/tests/fields/test_long_field.py index da4f04c8..b39a714c 100644 --- a/tests/fields/test_long_field.py +++ b/tests/fields/test_long_field.py @@ -1,12 +1,8 @@ # -*- coding: utf-8 -*- import pytest +from bson.int64 import Int64 import six -try: - from bson.int64 import Int64 -except ImportError: - Int64 = long - from mongoengine import * from mongoengine.connection import get_db diff --git a/tests/fields/test_sequence_field.py b/tests/fields/test_sequence_field.py index aa83f710..f96f6b06 100644 --- a/tests/fields/test_sequence_field.py +++ b/tests/fields/test_sequence_field.py @@ -21,7 +21,7 @@ class TestSequenceField(MongoDBTestCase): assert c["next"] == 10 ids = [i.id for i in Person.objects] - assert ids == range(1, 11) + assert ids == list(range(1, 11)) c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) assert c["next"] == 10 @@ -76,7 +76,7 @@ class TestSequenceField(MongoDBTestCase): assert c["next"] == 10 ids = [i.id for i in Person.objects] - assert ids == range(1, 11) + assert ids == list(range(1, 11)) c = self.db["mongoengine.counters"].find_one({"_id": "jelly.id"}) assert c["next"] == 10 @@ -101,10 +101,10 @@ class TestSequenceField(MongoDBTestCase): assert c["next"] == 10 ids = [i.id for i in Person.objects] - assert ids == range(1, 11) + assert ids == list(range(1, 11)) counters = [i.counter for i in Person.objects] - assert counters == range(1, 11) + assert counters == list(range(1, 11)) c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) assert c["next"] == 10 @@ -166,10 +166,10 @@ class TestSequenceField(MongoDBTestCase): assert c["next"] == 10 ids = [i.id for i in Person.objects] - assert ids == range(1, 11) + assert ids == list(range(1, 11)) id = [i.id for i in Animal.objects] - assert id == range(1, 11) + assert id == list(range(1, 11)) c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) assert c["next"] == 10 @@ -193,7 +193,7 @@ class TestSequenceField(MongoDBTestCase): assert c["next"] == 10 ids = [i.id for i in Person.objects] - assert ids == map(str, range(1, 11)) + assert ids == [str(i) for i in range(1, 11)] c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) assert c["next"] == 10 diff --git a/tests/fields/test_url_field.py b/tests/fields/test_url_field.py index 948a4788..98f5d4fd 100644 --- a/tests/fields/test_url_field.py +++ b/tests/fields/test_url_field.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- import pytest +from builtins import str + from mongoengine import * from tests.utils import MongoDBTestCase @@ -35,9 +37,8 @@ class TestURLField(MongoDBTestCase): with pytest.raises(ValidationError) as exc_info: link.validate() assert ( - unicode(exc_info.value) - == u"ValidationError (Link:None) (Invalid URL: http://\u043f\u0440\u0438\u0432\u0435\u0442.com: ['url'])" - ) + str(exc_info.exception) + == u"ValidationError (Link:None) (Invalid URL: http://\u043f\u0440\u0438\u0432\u0435\u0442.com: ['url'])") def test_url_scheme_validation(self): """Ensure that URLFields validate urls with specific schemes properly. diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index 7812ab66..49dab169 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -110,7 +110,7 @@ class TestQueryset(unittest.TestCase): # Filter people by age people = self.Person.objects(age=20) assert people.count() == 1 - person = people.next() + person = next(people) assert person == user_a assert person.name == "User A" assert person.age == 20 @@ -2768,7 +2768,7 @@ class TestQueryset(unittest.TestCase): ) # start a map/reduce - cursor.next() + next(cursor) results = Person.objects.map_reduce( map_f=map_person, @@ -4395,7 +4395,7 @@ class TestQueryset(unittest.TestCase): # Use a query to filter the people found to just person1 people = self.Person.objects(age=20).scalar("name") assert people.count() == 1 - person = people.next() + person = next(people) assert person == "User A" # Test limit @@ -5309,7 +5309,7 @@ class TestQueryset(unittest.TestCase): if not test: raise AssertionError("Cursor has data and returned False") - queryset.next() + next(queryset) if not queryset: raise AssertionError( "Cursor has data and it must returns True, even in the last item." diff --git a/tests/test_signals.py b/tests/test_signals.py index d79eaf75..13ea5a05 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -58,7 +58,7 @@ class TestSignal(unittest.TestCase): @classmethod def post_save(cls, sender, document, **kwargs): - dirty_keys = document._delta()[0].keys() + document._delta()[1].keys() + dirty_keys = list(document._delta()[0].keys()) + list(document._delta()[1].keys()) signal_output.append("post_save signal, %s" % document) signal_output.append("post_save dirty keys, %s" % dirty_keys) if kwargs.pop("created", False):