[Sqlalchemy-commits] [1126] sqlalchemy/trunk/test: added expire() function + unit test fixes [ticket
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-10 05:03:29
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1126] sqlalchemy/trunk/test: added expire() function + unit test fixes [ticket:95]</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1126</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-09 23:03:17 -0600 (Thu, 09 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added expire() function + unit test fixes [ticket:95]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyattributespy">sqlalchemy/trunk/lib/sqlalchemy/attributes.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingobjectstorepy">sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py</a></li> <li><a href="#sqlalchemytrunktestmapperpy">sqlalchemy/trunk/test/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyattributespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/attributes.py (1125 => 1126)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-10 04:47:38 UTC (rev 1125) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-10 05:03:17 UTC (rev 1126) </span><span class="lines">@@ -353,10 +353,20 @@ </span><span class="cx"> try: </span><span class="cx"> attr = obj.__dict__['_managed_attributes'] </span><span class="cx"> except KeyError: </span><ins>+ trigger = obj.__dict__.pop('_managed_trigger', None) + if trigger: + trigger() </ins><span class="cx"> attr = {} </span><span class="cx"> obj.__dict__['_managed_attributes'] = attr </span><span class="cx"> return attr </span><span class="cx"> </span><ins>+ def trigger_history(self, obj, callable): + try: + del obj.__dict__['_managed_attributes'] + except KeyError: + pass + obj.__dict__['_managed_trigger'] = callable + </ins><span class="cx"> def reset_history(self, obj, key): </span><span class="cx"> """removes the history object for the given attribute on the given object. </span><span class="cx"> When the attribute is next accessed, a new container will be created via the </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1125 => 1126)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-10 04:47:38 UTC (rev 1125) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-10 05:03:17 UTC (rev 1126) </span><span class="lines">@@ -145,9 +145,17 @@ </span><span class="cx"> self.uow.commit() </span><span class="cx"> </span><span class="cx"> def refresh(self, *obj): </span><ins>+ """reloads the attributes for the given objects from the database, clears + any changes made.""" </ins><span class="cx"> for o in obj: </span><span class="cx"> self.uow.refresh(o) </span><span class="cx"> </span><ins>+ def expire(self, *obj): + """invalidates the data in the given objects and sets them to refresh themselves + the next time they are requested.""" + for o in obj: + global_attributes.trigger_history(o, lambda: refresh(o)) + </ins><span class="cx"> def register_clean(self, obj): </span><span class="cx"> self._bind_to(obj) </span><span class="cx"> self.uow.register_clean(obj) </span><span class="lines">@@ -229,6 +237,11 @@ </span><span class="cx"> """reloads the state of this object from the database, and cancels any in-memory </span><span class="cx"> changes.""" </span><span class="cx"> get_session().refresh(*obj) </span><ins>+ +def expire(*obj): + """invalidates the data in the given objects and sets them to refresh themselves + the next time they are requested.""" + get_session().expire(*obj) </ins><span class="cx"> </span><span class="cx"> def delete(*obj): </span><span class="cx"> """registers the given objects as to be deleted upon the next commit""" </span></span></pre></div> <a id="sqlalchemytrunktestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/mapper.py (1125 => 1126)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/mapper.py 2006-03-10 04:47:38 UTC (rev 1125) +++ sqlalchemy/trunk/test/mapper.py 2006-03-10 05:03:17 UTC (rev 1126) </span><span class="lines">@@ -84,6 +84,31 @@ </span><span class="cx"> u2 = m.get(7) </span><span class="cx"> self.assert_(u is not u2) </span><span class="cx"> </span><ins>+ def testrefresh(self): + m = mapper(User, users) + u = m.get(7) + u.user_name = 'foo' + objectstore.refresh(u) + + # its refreshed, so not dirty + self.assert_(u not in objectstore.get_session().uow.dirty) + + # username is back to the DB + self.assert_(u.user_name == 'jack') + + u.user_name = 'foo' + # now its dirty + self.assert_(u in objectstore.get_session().uow.dirty) + self.assert_(u.user_name == 'foo') + objectstore.expire(u) + + # expired, but not refreshed yet. still dirty + self.assert_(u in objectstore.get_session().uow.dirty) + # get the attribute, it refreshes + self.assert_(u.user_name == 'jack') + # not dirty anymore + self.assert_(u not in objectstore.get_session().uow.dirty) + </ins><span class="cx"> def testmagic(self): </span><span class="cx"> m = mapper(User, users, properties = { </span><span class="cx"> 'addresses' : relation(mapper(Address, addresses)) </span></span></pre> </div> </div> </body> </html> |