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