diff --git a/docs/changelog.rst b/docs/changelog.rst index bf3bba24..dfed5f59 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,7 +5,7 @@ Changelog Development =========== - expose `mongoengine.connection.disconnect` and `mongoengine.connection.disconnect_all` -- POTENTIAL BREAKING CHANGE: Fixes in connect/disconnect methods #565 #566 +- POTENTIAL BREAKING CHANGES: Fixes in connect/disconnect methods #565 #566 #605 #607 #1213 #1599 - calling `connect` 2 times with the same alias and different parameter will raise an error (should call disconnect first) - disconnect now clears `mongoengine.connection._connection_settings` - disconnect now clears the cached attribute `Document._collection` diff --git a/mongoengine/connection.py b/mongoengine/connection.py index 0597199b..8902bbf6 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -10,6 +10,8 @@ __all__ = ['MongoEngineConnectionError', 'connect', 'disconnect', 'disconnect_al DEFAULT_CONNECTION_NAME = 'default' DEFAULT_DATABASE_NAME = 'test' +DEFAULT_HOST = 'localhost' +DEFAULT_PORT = 27017 if IS_PYMONGO_3: READ_PREFERENCE = ReadPreference.PRIMARY @@ -61,8 +63,8 @@ def _get_connection_settings( """ conn_settings = { 'name': name or db or DEFAULT_DATABASE_NAME, - 'host': host or 'localhost', - 'port': port or 27017, + 'host': host or DEFAULT_HOST, + 'port': port or DEFAULT_PORT, 'read_preference': read_preference, 'username': username, 'password': password, @@ -172,6 +174,7 @@ def register_connection(alias, db=None, name=None, host=None, port=None, def disconnect(alias=DEFAULT_CONNECTION_NAME): """Close the connection with a given alias.""" from mongoengine.base.common import _get_documents_by_db + from mongoengine import Document if alias in _connections: get_connection(alias=alias).close() @@ -180,7 +183,7 @@ def disconnect(alias=DEFAULT_CONNECTION_NAME): if alias in _dbs: # Detach all cached collections in Documents for doc_cls in _get_documents_by_db(alias, DEFAULT_CONNECTION_NAME): - if hasattr(doc_cls, '_disconnect'): + if issubclass(doc_cls, Document): # Skip EmbeddedDocument doc_cls._disconnect() del _dbs[alias] diff --git a/tests/test_connection.py b/tests/test_connection.py index 827829b5..5ff22e06 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -249,9 +249,15 @@ class ConnectionTest(unittest.TestCase): connect('mongoenginetest') self.assertEqual(len(connections), 1) - self.assertEqual(len(dbs), 1) + self.assertEqual(len(dbs), 0) self.assertEqual(len(connection_settings), 1) + class TestDoc(Document): + pass + + TestDoc.drop_collection() # triggers the db + self.assertEqual(len(dbs), 1) + disconnect() self.assertEqual(len(connections), 0) self.assertEqual(len(dbs), 0) diff --git a/tests/test_context_managers.py b/tests/test_context_managers.py index 227031e0..22c33b01 100644 --- a/tests/test_context_managers.py +++ b/tests/test_context_managers.py @@ -37,14 +37,15 @@ class ContextManagersTest(unittest.TestCase): def test_switch_collection_context_manager(self): connect('mongoenginetest') - register_connection('testdb-1', 'mongoenginetest2') + register_connection(alias='testdb-1', db='mongoenginetest2') class Group(Document): name = StringField() - Group.drop_collection() + Group.drop_collection() # drops in default + with switch_collection(Group, 'group1') as Group: - Group.drop_collection() + Group.drop_collection() # drops in group1 Group(name="hello - group").save() self.assertEqual(1, Group.objects.count())