Skip to content

Instantly share code, notes, and snippets.

@mentat
Created March 2, 2012 22:30
Show Gist options
  • Save mentat/1961902 to your computer and use it in GitHub Desktop.
Save mentat/1961902 to your computer and use it in GitHub Desktop.
Add _is_loaded to NDB
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