Skip to content

Commit aa3ff39

Browse files
authored
Merge pull request #2444 from bagerard/improve_code_health
Improve code health
2 parents fb8f02d + 149fb95 commit aa3ff39

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+526
-728
lines changed

.pre-commit-config.yaml

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
fail_fast: false
22
repos:
3-
- repo: https://github.com/ambv/black
4-
rev: 19.10b0
5-
hooks:
6-
- id: black
7-
- repo: https://gitlab.com/pycqa/flake8
8-
rev: 3.8.0a2
9-
hooks:
10-
- id: flake8
11-
additional_dependencies:
12-
- flake8-import-order
3+
- repo: https://github.com/ambv/black
4+
rev: 20.8b1
5+
hooks:
6+
- id: black
7+
- repo: https://gitlab.com/pycqa/flake8
8+
rev: 3.8.4
9+
hooks:
10+
- id: flake8
11+
additional_dependencies:
12+
- flake8-import-order
13+
- repo: https://github.com/asottile/pyupgrade
14+
rev: v2.7.4
15+
hooks:
16+
- id: pyupgrade
17+
args: [--py36-plus]

.travis.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
language: python
1717
dist: xenial
1818
python:
19-
- 3.6
20-
- 3.7
21-
- 3.8
22-
- 3.9
23-
- pypy3
19+
- 3.6
20+
- 3.7
21+
- 3.8
22+
- 3.9
23+
- pypy3
2424

2525
env:
2626
global:
@@ -42,14 +42,14 @@ matrix:
4242
fast_finish: true
4343

4444
include:
45-
- python: 3.7
46-
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_6}
47-
- python: 3.7
48-
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_9}
49-
- python: 3.7
50-
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_11}
51-
- python: 3.8
52-
env: MONGODB=${MONGODB_4_0} PYMONGO=${PYMONGO_3_11}
45+
- python: 3.7
46+
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_6}
47+
- python: 3.7
48+
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_9}
49+
- python: 3.7
50+
env: MONGODB=${MONGODB_3_6} PYMONGO=${PYMONGO_3_11}
51+
- python: 3.8
52+
env: MONGODB=${MONGODB_4_0} PYMONGO=${PYMONGO_3_11}
5353

5454
install:
5555
# Install Mongo
@@ -69,7 +69,7 @@ before_script:
6969
- ${PWD}/mongodb-linux-x86_64-${MONGODB}/bin/mongod --dbpath ${PWD}/mongodb-linux-x86_64-${MONGODB}/data --logpath ${PWD}/mongodb-linux-x86_64-${MONGODB}/mongodb.log --fork
7070
# Run pre-commit hooks (black, flake8, etc) on entire codebase
7171
- if [[ $TRAVIS_PYTHON_VERSION == $MAIN_PYTHON_VERSION ]]; then pre-commit run -a; else echo "pre-commit checks only runs on py37"; fi
72-
- mongo --eval 'db.version();' # Make sure mongo is awake
72+
- mongo --eval 'db.version();' # Make sure mongo is awake
7373

7474
script:
7575
- tox -e $(echo py$TRAVIS_PYTHON_VERSION-mg$PYMONGO | tr -d . | sed -e 's/pypypy/pypy/') -- -a "--cov=mongoengine"
@@ -83,8 +83,8 @@ notifications:
8383
# Only run builds on the master branch and GitHub releases (tagged as vX.Y.Z)
8484
branches:
8585
only:
86-
- master
87-
- /^v.*$/
86+
- master
87+
- /^v.*$/
8888

8989
# Whenever a new release is created via GitHub, publish it on PyPI.
9090
deploy:

benchmarks/test_basic_doc_ops.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def init_book():
4545

4646
print(
4747
"Doc setattr: %.3fus"
48-
% (timeit(lambda: setattr(b, "name", "New name"), 10000) * 10 ** 6)
48+
% (timeit(lambda: setattr(b, "name", "New name"), 10000) * 10 ** 6) # noqa B010
4949
)
5050

5151
print("Doc to mongo: %.3fus" % (timeit(b.to_mongo, 1000) * 10 ** 6))

docs/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
master_doc = "index"
4242

4343
# General information about the project.
44-
project = u"MongoEngine"
45-
copyright = u"2009, MongoEngine Authors"
44+
project = "MongoEngine"
45+
copyright = "2009, MongoEngine Authors" # noqa: A001
4646

4747
# The version info for the project you're documenting, acts as replacement for
4848
# |version| and |release|, also used in various other places throughout the

mongoengine/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
# mongoengine, e.g. instead of `from mongoengine.connection import connect`,
1111
# users can simply use `from mongoengine import connect`, or even
1212
# `from mongoengine import *` and then `connect('testdb')`.
13-
from mongoengine.connection import *
14-
from mongoengine.document import *
15-
from mongoengine.errors import *
16-
from mongoengine.fields import *
17-
from mongoengine.queryset import *
18-
from mongoengine.signals import *
13+
from mongoengine.connection import * # noqa: F401
14+
from mongoengine.document import * # noqa: F401
15+
from mongoengine.errors import * # noqa: F401
16+
from mongoengine.fields import * # noqa: F401
17+
from mongoengine.queryset import * # noqa: F401
18+
from mongoengine.signals import * # noqa: F401
1919

2020

2121
__all__ = (

mongoengine/base/datastructures.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ def __getitem__(self, key):
6767
if isinstance(value, EmbeddedDocument) and value._instance is None:
6868
value._instance = self._instance
6969
elif isinstance(value, dict) and not isinstance(value, BaseDict):
70-
value = BaseDict(value, None, "{}.{}".format(self._name, key))
70+
value = BaseDict(value, None, f"{self._name}.{key}")
7171
super().__setitem__(key, value)
7272
value._instance = self._instance
7373
elif isinstance(value, list) and not isinstance(value, BaseList):
74-
value = BaseList(value, None, "{}.{}".format(self._name, key))
74+
value = BaseList(value, None, f"{self._name}.{key}")
7575
super().__setitem__(key, value)
7676
value._instance = self._instance
7777
return value
@@ -97,7 +97,7 @@ def __setstate__(self, state):
9797
def _mark_as_changed(self, key=None):
9898
if hasattr(self._instance, "_mark_as_changed"):
9999
if key:
100-
self._instance._mark_as_changed("{}.{}".format(self._name, key))
100+
self._instance._mark_as_changed(f"{self._name}.{key}")
101101
else:
102102
self._instance._mark_as_changed(self._name)
103103

@@ -133,12 +133,12 @@ def __getitem__(self, key):
133133
value._instance = self._instance
134134
elif isinstance(value, dict) and not isinstance(value, BaseDict):
135135
# Replace dict by BaseDict
136-
value = BaseDict(value, None, "{}.{}".format(self._name, key))
136+
value = BaseDict(value, None, f"{self._name}.{key}")
137137
super().__setitem__(key, value)
138138
value._instance = self._instance
139139
elif isinstance(value, list) and not isinstance(value, BaseList):
140140
# Replace list by BaseList
141-
value = BaseList(value, None, "{}.{}".format(self._name, key))
141+
value = BaseList(value, None, f"{self._name}.{key}")
142142
super().__setitem__(key, value)
143143
value._instance = self._instance
144144
return value
@@ -180,9 +180,7 @@ def __setitem__(self, key, value):
180180
def _mark_as_changed(self, key=None):
181181
if hasattr(self._instance, "_mark_as_changed"):
182182
if key is not None:
183-
self._instance._mark_as_changed(
184-
"{}.{}".format(self._name, key % len(self))
185-
)
183+
self._instance._mark_as_changed(f"{self._name}.{key % len(self)}")
186184
else:
187185
self._instance._mark_as_changed(self._name)
188186

@@ -429,7 +427,7 @@ class SpecificStrictDict(cls):
429427

430428
def __repr__(self):
431429
return "{%s}" % ", ".join(
432-
'"{!s}": {!r}'.format(k, v) for k, v in self.items()
430+
f'"{k!s}": {v!r}' for k, v in self.items()
433431
)
434432

435433
cls._classes[allowed_keys] = SpecificStrictDict
@@ -472,4 +470,4 @@ def __getattr__(self, name):
472470
raise AttributeError()
473471

474472
def __repr__(self):
475-
return "<LazyReference({}, {!r})>".format(self.document_type, self.pk)
473+
return f"<LazyReference({self.document_type}, {self.pk!r})>"

mongoengine/base/document.py

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ def __init__(self, *args, **values):
8989
list(self._fields.keys()) + ["id", "pk", "_cls", "_text_score"]
9090
)
9191
if _undefined_fields:
92-
msg = ('The fields "{}" do not exist on the document "{}"').format(
93-
_undefined_fields, self._class_name
94-
)
92+
msg = f'The fields "{_undefined_fields}" do not exist on the document "{self._class_name}"'
9593
raise FieldDoesNotExist(msg)
9694

9795
if self.STRICT and not self._dynamic:
@@ -231,10 +229,10 @@ def __setstate__(self, data):
231229
setattr(self, k, data[k])
232230
if "_fields_ordered" in data:
233231
if self._dynamic:
234-
setattr(self, "_fields_ordered", data["_fields_ordered"])
232+
self._fields_ordered = data["_fields_ordered"]
235233
else:
236234
_super_fields_ordered = type(self)._fields_ordered
237-
setattr(self, "_fields_ordered", _super_fields_ordered)
235+
self._fields_ordered = _super_fields_ordered
238236

239237
dynamic_fields = data.get("_dynamic_fields") or SON()
240238
for k in dynamic_fields.keys():
@@ -244,8 +242,7 @@ def __iter__(self):
244242
return iter(self._fields_ordered)
245243

246244
def __getitem__(self, name):
247-
"""Dictionary-style field access, return a field's value if present.
248-
"""
245+
"""Dictionary-style field access, return a field's value if present."""
249246
try:
250247
if name in self._fields_ordered:
251248
return getattr(self, name)
@@ -254,8 +251,7 @@ def __getitem__(self, name):
254251
raise KeyError(name)
255252

256253
def __setitem__(self, name, value):
257-
"""Dictionary-style field access, set a field's value.
258-
"""
254+
"""Dictionary-style field access, set a field's value."""
259255
# Ensure that the field exists before settings its value
260256
if not self._dynamic and name not in self._fields:
261257
raise KeyError(name)
@@ -277,7 +273,7 @@ def __repr__(self):
277273
except (UnicodeEncodeError, UnicodeDecodeError):
278274
u = "[Bad Unicode data]"
279275
repr_type = str if u is None else type(u)
280-
return repr_type("<{}: {}>".format(self.__class__.__name__, u))
276+
return repr_type(f"<{self.__class__.__name__}: {u}>")
281277

282278
def __str__(self):
283279
# TODO this could be simpler?
@@ -433,7 +429,7 @@ def validate(self, clean=True):
433429
pk = self.pk
434430
elif self._instance and hasattr(self._instance, "pk"):
435431
pk = self._instance.pk
436-
message = "ValidationError ({}:{}) ".format(self._class_name, pk)
432+
message = f"ValidationError ({self._class_name}:{pk}) "
437433
raise ValidationError(message, errors=errors)
438434

439435
def to_json(self, *args, **kwargs):
@@ -506,7 +502,7 @@ def _mark_as_changed(self, key):
506502
if "." in key:
507503
key, rest = key.split(".", 1)
508504
key = self._db_field_map.get(key, key)
509-
key = "{}.{}".format(key, rest)
505+
key = f"{key}.{rest}"
510506
else:
511507
key = self._db_field_map.get(key, key)
512508

@@ -578,7 +574,7 @@ def _nestable_types_clear_changed_fields(data):
578574
else:
579575
iterator = data.items()
580576

581-
for index_or_key, value in iterator:
577+
for _index_or_key, value in iterator:
582578
if hasattr(value, "_get_changed_fields") and not isinstance(
583579
value, Document
584580
): # don't follow references
@@ -602,23 +598,22 @@ def _nestable_types_changed_fields(changed_fields, base_key, data):
602598
iterator = data.items()
603599

604600
for index_or_key, value in iterator:
605-
item_key = "{}{}.".format(base_key, index_or_key)
601+
item_key = f"{base_key}{index_or_key}."
606602
# don't check anything lower if this key is already marked
607603
# as changed.
608604
if item_key[:-1] in changed_fields:
609605
continue
610606

