clean code related to Py2 + six.text_type & six.string_types

This commit is contained in:
Bastien Gérard
2020-03-11 21:50:50 +01:00
parent 421e3f324f
commit 03e34299f0
16 changed files with 101 additions and 148 deletions

View File

@@ -1,7 +1,6 @@
import weakref
from bson import DBRef
import six
from six import iteritems
from mongoengine.common import _import_class
@@ -200,7 +199,7 @@ class EmbeddedDocumentList(BaseList):
"""
for key, expected_value in kwargs.items():
doc_val = getattr(embedded_doc, key)
if doc_val != expected_value and six.text_type(doc_val) != expected_value:
if doc_val != expected_value and str(doc_val) != expected_value:
return False
return True

View File

@@ -294,7 +294,7 @@ class BaseDocument(object):
# TODO this could be simpler?
if hasattr(self, "__unicode__"):
return self.__unicode__()
return six.text_type("%s object" % self.__class__.__name__)
return "%s object" % self.__class__.__name__
def __eq__(self, other):
if (
@@ -828,7 +828,7 @@ class BaseDocument(object):
@classmethod
def _build_index_spec(cls, spec):
"""Build a PyMongo index spec from a MongoEngine index spec."""
if isinstance(spec, six.string_types):
if isinstance(spec, str):
spec = {"fields": [spec]}
elif isinstance(spec, (list, tuple)):
spec = {"fields": list(spec)}
@@ -925,7 +925,7 @@ class BaseDocument(object):
# Add any unique_with fields to the back of the index spec
if field.unique_with:
if isinstance(field.unique_with, six.string_types):
if isinstance(field.unique_with, str):
field.unique_with = [field.unique_with]
# Convert unique_with field names to real field names
@@ -1172,9 +1172,6 @@ class BaseDocument(object):
else [value]
)
return sep.join(
[
six.text_type(dict(field.choices).get(val, val))
for val in values or []
]
[str(dict(field.choices).get(val, val)) for val in values or []]
)
return value

View File

@@ -4,7 +4,6 @@ import weakref
from bson import DBRef, ObjectId, SON
import pymongo
import six
from six import iteritems
from mongoengine.base.common import UPDATE_OPERATORS
@@ -92,13 +91,11 @@ class BaseField(object):
self._owner_document = None
# Make sure db_field is a string (if it's explicitly defined).
if self.db_field is not None and not isinstance(
self.db_field, six.string_types
):
if self.db_field is not None and not isinstance(self.db_field, str):
raise TypeError("db_field should be a string.")
# Make sure db_field doesn't contain any forbidden characters.
if isinstance(self.db_field, six.string_types) and (
if isinstance(self.db_field, str) and (
"." in self.db_field
or "\0" in self.db_field
or self.db_field.startswith("$")
@@ -221,14 +218,12 @@ class BaseField(object):
# Choices which are other types of Documents
if isinstance(value, (Document, EmbeddedDocument)):
if not any(isinstance(value, c) for c in choice_list):
self.error(
"Value must be an instance of %s" % (six.text_type(choice_list))
)
self.error("Value must be an instance of %s" % (choice_list))
# Choices which are types other than Documents
else:
values = value if isinstance(value, (list, tuple)) else [value]
if len(set(values) - set(choice_list)):
self.error("Value must be one of %s" % six.text_type(choice_list))
self.error("Value must be one of %s" % str(choice_list))
def _validate(self, value, **kwargs):
# Check the Choices Constraint
@@ -345,7 +340,7 @@ class ComplexBaseField(BaseField):
def to_python(self, value):
"""Convert a MongoDB-compatible type to a Python type."""
if isinstance(value, six.string_types):
if isinstance(value, str):
return value
if hasattr(value, "to_python"):
@@ -399,7 +394,7 @@ class ComplexBaseField(BaseField):
EmbeddedDocument = _import_class("EmbeddedDocument")
GenericReferenceField = _import_class("GenericReferenceField")
if isinstance(value, six.string_types):
if isinstance(value, str):
return value
if hasattr(value, "to_mongo"):
@@ -513,10 +508,9 @@ class ObjectIdField(BaseField):
def to_mongo(self, value):
if not isinstance(value, ObjectId):
try:
return ObjectId(six.text_type(value))
return ObjectId(str(value))
except Exception as e:
# e.message attribute has been deprecated since Python 2.6
self.error(six.text_type(e))
self.error(str(e))
return value
def prepare_query_value(self, op, value):
@@ -524,9 +518,9 @@ class ObjectIdField(BaseField):
def validate(self, value):
try:
ObjectId(six.text_type(value))
ObjectId(str(value))
except Exception:
self.error("Invalid Object ID")
self.error("Invalid ObjectID")
class GeoJsonBaseField(BaseField):

View File

@@ -1,7 +1,6 @@
import itertools
import warnings
import six
from six import iteritems, itervalues
from mongoengine.base.common import _document_registry
@@ -180,14 +179,15 @@ class DocumentMetaclass(type):
# module continues to use im_func and im_self, so the code below
# copies __func__ into im_func and __self__ into im_self for
# classmethod objects in Document derived classes.
if six.PY3:
for val in new_class.__dict__.values():
if isinstance(val, classmethod):
f = val.__get__(new_class)
if hasattr(f, "__func__") and not hasattr(f, "im_func"):
f.__dict__.update({"im_func": getattr(f, "__func__")})
if hasattr(f, "__self__") and not hasattr(f, "im_self"):
f.__dict__.update({"im_self": getattr(f, "__self__")})
#
# Relates to https://github.com/MongoEngine/mongoengine/issues/1107
# for val in new_class.__dict__.values():
# if isinstance(val, classmethod):
# f = val.__get__(new_class)
# if hasattr(f, "__func__") and not hasattr(f, "im_func"):
# f.__dict__.update({"im_func": getattr(f, "__func__")})
# if hasattr(f, "__self__") and not hasattr(f, "im_self"):
# f.__dict__.update({"im_self": getattr(f, "__self__")})
# Handle delete rules
for field in itervalues(new_class._fields):

View File

@@ -1,6 +1,5 @@
from pymongo import MongoClient, ReadPreference, uri_parser
from pymongo.database import _check_name
import six
__all__ = [
"DEFAULT_CONNECTION_NAME",
@@ -39,8 +38,8 @@ def _check_db_name(name):
"""Check if a database name is valid.
This functionality is copied from pymongo Database class constructor.
"""
if not isinstance(name, six.string_types):
raise TypeError("name must be an instance of %s" % six.string_types)
if not isinstance(name, str):
raise TypeError("name must be an instance of %s" % str)
elif name != "$external":
_check_name(name)
@@ -93,7 +92,7 @@ def _get_connection_settings(
conn_host = conn_settings["host"]
# Host can be a list or a string, so if string, force to a list.
if isinstance(conn_host, six.string_types):
if isinstance(conn_host, str):
conn_host = [conn_host]
resolved_hosts = []
@@ -148,7 +147,7 @@ def _get_connection_settings(
# TODO simplify the code below once we drop support for
# PyMongo v3.4.
read_pf_mode = uri_options["readpreference"]
if isinstance(read_pf_mode, six.string_types):
if isinstance(read_pf_mode, str):
read_pf_mode = read_pf_mode.lower()
for preference in read_preferences:
if (

View File

@@ -30,7 +30,7 @@ class DeReference(object):
:class:`~mongoengine.base.ComplexBaseField`
:param get: A boolean determining if being called by __get__
"""
if items is None or isinstance(items, six.string_types):
if items is None or isinstance(items, str):
return items
# cheapest way to convert a queryset to a list
@@ -274,9 +274,7 @@ class DeReference(object):
(v["_ref"].collection, v["_ref"].id), v
)
elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth:
item_name = six.text_type("{0}.{1}.{2}").format(
name, k, field_name
)
item_name = "{0}.{1}.{2}".format(name, k, field_name)
data[k]._data[field_name] = self._attach_objects(
v, depth, instance=instance, name=item_name
)

View File

@@ -44,7 +44,7 @@ def includes_cls(fields):
"""Helper function used for ensuring and comparing indexes."""
first_field = None
if len(fields):
if isinstance(fields[0], six.string_types):
if isinstance(fields[0], str):
first_field = fields[0]
elif isinstance(fields[0], (list, tuple)) and len(fields[0]):
first_field = fields[0][0]
@@ -430,15 +430,15 @@ class Document(six.with_metaclass(TopLevelDocumentMetaclass, BaseDocument)):
except pymongo.errors.DuplicateKeyError as err:
message = u"Tried to save duplicate unique keys (%s)"
raise NotUniqueError(message % six.text_type(err))
raise NotUniqueError(message % err)
except pymongo.errors.OperationFailure as err:
message = "Could not save document (%s)"
if re.match("^E1100[01] duplicate key", six.text_type(err)):
if re.match("^E1100[01] duplicate key", str(err)):
# E11000 - duplicate key error index
# E11001 - duplicate key on update
message = u"Tried to save duplicate unique keys (%s)"
raise NotUniqueError(message % six.text_type(err))
raise OperationError(message % six.text_type(err))
raise NotUniqueError(message % err)
raise OperationError(message % err)
# Make sure we store the PK on this document now that it's saved
id_field = self._meta["id_field"]

