[Sqlalchemy-commits] [1521] sqlalchemy/trunk/lib/sqlalchemy/orm: broke out dumper into a separate mo
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-27 17:46:15
|
<!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>[1521] sqlalchemy/trunk/lib/sqlalchemy/orm: broke out dumper into a separate module</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1521</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-27 12:46:03 -0500 (Sat, 27 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>broke out dumper into a separate module</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyormunitofworkpy">sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyormuowdumperpy">sqlalchemy/trunk/lib/sqlalchemy/orm/uowdumper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyormunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py (1520 => 1521)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py 2006-05-27 16:59:07 UTC (rev 1520) +++ sqlalchemy/trunk/lib/sqlalchemy/orm/unitofwork.py 2006-05-27 17:46:03 UTC (rev 1521) </span><span class="lines">@@ -844,151 +844,11 @@ </span><span class="cx"> </span><span class="cx"> def dump(self): </span><span class="cx"> buf = StringIO.StringIO() </span><del>- self._dump(buf) </del><ins>+ import uowdumper + uowdumper.UOWDumper(self, buf) </ins><span class="cx"> return buf.getvalue() </span><span class="cx"> </span><del>- def _dump(self, buf, indent=0, circularparent=None): - # TODO: the dumper should go into a separate module/class, allow different dumper implementations - def _indent(): - return " | " * indent - - headers = {} - def header(buf, text): - """writes a given header just once""" - try: - headers[text] - except KeyError: - buf.write(_indent() + " |\n") - buf.write(text) - headers[text] = True - - def _dump_processor(proc, deletes): - if deletes: - val = proc.targettask.polymorphic_todelete_elements - else: - val = proc.targettask.polymorphic_tosave_elements - - buf.write(_indent() + " |- %s attribute on %s (UOWDependencyProcessor(%d) processing %s)\n" % ( - repr(proc.processor.key), - ("%s's to be %s" % (_repr_task_class(proc.targettask), deletes and "deleted" or "saved")), - id(proc), - _repr_task(proc.targettask)) - ) - - if len(val) == 0: - buf.write(_indent() + " | |-" + "(no objects)\n") - for v in val: - buf.write(_indent() + " | |-" + _repr_task_element(v, proc.processor.key) + "\n") </del><span class="cx"> </span><del>- def _repr_task_element(te, attribute=None): - if te.obj is None: - objid = "(placeholder)" - else: - 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'))) - - def _repr_task(task): - if task.mapper is not None: - if task.mapper.__class__.__name__ == 'Mapper': - name = task.mapper.class_.__name__ + "/" + task.mapper.local_table.name + "/" + str(task.mapper.entity_name) - else: - name = repr(task.mapper) - else: - name = '(none)' - return ("UOWTask(%d, %s)" % (id(task), name)) - def _repr_task_class(task): - if task.mapper is not None and task.mapper.__class__.__name__ == 'Mapper': - return task.mapper.class_.__name__ - else: - return '(none)' - - def _repr(obj): - return "%s(%d)" % (obj.__class__.__name__, id(obj)) - - def _inheritance_tag(task): - if task is not self: - return (" (inheriting task %s)" % _repr_task(task)) - else: - return "" - - def _dump_saveelements(task): - for rec in task.tosave_elements: - if rec.listonly: - continue - header(buf, _indent() + " |- Save elements"+ _inheritance_tag(task) + "\n") - buf.write(_indent() + " |- " + _repr_task_element(rec) + "\n") - for t in task.inheriting_tasks: - _dump_saveelements(t) - - def _dump_deleteelements(task): - for rec in task.todelete_elements: - if rec.listonly: - continue - header(buf, _indent() + " |- Delete elements"+ _inheritance_tag(task) + "\n") - buf.write(_indent() + " |- " + _repr_task_element(rec) + "\n") - for t in task.inheriting_tasks: - _dump_deleteelements(t) - - def _dump_dependencies(task): - for dep in task.dependencies: - header(buf, _indent() + " |- Save dependencies" + _inheritance_tag(task) + "\n") - _dump_processor(dep, False) - for t in task.inheriting_tasks: - _dump_dependencies(t) - for dep in task.dependencies: - header(buf, _indent() + " |- Delete dependencies" + _inheritance_tag(task) + "\n") - _dump_processor(dep, True) - - def _dump_childtasks(task): - for child in task.childtasks: - header(buf, _indent() + " |- Child tasks" + _inheritance_tag(task) + "\n") - child._dump(buf, indent + 1) - for t in task.inheriting_tasks: - _dump_childtasks(t) - - if self.circular is not None: - self.circular._dump(buf, indent, self) - return - - i = _indent() - if len(i): - i = i[0:-1] + "-" - if circularparent is not None: - buf.write(i + " " + _repr_task(circularparent)) - buf.write("->circular->" + _repr_task(self)) - else: - buf.write(i + " " + _repr_task(self)) - - buf.write("\n") - _dump_saveelements(self) - for dep in self.cyclical_dependencies: - header(buf, _indent() + " |- Cyclical Save dependencies\n") - _dump_processor(dep, False) - for element in self.tosave_elements: - for task in element.childtasks: - header(buf, _indent() + " |- Save subelements of UOWTaskElement(%s)\n" % id(element)) - task._dump(buf, indent + 1) - _dump_dependencies(self) - for dep in self.cyclical_dependencies: - header(buf, _indent() + " |- Cyclical Delete dependencies\n") - _dump_processor(dep, True) - _dump_childtasks(self) - for element in self.todelete_elements: - for task in element.childtasks: - header(buf, _indent() + " |- Delete subelements of UOWTaskElement(%s)\n" % id(element)) - task._dump(buf, indent + 1) - _dump_deleteelements(self) - - if self.is_empty(): - buf.write(_indent() + " |- (empty task)\n") - else: - buf.write(_indent() + " |----\n") - - buf.write(_indent() + "\n") - </del><span class="cx"> def __repr__(self): </span><span class="cx"> if self.mapper is not None: </span><span class="cx"> if self.mapper.__class__.__name__ == 'Mapper': </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyormuowdumperpy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/lib/sqlalchemy/orm/uowdumper.py (1520 => 1521)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/orm/uowdumper.py 2006-05-27 16:59:07 UTC (rev 1520) +++ sqlalchemy/trunk/lib/sqlalchemy/orm/uowdumper.py 2006-05-27 17:46:03 UTC (rev 1521) </span><span class="lines">@@ -0,0 +1,188 @@ </span><ins>+ +"""dumps out a string representation of a UOWTask structure""" + +class UOWDumper(object): + def __init__(self, task, buf, verbose=False): + self.verbose = verbose + self.indent = 0 + self.task = task + self.buf = buf + self._dump(task) + + def _dump_processor(self, proc, deletes): + if deletes: + val = proc.targettask.polymorphic_todelete_elements + else: + val = proc.targettask.polymorphic_tosave_elements + + if self.verbose: + self.buf.write(self._indent() + " |- %s attribute on %s (UOWDependencyProcessor(%d) processing %s)\n" % ( + repr(proc.processor.key), + ("%s's to be %s" % (self._repr_task_class(proc.targettask), deletes and "deleted" or "saved")), + id(proc), + self._repr_task(proc.targettask)) + ) + elif False: + self.buf.write(self._indent() + " |- %s attribute on %s\n" % ( + repr(proc.processor.key), + ("%s's to be %s" % (self._repr_task_class(proc.targettask), deletes and "deleted" or "saved")), + ) + ) + + if len(val) == 0: + if self.verbose: + self.buf.write(self._indent() + " | |-" + "(no objects)\n") + for v in val: + self.buf.write(self._indent() + " | |-" + self._repr_task_element(v, proc.processor.key, process=True) + "\n") + + def _repr_task_element(self, te, attribute=None, process=False): + if te.obj is None: + objid = "(placeholder)" + else: + 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)) + if self.verbose: + return "%s (UOWTaskElement(%d, %s))" % (objid, id(te), (te.listonly and 'listonly' or (te.isdelete and 'delete' or 'save'))) + elif process: + return "Process %s" % (objid) + else: + return "%s %s" % ((te.isdelete and "Delete" or "Save"), objid) + + def _repr_task(self, task): + if task.mapper is not None: + if task.mapper.__class__.__name__ == 'Mapper': + name = task.mapper.class_.__name__ + "/" + task.mapper.local_table.name + "/" + str(task.mapper.entity_name) + else: + name = repr(task.mapper) + else: + name = '(none)' + return ("UOWTask(%d, %s)" % (id(task), name)) + + def _repr_task_class(self, task): + if task.mapper is not None and task.mapper.__class__.__name__ == 'Mapper': + return task.mapper.class_.__name__ + else: + return '(none)' + + def _repr(self, obj): + return "%s(%d)" % (obj.__class__.__name__, id(obj)) + + def _indent(self): + return " | " * self.indent + + def _dump(self, starttask, indent=None, circularparent=None): + try: + oldindent = self.indent + if indent is not None: + self.indent = indent + self._dump_impl(starttask, circularparent=circularparent) + finally: + self.indent = oldindent + + def _dump_impl(self, starttask, circularparent=None): + + headers = {} + def header(buf, text): + """writes a given header just once""" + try: + headers[text] + except KeyError: + self.buf.write(self._indent() + " |\n") + self.buf.write(text) + headers[text] = True + + def _inheritance_tag(task): + if not self.verbose: + return "" + elif task is not starttask: + return (" (inheriting task %s)" % self._repr_task(task)) + else: + return "" + + def _dump_saveelements(task): + for rec in task.tosave_elements: + if rec.listonly: + continue + if self.verbose: + header(self.buf, self._indent() + " |- Save elements"+ _inheritance_tag(task) + "\n") + self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") + for t in task.inheriting_tasks: + _dump_saveelements(t) + + def _dump_deleteelements(task): + for rec in task.todelete_elements: + if rec.listonly: + continue + if self.verbose: + header(self.buf, self._indent() + " |- Delete elements"+ _inheritance_tag(task) + "\n") + self.buf.write(self._indent() + " |- " + self._repr_task_element(rec) + "\n") + for t in task.inheriting_tasks: + _dump_deleteelements(t) + + def _dump_dependencies(task): + for dep in task.dependencies: + if self.verbose: + header(self.buf, self._indent() + " |- Save dependencies" + _inheritance_tag(task) + "\n") + self._dump_processor(dep, False) + for t in task.inheriting_tasks: + _dump_dependencies(t) + for dep in task.dependencies: + if self.verbose: + header(self.buf, self._indent() + " |- Delete dependencies" + _inheritance_tag(task) + "\n") + self._dump_processor(dep, True) + + def _dump_childtasks(task): + for child in task.childtasks: + if self.verbose: + header(self.buf, self._indent() + " |- Child tasks" + _inheritance_tag(task) + "\n") + self._dump(child, indent = self.indent + 1) + for t in task.inheriting_tasks: + _dump_childtasks(t) + + if starttask.circular is not None: + self._dump(starttask.circular, indent=self.indent, circularparent=starttask) + return + + i = self._indent() + if len(i): + i = i[0:-1] + "-" + if circularparent is not None: + self.buf.write(self._indent() + "\n") + self.buf.write(i + " " + self._repr_task(circularparent)) + self.buf.write("->circular->" + self._repr_task(starttask)) + else: + self.buf.write(self._indent() + "\n") + self.buf.write(i + " " + self._repr_task(starttask)) + + self.buf.write("\n") + _dump_saveelements(starttask) + for dep in starttask.cyclical_dependencies: + if self.verbose: + header(self.buf, self._indent() + " |- Cyclical Save dependencies\n") + self._dump_processor(dep, False) + for element in starttask.tosave_elements: + for task in element.childtasks: + if self.verbose: + header(self.buf, self._indent() + " |- Save subelements of UOWTaskElement(%s)\n" % id(element)) + self._dump(task, indent = self.indent + 1) + _dump_dependencies(starttask) + for dep in starttask.cyclical_dependencies: + if self.verbose: + header(self.buf, self._indent() + " |- Cyclical Delete dependencies\n") + self._dump_processor(dep, True) + _dump_childtasks(starttask) + for element in starttask.todelete_elements: + for task in element.childtasks: + if self.verbose: + header(self.buf, self._indent() + " |- Delete subelements of UOWTaskElement(%s)\n" % id(element)) + self._dump(task, indent = self.indent + 1) + _dump_deleteelements(starttask) + + if starttask.is_empty(): + self.buf.write(self._indent() + " |- (empty task)\n") + else: + self.buf.write(self._indent() + " |----\n") + + self.buf.write(self._indent() + "\n") </ins></span></pre> </div> </div> </body> </html> |