[Sqlalchemy-commits] [1266] sqlalchemy/trunk/lib/sqlalchemy: a little spring cleaning for the util p
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-07 00:11:26
|
<!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>[1266] sqlalchemy/trunk/lib/sqlalchemy: a little spring cleaning for the util package, etc</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1266</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-06 19:11:13 -0500 (Thu, 06 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>a little spring cleaning for the util package, etc</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemymappingquerypy">sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingsyncpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingutilpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/util.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemymappingquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -1,4 +1,10 @@ </span><ins>+# mapper/query.py +# Copyright (C) 2005,2006 Michael Bayer mi...@zz... +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php </ins><span class="cx"> </span><ins>+ </ins><span class="cx"> import objectstore </span><span class="cx"> import sqlalchemy.sql as sql </span><span class="cx"> import sqlalchemy.util as util </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingsyncpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/sync.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -1,3 +1,11 @@ </span><ins>+# mapper/sync.py +# Copyright (C) 2005,2006 Michael Bayer mi...@zz... +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + + </ins><span class="cx"> import sqlalchemy.sql as sql </span><span class="cx"> import sqlalchemy.schema as schema </span><span class="cx"> from sqlalchemy.exceptions import * </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/util.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/util.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/util.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -1,3 +1,10 @@ </span><ins>+# mapper/util.py +# Copyright (C) 2005,2006 Michael Bayer mi...@zz... +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + </ins><span class="cx"> import sqlalchemy.sql as sql </span><span class="cx"> </span><span class="cx"> class TableFinder(sql.ClauseVisitor): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -317,8 +317,8 @@ </span><span class="cx"> if len(kwargs): </span><span class="cx"> raise ArgumentError("Unknown arguments passed to Column: " + repr(kwargs.keys())) </span><span class="cx"> </span><del>- primary_key = AttrProp('_primary_key') - foreign_key = AttrProp('_foreign_key') </del><ins>+ primary_key = SimpleProperty('_primary_key') + foreign_key = SimpleProperty('_foreign_key') </ins><span class="cx"> original = property(lambda s: s._orig or s) </span><span class="cx"> parent = property(lambda s:s._parent or s) </span><span class="cx"> engine = property(lambda s: s.table.engine) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -247,6 +247,7 @@ </span><span class="cx"> return isinstance(col, ColumnElement) </span><span class="cx"> </span><span class="cx"> class AbstractEngine(object): </span><ins>+ """represents a 'thing that can produce Compiler objects an execute them'.""" </ins><span class="cx"> def execute_compiled(self, compiled, parameters, echo=None, **kwargs): </span><span class="cx"> raise NotImplementedError() </span><span class="cx"> def compiler(self, statement, parameters, **kwargs): </span><span class="lines">@@ -343,7 +344,7 @@ </span><span class="cx"> self.after_compile() </span><span class="cx"> </span><span class="cx"> def execute(self, *multiparams, **params): </span><del>- """executes this compiled object using the underlying SQLEngine""" </del><ins>+ """executes this compiled object using the AbstractEngine it is bound to.""" </ins><span class="cx"> if len(multiparams): </span><span class="cx"> params = multiparams </span><span class="cx"> </span><span class="lines">@@ -1350,8 +1351,6 @@ </span><span class="cx"> else: </span><span class="cx"> setattr(self, attribute, condition) </span><span class="cx"> </span><del>- _hash_recursion = util.RecursionStack() - </del><span class="cx"> def clear_from(self, from_obj): </span><span class="cx"> self._froms[from_obj] = FromClause(from_name = None) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1265 => 1266)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-04-06 23:46:02 UTC (rev 1265) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-04-07 00:11:13 UTC (rev 1266) </span><span class="lines">@@ -4,7 +4,6 @@ </span><span class="cx"> # This module is part of SQLAlchemy and is released under </span><span class="cx"> # the MIT License: http://www.opensource.org/licenses/mit-license.php </span><span class="cx"> </span><del>-__all__ = ['OrderedProperties', 'OrderedDict', 'generic_repr', 'HashSet', 'AttrProp'] </del><span class="cx"> import thread, threading, weakref, UserList, time, string, inspect, sys </span><span class="cx"> from exceptions import * </span><span class="cx"> import __builtin__ </span><span class="lines">@@ -36,9 +35,9 @@ </span><span class="cx"> i -= 1 </span><span class="cx"> raise StopIteration() </span><span class="cx"> return rev() </span><del>- -class AttrProp(object): - """a quick way to stick a property accessor on an object""" </del><ins>+ +class SimpleProperty(object): + """a "default" property accessor.""" </ins><span class="cx"> def __init__(self, key): </span><span class="cx"> self.key = key </span><span class="cx"> def __set__(self, obj, value): </span><span class="lines">@@ -50,21 +49,7 @@ </span><span class="cx"> return self </span><span class="cx"> else: </span><span class="cx"> return getattr(obj, self.key) </span><del>- -def generic_repr(obj, exclude=None): - L = ['%s=%s' % (a, repr(getattr(obj, a))) for a in dir(obj) if not callable(getattr(obj, a)) and not a.startswith('_') and (exclude is None or not exclude.has_key(a))] - return '%s(%s)' % (obj.__class__.__name__, ','.join(L)) </del><span class="cx"> </span><del>-def hash_key(obj): - if obj is None: - return 'None' - elif isinstance(obj, list): - return repr([hash_key(o) for o in obj]) - elif hasattr(obj, 'hash_key'): - return obj.hash_key() - else: - return repr(obj) - </del><span class="cx"> class Logger(object): </span><span class="cx"> """defines various forms of logging""" </span><span class="cx"> def __init__(self, logger=None, usethreads=False, usetimestamp=True, origin=None): </span><span class="lines">@@ -130,30 +115,6 @@ </span><span class="cx"> def clear(self): </span><span class="cx"> self.__dict__.clear() </span><span class="cx"> self.__dict__['_list'] = [] </span><del>- -class RecursionStack(object): - """a thread-local stack used to detect recursive object traversals.""" - def __init__(self): - self.stacks = {} - def _get_stack(self): - try: - stack = self.stacks[thread.get_ident()] - except KeyError: - stack = {} - self.stacks[thread.get_ident()] = stack - return stack - def push(self, obj): - s = self._get_stack() - if s.has_key(obj): - return True - else: - s[obj] = True - return False - def pop(self, obj): - stack = self._get_stack() - del stack[obj] - if len(stack) == 0: - del self.stacks[thread.get_ident()] </del><span class="cx"> </span><span class="cx"> class OrderedDict(dict): </span><span class="cx"> """A Dictionary that keeps its own internal ordering""" </span><span class="lines">@@ -163,52 +124,40 @@ </span><span class="cx"> if values is not None: </span><span class="cx"> for val in values: </span><span class="cx"> self.update(val) </span><del>- </del><span class="cx"> def keys(self): </span><span class="cx"> return list(self._list) </span><del>- </del><span class="cx"> def clear(self): </span><span class="cx"> self._list = [] </span><span class="cx"> dict.clear(self) </span><del>- </del><span class="cx"> def update(self, dict): </span><span class="cx"> for key in dict.keys(): </span><span class="cx"> self.__setitem__(key, dict[key]) </span><del>- </del><span class="cx"> def setdefault(self, key, value): </span><span class="cx"> if not self.has_key(key): </span><span class="cx"> self.__setitem__(key, value) </span><span class="cx"> return value </span><span class="cx"> else: </span><span class="cx"> return self.__getitem__(key) </span><del>- </del><span class="cx"> def values(self): </span><span class="cx"> return map(lambda key: self[key], self._list) </span><del>- </del><span class="cx"> def __iter__(self): </span><span class="cx"> return iter(self._list) </span><del>- </del><span class="cx"> def itervalues(self): </span><span class="cx"> return iter([self[key] for key in self._list]) </span><del>- </del><span class="cx"> def iterkeys(self): </span><span class="cx"> return self.__iter__() </span><del>- </del><span class="cx"> def iteritems(self): </span><span class="cx"> return iter([(key, self[key]) for key in self.keys()]) </span><del>- </del><span class="cx"> def __delitem__(self, key): </span><span class="cx"> try: </span><span class="cx"> del self._list[self._list.index(key)] </span><span class="cx"> except ValueError: </span><span class="cx"> raise KeyError(key) </span><span class="cx"> dict.__delitem__(self, key) </span><del>- </del><span class="cx"> def __setitem__(self, key, object): </span><span class="cx"> if not self.has_key(key): </span><span class="cx"> self._list.append(key) </span><span class="cx"> dict.__setitem__(self, key, object) </span><del>- </del><span class="cx"> def __getitem__(self, key): </span><span class="cx"> return dict.__getitem__(self, key) </span><span class="cx"> </span><span class="lines">@@ -230,6 +179,7 @@ </span><span class="cx"> self._tdict["%d_%s" % (thread.get_ident(), key)] = value </span><span class="cx"> </span><span class="cx"> class DictDecorator(dict): </span><ins>+ """a Dictionary that delegates items not found to a second wrapped dictionary.""" </ins><span class="cx"> def __init__(self, decorate): </span><span class="cx"> self.decorate = decorate </span><span class="cx"> def __getitem__(self, key): </span><span class="lines">@@ -239,8 +189,9 @@ </span><span class="cx"> return self.decorate[key] </span><span class="cx"> def __repr__(self): </span><span class="cx"> return dict.__repr__(self) + repr(self.decorate) </span><ins>+ </ins><span class="cx"> class HashSet(object): </span><del>- """implements a Set.""" </del><ins>+ """implements a Set, including ordering capability""" </ins><span class="cx"> def __init__(self, iter=None, ordered=False): </span><span class="cx"> if ordered: </span><span class="cx"> self.map = OrderedDict() </span><span class="lines">@@ -474,6 +425,12 @@ </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> def constructor_args(instance, **kwargs): </span><ins>+ """given an object instance and keyword arguments, inspects the + argument signature of the instance's __init__ method and returns + a tuple of list and keyword arguments, suitable for creating a new + instance of the class. The returned arguments are drawn from the + given keyword dictionary, or if not found are drawn from the + corresponding attributes of the original instance.""" </ins><span class="cx"> classobj = instance.__class__ </span><span class="cx"> </span><span class="cx"> argspec = inspect.getargspec(classobj.__init__.im_func) </span></span></pre> </div> </div> </body> </html> |