[Sqlalchemy-commits] [1193] sqlalchemy/trunk/test: added expunge() method to objectstore
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-25 00:18:05
|
<!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>[1193] sqlalchemy/trunk/test: added expunge() method to objectstore</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1193</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-24 18:17:51 -0600 (Fri, 24 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added expunge() method to objectstore correction in attributes reset_history to really reset in all cases added unit tests testing refresh()/expire() bug that was fixed by reset_history thing</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="#sqlalchemytrunklibsqlalchemymappingunitofworkpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.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 (1192 => 1193)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-24 23:06:07 UTC (rev 1192) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-25 00:17:51 UTC (rev 1193) </span><span class="lines">@@ -397,7 +397,10 @@ </span><span class="cx"> x.clear() </span><span class="cx"> del self.attribute_history(obj)[key] </span><span class="cx"> except KeyError: </span><del>- pass </del><ins>+ try: + del obj.__dict__[key] + except KeyError: + pass </ins><span class="cx"> </span><span class="cx"> def class_managed(self, class_): </span><span class="cx"> """returns a dictionary of "history container definitions", which is attached to a </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1192 => 1193)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-24 23:06:07 UTC (rev 1192) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-25 00:17:51 UTC (rev 1193) </span><span class="lines">@@ -166,6 +166,10 @@ </span><span class="cx"> for o in obj: </span><span class="cx"> global_attributes.trigger_history(o, lambda: refresh(o)) </span><span class="cx"> </span><ins>+ def expunge(self, *obj): + for o in obj: + self.uow.expunge(obj) + </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">@@ -252,7 +256,10 @@ </span><span class="cx"> """invalidates the data in the given objects and sets them to refresh themselves </span><span class="cx"> the next time they are requested.""" </span><span class="cx"> get_session().expire(*obj) </span><del>- </del><ins>+ +def expunge(*obj): + get_session().expunge(*obj) + </ins><span class="cx"> def delete(*obj): </span><span class="cx"> """registers the given objects as to be deleted upon the next commit""" </span><span class="cx"> s = get_session().delete(*obj) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py (1192 => 1193)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py 2006-03-24 23:06:07 UTC (rev 1192) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/unitofwork.py 2006-03-25 00:17:51 UTC (rev 1193) </span><span class="lines">@@ -104,6 +104,11 @@ </span><span class="cx"> """returns True if the given key is present in this UnitOfWork's identity map.""" </span><span class="cx"> return self.identity_map.has_key(key) </span><span class="cx"> </span><ins>+ def expunge(self, obj): + """removes this object completely from the UnitOfWork, including the identity map, + and the "new", "dirty" and "deleted" lists.""" + self._remove_deleted(obj) + </ins><span class="cx"> def _remove_deleted(self, obj): </span><span class="cx"> if hasattr(obj, "_instance_key"): </span><span class="cx"> del self.identity_map[obj._instance_key] </span><span class="lines">@@ -119,7 +124,7 @@ </span><span class="cx"> del self.new[obj] </span><span class="cx"> except KeyError: </span><span class="cx"> pass </span><del>- self.attributes.commit(obj) </del><ins>+ #self.attributes.commit(obj) </ins><span class="cx"> self.attributes.remove(obj) </span><span class="cx"> </span><span class="cx"> def _validate_obj(self, obj): </span></span></pre></div> <a id="sqlalchemytrunktestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/mapper.py (1192 => 1193)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/mapper.py 2006-03-24 23:06:07 UTC (rev 1192) +++ sqlalchemy/trunk/test/mapper.py 2006-03-25 00:17:51 UTC (rev 1193) </span><span class="lines">@@ -85,9 +85,14 @@ </span><span class="cx"> self.assert_(u is not u2) </span><span class="cx"> </span><span class="cx"> def testrefresh(self): </span><del>- m = mapper(User, users) </del><ins>+ m = mapper(User, users, properties={'addresses':relation(mapper(Address, addresses))}) </ins><span class="cx"> u = m.get(7) </span><span class="cx"> u.user_name = 'foo' </span><ins>+ a = Address() + u.addresses.append(a) + + self.assert_(a in u.addresses) + </ins><span class="cx"> objectstore.refresh(u) </span><span class="cx"> </span><span class="cx"> # its refreshed, so not dirty </span><span class="lines">@@ -96,16 +101,21 @@ </span><span class="cx"> # username is back to the DB </span><span class="cx"> self.assert_(u.user_name == 'jack') </span><span class="cx"> </span><ins>+ self.assert_(a not in u.addresses) + </ins><span class="cx"> u.user_name = 'foo' </span><ins>+ u.addresses.append(a) </ins><span class="cx"> # now its dirty </span><span class="cx"> self.assert_(u in objectstore.get_session().uow.dirty) </span><span class="cx"> self.assert_(u.user_name == 'foo') </span><ins>+ self.assert_(a in u.addresses) </ins><span class="cx"> objectstore.expire(u) </span><span class="cx"> </span><span class="cx"> # expired, but not refreshed yet. still dirty </span><span class="cx"> self.assert_(u in objectstore.get_session().uow.dirty) </span><span class="cx"> # get the attribute, it refreshes </span><span class="cx"> self.assert_(u.user_name == 'jack') </span><ins>+ self.assert_(a not in u.addresses) </ins><span class="cx"> # not dirty anymore </span><span class="cx"> self.assert_(u not in objectstore.get_session().uow.dirty) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |