Skip to content

Commit 0203182

Browse files
committed
MasterSlaveConnection.document_class PYTHON-136
Document class is now configurable as in Connection and ReplicaSetConnection.
1 parent e5ddb13 commit 0203182

2 files changed

Lines changed: 43 additions & 5 deletions

File tree

pymongo/master_slave_connection.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class MasterSlaveConnection(BaseObject):
3232
"""A master-slave connection to Mongo.
3333
"""
3434

35-
def __init__(self, master, slaves=[], tz_aware=False):
35+
def __init__(self, master, slaves=[], document_class=dict, tz_aware=False):
3636
"""Create a new Master-Slave connection.
3737
3838
The resultant connection should be interacted with using the same
@@ -50,6 +50,8 @@ def __init__(self, master, slaves=[], tz_aware=False):
5050
- `master`: `Connection` instance for the writable Master
5151
- `slaves` (optional): list of `Connection` instances for the
5252
read-only slaves
53+
- `document_class` (optional): default class to use for
54+
documents returned from queries on this connection
5355
- `tz_aware` (optional): if ``True``,
5456
:class:`~datetime.datetime` instances returned as values
5557
in a document by this :class:`MasterSlaveConnection` will be timezone
@@ -73,6 +75,7 @@ def __init__(self, master, slaves=[], tz_aware=False):
7375
self.__in_request = False
7476
self.__master = master
7577
self.__slaves = slaves
78+
self.__document_class = document_class
7679
self.__tz_aware = tz_aware
7780

7881
@property
@@ -83,10 +86,15 @@ def master(self):
8386
def slaves(self):
8487
return self.__slaves
8588

86-
# TODO this is a temporary hack PYTHON-136 is the right solution for this
87-
@property
88-
def document_class(self):
89-
return dict
89+
def get_document_class(self):
90+
return self.__document_class
91+
92+
def set_document_class(self, klass):
93+
self.__document_class = klass
94+
95+
document_class = property(get_document_class, set_document_class,
96+
doc="""Default class to use for documents
97+
returned on this connection.""")
9098

9199
@property
92100
def tz_aware(self):

test/test_master_slave_connection.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
from nose.plugins.skip import SkipTest
2525

26+
from bson.son import SON
2627
from bson.tz_util import utc
2728
from pymongo import ReadPreference
2829
from pymongo.errors import ConnectionFailure, InvalidName
@@ -371,6 +372,35 @@ def test_base_object(self):
371372
self.assertFalse(self.connection.safe)
372373
self.assertEqual({}, self.connection.get_lasterror_options())
373374

375+
def test_document_class(self):
376+
c = MasterSlaveConnection(self.master, self.slaves)
377+
db = c.pymongo_test
378+
db.test.insert({"x": 1})
379+
time.sleep(1)
380+
381+
self.assertEqual(dict, c.document_class)
382+
self.assert_(isinstance(db.test.find_one(), dict))
383+
self.assertFalse(isinstance(db.test.find_one(), SON))
384+
385+
c.document_class = SON
386+
387+
self.assertEqual(SON, c.document_class)
388+
self.assert_(isinstance(db.test.find_one(), SON))
389+
self.assertFalse(isinstance(db.test.find_one(as_class=dict), SON))
390+
391+
c = MasterSlaveConnection(self.master, self.slaves, document_class=SON)
392+
db = c.pymongo_test
393+
394+
self.assertEqual(SON, c.document_class)
395+
self.assert_(isinstance(db.test.find_one(), SON))
396+
self.assertFalse(isinstance(db.test.find_one(as_class=dict), SON))
397+
398+
c.document_class = dict
399+
400+
self.assertEqual(dict, c.document_class)
401+
self.assert_(isinstance(db.test.find_one(), dict))
402+
self.assertFalse(isinstance(db.test.find_one(), SON))
403+
374404
def test_tz_aware(self):
375405
dt = datetime.datetime.utcnow()
376406
conn = MasterSlaveConnection(self.master, self.slaves)

0 commit comments

Comments
 (0)