611607
if hasattr(value, "_get_changed_fields"):
612608
changed = value._get_changed_fields()
613-
changed_fields += ["{}{}".format(item_key, k) for k in changed if k]
609+
changed_fields += [f"{item_key}{k}" for k in changed if k]
614610
elif isinstance(value, (list, tuple, dict)):
615611
BaseDocument._nestable_types_changed_fields(
616612
changed_fields, item_key, value
617613
)
618614

619615
def _get_changed_fields(self):
620-
"""Return a list of all fields that have explicitly been changed.
621-
"""
616+
"""Return a list of all fields that have explicitly been changed."""
622617
EmbeddedDocument = _import_class("EmbeddedDocument")
623618
ReferenceField = _import_class("ReferenceField")
624619
GenericReferenceField = _import_class("GenericReferenceField")
@@ -643,7 +638,7 @@ def _get_changed_fields(self):
643638
if isinstance(data, EmbeddedDocument):
644639
# Find all embedded fields that have been changed
645640
changed = data._get_changed_fields()
646-
changed_fields += ["{}{}".format(key, k) for k in changed if k]
641+
changed_fields += [f"{key}{k}" for k in changed if k]
647642
elif isinstance(data, (list, tuple, dict)):
648643
if hasattr(field, "field") and isinstance(
649644
field.field, (ReferenceField, GenericReferenceField)
@@ -750,8 +745,7 @@ def _get_collection_name(cls):
750745

751746
@classmethod
752747
def _from_son(cls, son, _auto_dereference=True, created=False):
753-
"""Create an instance of a Document (subclass) from a PyMongo SON (dict)
754-
"""
748+
"""Create an instance of a Document (subclass) from a PyMongo SON (dict)"""
755749
if son and not isinstance(son, dict):
756750
raise ValueError(
757751
"The source SON object needs to be of type 'dict' but a '%s' was found"
@@ -796,11 +790,10 @@ def _from_son(cls, son, _auto_dereference=True, created=False):
796790
errors_dict[field_name] = e
797791

798792
if errors_dict:
799-
errors = "\n".join(
800-
["Field '{}' - {}".format(k, v) for k, v in errors_dict.items()]
801-
)
793+
errors = "\n".join([f"Field '{k}' - {v}" for k, v in errors_dict.items()])
802794
msg = "Invalid data to create a `{}` instance.\n{}".format(
803-
cls._class_name, errors,
795+
cls._class_name,
796+
errors,
804797
)
805798
raise InvalidDocumentError(msg)
806799

@@ -968,10 +961,7 @@ def _unique_with_indexes(cls, namespace=""):
968961
unique_fields += unique_with
969962

970963
# Add the new index to the list
971-
fields = [
972-
("{}{}".format(namespace, f), pymongo.ASCENDING)
973-
for f in unique_fields
974-
]
964+
fields = [(f"{namespace}{f}", pymongo.ASCENDING) for f in unique_fields]
975965
index = {"fields": fields, "unique": True, "sparse": sparse}
976966
unique_indexes.append(index)
977967

@@ -1007,9 +997,7 @@ def _geo_indices(cls, inspected=None, parent_field=None):
1007997
"PolygonField",
1008998
)
1009999

1010-
geo_field_types = tuple(
1011-
[_import_class(field) for field in geo_field_type_names]
1012-
)
1000+
geo_field_types = tuple(_import_class(field) for field in geo_field_type_names)
10131001

10141002
for field in cls._fields.values():
10151003
if not isinstance(field, geo_field_types):
@@ -1027,7 +1015,7 @@ def _geo_indices(cls, inspected=None, parent_field=None):
10271015
elif field._geo_index:
10281016
field_name = field.db_field
10291017
if parent_field:
1030-
field_name = "{}.{}".format(parent_field, field_name)
1018+
field_name = f"{parent_field}.{field_name}"
10311019
geo_indices.append({"fields": [(field_name, field._geo_index)]})
10321020

10331021
return geo_indices
@@ -1165,8 +1153,7 @@ def _lookup_field(cls, parts):
11651153

11661154
@classmethod
11671155
def _translate_field_name(cls, field, sep="."):
1168-
"""Translate a field attribute name to a database field name.
1169-
"""
1156+
"""Translate a field attribute name to a database field name."""
11701157
parts = field.split(sep)
11711158
parts = [f.db_field for f in cls._lookup_field(parts)]
11721159
return ".".join(parts)

0 commit comments

Comments
 (0)