View File

@@ -1,6 +1,5 @@
from collections import defaultdict
import six
from six import iteritems
__all__ = (
@@ -93,7 +92,7 @@ class ValidationError(AssertionError):
self.message = message
def __str__(self):
return six.text_type(self.message)
return str(self.message)
def __repr__(self):
return "%s(%s,)" % (self.__class__.__name__, self.message)
@@ -131,7 +130,7 @@ class ValidationError(AssertionError):
elif isinstance(source, ValidationError) and source.errors:
return build_dict(source.errors)
else:
return six.text_type(source)
return str(source)
return errors_dict

View File

@@ -108,7 +108,7 @@ class StringField(BaseField):
super(StringField, self).__init__(**kwargs)
def to_python(self, value):
if isinstance(value, six.text_type):
if isinstance(value, str):
return value
try:
value = value.decode("utf-8")
@@ -117,7 +117,7 @@ class StringField(BaseField):
return value
def validate(self, value):
if not isinstance(value, six.string_types):
if not isinstance(value, str):
self.error("StringField only accepts string values")
if self.max_length is not None and len(value) > self.max_length:
@@ -133,7 +133,7 @@ class StringField(BaseField):
return None
def prepare_query_value(self, op, value):
if not isinstance(op, six.string_types):
if not isinstance(op, str):
return value
if op in STRING_OPERATORS:
@@ -472,13 +472,13 @@ class DecimalField(BaseField):
if value is None:
return value
if self.force_string:
return six.text_type(self.to_python(value))
return str(self.to_python(value))
return float(self.to_python(value))
def validate(self, value):
if not isinstance(value, decimal.Decimal):
if not isinstance(value, six.string_types):
value = six.text_type(value)
if not isinstance(value, str):
value = str(value)
try:
value = decimal.Decimal(value)
except (TypeError, ValueError, decimal.InvalidOperation) as exc:
@@ -543,7 +543,7 @@ class DateTimeField(BaseField):
if callable(value):
return value()
if not isinstance(value, six.string_types):
if not isinstance(value, str):
return None
return self._parse_datetime(value)
@@ -707,7 +707,7 @@ class EmbeddedDocumentField(BaseField):
def __init__(self, document_type, **kwargs):
# XXX ValidationError raised outside of the "validate" method.
if not (
isinstance(document_type, six.string_types)
isinstance(document_type, str)
or issubclass(document_type, EmbeddedDocument)
):
self.error(
@@ -720,7 +720,7 @@ class EmbeddedDocumentField(BaseField):
@property
def document_type(self):
if isinstance(self.document_type_obj, six.string_types):
if isinstance(self.document_type_obj, str):
if self.document_type_obj == RECURSIVE_REFERENCE_CONSTANT:
resolved_document_type = self.owner_document
else:
@@ -846,7 +846,7 @@ class DynamicField(BaseField):
"""Convert a Python type to a MongoDB compatible type.
"""
if isinstance(value, six.string_types):
if isinstance(value, str):
return value
if hasattr(value, "to_mongo"):
@@ -889,7 +889,7 @@ class DynamicField(BaseField):
return member_name
def prepare_query_value(self, op, value):
if isinstance(value, six.string_types):
if isinstance(value, str):
return StringField().prepare_query_value(op, value)
return super(DynamicField, self).prepare_query_value(op, self.to_mongo(value))
@@ -954,7 +954,7 @@ class ListField(ComplexBaseField):
if (
op in ("set", "unset", None)
and hasattr(value, "__iter__")
and not isinstance(value, six.string_types)
and not isinstance(value, str)
and not isinstance(value, BaseDocument)
):
return [self.field.prepare_query_value(op, v) for v in value]
@@ -1026,9 +1026,7 @@ def key_not_string(d):
dictionary is not a string.
"""
for k, v in d.items():
if not isinstance(k, six.string_types) or (
isinstance(v, dict) and key_not_string(v)
):
if not isinstance(k, str) or (isinstance(v, dict) and key_not_string(v)):
return True
@@ -1107,7 +1105,7 @@ class DictField(ComplexBaseField):
"iexact",
]
if op in match_operators and isinstance(value, six.string_types):
if op in match_operators and isinstance(value, str):
return StringField().prepare_query_value(op, value)
if hasattr(
@@ -1194,7 +1192,7 @@ class ReferenceField(BaseField):
:class:`~pymongo.dbref.DBRef`, regardless of the value of `dbref`.
"""
# XXX ValidationError raised outside of the "validate" method.
if not isinstance(document_type, six.string_types) and not issubclass(
if not isinstance(document_type, str) and not issubclass(
document_type, Document
):
self.error(
@@ -1209,7 +1207,7 @@ class ReferenceField(BaseField):
@property
def document_type(self):
if isinstance(self.document_type_obj, six.string_types):
if isinstance(self.document_type_obj, str):
if self.document_type_obj == RECURSIVE_REFERENCE_CONSTANT:
self.document_type_obj = self.owner_document
else:
@@ -1325,7 +1323,7 @@ class CachedReferenceField(BaseField):
fields = []
# XXX ValidationError raised outside of the "validate" method.
if not isinstance(document_type, six.string_types) and not issubclass(
if not isinstance(document_type, str) and not issubclass(
document_type, Document
):
self.error(
@@ -1370,7 +1368,7 @@ class CachedReferenceField(BaseField):
@property
def document_type(self):
if isinstance(self.document_type_obj, six.string_types):
if isinstance(self.document_type_obj, str):
if self.document_type_obj == RECURSIVE_REFERENCE_CONSTANT:
self.document_type_obj = self.owner_document
else:
@@ -1498,7 +1496,7 @@ class GenericReferenceField(BaseField):
# Keep the choices as a list of allowed Document class names
if choices:
for choice in choices:
if isinstance(choice, six.string_types):
if isinstance(choice, str):
self.choices.append(choice)
elif isinstance(choice, type) and issubclass(choice, Document):
self.choices.append(choice._class_name)
@@ -1507,7 +1505,7 @@ class GenericReferenceField(BaseField):
# method.
self.error(
"Invalid choices provided: must be a list of"
"Document subclasses and/or six.string_typess"
"Document subclasses and/or str"
)
def _validate_choices(self, value):
@@ -1601,8 +1599,8 @@ class BinaryField(BaseField):
def __set__(self, instance, value):
"""Handle bytearrays in python 3.1"""
if six.PY3 and isinstance(value, bytearray):
value = six.binary_type(value)
if isinstance(value, bytearray):
value = bytes(value)
return super(BinaryField, self).__set__(instance, value)
def to_mongo(self, value):
@@ -1831,7 +1829,7 @@ class FileField(BaseField):
key = self.name
if (
hasattr(value, "read") and not isinstance(value, GridFSProxy)
) or isinstance(value, (six.binary_type, six.string_types)):
) or isinstance(value, (six.binary_type, str)):
# using "FileField() = file/string" notation
grid_file = instance._data.get(self.name)
# If a file already exists, delete it
@@ -2038,12 +2036,7 @@ class ImageField(FileField):
for att_name, att in extra_args.items():
value = None
if isinstance(att, (tuple, list)):
if six.PY3:
value = dict(
itertools.zip_longest(params_size, att, fillvalue=None)
)
else:
value = dict(map(None, params_size, att))
value = dict(itertools.zip_longest(params_size, att, fillvalue=None))
setattr(self, att_name, value)
@@ -2213,8 +2206,8 @@ class UUIDField(BaseField):
if not self._binary:
original_value = value
try:
if not isinstance(value, six.string_types):
value = six.text_type(value)
if not isinstance(value, str):
value = str(value)
return uuid.UUID(value)
except (ValueError, TypeError, AttributeError):
return original_value
@@ -2222,8 +2215,8 @@ class UUIDField(BaseField):
def to_mongo(self, value):
if not self._binary:
return six.text_type(value)
elif isinstance(value, six.string_types):
return str(value)
elif isinstance(value, str):
return uuid.UUID(value)
return value
@@ -2234,7 +2227,7 @@ class UUIDField(BaseField):
def validate(self, value):
if not isinstance(value, uuid.UUID):
if not isinstance(value, six.string_types):
if not isinstance(value, str):
value = str(value)
try:
uuid.UUID(value)
@@ -2433,7 +2426,7 @@ class LazyReferenceField(BaseField):
document. Note this only work getting field (not setting or deleting).
"""
# XXX ValidationError raised outside of the "validate" method.
if not isinstance(document_type, six.string_types) and not issubclass(
if not isinstance(document_type, str) and not issubclass(
document_type, Document
):
self.error(
@@ -2449,7 +2442,7 @@ class LazyReferenceField(BaseField):
@property
def document_type(self):
if isinstance(self.document_type_obj, six.string_types):
if isinstance(self.document_type_obj, str):
if self.document_type_obj == RECURSIVE_REFERENCE_CONSTANT:
self.document_type_obj = self.owner_document
else:

View File

@@ -349,20 +349,20 @@ class BaseQuerySet(object):
)
except pymongo.errors.DuplicateKeyError as err:
message = "Could not save document (%s)"
raise NotUniqueError(message % six.text_type(err))
raise NotUniqueError(message % err)
except pymongo.errors.BulkWriteError as err:
# inserting documents that already have an _id field will
# give huge performance debt or raise
message = u"Bulk write error: (%s)"
raise BulkWriteError(message % six.text_type(err.details))
raise BulkWriteError(message % err.details)
except pymongo.errors.OperationFailure as err:
message = "Could not save document (%s)"
if re.match("^E1100[01] duplicate key", six.text_type(err)):
if re.match("^E1100[01] duplicate key", str(err)):
# E11000 - duplicate key error index
# E11001 - duplicate key on update
message = u"Tried to save duplicate unique keys (%s)"
raise NotUniqueError(message % six.text_type(err))
raise OperationError(message % six.text_type(err))
raise NotUniqueError(message % err)
raise OperationError(message % err)
# Apply inserted_ids to documents
for doc, doc_id in zip(docs, ids):
@@ -534,12 +534,12 @@ class BaseQuerySet(object):
elif result.raw_result:
return result.raw_result["n"]
except pymongo.errors.DuplicateKeyError as err:
raise NotUniqueError(u"Update failed (%s)" % six.text_type(err))
raise NotUniqueError("Update failed (%s)" % err)
except pymongo.errors.OperationFailure as err:
if six.text_type(err) == u"multi not coded yet":
message = u"update() method requires MongoDB 1.1.3+"
if str(err) == "multi not coded yet":
message = "update() method requires MongoDB 1.1.3+"
raise OperationError(message)
raise OperationError(u"Update failed (%s)" % six.text_type(err))
raise OperationError("Update failed (%s)" % err)
def upsert_one(self, write_concern=None, **update):
"""Overwrite or add the first document matched by the query.
@@ -1348,13 +1348,13 @@ class BaseQuerySet(object):
map_f_scope = {}
if isinstance(map_f, Code):
map_f_scope = map_f.scope
map_f = six.text_type(map_f)
map_f = str(map_f)
map_f = Code(queryset._sub_js_fields(map_f), map_f_scope)
reduce_f_scope = {}
if isinstance(reduce_f, Code):
reduce_f_scope = reduce_f.scope
reduce_f = six.text_type(reduce_f)
reduce_f = str(reduce_f)
reduce_f_code = queryset._sub_js_fields(reduce_f)
reduce_f = Code(reduce_f_code, reduce_f_scope)
@@ -1364,7 +1364,7 @@ class BaseQuerySet(object):
finalize_f_scope = {}
if isinstance(finalize_f, Code):
finalize_f_scope = finalize_f.scope
finalize_f = six.text_type(finalize_f)
finalize_f = str(finalize_f)
finalize_f_code = queryset._sub_js_fields(finalize_f)
finalize_f = Code(finalize_f_code, finalize_f_scope)
mr_args["finalize"] = finalize_f
@@ -1380,7 +1380,7 @@ class BaseQuerySet(object):
else:
map_reduce_function = "map_reduce"
if isinstance(output, six.string_types):
if isinstance(output, str):
mr_args["out"] = output
elif isinstance(output, dict):
@@ -1838,7 +1838,7 @@ class BaseQuerySet(object):
field_parts = field.split(".")
try:
field = ".".join(
f if isinstance(f, six.string_types) else f.db_field
f if isinstance(f, str) else f.db_field
for f in self._document._lookup_field(field_parts)
)
db_field_paths.append(field)
@@ -1850,7 +1850,7 @@ class BaseQuerySet(object):
for subdoc in subclasses:
try:
subfield = ".".join(
f if isinstance(f, six.string_types) else f.db_field
f if isinstance(f, str) else f.db_field
for f in subdoc._lookup_field(field_parts)
)
db_field_paths.append(subfield)

View File

@@ -101,7 +101,7 @@ def query(_doc_cls=None, **kwargs):
cleaned_fields = []
for field in fields:
append_field = True
if isinstance(field, six.string_types):
if isinstance(field, str):
parts.append(field)
append_field = False
# is last and CachedReferenceField
@@ -281,7 +281,7 @@ def update(_doc_cls=None, **update):
appended_sub_field = False
for field in fields:
append_field = True
if isinstance(field, six.string_types):
if isinstance(field, str):
# Convert the S operator to $
if field == "S":
field = "$"