Created
March 2, 2012 22:30
-
-
Save mentat/1961902 to your computer and use it in GitHub Desktop.
Add _is_loaded to NDB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -Naur -x '*.pyc' ndb.old/model.py ndb/model.py | |
--- ndb.old/model.py 2012-03-02 16:04:15.000000000 -0600 | |
+++ ndb/model.py 2012-03-02 16:11:18.000000000 -0600 | |
@@ -2525,6 +2525,7 @@ | |
app is not None or namespace is not None): | |
self._key = Key(self._get_kind(), id, | |
parent=parent, app=app, namespace=namespace) | |
+ self._is_loaded = False | |
self._values = {} | |
self._set_attributes(kwds) | |
@@ -2729,7 +2730,7 @@ | |
for p in plist: | |
prop = ent._get_property_for(p, plist is indexed_properties) | |
prop._deserialize(ent, p) | |
- | |
+ ent._is_loaded = True | |
return ent | |
def _get_property_for(self, p, indexed=True, depth=0): | |
@@ -2902,6 +2903,9 @@ | |
This is the asynchronous version of Model._put(). | |
""" | |
+ def load_callback(_): | |
+ self._is_loaded = True | |
+ | |
from . import tasklets | |
ctx = tasklets.get_context() | |
self._prepare_for_put() | |
@@ -2912,6 +2916,7 @@ | |
post_hook = self._post_put_hook | |
if not self._is_default_hook(Model._default_post_put_hook, post_hook): | |
fut.add_immediate_callback(post_hook, fut) | |
+ fut.add_immediate_callback(load_callback, fut) | |
return fut | |
put_async = _put_async | |
diff -Naur -x '*.pyc' ndb.old/model_test.py ndb/model_test.py | |
--- ndb.old/model_test.py 2012-03-02 16:04:15.000000000 -0600 | |
+++ ndb/model_test.py 2012-03-02 16:23:04.000000000 -0600 | |
@@ -3252,6 +3252,51 @@ | |
self.assertFalse(fut._immediate_callbacks, | |
'Allocate ids hook queued default no-op.') | |
+ def testCreateHook(self): | |
+ self.pre, self.post, self.putted = 0,0,0 | |
+ | |
+ class TestModel(model.Model): | |
+ | |
+ def post_put_hook(_, future): | |
+ self.putted += 1 | |
+ | |
+ def pre_create_hook(_): | |
+ self.pre += 1 | |
+ | |
+ def post_create_hook(_, future): | |
+ self.post += 1 | |
+ | |
+ def _pre_put_hook(self): | |
+ if not self._is_loaded: | |
+ self.pre_create_hook() | |
+ | |
+ def _post_put_hook(self, future): | |
+ if not self._is_loaded: | |
+ self.post_create_hook(future) | |
+ self.post_put_hook(future) | |
+ | |
+ | |
+ obj = TestModel() | |
+ self.assertEqual(obj._is_loaded, False) | |
+ obj.put() | |
+ self.assertEqual(self.pre, 1) | |
+ self.assertEqual(self.post, 1) | |
+ self.assertEqual(self.putted, 1) | |
+ self.assertEqual(obj._is_loaded, True) | |
+ obj.put() | |
+ self.assertEqual(self.pre, 1) | |
+ self.assertEqual(self.post, 1) | |
+ self.assertEqual(self.putted, 2) | |
+ | |
+ | |
+ obj2 = TestModel(key=model.Key('TestModel', 1000)) | |
+ self.assertEqual(obj2._is_loaded, False) | |
+ obj2.put() | |
+ self.assertEqual(obj2._is_loaded, True) | |
+ obj2.put() | |
+ self.assertEqual(obj2._is_loaded, True) | |
+ | |
+ | |
def testPutHooksCalled(self): | |
test = self # Closure for inside hooks | |
self.pre_counter = 0 | |
@@ -3441,7 +3486,7 @@ | |
pass | |
entity = EmptyModel() | |
fut = entity.put_async() | |
- self.assertFalse(fut._immediate_callbacks, 'Put hook queued default no-op.') | |
+ self.assertFalse(len(fut._immediate_callbacks) > 1, 'Put hook queued default no-op.') | |
def testKeyValidation(self): | |
# See issue 75. http://goo.gl/k0Gfv |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment