diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cb68249a..025e3b9e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,3 +10,8 @@ repos: - id: flake8 additional_dependencies: - flake8-import-order + - repo: https://github.com/asottile/pyupgrade + rev: v2.7.4 + hooks: + - id: pyupgrade + args: [--py36-plus] \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index fdb5b61d..299959ee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -41,8 +41,8 @@ source_suffix = ".rst" master_doc = "index" # General information about the project. -project = u"MongoEngine" -copyright = u"2009, MongoEngine Authors" +project = "MongoEngine" +copyright = "2009, MongoEngine Authors" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/mongoengine/base/datastructures.py b/mongoengine/base/datastructures.py index 2a8fde6d..0f2f8a49 100644 --- a/mongoengine/base/datastructures.py +++ b/mongoengine/base/datastructures.py @@ -67,11 +67,11 @@ class BaseDict(dict): if isinstance(value, EmbeddedDocument) and value._instance is None: value._instance = self._instance elif isinstance(value, dict) and not isinstance(value, BaseDict): - value = BaseDict(value, None, "{}.{}".format(self._name, key)) + value = BaseDict(value, None, f"{self._name}.{key}") super().__setitem__(key, value) value._instance = self._instance elif isinstance(value, list) and not isinstance(value, BaseList): - value = BaseList(value, None, "{}.{}".format(self._name, key)) + value = BaseList(value, None, f"{self._name}.{key}") super().__setitem__(key, value) value._instance = self._instance return value @@ -97,7 +97,7 @@ class BaseDict(dict): def _mark_as_changed(self, key=None): if hasattr(self._instance, "_mark_as_changed"): if key: - self._instance._mark_as_changed("{}.{}".format(self._name, key)) + self._instance._mark_as_changed(f"{self._name}.{key}") else: self._instance._mark_as_changed(self._name) @@ -133,12 +133,12 @@ class BaseList(list): value._instance = self._instance elif isinstance(value, dict) and not isinstance(value, BaseDict): # Replace dict by BaseDict - value = BaseDict(value, None, "{}.{}".format(self._name, key)) + value = BaseDict(value, None, f"{self._name}.{key}") super().__setitem__(key, value) value._instance = self._instance elif isinstance(value, list) and not isinstance(value, BaseList): # Replace list by BaseList - value = BaseList(value, None, "{}.{}".format(self._name, key)) + value = BaseList(value, None, f"{self._name}.{key}") super().__setitem__(key, value) value._instance = self._instance return value @@ -429,7 +429,7 @@ class StrictDict: def __repr__(self): return "{%s}" % ", ".join( - '"{!s}": {!r}'.format(k, v) for k, v in self.items() + f'"{k!s}": {v!r}' for k, v in self.items() ) cls._classes[allowed_keys] = SpecificStrictDict @@ -472,4 +472,4 @@ class LazyReference(DBRef): raise AttributeError() def __repr__(self): - return "".format(self.document_type, self.pk) + return f"" diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 32ad0adc..45acfa3d 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -275,7 +275,7 @@ class BaseDocument: except (UnicodeEncodeError, UnicodeDecodeError): u = "[Bad Unicode data]" repr_type = str if u is None else type(u) - return repr_type("<{}: {}>".format(self.__class__.__name__, u)) + return repr_type(f"<{self.__class__.__name__}: {u}>") def __str__(self): # TODO this could be simpler? @@ -431,7 +431,7 @@ class BaseDocument: pk = self.pk elif self._instance and hasattr(self._instance, "pk"): pk = self._instance.pk - message = "ValidationError ({}:{}) ".format(self._class_name, pk) + message = f"ValidationError ({self._class_name}:{pk}) " raise ValidationError(message, errors=errors) def to_json(self, *args, **kwargs): @@ -504,7 +504,7 @@ class BaseDocument: if "." in key: key, rest = key.split(".", 1) key = self._db_field_map.get(key, key) - key = "{}.{}".format(key, rest) + key = f"{key}.{rest}" else: key = self._db_field_map.get(key, key) @@ -600,7 +600,7 @@ class BaseDocument: iterator = data.items() for index_or_key, value in iterator: - item_key = "{}{}.".format(base_key, index_or_key) + item_key = f"{base_key}{index_or_key}." # don't check anything lower if this key is already marked # as changed. if item_key[:-1] in changed_fields: @@ -608,7 +608,7 @@ class BaseDocument: if hasattr(value, "_get_changed_fields"): changed = value._get_changed_fields() - changed_fields += ["{}{}".format(item_key, k) for k in changed if k] + changed_fields += [f"{item_key}{k}" for k in changed if k] elif isinstance(value, (list, tuple, dict)): BaseDocument._nestable_types_changed_fields( changed_fields, item_key, value @@ -640,7 +640,7 @@ class BaseDocument: if isinstance(data, EmbeddedDocument): # Find all embedded fields that have been changed changed = data._get_changed_fields() - changed_fields += ["{}{}".format(key, k) for k in changed if k] + changed_fields += [f"{key}{k}" for k in changed if k] elif isinstance(data, (list, tuple, dict)): if hasattr(field, "field") and isinstance( field.field, (ReferenceField, GenericReferenceField) @@ -792,9 +792,7 @@ class BaseDocument: errors_dict[field_name] = e if errors_dict: - errors = "\n".join( - ["Field '{}' - {}".format(k, v) for k, v in errors_dict.items()] - ) + errors = "\n".join([f"Field '{k}' - {v}" for k, v in errors_dict.items()]) msg = "Invalid data to create a `{}` instance.\n{}".format( cls._class_name, errors, @@ -965,10 +963,7 @@ class BaseDocument: unique_fields += unique_with # Add the new index to the list - fields = [ - ("{}{}".format(namespace, f), pymongo.ASCENDING) - for f in unique_fields - ] + fields = [(f"{namespace}{f}", pymongo.ASCENDING) for f in unique_fields] index = {"fields": fields, "unique": True, "sparse": sparse} unique_indexes.append(index) @@ -1024,7 +1019,7 @@ class BaseDocument: elif field._geo_index: field_name = field.db_field if parent_field: - field_name = "{}.{}".format(parent_field, field_name) + field_name = f"{parent_field}.{field_name}" geo_indices.append({"fields": [(field_name, field._geo_index)]}) return geo_indices diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index 8df3d089..61dde5d2 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -40,7 +40,7 @@ class BaseField: choices=None, null=False, sparse=False, - **kwargs + **kwargs, ): """ :param db_field: The database field to store this field in @@ -465,9 +465,7 @@ class ComplexBaseField(BaseField): if errors: field_class = self.field.__class__.__name__ - self.error( - "Invalid {} item ({})".format(field_class, value), errors=errors - ) + self.error(f"Invalid {field_class} item ({value})", errors=errors) # Don't allow empty values if required if self.required and not value: self.error("Field is required and cannot be empty") @@ -537,7 +535,7 @@ class GeoJsonBaseField(BaseField): if isinstance(value, dict): if set(value.keys()) == {"type", "coordinates"}: if value["type"] != self._type: - self.error('{} type must be "{}"'.format(self._name, self._type)) + self.error(f'{self._name} type must be "{self._type}"') return self.validate(value["coordinates"]) else: self.error( diff --git a/mongoengine/base/metaclasses.py b/mongoengine/base/metaclasses.py index b4479b97..67a5f112 100644 --- a/mongoengine/base/metaclasses.py +++ b/mongoengine/base/metaclasses.py @@ -439,8 +439,8 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): id_basename, id_db_basename, i = ("auto_id", "_auto_id", 0) for i in itertools.count(): - id_name = "{}_{}".format(id_basename, i) - id_db_name = "{}_{}".format(id_db_basename, i) + id_name = f"{id_basename}_{i}" + id_db_name = f"{id_db_basename}_{i}" if id_name not in existing_fields and id_db_name not in existing_db_fields: return id_name, id_db_name diff --git a/mongoengine/connection.py b/mongoengine/connection.py index 9253d556..f181cf61 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -54,7 +54,7 @@ def _get_connection_settings( password=None, authentication_source=None, authentication_mechanism=None, - **kwargs + **kwargs, ): """Get the connection settings as a dict @@ -177,7 +177,7 @@ def register_connection( password=None, authentication_source=None, authentication_mechanism=None, - **kwargs + **kwargs, ): """Register the connection settings. @@ -210,7 +210,7 @@ def register_connection( password=password, authentication_source=authentication_source, authentication_mechanism=authentication_mechanism, - **kwargs + **kwargs, ) _connection_settings[alias] = conn_settings @@ -313,7 +313,7 @@ def _create_connection(alias, connection_class, **connection_settings): try: return connection_class(**connection_settings) except Exception as e: - raise ConnectionFailure("Cannot connect to database {} :\n{}".format(alias, e)) + raise ConnectionFailure(f"Cannot connect to database {alias} :\n{e}") def _find_existing_connection(connection_settings): diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index a89bc15a..3cd200ea 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -271,12 +271,12 @@ class DeReference: (v["_ref"].collection, v["_ref"].id), v ) elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth: - item_name = "{}.{}.{}".format(name, k, field_name) + item_name = f"{name}.{k}.{field_name}" data[k]._data[field_name] = self._attach_objects( v, depth, instance=instance, name=item_name ) elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth: - item_name = "{}.{}".format(name, k) if name else name + item_name = f"{name}.{k}" if name else name data[k] = self._attach_objects( v, depth - 1, instance=instance, name=item_name ) diff --git a/mongoengine/errors.py b/mongoengine/errors.py index 95564ff9..2b3d2014 100644 --- a/mongoengine/errors.py +++ b/mongoengine/errors.py @@ -94,7 +94,7 @@ class ValidationError(AssertionError): return str(self.message) def __repr__(self): - return "{}({},)".format(self.__class__.__name__, self.message) + return f"{self.__class__.__name__}({self.message},)" def __getattribute__(self, name): message = super().__getattribute__(name) @@ -102,7 +102,7 @@ class ValidationError(AssertionError): if self.field_name: message = "%s" % message if self.errors: - message = "{}({})".format(message, self._format_errors()) + message = f"{message}({self._format_errors()})" return message def _get_message(self): @@ -147,13 +147,13 @@ class ValidationError(AssertionError): elif isinstance(value, dict): value = " ".join([generate_key(v, k) for k, v in value.items()]) - results = "{}.{}".format(prefix, value) if prefix else value + results = f"{prefix}.{value}" if prefix else value return results error_dict = defaultdict(list) for k, v in self.to_dict().items(): error_dict[generate_key(v)].append(k) - return " ".join(["{}: {}".format(k, v) for k, v in error_dict.items()]) + return " ".join([f"{k}: {v}" for k, v in error_dict.items()]) class DeprecatedError(Exception): diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 4ef5dafc..f1d854af 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -189,11 +189,11 @@ class URLField(StringField): # Check first if the scheme is valid scheme = value.split("://")[0].lower() if scheme not in self.schemes: - self.error("Invalid scheme {} in URL: {}".format(scheme, value)) + self.error(f"Invalid scheme {scheme} in URL: {value}") # Then check full URL if not self.url_regex.match(value): - self.error("Invalid URL: {}".format(value)) + self.error(f"Invalid URL: {value}") class EmailField(StringField): @@ -233,7 +233,7 @@ class EmailField(StringField): allow_utf8_user=False, allow_ip_domain=False, *args, - **kwargs + **kwargs, ): """ :param domain_whitelist: (optional) list of valid domain names applied during validation @@ -440,7 +440,7 @@ class DecimalField(BaseField): force_string=False, precision=2, rounding=decimal.ROUND_HALF_UP, - **kwargs + **kwargs, ): """ :param min_value: (optional) A min value that will be applied during validation @@ -1337,7 +1337,7 @@ class CachedReferenceField(BaseField): return None update_kwargs = { - "set__{}__{}".format(self.name, key): val + f"set__{self.name}__{key}": val for key, val in document._delta()[0].items() if key in self.fields } @@ -1739,12 +1739,12 @@ class GridFSProxy: return self.__copy__() def __repr__(self): - return "<{}: {}>".format(self.__class__.__name__, self.grid_id) + return f"<{self.__class__.__name__}: {self.grid_id}>" def __str__(self): gridout = self.get() filename = getattr(gridout, "filename") if gridout else "" - return "<{}: {} ({})>".format(self.__class__.__name__, filename, self.grid_id) + return f"<{self.__class__.__name__}: {filename} ({self.grid_id})>" def __eq__(self, other): if isinstance(other, GridFSProxy): @@ -2120,7 +2120,7 @@ class SequenceField(BaseField): sequence_name=None, value_decorator=None, *args, - **kwargs + **kwargs, ): self.collection_name = collection_name or self.COLLECTION_NAME self.db_alias = db_alias or DEFAULT_CONNECTION_NAME @@ -2135,7 +2135,7 @@ class SequenceField(BaseField): Generate and Increment the counter """ sequence_name = self.get_sequence_name() - sequence_id = "{}.{}".format(sequence_name, self.name) + sequence_id = f"{sequence_name}.{self.name}" collection = get_db(alias=self.db_alias)[self.collection_name] counter = collection.find_one_and_update( @@ -2149,7 +2149,7 @@ class SequenceField(BaseField): def set_next_value(self, value): """Helper method to set the next sequence value""" sequence_name = self.get_sequence_name() - sequence_id = "{}.{}".format(sequence_name, self.name) + sequence_id = f"{sequence_name}.{self.name}" collection = get_db(alias=self.db_alias)[self.collection_name] counter = collection.find_one_and_update( filter={"_id": sequence_id}, @@ -2166,7 +2166,7 @@ class SequenceField(BaseField): as it is only fixed on set. """ sequence_name = self.get_sequence_name() - sequence_id = "{}.{}".format(sequence_name, self.name) + sequence_id = f"{sequence_name}.{self.name}" collection = get_db(alias=self.db_alias)[self.collection_name] data = collection.find_one({"_id": sequence_id}) @@ -2427,7 +2427,7 @@ class LazyReferenceField(BaseField): passthrough=False, dbref=False, reverse_delete_rule=DO_NOTHING, - **kwargs + **kwargs, ): """Initialises the Reference Field. diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 43e03ef8..1f29cdf7 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -422,7 +422,7 @@ class BaseQuerySet: count = count_documents( collection=self._cursor.collection, filter=self._cursor._Cursor__spec, - **kwargs + **kwargs, ) self._cursor_obj = None @@ -526,7 +526,7 @@ class BaseQuerySet: write_concern=None, read_concern=None, full_result=False, - **update + **update, ): """Perform an atomic update on the fields matched by the query. @@ -603,7 +603,7 @@ class BaseQuerySet: write_concern=write_concern, read_concern=read_concern, full_result=True, - **update + **update, ) if atomic_update.raw_result["updatedExisting"]: @@ -634,7 +634,7 @@ class BaseQuerySet: multi=False, write_concern=write_concern, full_result=full_result, - **update + **update, ) def modify( @@ -692,7 +692,7 @@ class BaseQuerySet: upsert=upsert, sort=sort, return_document=return_doc, - **self._cursor_args + **self._cursor_args, ) except pymongo.errors.DuplicateKeyError as err: raise NotUniqueError("Update failed (%s)" % err) @@ -1194,7 +1194,7 @@ class BaseQuerySet: preference. """ if read_concern is not None and not isinstance(read_concern, Mapping): - raise TypeError("%r is not a valid read concern." % (read_concern,)) + raise TypeError(f"{read_concern!r} is not a valid read concern.") queryset = self.clone() queryset._read_concern = ( diff --git a/tests/document/test_class_methods.py b/tests/document/test_class_methods.py index 7a9428df..e20a5802 100644 --- a/tests/document/test_class_methods.py +++ b/tests/document/test_class_methods.py @@ -231,7 +231,7 @@ class TestClassMethods(unittest.TestCase): assert BlogPost.list_indexes() == [ [("_cls", 1), ("author", 1), ("tags", 1)], [("_cls", 1), ("author", 1), ("tags", 1), ("extra_text", 1)], - [(u"_id", 1)], + [("_id", 1)], [("_cls", 1)], ] @@ -288,7 +288,7 @@ class TestClassMethods(unittest.TestCase): assert "wibble" == InheritedAbstractNamingTest._get_collection_name() # Mixin tests - class BaseMixin(object): + class BaseMixin: meta = {"collection": lambda c: c.__name__.lower()} class OldMixinNamingConvention(Document, BaseMixin): @@ -299,7 +299,7 @@ class TestClassMethods(unittest.TestCase): == OldMixinNamingConvention._get_collection_name() ) - class BaseMixin(object): + class BaseMixin: meta = {"collection": lambda c: c.__name__.lower()} class BaseDocument(Document, BaseMixin): diff --git a/tests/document/test_delta.py b/tests/document/test_delta.py index 2aae0af6..817bc40e 100644 --- a/tests/document/test_delta.py +++ b/tests/document/test_delta.py @@ -8,7 +8,7 @@ from tests.utils import MongoDBTestCase class TestDelta(MongoDBTestCase): def setUp(self): - super(TestDelta, self).setUp() + super().setUp() class Person(Document): name = StringField() diff --git a/tests/document/test_dynamic.py b/tests/document/test_dynamic.py index dc7ecb8b..909c6f79 100644 --- a/tests/document/test_dynamic.py +++ b/tests/document/test_dynamic.py @@ -10,7 +10,7 @@ __all__ = ("TestDynamicDocument",) class TestDynamicDocument(MongoDBTestCase): def setUp(self): - super(TestDynamicDocument, self).setUp() + super().setUp() class Person(DynamicDocument): name = StringField() @@ -118,17 +118,17 @@ class TestDynamicDocument(MongoDBTestCase): p.save() raw_p = Person.objects.as_pymongo().get(id=p.id) - assert raw_p == {"_cls": u"Person", "_id": p.id, "name": u"Dean"} + assert raw_p == {"_cls": "Person", "_id": p.id, "name": "Dean"} p.name = "OldDean" p.newattr = "garbage" p.save() raw_p = Person.objects.as_pymongo().get(id=p.id) assert raw_p == { - "_cls": u"Person", + "_cls": "Person", "_id": p.id, "name": "OldDean", - "newattr": u"garbage", + "newattr": "garbage", } def test_fields_containing_underscore(self): @@ -144,14 +144,14 @@ class TestDynamicDocument(MongoDBTestCase): p.save() raw_p = WeirdPerson.objects.as_pymongo().get(id=p.id) - assert raw_p == {"_id": p.id, "_name": u"Dean", "name": u"Dean"} + assert raw_p == {"_id": p.id, "_name": "Dean", "name": "Dean"} p.name = "OldDean" p._name = "NewDean" p._newattr1 = "garbage" # Unknown fields won't be added p.save() raw_p = WeirdPerson.objects.as_pymongo().get(id=p.id) - assert raw_p == {"_id": p.id, "_name": u"NewDean", "name": u"OldDean"} + assert raw_p == {"_id": p.id, "_name": "NewDean", "name": "OldDean"} def test_dynamic_document_queries(self): """Ensure we can query dynamic fields""" diff --git a/tests/document/test_inheritance.py b/tests/document/test_inheritance.py index bd694a1c..fdeb4052 100644 --- a/tests/document/test_inheritance.py +++ b/tests/document/test_inheritance.py @@ -281,9 +281,7 @@ class TestInheritance(MongoDBTestCase): assert sorted( [idx["key"] for idx in C._get_collection().index_information().values()] - ) == sorted( - [[(u"_cls", 1), (u"b", 1)], [(u"_id", 1)], [(u"_cls", 1), (u"a", 1)]] - ) + ) == sorted([[("_cls", 1), ("b", 1)], [("_id", 1)], [("_cls", 1), ("a", 1)]]) def test_polymorphic_queries(self): """Ensure that the correct subclasses are returned from a query""" diff --git a/tests/document/test_instance.py b/tests/document/test_instance.py index a28cd472..17b99983 100644 --- a/tests/document/test_instance.py +++ b/tests/document/test_instance.py @@ -168,7 +168,7 @@ class TestDocumentInstance(MongoDBTestCase): def __unicode__(self): return self.title - doc = Article(title=u"привет мир") + doc = Article(title="привет мир") assert "" == repr(doc) @@ -181,7 +181,7 @@ class TestDocumentInstance(MongoDBTestCase): def __str__(self): return None - doc = Article(title=u"привет мир") + doc = Article(title="привет мир") assert "" == repr(doc) def test_queryset_resurrects_dropped_collection(self): @@ -521,9 +521,9 @@ class TestDocumentInstance(MongoDBTestCase): query_op = q.db.system.profile.find({"ns": "mongoenginetest.animal"})[0] assert query_op["op"] == "update" if mongo_db <= MONGODB_34: - assert set(query_op["query"].keys()) == set(["_id", "is_mammal"]) + assert set(query_op["query"].keys()) == {"_id", "is_mammal"} else: - assert set(query_op["command"]["q"].keys()) == set(["_id", "is_mammal"]) + assert set(query_op["command"]["q"].keys()) == {"_id", "is_mammal"} Animal.drop_collection() @@ -546,7 +546,7 @@ class TestDocumentInstance(MongoDBTestCase): query_op = q.db.system.profile.find({"ns": "mongoenginetest.animal"})[0] assert query_op["op"] == "command" assert query_op["command"]["findAndModify"] == "animal" - assert set(query_op["command"]["query"].keys()) == set(["_id", "is_mammal"]) + assert set(query_op["command"]["query"].keys()) == {"_id", "is_mammal"} Animal.drop_collection() @@ -1428,11 +1428,11 @@ class TestDocumentInstance(MongoDBTestCase): coll = self.Person._get_collection() doc = self.Person(name="John").save() raw_doc = coll.find_one({"_id": doc.pk}) - assert set(raw_doc.keys()) == set(["_id", "_cls", "name"]) + assert set(raw_doc.keys()) == {"_id", "_cls", "name"} doc.update(rename__name="first_name") raw_doc = coll.find_one({"_id": doc.pk}) - assert set(raw_doc.keys()) == set(["_id", "_cls", "first_name"]) + assert set(raw_doc.keys()) == {"_id", "_cls", "first_name"} assert raw_doc["first_name"] == "John" def test_inserts_if_you_set_the_pk(self): @@ -2041,7 +2041,7 @@ class TestDocumentInstance(MongoDBTestCase): assert promoted_employee.details is None def test_object_mixins(self): - class NameMixin(object): + class NameMixin: name = StringField() class Foo(EmbeddedDocument, NameMixin): @@ -2055,7 +2055,7 @@ class TestDocumentInstance(MongoDBTestCase): assert ["id", "name", "widgets"] == sorted(Bar._fields.keys()) def test_mixin_inheritance(self): - class BaseMixIn(object): + class BaseMixIn: count = IntField() data = StringField() @@ -2929,7 +2929,7 @@ class TestDocumentInstance(MongoDBTestCase): # $Where assert ( - u",".join( + ",".join( [ str(b) for b in Book.objects.filter( @@ -3303,7 +3303,7 @@ class TestDocumentInstance(MongoDBTestCase): for node_name, node in self.nodes.items(): node.expand() node.save(*args, **kwargs) - super(NodesSystem, self).save(*args, **kwargs) + super().save(*args, **kwargs) NodesSystem.drop_collection() Node.drop_collection() @@ -3752,7 +3752,7 @@ class TestDocumentInstance(MongoDBTestCase): _ = list(Jedi.objects) # Ensure a proper document loads without errors # Forces a document with a wrong shape (may occur in case of migration) - value = u"I_should_be_a_dict" + value = "I_should_be_a_dict" coll.insert_one({"light_saber": value}) with pytest.raises(InvalidDocumentError) as exc_info: @@ -3819,7 +3819,7 @@ class ObjectKeyTestCase(MongoDBTestCase): class DBFieldMappingTest(MongoDBTestCase): def setUp(self): - class Fields(object): + class Fields: w1 = BooleanField(db_field="w2") x1 = BooleanField(db_field="x2") diff --git a/tests/fields/test_binary_field.py b/tests/fields/test_binary_field.py index 0f92d53b..8dfcdb54 100644 --- a/tests/fields/test_binary_field.py +++ b/tests/fields/test_binary_field.py @@ -19,7 +19,7 @@ class TestBinaryField(MongoDBTestCase): content_type = StringField() blob = BinaryField() - BLOB = "\xe6\x00\xc4\xff\x07".encode("latin-1") + BLOB = b"\xe6\x00\xc4\xff\x07" MIME_TYPE = "application/octet-stream" Attachment.drop_collection() @@ -43,11 +43,11 @@ class TestBinaryField(MongoDBTestCase): attachment_required = AttachmentRequired() with pytest.raises(ValidationError): attachment_required.validate() - attachment_required.blob = Binary("\xe6\x00\xc4\xff\x07".encode("latin-1")) + attachment_required.blob = Binary(b"\xe6\x00\xc4\xff\x07") attachment_required.validate() - _5_BYTES = "\xe6\x00\xc4\xff\x07".encode("latin-1") - _4_BYTES = "\xe6\x00\xc4\xff".encode("latin-1") + _5_BYTES = b"\xe6\x00\xc4\xff\x07" + _4_BYTES = b"\xe6\x00\xc4\xff" with pytest.raises(ValidationError): AttachmentSizeLimit(blob=_5_BYTES).validate() AttachmentSizeLimit(blob=_4_BYTES).validate() @@ -58,7 +58,7 @@ class TestBinaryField(MongoDBTestCase): class Attachment(Document): blob = BinaryField() - for invalid_data in (2, u"Im_a_unicode", ["some_str"]): + for invalid_data in (2, "Im_a_unicode", ["some_str"]): with pytest.raises(ValidationError): Attachment(blob=invalid_data).validate() @@ -129,7 +129,7 @@ class TestBinaryField(MongoDBTestCase): MyDocument.drop_collection() - bin_data = "\xe6\x00\xc4\xff\x07".encode("latin-1") + bin_data = b"\xe6\x00\xc4\xff\x07" doc = MyDocument(bin_field=bin_data).save() n_updated = MyDocument.objects(bin_field=bin_data).update_one( diff --git a/tests/fields/test_cached_reference_field.py b/tests/fields/test_cached_reference_field.py index dd804b38..7a96bc06 100644 --- a/tests/fields/test_cached_reference_field.py +++ b/tests/fields/test_cached_reference_field.py @@ -190,9 +190,9 @@ class TestCachedReferenceField(MongoDBTestCase): assert dict(a2.to_mongo()) == { "_id": a2.pk, - "name": u"Wilson Junior", - "tp": u"pf", - "father": {"_id": a1.pk, "tp": u"pj"}, + "name": "Wilson Junior", + "tp": "pf", + "father": {"_id": a1.pk, "tp": "pj"}, } assert Person.objects(father=a1)._query == {"father._id": a1.pk} @@ -204,9 +204,9 @@ class TestCachedReferenceField(MongoDBTestCase): a2.reload() assert dict(a2.to_mongo()) == { "_id": a2.pk, - "name": u"Wilson Junior", - "tp": u"pf", - "father": {"_id": a1.pk, "tp": u"pf"}, + "name": "Wilson Junior", + "tp": "pf", + "father": {"_id": a1.pk, "tp": "pf"}, } def test_cached_reference_fields_on_embedded_documents(self): diff --git a/tests/fields/test_email_field.py b/tests/fields/test_email_field.py index 893180a4..974360ef 100644 --- a/tests/fields/test_email_field.py +++ b/tests/fields/test_email_field.py @@ -30,11 +30,11 @@ class TestEmailField(MongoDBTestCase): user.validate() # unicode domain - user = User(email=u"user@пример.рф") + user = User(email="user@пример.рф") user.validate() # invalid unicode domain - user = User(email=u"user@пример") + user = User(email="user@пример") with pytest.raises(ValidationError): user.validate() @@ -48,7 +48,7 @@ class TestEmailField(MongoDBTestCase): email = EmailField() # unicode user shouldn't validate by default... - user = User(email=u"Dörte@Sörensen.example.com") + user = User(email="Dörte@Sörensen.example.com") with pytest.raises(ValidationError): user.validate() @@ -56,7 +56,7 @@ class TestEmailField(MongoDBTestCase): class User(Document): email = EmailField(allow_utf8_user=True) - user = User(email=u"Dörte@Sörensen.example.com") + user = User(email="Dörte@Sörensen.example.com") user.validate() def test_email_field_domain_whitelist(self): diff --git a/tests/fields/test_embedded_document_field.py b/tests/fields/test_embedded_document_field.py index e116dc0d..480bec20 100644 --- a/tests/fields/test_embedded_document_field.py +++ b/tests/fields/test_embedded_document_field.py @@ -74,7 +74,7 @@ class TestEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: Person.objects(settings__notexist="bar").first() - assert str(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == 'Cannot resolve field "notexist"' with pytest.raises(LookUpError): Person.objects.only("settings.notexist") @@ -110,7 +110,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 str(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == 'Cannot resolve field "notexist"' # Test existing attribute assert Person.objects(settings__base_foo="basefoo").first().id == p.id @@ -318,7 +318,7 @@ class TestGenericEmbeddedDocumentField(MongoDBTestCase): # Test non exiting attribute with pytest.raises(InvalidQueryError) as exc_info: Person.objects(settings__notexist="bar").first() - assert str(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == 'Cannot resolve field "notexist"' with pytest.raises(LookUpError): Person.objects.only("settings.notexist") @@ -346,7 +346,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 str(exc_info.value) == u'Cannot resolve field "notexist"' + assert str(exc_info.value) == 'Cannot resolve field "notexist"' # Test existing attribute assert Person.objects(settings__base_foo="basefoo").first().id == p.id diff --git a/tests/fields/test_fields.py b/tests/fields/test_fields.py index ff1fde98..ce16a904 100644 --- a/tests/fields/test_fields.py +++ b/tests/fields/test_fields.py @@ -292,7 +292,7 @@ class TestField(MongoDBTestCase): HandleNoneFields.drop_collection() doc = HandleNoneFields() - doc.str_fld = u"spam ham egg" + doc.str_fld = "spam ham egg" doc.int_fld = 42 doc.flt_fld = 4.2 doc.com_dt_fld = datetime.datetime.utcnow() @@ -328,7 +328,7 @@ class TestField(MongoDBTestCase): HandleNoneFields.drop_collection() doc = HandleNoneFields() - doc.str_fld = u"spam ham egg" + doc.str_fld = "spam ham egg" doc.int_fld = 42 doc.flt_fld = 4.2 doc.comp_dt_fld = datetime.datetime.utcnow() @@ -426,9 +426,9 @@ class TestField(MongoDBTestCase): def test_list_validation(self): """Ensure that a list field only accepts lists with valid elements.""" access_level_choices = ( - ("a", u"Administration"), - ("b", u"Manager"), - ("c", u"Staff"), + ("a", "Administration"), + ("b", "Manager"), + ("c", "Staff"), ) class User(Document): @@ -476,7 +476,7 @@ class TestField(MongoDBTestCase): post.access_list = ["a", "b"] post.validate() - assert post.get_access_list_display() == u"Administration, Manager" + assert post.get_access_list_display() == "Administration, Manager" post.comments = ["a"] with pytest.raises(ValidationError): @@ -2028,8 +2028,8 @@ class TestField(MongoDBTestCase): """Ensure that error messages are correct.""" SIZES = ("S", "M", "L", "XL", "XXL") COLORS = (("R", "Red"), ("B", "Blue")) - SIZE_MESSAGE = u"Value must be one of ('S', 'M', 'L', 'XL', 'XXL')" - COLOR_MESSAGE = u"Value must be one of ['R', 'B']" + SIZE_MESSAGE = "Value must be one of ('S', 'M', 'L', 'XL', 'XXL')" + COLOR_MESSAGE = "Value must be one of ['R', 'B']" class Shirt(Document): size = StringField(max_length=3, choices=SIZES) @@ -2092,7 +2092,7 @@ class TestField(MongoDBTestCase): assert "comments" in error_dict assert 1 in error_dict["comments"] assert "content" in error_dict["comments"][1] - assert error_dict["comments"][1]["content"] == u"Field is required" + assert error_dict["comments"][1]["content"] == "Field is required" post.comments[1].content = "here we go" post.validate() @@ -2104,7 +2104,7 @@ class TestField(MongoDBTestCase): class EnumField(BaseField): def __init__(self, **kwargs): - super(EnumField, self).__init__(**kwargs) + super().__init__(**kwargs) def to_mongo(self, value): return value @@ -2606,11 +2606,11 @@ class TestEmbeddedDocumentListField(MongoDBTestCase): """ post = self.BlogPost( comments=[ - self.Comments(author="user1", message=u"сообщение"), - self.Comments(author="user2", message=u"хабарлама"), + self.Comments(author="user1", message="сообщение"), + self.Comments(author="user2", message="хабарлама"), ] ).save() - assert post.comments.get(message=u"сообщение").author == "user1" + assert post.comments.get(message="сообщение").author == "user1" def test_save(self): """ diff --git a/tests/fields/test_file_field.py b/tests/fields/test_file_field.py index dc9354f0..9a20c917 100644 --- a/tests/fields/test_file_field.py +++ b/tests/fields/test_file_field.py @@ -55,7 +55,7 @@ class TestFileField(MongoDBTestCase): PutFile.drop_collection() - text = "Hello, World!".encode("latin-1") + text = b"Hello, World!" content_type = "text/plain" putfile = PutFile() @@ -97,8 +97,8 @@ class TestFileField(MongoDBTestCase): StreamFile.drop_collection() - text = "Hello, World!".encode("latin-1") - more_text = "Foo Bar".encode("latin-1") + text = b"Hello, World!" + more_text = b"Foo Bar" content_type = "text/plain" streamfile = StreamFile() @@ -133,8 +133,8 @@ class TestFileField(MongoDBTestCase): StreamFile.drop_collection() - text = "Hello, World!".encode("latin-1") - more_text = "Foo Bar".encode("latin-1") + text = b"Hello, World!" + more_text = b"Foo Bar" streamfile = StreamFile() streamfile.save() @@ -163,8 +163,8 @@ class TestFileField(MongoDBTestCase): class SetFile(Document): the_file = FileField() - text = "Hello, World!".encode("latin-1") - more_text = "Foo Bar".encode("latin-1") + text = b"Hello, World!" + more_text = b"Foo Bar" SetFile.drop_collection() @@ -192,7 +192,7 @@ class TestFileField(MongoDBTestCase): GridDocument.drop_collection() with tempfile.TemporaryFile() as f: - f.write("Hello World!".encode("latin-1")) + f.write(b"Hello World!") f.flush() # Test without default @@ -209,7 +209,7 @@ class TestFileField(MongoDBTestCase): assert doc_b.the_file.grid_id == doc_c.the_file.grid_id # Test with default - doc_d = GridDocument(the_file="".encode("latin-1")) + doc_d = GridDocument(the_file=b"") doc_d.save() doc_e = GridDocument.objects.with_id(doc_d.id) @@ -235,7 +235,7 @@ class TestFileField(MongoDBTestCase): # First instance test_file = TestFile() test_file.name = "Hello, World!" - test_file.the_file.put("Hello, World!".encode("latin-1")) + test_file.the_file.put(b"Hello, World!") test_file.save() # Second instance @@ -291,9 +291,7 @@ class TestFileField(MongoDBTestCase): test_file = TestFile() assert not bool(test_file.the_file) - test_file.the_file.put( - "Hello, World!".encode("latin-1"), content_type="text/plain" - ) + test_file.the_file.put(b"Hello, World!", content_type="text/plain") test_file.save() assert bool(test_file.the_file) @@ -315,7 +313,7 @@ class TestFileField(MongoDBTestCase): class TestFile(Document): the_file = FileField() - text = "Hello, World!".encode("latin-1") + text = b"Hello, World!" content_type = "text/plain" testfile = TestFile() @@ -359,7 +357,7 @@ class TestFileField(MongoDBTestCase): testfile.the_file.put(text, content_type=content_type, filename="hello") testfile.save() - text = "Bonjour, World!".encode("latin-1") + text = b"Bonjour, World!" testfile.the_file.replace(text, content_type=content_type, filename="hello") testfile.save() @@ -383,7 +381,7 @@ class TestFileField(MongoDBTestCase): TestImage.drop_collection() with tempfile.TemporaryFile() as f: - f.write("Hello World!".encode("latin-1")) + f.write(b"Hello World!") f.flush() t = TestImage() @@ -499,21 +497,21 @@ class TestFileField(MongoDBTestCase): # First instance test_file = TestFile() test_file.name = "Hello, World!" - test_file.the_file.put("Hello, World!".encode("latin-1"), name="hello.txt") + test_file.the_file.put(b"Hello, World!", name="hello.txt") test_file.save() data = get_db("test_files").macumba.files.find_one() assert data.get("name") == "hello.txt" test_file = TestFile.objects.first() - assert test_file.the_file.read() == "Hello, World!".encode("latin-1") + assert test_file.the_file.read() == b"Hello, World!" test_file = TestFile.objects.first() - test_file.the_file = "Hello, World!".encode("latin-1") + test_file.the_file = b"Hello, World!" test_file.save() test_file = TestFile.objects.first() - assert test_file.the_file.read() == "Hello, World!".encode("latin-1") + assert test_file.the_file.read() == b"Hello, World!" def test_copyable(self): class PutFile(Document): @@ -521,7 +519,7 @@ class TestFileField(MongoDBTestCase): PutFile.drop_collection() - text = "Hello, World!".encode("latin-1") + text = b"Hello, World!" content_type = "text/plain" putfile = PutFile() diff --git a/tests/fields/test_geo_fields.py b/tests/fields/test_geo_fields.py index a611be85..3c63b168 100644 --- a/tests/fields/test_geo_fields.py +++ b/tests/fields/test_geo_fields.py @@ -8,7 +8,7 @@ class TestGeoField(MongoDBTestCase): def _test_for_expected_error(self, Cls, loc, expected): try: Cls(loc=loc).validate() - self.fail("Should not validate the location {0}".format(loc)) + self.fail(f"Should not validate the location {loc}") except ValidationError as e: assert expected == e.to_dict()["loc"] diff --git a/tests/fields/test_map_field.py b/tests/fields/test_map_field.py index ea60e34d..eb747ef2 100644 --- a/tests/fields/test_map_field.py +++ b/tests/fields/test_map_field.py @@ -135,11 +135,11 @@ class TestMapField(MongoDBTestCase): BlogPost.drop_collection() - tree = BlogPost(info_dict={u"éééé": {"description": u"VALUE: éééé"}}) + tree = BlogPost(info_dict={"éééé": {"description": "VALUE: éééé"}}) tree.save() assert ( - BlogPost.objects.get(id=tree.id).info_dict[u"éééé"].description - == u"VALUE: éééé" + BlogPost.objects.get(id=tree.id).info_dict["éééé"].description + == "VALUE: éééé" ) diff --git a/tests/fields/test_reference_field.py b/tests/fields/test_reference_field.py index e2c92034..275e3fe1 100644 --- a/tests/fields/test_reference_field.py +++ b/tests/fields/test_reference_field.py @@ -87,7 +87,7 @@ class TestReferenceField(MongoDBTestCase): parent = ReferenceField("self", dbref=False) p = Person(name="Steve", parent=DBRef("person", "abcdefghijklmnop")) - assert p.to_mongo() == SON([("name", u"Steve"), ("parent", "abcdefghijklmnop")]) + assert p.to_mongo() == SON([("name", "Steve"), ("parent", "abcdefghijklmnop")]) def test_objectid_reference_fields(self): class Person(Document): diff --git a/tests/fields/test_url_field.py b/tests/fields/test_url_field.py index eb639bfe..7639eb6e 100644 --- a/tests/fields/test_url_field.py +++ b/tests/fields/test_url_field.py @@ -26,7 +26,7 @@ class TestURLField(MongoDBTestCase): url = URLField() link = Link() - link.url = u"http://привет.com" + link.url = "http://привет.com" # TODO fix URL validation - this *IS* a valid URL # For now we just want to make sure that the error message is correct @@ -34,7 +34,7 @@ class TestURLField(MongoDBTestCase): link.validate() assert ( str(exc_info.value) - == u"ValidationError (Link:None) (Invalid URL: http://\u043f\u0440\u0438\u0432\u0435\u0442.com: ['url'])" + == "ValidationError (Link:None) (Invalid URL: http://\u043f\u0440\u0438\u0432\u0435\u0442.com: ['url'])" ) def test_url_scheme_validation(self): diff --git a/tests/fixtures.py b/tests/fixtures.py index 59fc3bf3..ef82c22a 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -53,7 +53,7 @@ signals.post_save.connect(PickleSignalsTest.post_save, sender=PickleSignalsTest) signals.post_delete.connect(PickleSignalsTest.post_delete, sender=PickleSignalsTest) -class Mixin(object): +class Mixin: name = StringField() diff --git a/tests/queryset/test_geo.py b/tests/queryset/test_geo.py index a546fdb6..81ade092 100644 --- a/tests/queryset/test_geo.py +++ b/tests/queryset/test_geo.py @@ -496,8 +496,8 @@ class TestGeoQueries(MongoDBTestCase): p.save() qs = Place.objects().only("location") assert qs.as_pymongo()[0]["location"] == { - u"type": u"Point", - u"coordinates": [24.946861267089844, 60.16311983618494], + "type": "Point", + "coordinates": [24.946861267089844, 60.16311983618494], } def test_2dsphere_point_sets_correctly(self): diff --git a/tests/queryset/test_pickable.py b/tests/queryset/test_pickable.py index d41f56df..d20db32e 100644 --- a/tests/queryset/test_pickable.py +++ b/tests/queryset/test_pickable.py @@ -18,7 +18,7 @@ class TestQuerysetPickable(MongoDBTestCase): """ def setUp(self): - super(TestQuerysetPickable, self).setUp() + super().setUp() self.john = Person.objects.create(name="John", age=21) def test_picke_simple_qs(self): diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index 3f1b85d7..c75f2f10 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -113,7 +113,7 @@ class TestQueryset(unittest.TestCase): def test_slicing_sets_empty_limit_skip(self): self.Person.objects.insert( - [self.Person(name="User {}".format(i), age=i) for i in range(5)], + [self.Person(name=f"User {i}", age=i) for i in range(5)], load_bulk=False, ) @@ -1570,9 +1570,9 @@ class TestQueryset(unittest.TestCase): results = BlogPost.objects.exec_js(code) expected_results = [ - {u"comment": u"cool", u"document": u"post1"}, - {u"comment": u"yay", u"document": u"post1"}, - {u"comment": u"nice stuff", u"document": u"post2"}, + {"comment": "cool", "document": "post1"}, + {"comment": "yay", "document": "post1"}, + {"comment": "nice stuff", "document": "post2"}, ] assert results == expected_results @@ -2721,10 +2721,10 @@ class TestQueryset(unittest.TestCase): f1.save() # persons of first family - Person(id=1, family=f1, name=u"Wilson Jr", age=21).save() - Person(id=2, family=f1, name=u"Wilson Father", age=45).save() - Person(id=3, family=f1, name=u"Eliana Costa", age=40).save() - Person(id=4, family=f1, name=u"Tayza Mariana", age=17).save() + Person(id=1, family=f1, name="Wilson Jr", age=21).save() + Person(id=2, family=f1, name="Wilson Father", age=45).save() + Person(id=3, family=f1, name="Eliana Costa", age=40).save() + Person(id=4, family=f1, name="Tayza Mariana", age=17).save() # creating second family f2 = Family(id=2, log="Av prof frasc brunno") @@ -2802,10 +2802,10 @@ class TestQueryset(unittest.TestCase): "_id": 1, "value": { "persons": [ - {"age": 21, "name": u"Wilson Jr"}, - {"age": 45, "name": u"Wilson Father"}, - {"age": 40, "name": u"Eliana Costa"}, - {"age": 17, "name": u"Tayza Mariana"}, + {"age": 21, "name": "Wilson Jr"}, + {"age": 45, "name": "Wilson Father"}, + {"age": 40, "name": "Eliana Costa"}, + {"age": 17, "name": "Tayza Mariana"}, ], "totalAge": 123, }, @@ -2815,9 +2815,9 @@ class TestQueryset(unittest.TestCase): "_id": 2, "value": { "persons": [ - {"age": 16, "name": u"Isabella Luanna"}, - {"age": 36, "name": u"Sandra Mara"}, - {"age": 10, "name": u"Igor Gabriel"}, + {"age": 16, "name": "Isabella Luanna"}, + {"age": 36, "name": "Sandra Mara"}, + {"age": 10, "name": "Igor Gabriel"}, ], "totalAge": 62, }, @@ -2827,8 +2827,8 @@ class TestQueryset(unittest.TestCase): "_id": 3, "value": { "persons": [ - {"age": 30, "name": u"Arthur WA"}, - {"age": 25, "name": u"Paula Leonel"}, + {"age": 30, "name": "Arthur WA"}, + {"age": 25, "name": "Paula Leonel"}, ], "totalAge": 55, }, @@ -2974,7 +2974,7 @@ class TestQueryset(unittest.TestCase): def test_assertions(f): f = {key: int(val) for key, val in f.items()} - assert set(["music", "film", "actors", "watch"]) == set(f.keys()) + assert {"music", "film", "actors", "watch"} == set(f.keys()) assert f["music"] == 3 assert f["actors"] == 2 assert f["watch"] == 2 @@ -2988,7 +2988,7 @@ class TestQueryset(unittest.TestCase): # Ensure query is taken into account def test_assertions(f): f = {key: int(val) for key, val in f.items()} - assert set(["music", "actors", "watch"]) == set(f.keys()) + assert {"music", "actors", "watch"} == set(f.keys()) assert f["music"] == 2 assert f["actors"] == 1 assert f["watch"] == 1 @@ -3016,7 +3016,7 @@ class TestQueryset(unittest.TestCase): # Check item_frequencies works for non-list fields def test_assertions(f): - assert set([1, 2]) == set(f.keys()) + assert {1, 2} == set(f.keys()) assert f[1] == 1 assert f[2] == 2 @@ -3053,7 +3053,7 @@ class TestQueryset(unittest.TestCase): def test_assertions(f): f = {key: int(val) for key, val in f.items()} - assert set(["62-3331-1656", "62-3332-1656"]) == set(f.keys()) + assert {"62-3331-1656", "62-3332-1656"} == set(f.keys()) assert f["62-3331-1656"] == 2 assert f["62-3332-1656"] == 1 @@ -3065,7 +3065,7 @@ class TestQueryset(unittest.TestCase): # Ensure query is taken into account def test_assertions(f): f = {key: int(val) for key, val in f.items()} - assert set(["62-3331-1656"]) == set(f.keys()) + assert {"62-3331-1656"} == set(f.keys()) assert f["62-3331-1656"] == 2 exec_js = Person.objects(phone__number="62-3331-1656").item_frequencies( @@ -3132,10 +3132,10 @@ class TestQueryset(unittest.TestCase): p.save() ot = Person.objects.item_frequencies("extra.tag", map_reduce=False) - assert ot == {None: 1.0, u"friend": 1.0} + assert ot == {None: 1.0, "friend": 1.0} ot = Person.objects.item_frequencies("extra.tag", map_reduce=True) - assert ot == {None: 1.0, u"friend": 1.0} + assert ot == {None: 1.0, "friend": 1.0} def test_item_frequencies_with_0_values(self): class Test(Document): @@ -3379,13 +3379,16 @@ class TestQueryset(unittest.TestCase): self.Person(name="Mr White", age=20).save() self.Person(name="Mr Orange", age=30).save() self.Person(name="Mr Pink", age=30).save() - assert set(self.Person.objects.distinct("name")) == set( - ["Mr Orange", "Mr White", "Mr Pink"] - ) - assert set(self.Person.objects.distinct("age")) == set([20, 30]) - assert set(self.Person.objects(age=30).distinct("name")) == set( - ["Mr Orange", "Mr Pink"] - ) + assert set(self.Person.objects.distinct("name")) == { + "Mr Orange", + "Mr White", + "Mr Pink", + } + assert set(self.Person.objects.distinct("age")) == {20, 30} + assert set(self.Person.objects(age=30).distinct("name")) == { + "Mr Orange", + "Mr Pink", + } def test_distinct_handles_references(self): class Foo(Document): @@ -3446,8 +3449,8 @@ class TestQueryset(unittest.TestCase): assert count == 1 News( - title=u"As eleições no Brasil já estão em planejamento", - content=u"A candidata dilma roussef já começa o teu planejamento", + title="As eleições no Brasil já estão em planejamento", + content="A candidata dilma roussef já começa o teu planejamento", is_active=False, ).save() @@ -3525,8 +3528,8 @@ class TestQueryset(unittest.TestCase): Product(product_id=2).save() Product(product_id=1).save() - assert set(Product.objects.distinct("product_id")) == set([1, 2]) - assert set(Product.objects.distinct("pid")) == set([1, 2]) + assert set(Product.objects.distinct("product_id")) == {1, 2} + assert set(Product.objects.distinct("pid")) == {1, 2} Product.drop_collection() @@ -4222,15 +4225,15 @@ class TestQueryset(unittest.TestCase): ulist = list(UserDoc.objects.scalar("name", "age")) assert ulist == [ - (u"Wilson Jr", 19), - (u"Wilson", 43), - (u"Eliana", 37), - (u"Tayza", 15), + ("Wilson Jr", 19), + ("Wilson", 43), + ("Eliana", 37), + ("Tayza", 15), ] ulist = list(UserDoc.objects.scalar("name").order_by("age")) - assert ulist == [(u"Tayza"), (u"Wilson Jr"), (u"Eliana"), (u"Wilson")] + assert ulist == [("Tayza"), ("Wilson Jr"), ("Eliana"), ("Wilson")] def test_scalar_embedded(self): class Profile(EmbeddedDocument): @@ -4269,7 +4272,7 @@ class TestQueryset(unittest.TestCase): assert list( Person.objects.order_by("profile__age").scalar("profile__name") - ) == [u"Wilson Jr", u"Gabriel Falcao", u"Lincoln de souza", u"Walter cruz"] + ) == ["Wilson Jr", "Gabriel Falcao", "Lincoln de souza", "Walter cruz"] ulist = list( Person.objects.order_by("locale.city").scalar( @@ -4277,10 +4280,10 @@ class TestQueryset(unittest.TestCase): ) ) assert ulist == [ - (u"Lincoln de souza", 28, u"Belo Horizonte"), - (u"Walter cruz", 30, u"Brasilia"), - (u"Wilson Jr", 19, u"Corumba-GO"), - (u"Gabriel Falcao", 23, u"New York"), + ("Lincoln de souza", 28, "Belo Horizonte"), + ("Walter cruz", 30, "Brasilia"), + ("Wilson Jr", 19, "Corumba-GO"), + ("Gabriel Falcao", 23, "New York"), ] def test_scalar_decimal(self): @@ -4294,7 +4297,7 @@ class TestQueryset(unittest.TestCase): Person(name="Wilson Jr", rating=Decimal("1.0")).save() ulist = list(Person.objects.scalar("name", "rating")) - assert ulist == [(u"Wilson Jr", Decimal("1.0"))] + assert ulist == [("Wilson Jr", Decimal("1.0"))] def test_scalar_reference_field(self): class State(Document): @@ -4313,7 +4316,7 @@ class TestQueryset(unittest.TestCase): Person(name="Wilson JR", state=s1).save() plist = list(Person.objects.scalar("name", "state")) - assert plist == [(u"Wilson JR", s1)] + assert plist == [("Wilson JR", s1)] def test_scalar_generic_reference_field(self): class State(Document): @@ -4332,7 +4335,7 @@ class TestQueryset(unittest.TestCase): Person(name="Wilson JR", state=s1).save() plist = list(Person.objects.scalar("name", "state")) - assert plist == [(u"Wilson JR", s1)] + assert plist == [("Wilson JR", s1)] def test_generic_reference_field_with_only_and_as_pymongo(self): class TestPerson(Document): @@ -4863,13 +4866,11 @@ class TestQueryset(unittest.TestCase): ) results = User.objects.as_pymongo() - assert set(results[0].keys()) == set(["_id", "name", "age", "price"]) - assert set(results[1].keys()) == set( - ["_id", "name", "age", "price", "last_login"] - ) + assert set(results[0].keys()) == {"_id", "name", "age", "price"} + assert set(results[1].keys()) == {"_id", "name", "age", "price", "last_login"} results = User.objects.only("id", "name").as_pymongo() - assert set(results[0].keys()) == set(["_id", "name"]) + assert set(results[0].keys()) == {"_id", "name"} users = User.objects.only("name", "price").as_pymongo() results = list(users) @@ -5501,12 +5502,12 @@ class TestQueryset(unittest.TestCase): assert Person.objects._has_data(), "Cursor has data and returned False" def test_delete_count(self): - [self.Person(name="User {0}".format(i), age=i * 10).save() for i in range(1, 4)] + [self.Person(name=f"User {i}", age=i * 10).save() for i in range(1, 4)] assert ( self.Person.objects().delete() == 3 ) # test ordinary QuerySey delete count - [self.Person(name="User {0}".format(i), age=i * 10).save() for i in range(1, 4)] + [self.Person(name=f"User {i}", age=i * 10).save() for i in range(1, 4)] assert ( self.Person.objects().skip(1).delete() == 2 diff --git a/tests/queryset/test_queryset_aggregation.py b/tests/queryset/test_queryset_aggregation.py index 146501d0..a9c042de 100644 --- a/tests/queryset/test_queryset_aggregation.py +++ b/tests/queryset/test_queryset_aggregation.py @@ -64,7 +64,7 @@ class TestQuerysetAggregate(MongoDBTestCase): pipeline = [{"$match": {"name": "Isabella Luanna"}}] data = Person.objects().aggregate(pipeline) - assert list(data) == [{u"_id": p1.pk, u"age": 16, u"name": u"Isabella Luanna"}] + assert list(data) == [{"_id": p1.pk, "age": 16, "name": "Isabella Luanna"}] def test_queryset_aggregation_with_skip(self): class Person(Document): diff --git a/tests/queryset/test_transform.py b/tests/queryset/test_transform.py index 872a9a5d..e51683ae 100644 --- a/tests/queryset/test_transform.py +++ b/tests/queryset/test_transform.py @@ -328,7 +328,7 @@ class TestTransform(unittest.TestCase): word = Word(word="abc", index=1) update = transform.update(MainDoc, pull__content__text=word) assert update == { - "$pull": {"content.text": SON([("word", u"abc"), ("index", 1)])} + "$pull": {"content.text": SON([("word", "abc"), ("index", 1)])} } update = transform.update(MainDoc, pull__content__heading="xyz") diff --git a/tests/test_datastructures.py b/tests/test_datastructures.py index f4b63f05..1db5975d 100644 --- a/tests/test_datastructures.py +++ b/tests/test_datastructures.py @@ -6,7 +6,7 @@ from mongoengine import Document from mongoengine.base.datastructures import BaseDict, BaseList, StrictDict -class DocumentStub(object): +class DocumentStub: def __init__(self): self._changed_fields = [] self._unset_fields = [] diff --git a/tests/test_dereference.py b/tests/test_dereference.py index 88ea0033..640aed36 100644 --- a/tests/test_dereference.py +++ b/tests/test_dereference.py @@ -1321,7 +1321,7 @@ class FieldTest(unittest.TestCase): BrandGroup.drop_collection() brand1 = Brand(title="Moschino").save() - brand2 = Brand(title=u"Денис Симачёв").save() + brand2 = Brand(title="Денис Симачёв").save() BrandGroup(title="top_brands", brands=[brand1, brand2]).save() brand_groups = BrandGroup.objects().all() diff --git a/tests/test_utils.py b/tests/test_utils.py index dd178273..ca7defad 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -10,7 +10,7 @@ signal_output = [] class TestLazyRegexCompiler: def test_lazy_regex_compiler_verify_laziness_of_descriptor(self): - class UserEmail(object): + class UserEmail: EMAIL_REGEX = LazyRegexCompiler("@", flags=32) descriptor = UserEmail.__dict__["EMAIL_REGEX"] @@ -24,7 +24,7 @@ class TestLazyRegexCompiler: assert user_email.EMAIL_REGEX is UserEmail.EMAIL_REGEX def test_lazy_regex_compiler_verify_cannot_set_descriptor_on_instance(self): - class UserEmail(object): + class UserEmail: EMAIL_REGEX = LazyRegexCompiler("@") user_email = UserEmail() @@ -32,7 +32,7 @@ class TestLazyRegexCompiler: user_email.EMAIL_REGEX = re.compile("@") def test_lazy_regex_compiler_verify_can_override_class_attr(self): - class UserEmail(object): + class UserEmail: EMAIL_REGEX = LazyRegexCompiler("@") UserEmail.EMAIL_REGEX = re.compile("cookies") diff --git a/tests/utils.py b/tests/utils.py index 195b9dba..0899c208 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -59,7 +59,7 @@ def _decorated_with_ver_requirement(func, mongo_version_req, oper): return func(*args, **kwargs) pretty_version = ".".join(str(n) for n in mongo_version_req) - pytest.skip("Needs MongoDB v{}+".format(pretty_version)) + pytest.skip(f"Needs MongoDB v{pretty_version}+") _inner.__name__ = func.__name__ _inner.__doc__ = func.__doc__