[Sqlalchemy-commits] [1485] sqlalchemy/branches/schema/test: making UOW dump slightly more readable
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-22 17:32:07
|
<!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>[1485] sqlalchemy/branches/schema/test: making UOW dump slightly more readable (the way a hurricaine is slightly less windy than a tornado)</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1485</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-22 12:31:52 -0500 (Mon, 22 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>making UOW dump slightly more readable (the way a hurricaine is slightly less windy than a tornado)</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormmapperpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormunitofworkpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py</a></li> <li><a href="#sqlalchemybranchesschematestcyclespy">sqlalchemy/branches/schema/test/cycles.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyormmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py (1484 => 1485)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-22 01:14:42 UTC (rev 1484) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-22 17:31:52 UTC (rev 1485) </span><span class="lines">@@ -513,10 +513,10 @@ </span><span class="cx"> """called by a UnitOfWork object to save objects, which involves either an INSERT or </span><span class="cx"> an UPDATE statement for each table used by this mapper, for each element of the </span><span class="cx"> list.""" </span><del>- print "SAVE_OBJ MAPPER", self.class_.__name__, objects </del><ins>+ #print "SAVE_OBJ MAPPER", self.class_.__name__, objects </ins><span class="cx"> connection = uow.transaction.connection(self) </span><span class="cx"> for table in self.tables: </span><del>- print "SAVE_OBJ table ", self.class_.__name__, table.name </del><ins>+ #print "SAVE_OBJ table ", self.class_.__name__, table.name </ins><span class="cx"> # looping through our set of tables, which are all "real" tables, as opposed </span><span class="cx"> # to our main table which might be a select statement or something non-writeable </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py (1484 => 1485)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py 2006-05-22 01:14:42 UTC (rev 1484) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/unitofwork.py 2006-05-22 17:31:52 UTC (rev 1485) </span><span class="lines">@@ -279,7 +279,7 @@ </span><span class="cx"> refreshed/updated to reflect a recent save/upcoming delete operation, but not a full </span><span class="cx"> save/delete operation on the object itself, unless an additional save/delete </span><span class="cx"> registration is entered for the object.""" </span><del>- print "REGISTER", repr(obj), repr(getattr(obj, '_instance_key', None)), str(isdelete), str(listonly) </del><ins>+ #print "REGISTER", repr(obj), repr(getattr(obj, '_instance_key', None)), str(isdelete), str(listonly) </ins><span class="cx"> # things can get really confusing if theres duplicate instances floating around, </span><span class="cx"> # so make sure everything is OK </span><span class="cx"> self.uow._validate_obj(obj) </span><span class="lines">@@ -413,7 +413,6 @@ </span><span class="cx"> self.listonly = True </span><span class="cx"> self.childtasks = [] </span><span class="cx"> self.isdelete = False </span><del>- self.mapper = None </del><span class="cx"> def __repr__(self): </span><span class="cx"> return "UOWTaskElement/%d: %s/%d %s" % (id(self), self.obj.__class__.__name__, id(self.obj), (self.listonly and 'listonly' or (self.isdelete and 'delete' or 'save')) ) </span><span class="cx"> </span><span class="lines">@@ -451,9 +450,7 @@ </span><span class="cx"> self.dependencies = [] </span><span class="cx"> self.cyclical_dependencies = [] </span><span class="cx"> self.circular = None </span><del>- self.postcircular = None </del><span class="cx"> self.childtasks = [] </span><del>-# print "NEW TASK", repr(self) </del><span class="cx"> </span><span class="cx"> def is_empty(self): </span><span class="cx"> return len(self.objects) == 0 and len(self.dependencies) == 0 and len(self.childtasks) == 0 </span><span class="lines">@@ -543,7 +540,6 @@ </span><span class="cx"> this is not the normal case; this logic only kicks in when something like </span><span class="cx"> a hierarchical tree is being represented. </span><span class="cx"> </span><del>- TODO: refactor heavily </del><span class="cx"> """ </span><span class="cx"> </span><span class="cx"> allobjects = [] </span><span class="lines">@@ -553,7 +549,7 @@ </span><span class="cx"> </span><span class="cx"> cycles = Set(cycles) </span><span class="cx"> </span><del>- print "BEGIN CIRC SORT-------" </del><ins>+ #print "BEGIN CIRC SORT-------" </ins><span class="cx"> # dependency processors that arent part of the cyclical thing </span><span class="cx"> # get put here </span><span class="cx"> extradeplist = [] </span><span class="lines">@@ -630,8 +626,8 @@ </span><span class="cx"> whosdep = dep.whose_dependent_on_who(obj, o) </span><span class="cx"> if whosdep is not None: </span><span class="cx"> tuples.append(whosdep) </span><del>- # then locate a UOWDependencyProcessor to add the object onto, which - # will handle the modifications between saves/deletes </del><ins>+ # create a UOWDependencyProcessor representing this pair of objects. + # append it to a UOWTask </ins><span class="cx"> if whosdep[0] is obj: </span><span class="cx"> get_dependency_task(obj, dep).append(whosdep[0], isdelete=isdelete) </span><span class="cx"> else: </span><span class="lines">@@ -643,7 +639,7 @@ </span><span class="cx"> if head is None: </span><span class="cx"> return None </span><span class="cx"> </span><del>- print str(head) </del><ins>+ #print str(head) </ins><span class="cx"> </span><span class="cx"> hierarchical_tasks = {} </span><span class="cx"> def get_object_task(obj): </span><span class="lines">@@ -655,8 +651,12 @@ </span><span class="cx"> </span><span class="cx"> def make_task_tree(node, parenttask): </span><span class="cx"> """takes a dependency-sorted tree of objects and creates a tree of UOWTasks""" </span><del>- print "MAKETASKTREE", node.item </del><ins>+ #print "MAKETASKTREE", node.item + </ins><span class="cx"> t = get_object_task(node.item) </span><ins>+ for n in node.children: + t2 = make_task_tree(n, t) + </ins><span class="cx"> can_add_to_parent = t.mapper is parenttask.mapper </span><span class="cx"> original_task = object_to_original_task[node.item] </span><span class="cx"> if original_task.objects.has_key(node.item): </span><span class="lines">@@ -666,15 +666,13 @@ </span><span class="cx"> t.append(node.item, original_task.objects[node.item].listonly, isdelete=original_task.objects[node.item].isdelete) </span><span class="cx"> parenttask.append(None, listonly=False, isdelete=original_task.objects[node.item].isdelete, childtask=t) </span><span class="cx"> else: </span><del>- parenttask.append(None, childtask=t) </del><ins>+ parenttask.append(None, listonly=False, isdelete=original_task.objects[node.item].isdelete, childtask=t) </ins><span class="cx"> if dependencies.has_key(node.item): </span><span class="cx"> for depprocessor, deptask in dependencies[node.item].iteritems(): </span><span class="cx"> if can_add_to_parent: </span><span class="cx"> parenttask.cyclical_dependencies.append(depprocessor.branch(deptask)) </span><span class="cx"> else: </span><span class="cx"> t.cyclical_dependencies.append(depprocessor.branch(deptask)) </span><del>- for n in node.children: - t2 = make_task_tree(n, t) </del><span class="cx"> return t </span><span class="cx"> </span><span class="cx"> # this is the new "circular" UOWTask which will execute in place of "self" </span><span class="lines">@@ -685,8 +683,7 @@ </span><span class="cx"> t.dependencies += [d for d in extradeplist] </span><span class="cx"> t.childtasks = self.childtasks </span><span class="cx"> make_task_tree(head, t) </span><del>- print [o.obj for o in t.objects.values()] - print t.dump() </del><ins>+ #print t.dump() </ins><span class="cx"> return t </span><span class="cx"> </span><span class="cx"> def dump(self): </span><span class="lines">@@ -715,38 +712,39 @@ </span><span class="cx"> else: </span><span class="cx"> val = [t for t in proc.targettask.objects.values() if not t.isdelete] </span><span class="cx"> </span><del>- buf.write(_indent() + " |- UOWDependencyProcessor(%d) %s attribute on %s (%s)\n" % ( - id(proc), </del><ins>+ buf.write(_indent() + " |- %s attribute on %s (UOWDependencyProcessor(%d) processing %s)\n" % ( </ins><span class="cx"> repr(proc.processor.key), </span><span class="cx"> (proc.isdeletefrom and </span><span class="cx"> "%s's to be deleted" % _repr_task_class(proc.targettask) </span><span class="cx"> or "saved %s's" % _repr_task_class(proc.targettask)), </span><ins>+ id(proc), </ins><span class="cx"> _repr_task(proc.targettask)) </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> if len(val) == 0: </span><span class="cx"> buf.write(_indent() + " | |-" + "(no objects)\n") </span><span class="cx"> for v in val: </span><del>- buf.write(_indent() + " | |-" + _repr_task_element(v) + "\n") </del><ins>+ buf.write(_indent() + " | |-" + _repr_task_element(v, proc.processor.key) + "\n") </ins><span class="cx"> </span><del>- def _repr_task_element(te): </del><ins>+ def _repr_task_element(te, attribute=None): </ins><span class="cx"> if te.obj is None: </span><span class="cx"> objid = "(placeholder)" </span><span class="cx"> else: </span><del>- objid = "%s(%d)" % (te.obj.__class__.__name__, id(te.obj)) - return "UOWTaskElement(%d): %s %s%s" % (id(te), objid, (te.listonly and '(listonly)' or (te.isdelete and '(delete' or '(save')), - (te.mapper is not None and " w/ " + str(te.mapper) + ")" or ")") - ) </del><ins>+ if attribute is not None: + objid = "%s(%d).%s" % (te.obj.__class__.__name__, id(te.obj), attribute) + else: + objid = "%s(%d)" % (te.obj.__class__.__name__, id(te.obj)) + return "%s (UOWTaskElement(%d, %s))" % (objid, id(te), (te.listonly and 'listonly' or (te.isdelete and 'delete' or 'save'))) </ins><span class="cx"> </span><span class="cx"> def _repr_task(task): </span><span class="cx"> if task.mapper is not None: </span><span class="cx"> if task.mapper.__class__.__name__ == 'Mapper': </span><del>- name = task.mapper.class_.__name__ + "/" + str(task.mapper.local_table) + "/" + str(id(task.mapper)) </del><ins>+ name = task.mapper.class_.__name__ + "/" + task.mapper.local_table.name + "/" + str(task.mapper.entity_name) </ins><span class="cx"> else: </span><span class="cx"> name = repr(task.mapper) </span><span class="cx"> else: </span><span class="cx"> name = '(none)' </span><del>- return ("UOWTask(%d) '%s'" % (id(task), name)) </del><ins>+ return ("UOWTask(%d, %s)" % (id(task), name)) </ins><span class="cx"> def _repr_task_class(task): </span><span class="cx"> if task.mapper is not None and task.mapper.__class__.__name__ == 'Mapper': </span><span class="cx"> return task.mapper.class_.__name__ </span><span class="lines">@@ -774,7 +772,7 @@ </span><span class="cx"> if rec.listonly: </span><span class="cx"> continue </span><span class="cx"> header(buf, _indent() + " |- Save elements\n") </span><del>- buf.write(_indent() + " |- Save: " + _repr_task_element(rec) + "\n") </del><ins>+ buf.write(_indent() + " |- " + _repr_task_element(rec) + "\n") </ins><span class="cx"> for dep in self.cyclical_save_dependencies(): </span><span class="cx"> header(buf, _indent() + " |- Cyclical Save dependencies\n") </span><span class="cx"> _dump_processor(dep) </span><span class="lines">@@ -806,9 +804,13 @@ </span><span class="cx"> if rec.listonly: </span><span class="cx"> continue </span><span class="cx"> header(buf, _indent() + " |- Delete elements\n") </span><del>- buf.write(_indent() + " |- Delete: " + _repr_task_element(rec) + "\n") </del><ins>+ buf.write(_indent() + " |- " + _repr_task_element(rec) + "\n") </ins><span class="cx"> </span><del>- buf.write(_indent() + " |----\n") </del><ins>+ if self.is_empty(): + buf.write(_indent() + " |- (empty task)\n") + else: + buf.write(_indent() + " |----\n") + </ins><span class="cx"> buf.write(_indent() + "\n") </span><span class="cx"> </span><span class="cx"> def __repr__(self): </span></span></pre></div> <a id="sqlalchemybranchesschematestcyclespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/test/cycles.py (1484 => 1485)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/test/cycles.py 2006-05-22 01:14:42 UTC (rev 1484) +++ sqlalchemy/branches/schema/test/cycles.py 2006-05-22 17:31:52 UTC (rev 1485) </span><span class="lines">@@ -49,7 +49,7 @@ </span><span class="cx"> }) </span><span class="cx"> a = C1('head c1') </span><span class="cx"> a.c1s.append(C1('another c1')) </span><del>- sess = create_session() </del><ins>+ sess = create_session(echo_uow=True) </ins><span class="cx"> sess.save(a) </span><span class="cx"> sess.flush() </span><span class="cx"> sess.delete(a) </span><span class="lines">@@ -73,7 +73,7 @@ </span><span class="cx"> a.c1s[0].c1s.append(C1('subchild2')) </span><span class="cx"> a.c1s[1].c2s.append(C2('child2 data1')) </span><span class="cx"> a.c1s[1].c2s.append(C2('child2 data2')) </span><del>- sess = create_session() </del><ins>+ sess = create_session(echo_uow=True) </ins><span class="cx"> sess.save(a) </span><span class="cx"> sess.flush() </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |