[Sqlalchemy-commits] [1149] sqlalchemy/trunk/test: expanded and integrated qvx's patch for dotted fu
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-16 23:38:25
|
<!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>[1149] sqlalchemy/trunk/test: expanded and integrated qvx's patch for dotted function names</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1149</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-16 17:38:14 -0600 (Thu, 16 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>expanded and integrated qvx's patch for dotted function names</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemytrunktestselectpy">sqlalchemy/trunk/test/select.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1148 => 1149)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-16 19:09:53 UTC (rev 1148) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-03-16 23:38:14 UTC (rev 1149) </span><span class="lines">@@ -224,9 +224,9 @@ </span><span class="cx"> if len(self.select_stack): </span><span class="cx"> self.typemap.setdefault(func.name, func.type) </span><span class="cx"> if func.name.upper() in ANSI_FUNCS and not len(func.clauses): </span><del>- self.strings[func] = func.name </del><ins>+ self.strings[func] = ".".join(func.packagenames + [func.name]) </ins><span class="cx"> else: </span><del>- self.strings[func] = func.name + "(" + string.join([self.get_str(c) for c in func.clauses], ', ') + ")" </del><ins>+ self.strings[func] = ".".join(func.packagenames + [func.name]) + "(" + string.join([self.get_str(c) for c in func.clauses], ', ') + ")" </ins><span class="cx"> </span><span class="cx"> def visit_compound_select(self, cs): </span><span class="cx"> text = string.join([self.get_str(c) for c in cs.selects], " " + cs.keyword + " ") </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1148 => 1149)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-16 19:09:53 UTC (rev 1148) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-16 23:38:14 UTC (rev 1149) </span><span class="lines">@@ -280,10 +280,7 @@ </span><span class="cx"> return typeobj </span><span class="cx"> </span><span class="cx"> def _func(self): </span><del>- class FunctionGateway(object): - def __getattr__(s, name): - return lambda *c, **kwargs: sql.Function(name, engine=self, *c, **kwargs) - return FunctionGateway() </del><ins>+ return sql.FunctionGenerator(self) </ins><span class="cx"> func = property(_func) </span><span class="cx"> </span><span class="cx"> def text(self, text, *args, **kwargs): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1148 => 1149)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-16 19:09:53 UTC (rev 1148) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-03-16 23:38:14 UTC (rev 1149) </span><span class="lines">@@ -218,7 +218,7 @@ </span><span class="cx"> """returns a callable based on an attribute name, which then returns a Function </span><span class="cx"> object with that name.""" </span><span class="cx"> def __getattr__(self, name): </span><del>- return lambda *c, **kwargs: Function(name, *c, **kwargs) </del><ins>+ return getattr(FunctionGenerator(), name) </ins><span class="cx"> func = FunctionGateway() </span><span class="cx"> </span><span class="cx"> def _compound_clause(keyword, *clauses): </span><span class="lines">@@ -794,6 +794,7 @@ </span><span class="cx"> def __init__(self, name, *clauses, **kwargs): </span><span class="cx"> self.name = name </span><span class="cx"> self.type = kwargs.get('type', sqltypes.NULLTYPE) </span><ins>+ self.packagenames = kwargs.get('packagenames') </ins><span class="cx"> self._engine = kwargs.get('engine', None) </span><span class="cx"> if self._engine is not None: </span><span class="cx"> self.type = self._engine.type_descriptor(self.type) </span><span class="lines">@@ -827,6 +828,17 @@ </span><span class="cx"> return select([self]).execute() </span><span class="cx"> def _compare_type(self, obj): </span><span class="cx"> return self.type </span><ins>+ +class FunctionGenerator(object): + """generates Function objects based on getattr calls""" + def __init__(self, engine=None): + self.__engine = engine + self.__names = [] + def __getattr__(self, name): + self.__names.append(name) + return self + def __call__(self, *c, **kwargs): + return Function(self.__names[-1], packagenames=self.__names[0:-1], engine=self.__engine, *c, **kwargs) </ins><span class="cx"> </span><span class="cx"> class BinaryClause(ClauseElement): </span><span class="cx"> """represents two clauses with an operator in between""" </span></span></pre></div> <a id="sqlalchemytrunktestselectpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/select.py (1148 => 1149)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/select.py 2006-03-16 19:09:53 UTC (rev 1148) +++ sqlalchemy/trunk/test/select.py 2006-03-16 23:38:14 UTC (rev 1149) </span><span class="lines">@@ -343,12 +343,27 @@ </span><span class="cx"> "SELECT :literal + :literal_1 FROM mytable") </span><span class="cx"> </span><span class="cx"> def testfunction(self): </span><ins>+ """tests the generation of functions using the func keyword""" + # test an expression with a function </ins><span class="cx"> self.runtest(func.lala(3, 4, literal("five"), table1.c.myid) * table2.c.otherid, </span><span class="cx"> "lala(:lala, :lala_1, :literal, mytable.myid) * myothertable.otherid") </span><span class="cx"> </span><ins>+ # test it in a SELECT </ins><span class="cx"> self.runtest(select([func.count(table1.c.myid)]), </span><span class="cx"> "SELECT count(mytable.myid) FROM mytable") </span><span class="cx"> </span><ins>+ # test a "dotted" function name + self.runtest(select([func.foo.bar.lala(table1.c.myid)]), + "SELECT foo.bar.lala(mytable.myid) FROM mytable") + + # test the bind parameter name with a "dotted" function name is only the name + # (limits the length of the bind param name) + self.runtest(select([func.foo.bar.lala(12)]), + "SELECT foo.bar.lala(:lala)") + + # test a dotted func off the engine itself + self.runtest(db.func.lala.hoho(7), "lala.hoho(:hoho)") + </ins><span class="cx"> def testjoin(self): </span><span class="cx"> self.runtest( </span><span class="cx"> join(table2, table1, table1.c.myid == table2.c.otherid).select(), </span></span></pre> </div> </div> </body> </html> |