sqlalchemy-commits Mailing List for SQLAlchemy (Page 360)
Brought to you by:
zzzeek
You can subscribe to this list here.
2006 |
Jan
|
Feb
(74) |
Mar
(167) |
Apr
(127) |
May
(190) |
Jun
(119) |
Jul
(77) |
Aug
(82) |
Sep
(84) |
Oct
(153) |
Nov
(45) |
Dec
(54) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(109) |
Feb
(80) |
Mar
(110) |
Apr
(106) |
May
(92) |
Jun
(147) |
Jul
(288) |
Aug
(307) |
Sep
(108) |
Oct
(156) |
Nov
(147) |
Dec
(134) |
2008 |
Jan
(126) |
Feb
(91) |
Mar
(184) |
Apr
(208) |
May
(212) |
Jun
(54) |
Jul
(106) |
Aug
(80) |
Sep
(58) |
Oct
(80) |
Nov
(119) |
Dec
(220) |
2009 |
Jan
(202) |
Feb
(50) |
Mar
(70) |
Apr
(46) |
May
(80) |
Jun
(61) |
Jul
(146) |
Aug
(81) |
Sep
(71) |
Oct
(74) |
Nov
(66) |
Dec
(82) |
2010 |
Jan
(112) |
Feb
(169) |
Mar
(235) |
Apr
(77) |
May
(22) |
Jun
(31) |
Jul
(46) |
Aug
(46) |
Sep
(70) |
Oct
(36) |
Nov
(37) |
Dec
(79) |
2011 |
Jan
(46) |
Feb
(54) |
Mar
(65) |
Apr
(73) |
May
(31) |
Jun
(46) |
Jul
(40) |
Aug
(36) |
Sep
(44) |
Oct
(33) |
Nov
(19) |
Dec
(10) |
2012 |
Jan
(60) |
Feb
(37) |
Mar
(35) |
Apr
(28) |
May
(27) |
Jun
(50) |
Jul
(33) |
Aug
(88) |
Sep
(64) |
Oct
(74) |
Nov
(62) |
Dec
(41) |
2013 |
Jan
(30) |
Feb
(37) |
Mar
(39) |
Apr
(52) |
May
(40) |
Jun
(85) |
Jul
(74) |
Aug
(76) |
Sep
(26) |
Oct
(76) |
Nov
(63) |
Dec
(65) |
2014 |
Jan
(68) |
Feb
(82) |
Mar
(87) |
Apr
(24) |
May
(66) |
Jun
(34) |
Jul
(86) |
Aug
(75) |
Sep
(70) |
Oct
(41) |
Nov
(23) |
Dec
(53) |
2015 |
Jan
(40) |
Feb
(39) |
Mar
(69) |
Apr
(64) |
May
(40) |
Jun
(43) |
Jul
(20) |
Aug
(48) |
Sep
(38) |
Oct
(28) |
Nov
(34) |
Dec
(44) |
2016 |
Jan
(82) |
Feb
(49) |
Mar
(25) |
Apr
(21) |
May
(19) |
Jun
(46) |
Jul
(38) |
Aug
(21) |
Sep
(33) |
Oct
(44) |
Nov
(26) |
Dec
(10) |
2017 |
Jan
(52) |
Feb
(18) |
Mar
(61) |
Apr
(43) |
May
(57) |
Jun
(36) |
Jul
(37) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <co...@sq...> - 2006-05-15 22:47:49
|
<!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>[1462] sqlalchemy/trunk/doc/build/content/document_base.myt: version id...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1462</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 17:47:41 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>version id...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdocument_basemyt">sqlalchemy/trunk/doc/build/content/document_base.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdocument_basemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/document_base.myt (1461 => 1462)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-15 22:46:43 UTC (rev 1461) +++ sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-15 22:47:41 UTC (rev 1462) </span><span class="lines">@@ -30,9 +30,9 @@ </span><span class="cx"> <%method title> </span><span class="cx"> % try: </span><span class="cx"> # avoid inheritance via attr instead of attributes </span><del>- <% m.base_component.attr['title'] %> - SQLAlchemy 0.1 Documentation </del><ins>+ <% m.base_component.attr['title'] %> - <% self.owner.attr['title'] %> </ins><span class="cx"> % except KeyError: </span><del>- SQLAlchemy 0.1 Documentation </del><ins>+ <% self.owner.attr['title'] %> </ins><span class="cx"> % </span><span class="cx"> </%method> </span><span class="cx"> </span><span class="lines">@@ -40,3 +40,4 @@ </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> </span><ins>+ </ins></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 22:46:51
|
<!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>[1461] sqlalchemy/branches/schema/doc/build/content/document_base.myt: title change</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1461</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 17:46:43 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>title change</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentdocument_basemyt">sqlalchemy/branches/schema/doc/build/content/document_base.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentdocument_basemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/document_base.myt (1460 => 1461)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/document_base.myt 2006-05-15 22:45:04 UTC (rev 1460) +++ sqlalchemy/branches/schema/doc/build/content/document_base.myt 2006-05-15 22:46:43 UTC (rev 1461) </span><span class="lines">@@ -23,16 +23,16 @@ </span><span class="cx"> wrapper='section_wrapper.myt' </span><span class="cx"> onepage='documentation' </span><span class="cx"> index='index' </span><del>- title='SQLAlchemy Documentation' </del><ins>+ title='SQLAlchemy 0.2 Documentation' </ins><span class="cx"> version = '0.2.0' </span><span class="cx"> </%attr> </span><span class="cx"> </span><span class="cx"> <%method title> </span><span class="cx"> % try: </span><span class="cx"> # avoid inheritance via attr instead of attributes </span><del>- <% m.base_component.attr['title'] %> - SQLAlchemy Documentation </del><ins>+ <% m.base_component.attr['title'] %> - <% self.owner.attr['title'] %> </ins><span class="cx"> % except KeyError: </span><del>- SQLAlchemy Documentation </del><ins>+ <% self.owner.attr['title'] %> </ins><span class="cx"> % </span><span class="cx"> </%method> </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 22:45:12
|
<!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>[1460] sqlalchemy/trunk/doc/build/content/document_base.myt: title change</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1460</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 17:45:04 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>title change</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdocument_basemyt">sqlalchemy/trunk/doc/build/content/document_base.myt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdocument_basemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/document_base.myt (1459 => 1460)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-15 22:43:41 UTC (rev 1459) +++ sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-15 22:45:04 UTC (rev 1460) </span><span class="lines">@@ -23,16 +23,16 @@ </span><span class="cx"> wrapper='section_wrapper.myt' </span><span class="cx"> onepage='documentation' </span><span class="cx"> index='index' </span><del>- title='SQLAlchemy Documentation' </del><ins>+ title='SQLAlchemy 0.1 Documentation' </ins><span class="cx"> version = '0.1.7' </span><span class="cx"> </%attr> </span><span class="cx"> </span><span class="cx"> <%method title> </span><span class="cx"> % try: </span><span class="cx"> # avoid inheritance via attr instead of attributes </span><del>- <% m.base_component.attr['title'] %> - SQLAlchemy Documentation </del><ins>+ <% m.base_component.attr['title'] %> - SQLAlchemy 0.1 Documentation </ins><span class="cx"> % except KeyError: </span><del>- SQLAlchemy Documentation </del><ins>+ SQLAlchemy 0.1 Documentation </ins><span class="cx"> % </span><span class="cx"> </%method> </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 22:43:50
|
<!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>[1459] sqlalchemy/branches/schema/doc/style.css: removed .logo style</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1459</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 17:43:41 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>removed .logo style</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocstylecss">sqlalchemy/branches/schema/doc/style.css</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocstylecss"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/style.css (1458 => 1459)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/style.css 2006-05-15 22:43:19 UTC (rev 1458) +++ sqlalchemy/branches/schema/doc/style.css 2006-05-15 22:43:41 UTC (rev 1459) </span><span class="lines">@@ -41,12 +41,6 @@ </span><span class="cx"> background-color: #D2D2D2; </span><span class="cx"> } </span><span class="cx"> </span><del>-.logo { - float:left; - padding: 24px 15px 0px 10px; - height:276px; -} - </del><span class="cx"> .smalllogo { </span><span class="cx"> float:left; </span><span class="cx"> } </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 22:43:29
|
<!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>[1458] sqlalchemy/trunk/doc/style.css: removed .logo style</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1458</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 17:43:19 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>removed .logo style</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocstylecss">sqlalchemy/trunk/doc/style.css</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocstylecss"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/style.css (1457 => 1458)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/style.css 2006-05-15 22:10:04 UTC (rev 1457) +++ sqlalchemy/trunk/doc/style.css 2006-05-15 22:43:19 UTC (rev 1458) </span><span class="lines">@@ -41,12 +41,6 @@ </span><span class="cx"> background-color: #D2D2D2; </span><span class="cx"> } </span><span class="cx"> </span><del>-.logo { - float:left; - padding: 24px 15px 0px 10px; - height:276px; -} - </del><span class="cx"> .smalllogo { </span><span class="cx"> float:left; </span><span class="cx"> } </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 20:37: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>[1456] sqlalchemy/branches/schema/lib/sqlalchemy: small fix for _find_dependent fixing [ticket:183]</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1456</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 15:37:09 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>small fix for _find_dependent fixing [ticket:183] MetaData returns None for no engine present, raising an exception moved to session/clauseelement.execute. doc tweak for oracle threaded keyword, foreignkey keyword fix to Alias which was calling "name" on Select/CompoundSelect</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentadv_datamappingtxt">sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt</a></li> <li><a href="#sqlalchemybranchesschemadocbuildcontentdbenginetxt">sqlalchemy/branches/schema/doc/build/content/dbengine.txt</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormpropertiespy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormsessionpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyschemapy">sqlalchemy/branches/schema/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentadv_datamappingtxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -620,7 +620,7 @@ </span><span class="cx"> } </span><span class="cx"> ) </span><span class="cx"> </span><del>-The "root" property on a TreeNode is a many-to-one relationship. By default, a self-referential mapper declares relationships as one-to-many, so the extra parameter `foreignkey`, pointing to the "many" side of a relationship, is needed to indicate a "many-to-one" self-referring relationship. </del><ins>+The "root" property on a TreeNode is a many-to-one relationship. By default, a self-referential mapper declares relationships as one-to-many, so the extra parameter `foreignkey`, pointing to the remote side of a relationship, is needed to indicate a "many-to-one" self-referring relationship. </ins><span class="cx"> Both TreeNode examples above are available in functional form in the `examples/adjacencytree` directory of the distribution. </span><span class="cx"> </span><span class="cx"> ### Result-Set Mapping {@name=resultset} </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildcontentdbenginetxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/dbengine.txt (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/dbengine.txt 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/doc/build/content/dbengine.txt 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -69,6 +69,7 @@ </span><span class="cx"> * logger=None : a file-like object where logging output can be sent, if echo is set to True. Newlines will not be sent with log messages. This defaults to an internal logging object which references `sys.stdout`. </span><span class="cx"> * module=None : used by database implementations which support multiple DBAPI modules, this is a reference to a DBAPI2 module to be used instead of the engine's default module. For Postgres, the default is psycopg2, or psycopg1 if 2 cannot be found. For Oracle, its cx_Oracle. </span><span class="cx"> * use_ansi=True : used only by Oracle; when False, the Oracle driver attempts to support a particular "quirk" of Oracle versions 8 and previous, that the LEFT OUTER JOIN SQL syntax is not supported, and the "Oracle join" syntax of using `&lt;column1&gt;(+)=&lt;column2&gt;` must be used in order to achieve a LEFT OUTER JOIN. </span><ins>+* threaded=True : used by cx_Oracle; sets the `threaded` parameter of the connection indicating thread-safe usage. cx_Oracle docs indicate setting this flag to `False` will speed performance by 10-15%. While this defaults to `False` in cx_Oracle, SQLAlchemy defaults it to `True`, preferring stability over early optimization. </ins><span class="cx"> * use_oids=False : used only by Postgres, will enable the column name "oid" as the object ID column, which is also used for the default sort order of tables. Postgres as of 8.1 has object IDs disabled by default. </span><span class="cx"> * convert_unicode=False : if set to True, all String/character based types will convert Unicode values to raw byte values going into the database, and all raw byte values to Python Unicode coming out in result sets. This is an engine-wide method to provide unicode across the board. For unicode conversion on a column-by-column level, use the `Unicode` column type instead. </span><span class="cx"> * encoding='utf-8' : the encoding to use for all Unicode translations, both by engine-wide unicode conversion as well as the `Unicode` type object. </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -275,22 +275,22 @@ </span><span class="cx"> # set as a reference to allow assignment from inside a first-class function </span><span class="cx"> dependent = [None] </span><span class="cx"> def foo(binary): </span><del>- if binary.operator != '=': </del><ins>+ if binary.operator != '=' or not isinstance(binary.left, schema.Column) or not isinstance(binary.right, schema.Column): </ins><span class="cx"> return </span><del>- if isinstance(binary.left, schema.Column) and binary.left.primary_key: </del><ins>+ if binary.left.primary_key: </ins><span class="cx"> if dependent[0] is binary.left.table: </span><del>- raise exceptions.ArgumentError("bidirectional dependency not supported...specify foreignkey") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (table '%s' appears on both sides of the relationship, or in an otherwise ambiguous manner). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.left.table))) </ins><span class="cx"> dependent[0] = binary.right.table </span><span class="cx"> self.foreignkey= binary.right </span><del>- elif isinstance(binary.right, schema.Column) and binary.right.primary_key: </del><ins>+ elif binary.right.primary_key: </ins><span class="cx"> if dependent[0] is binary.right.table: </span><del>- raise exceptions.ArgumentError("bidirectional dependency not supported...specify foreignkey") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (table '%s' appears on both sides of the relationship, or in an otherwise ambiguous manner). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.right.table))) </ins><span class="cx"> dependent[0] = binary.left.table </span><span class="cx"> self.foreignkey = binary.left </span><span class="cx"> visitor = BinaryVisitor(foo) </span><span class="cx"> self.primaryjoin.accept_visitor(visitor) </span><span class="cx"> if dependent[0] is None: </span><del>- raise exceptions.ArgumentError("cant determine primary foreign key in the join relationship....specify foreignkey=<column> or foreignkey=[<columns>]") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (no relationships joining tables '%s' and '%s' could be located). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.left.table), str(binary.right.table))) </ins><span class="cx"> else: </span><span class="cx"> self.foreigntable = dependent[0] </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormsessionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -169,7 +169,10 @@ </span><span class="cx"> elif self.bind_to is not None: </span><span class="cx"> return self.bind_to </span><span class="cx"> else: </span><del>- return mapper.select_table.engine </del><ins>+ e = mapper.select_table.engine + if e is None: + raise exceptions.InvalidRequestError("Could not locate any Engine bound to mapper '%s'" % str(mapper)) + return e </ins><span class="cx"> def query(self, mapper_or_class, entity_name=None): </span><span class="cx"> """given a mapper or Class, returns a new Query object corresponding to this Session and the mapper, or the classes' primary mapper.""" </span><span class="cx"> if isinstance(mapper_or_class, type): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/schema.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -654,7 +654,7 @@ </span><span class="cx"> return self </span><span class="cx"> def _get_engine(self): </span><span class="cx"> if not self.is_bound(): </span><del>- raise exceptions.InvalidRequestError("MetaData '%s' is not bound to any engine" % self.name) </del><ins>+ return None </ins><span class="cx"> return self._engine </span><span class="cx"> </span><span class="cx"> class BoundMetaData(MetaData): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -1049,12 +1049,13 @@ </span><span class="cx"> self.original = baseselectable </span><span class="cx"> self.selectable = selectable </span><span class="cx"> if alias is None: </span><del>- n = getattr(self.original, 'name', None) - if n is None: - n = 'anon' - elif len(n) > 15: - n = n[0:15] - alias = n + "_" + hex(random.randint(0, 65535))[2:] </del><ins>+ if self.original.named_with_column(): + alias = getattr(self.original, 'name', None) + if alias is None: + alias = 'anon' + elif len(alias) > 15: + alias = alias[0:15] + alias = alias + "_" + hex(random.randint(0, 65535))[2:] </ins><span class="cx"> self.name = alias </span><span class="cx"> </span><span class="cx"> def _locate_oid_column(self): </span><span class="lines">@@ -1263,7 +1264,10 @@ </span><span class="cx"> self.order_by(*kwargs.get('order_by', [None])) </span><span class="cx"> self._col_map = {} </span><span class="cx"> </span><del>- name = property(lambda s:s.keyword + " statement") </del><ins>+# name = property(lambda s:s.keyword + " statement") + def _foo(self): + raise "this is a temporary assertion while we refactor SQL to not call 'name' on non-table Selectables" + name = property(lambda s:s._foo()) #"SELECT statement") </ins><span class="cx"> </span><span class="cx"> def _locate_oid_column(self): </span><span class="cx"> return self.selects[0].oid_column </span><span class="lines">@@ -1353,7 +1357,7 @@ </span><span class="cx"> self.append_from(f) </span><span class="cx"> </span><span class="cx"> def _foo(self): </span><del>- raise "wtf?" </del><ins>+ raise "this is a temporary assertion while we refactor SQL to not call 'name' on non-table Selectables" </ins><span class="cx"> name = property(lambda s:s._foo()) #"SELECT statement") </span><span class="cx"> </span><span class="cx"> class CorrelatedVisitor(ClauseVisitor): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 16:45:46
|
<!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>[1455] sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py: added 'threaded' keyword param default is True</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1455</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 11:45:38 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>added 'threaded' keyword param default is True</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasesoraclepy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py (1454 => 1455)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py 2006-05-15 16:44:38 UTC (rev 1454) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py 2006-05-15 16:45:38 UTC (rev 1455) </span><span class="lines">@@ -106,9 +106,10 @@ </span><span class="cx"> ]} </span><span class="cx"> </span><span class="cx"> class OracleSQLEngine(ansisql.ANSISQLEngine): </span><del>- def __init__(self, opts, use_ansi = True, module = None, **params): </del><ins>+ def __init__(self, opts, use_ansi = True, module = None, threaded=True, **params): </ins><span class="cx"> self._use_ansi = use_ansi </span><span class="cx"> self.opts = self._translate_connect_args((None, 'dsn', 'user', 'password'), opts) </span><ins>+ opts['threaded'] = threaded </ins><span class="cx"> if module is None: </span><span class="cx"> self.module = cx_Oracle </span><span class="cx"> else: </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-15 16:44:48
|
<!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>[1454] sqlalchemy/trunk/test: extra unicode tests</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1454</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 11:44:38 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>extra unicode tests added 'threaded' keyword argument to oracle.py (pretty important....)</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunktesttesttypespy">sqlalchemy/trunk/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1453 => 1454)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-05-13 08:05:52 UTC (rev 1453) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-05-15 16:44:38 UTC (rev 1454) </span><span class="lines">@@ -106,9 +106,10 @@ </span><span class="cx"> ]} </span><span class="cx"> </span><span class="cx"> class OracleSQLEngine(ansisql.ANSISQLEngine): </span><del>- def __init__(self, opts, use_ansi = True, module = None, **params): </del><ins>+ def __init__(self, opts, use_ansi = True, module = None, threaded=False, **params): </ins><span class="cx"> self._use_ansi = use_ansi </span><span class="cx"> self.opts = self._translate_connect_args((None, 'dsn', 'user', 'password'), opts) </span><ins>+ self.opts['threaded'] = threaded </ins><span class="cx"> if module is None: </span><span class="cx"> self.module = cx_Oracle </span><span class="cx"> else: </span></span></pre></div> <a id="sqlalchemytrunktesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/testtypes.py (1453 => 1454)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/testtypes.py 2006-05-13 08:05:52 UTC (rev 1453) +++ sqlalchemy/trunk/test/testtypes.py 2006-05-15 16:44:38 UTC (rev 1454) </span><span class="lines">@@ -130,6 +130,13 @@ </span><span class="cx"> unicode_table.create() </span><span class="cx"> def tearDownAll(self): </span><span class="cx"> unicode_table.drop() </span><ins>+ def testwhereclause(self): + l = unicode_table.select(unicode_table.c.unicode_data==u'this is also unicode').execute() + def testmapperwhere(self): + class Foo(object):pass + m = mapper(Foo, unicode_table) + l = m.get_by(unicode_data=unicode('this is also unicode')) + l = m.get_by(plain_data=unicode('this is also unicode')) </ins><span class="cx"> def testbasic(self): </span><span class="cx"> rawdata = 'Alors vous imaginez ma surprise, au lever du jour, quand une dr\xc3\xb4le de petit voix m\xe2\x80\x99a r\xc3\xa9veill\xc3\xa9. Elle disait: \xc2\xab S\xe2\x80\x99il vous pla\xc3\xaet\xe2\x80\xa6 dessine-moi un mouton! \xc2\xbb\n' </span><span class="cx"> unicodedata = rawdata.decode('utf-8') </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-13 08:06:03
|
<!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>[1453] sqlalchemy/branches/schema/doc/build/content/datamapping.txt: dev</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1453</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-13 03:05:52 -0500 (Sat, 13 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>dev</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentdatamappingtxt">sqlalchemy/branches/schema/doc/build/content/datamapping.txt</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentdatamappingtxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/datamapping.txt (1452 => 1453)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/datamapping.txt 2006-05-13 08:00:52 UTC (rev 1452) +++ sqlalchemy/branches/schema/doc/build/content/datamapping.txt 2006-05-13 08:05:52 UTC (rev 1453) </span><span class="lines">@@ -404,9 +404,9 @@ </span><span class="cx"> Address.c.street=='123 Green Street') </span><span class="cx"> ) </span><span class="cx"> </span><del>-All keyword arguments sent to `select_by` are used to create query criterion. This means that familiar `select` keyword options like `order_by` and `limit` are not directly available. To enable these options with `select_by`, you can try the `SelectResults` extension which offers methods off the result of a `select_by` such as "order_by" as well as array slicing functions that generate queries. Or you can use `select` in conjunction with `join_to`. </del><ins>+All keyword arguments sent to `select_by` are used to create query criterion. This means that familiar `select` keyword options like `order_by` and `limit` are not directly available. To enable these options with `select_by`, you can try the `SelectResults` extension which offers methods off the result of a `select` or `select_by` such as `order_by()` and array slicing functions that generate new queries. Or you can use `select` in conjunction with `join_to`. </ins><span class="cx"> </span><del>-The `join_to` method of Query is a component of the `select_by` operation, and is given a keyname in order to return a "join path" from the Query's mapper to the mapper which contains the property of the given name: </del><ins>+The `join_to` method of `Query` is a component of the `select_by` operation, and is given a keyname in order to return a "join path" from the Query's mapper to the mapper which contains the property of the given name: </ins><span class="cx"> </span><span class="cx"> {python} </span><span class="cx"> >>> q = session.query(User) </span><span class="lines">@@ -424,6 +424,7 @@ </span><span class="cx"> </span><span class="cx"> Expressions produced by `join_to` and `join_via` can be used with `select` to create query criterion: </span><span class="cx"> </span><ins>+ {python} </ins><span class="cx"> >>> l = q.select( </span><span class="cx"> (addresses_table.c.street=='some address') & </span><span class="cx"> (items_table.c.item_name=='item #4') & </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-13 08:01:09
|
<!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>[1452] sqlalchemy/branches/schema/test: refactored select_by to be simpler and probably less buggy.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1452</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-13 03:00:52 -0500 (Sat, 13 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>refactored select_by to be simpler and probably less buggy. added join_by, join_via and join_to functions which provide more modular components of the select_by operation.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentdatamappingtxt">sqlalchemy/branches/schema/doc/build/content/datamapping.txt</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormpropertiespy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormquerypy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py</a></li> <li><a href="#sqlalchemybranchesschematestmapperpy">sqlalchemy/branches/schema/test/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentdatamappingtxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/datamapping.txt (1451 => 1452)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/datamapping.txt 2006-05-13 01:18:04 UTC (rev 1451) +++ sqlalchemy/branches/schema/doc/build/content/datamapping.txt 2006-05-13 08:00:52 UTC (rev 1452) </span><span class="lines">@@ -382,9 +382,9 @@ </span><span class="cx"> </span><span class="cx"> print repr(a) </span><span class="cx"> </span><del>-##### Useful Feature: Creating Joins via select_by {@name=relselectby} </del><ins>+##### Useful Feature: Creating Joins Across Relations {@name=relselectby} </ins><span class="cx"> </span><del>-For mappers that have relationships, the `select_by` method of the Query object and its cousins include special functionality that can be used to create joins. Just specify a key in the argument list which is not present in the primary mapper's list of properties or columns, but *is* present in the property list of one of its relationships: </del><ins>+For mappers that have relationships, the `select_by` method of the Query object can create queries that include automatically created joins. Just specify a key in the argument list which is not present in the primary mapper's list of properties or columns, but *is* present in the property list of one of its relationships: </ins><span class="cx"> </span><span class="cx"> {python} </span><span class="cx"> {sql}l = session.query(User).select_by(street='123 Green Street') </span><span class="lines">@@ -404,6 +404,34 @@ </span><span class="cx"> Address.c.street=='123 Green Street') </span><span class="cx"> ) </span><span class="cx"> </span><ins>+All keyword arguments sent to `select_by` are used to create query criterion. This means that familiar `select` keyword options like `order_by` and `limit` are not directly available. To enable these options with `select_by`, you can try the `SelectResults` extension which offers methods off the result of a `select_by` such as "order_by" as well as array slicing functions that generate queries. Or you can use `select` in conjunction with `join_to`. + +The `join_to` method of Query is a component of the `select_by` operation, and is given a keyname in order to return a "join path" from the Query's mapper to the mapper which contains the property of the given name: + + {python} + >>> q = session.query(User) + >>> j = q.join_to('street') + >>> print j + users.user_id=addresses.user_id + +Also available is the `join_via` function, which is similar to `join_to`, except instead of traversing through all properties to find a path to the given key, its given an explicit path to the target property: + + {python} + >>> q = session.query(User) + >>> j = q.join_via(['orders', 'items']) + >>> print j + users.c.user_id==orders.c.user_id AND orders.c.item_id==items.c.item_id + +Expressions produced by `join_to` and `join_via` can be used with `select` to create query criterion: + + >>> l = q.select( + (addresses_table.c.street=='some address') & + (items_table.c.item_name=='item #4') & + q.join_to('address') & + q.join_via(['orders', 'items']) + ) + + </ins><span class="cx"> #### Selecting from Relationships: Eager Load {@name=eagerload} </span><span class="cx"> </span><span class="cx"> With just a single parameter `lazy=False` specified to the relation object, the parent and child SQL queries can be joined together. </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py (1451 => 1452)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-13 01:18:04 UTC (rev 1451) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-13 08:00:52 UTC (rev 1452) </span><span class="lines">@@ -39,6 +39,7 @@ </span><span class="cx"> statement.append_column(c) </span><span class="cx"> def do_init(self, key, parent): </span><span class="cx"> self.key = key </span><ins>+ self.parent = parent </ins><span class="cx"> # establish a SmartProperty property manager on the object for this key </span><span class="cx"> if parent._is_primary_mapper(): </span><span class="cx"> #print "regiser col on class %s key %s" % (parent.class_.__name__, key) </span><span class="lines">@@ -293,34 +294,11 @@ </span><span class="cx"> else: </span><span class="cx"> self.foreigntable = dependent[0] </span><span class="cx"> </span><del>- - def get_criterion(self, query, key, value): - """given a key/value pair, determines if this PropertyLoader's mapper contains a key of the - given name in its property list, or if this PropertyLoader's association mapper, if any, - contains a key of the given name in its property list, and returns a WHERE clause against - the given value if found. - - this is called by a mappers select_by method to formulate a set of key/value pairs into - a WHERE criterion that spans multiple tables if needed.""" - # TODO: optimization: change mapper to accept a WHERE clause with separate bind parameters - # then cache the generated WHERE clauses here, since the creation + the copy_container - # is an extra expense - if self.mapper.props.has_key(key): - if self.secondaryjoin is not None: - c = (self.mapper.props[key].columns[0]==value) & self.primaryjoin & self.secondaryjoin - else: - c = (self.mapper.props[key].columns[0]==value) & self.primaryjoin - return c.copy_container() - elif self.mapper.mapped_table.c.has_key(key): - if self.secondaryjoin is not None: - c = (self.mapper.mapped_table.c[key].columns[0]==value) & self.primaryjoin & self.secondaryjoin - else: - c = (self.mapper.mapped_table.c[key].columns[0]==value) & self.primaryjoin - return c.copy_container() - elif self.association is not None: - c = query._get_criterion(self.mapper, key, value) & self.primaryjoin - return c.copy_container() - return None </del><ins>+ def get_join(self): + if self.secondaryjoin is not None: + return self.primaryjoin & self.secondaryjoin + else: + return self.primaryjoin </ins><span class="cx"> </span><span class="cx"> def execute(self, session, instance, row, identitykey, imap, isnew): </span><span class="cx"> if self.is_primary(): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py (1451 => 1452)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-13 01:18:04 UTC (rev 1451) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-13 08:00:52 UTC (rev 1452) </span><span class="lines">@@ -65,7 +65,7 @@ </span><span class="cx"> </span><span class="cx"> e.g. u = usermapper.get_by(user_name = 'fred') </span><span class="cx"> """ </span><del>- x = self.select_whereclause(self._by_clause(*args, **params), limit=1) </del><ins>+ x = self.select_whereclause(self.join_by(*args, **params), limit=1) </ins><span class="cx"> if x: </span><span class="cx"> return x[0] </span><span class="cx"> else: </span><span class="lines">@@ -75,6 +75,7 @@ </span><span class="cx"> """returns an array of object instances based on the given clauses and key/value criterion. </span><span class="cx"> </span><span class="cx"> *args is a list of zero or more ClauseElements which will be connected by AND operators. </span><ins>+ </ins><span class="cx"> **params is a set of zero or more key/value parameters which are converted into ClauseElements. </span><span class="cx"> the keys are mapped to property or column names mapped by this mapper's Table, and the values </span><span class="cx"> are coerced into a WHERE clause separated by AND operators. If the local property/column </span><span class="lines">@@ -87,8 +88,73 @@ </span><span class="cx"> ret = self.extension.select_by(self, *args, **params) </span><span class="cx"> if ret is not mapper.EXT_PASS: </span><span class="cx"> return ret </span><del>- return self.select_whereclause(self._by_clause(*args, **params)) </del><ins>+ return self.select_whereclause(self.join_by(*args, **params)) </ins><span class="cx"> </span><ins>+ def join_by(self, *args, **params): + """like select_by, but returns a ClauseElement representing the WHERE clause that would normally + be sent to select_whereclause by select_by.""" + clause = None + for arg in args: + if clause is None: + clause = arg + else: + clause &= arg + + for key, value in params.iteritems(): + (keys, prop) = self._locate_prop(key) + c = (prop.columns[0]==value) & self.join_via(keys) + if clause is None: + clause = c + else: + clause &= c + return clause + + def _locate_prop(self, key): + import properties + keys = [] + def search_for_prop(mapper): + if mapper.props.has_key(key): + return mapper.props[key] + else: + for prop in mapper.props.values(): + if not isinstance(prop, properties.PropertyLoader): + continue + x = search_for_prop(prop.mapper) + if x: + keys.insert(0, prop.key) + return x + else: + return None + p = search_for_prop(self.mapper) + if p is None: + raise exceptions.InvalidRequestError("Cant locate property named '%s'" % key) + return [keys, p] + + def join_to(self, key): + """given the key name of a property, will recursively descend through all child properties + from this Query's mapper to locate the property, and will return a ClauseElement + representing a join from this Query's mapper to the endmost mapper.""" + [keys, p] = self._locate_prop(key) + return self.join_via(keys) + + def join_via(self, keys): + """given a list of keys that represents a path from this Query's mapper to a related mapper + based on names of relations from one mapper to the next, returns a + ClauseElement representing a join from this Query's mapper to the endmost mapper. + """ + mapper = self.mapper + clause = None + for key in keys: + prop = mapper.props[key] + if clause is None: + clause = prop.get_join() + else: + clause &= prop.get_join() + mapper = prop.mapper + + return clause + + </ins><span class="cx"> def selectfirst_by(self, *args, **params): </span><span class="cx"> """works like select_by(), but only returns the first result by itself, or None if no </span><span class="cx"> objects returned. Synonymous with get_by()""" </span><span class="lines">@@ -96,7 +162,7 @@ </span><span class="cx"> </span><span class="cx"> def selectone_by(self, *args, **params): </span><span class="cx"> """works like selectfirst_by(), but throws an error if not exactly one result was returned.""" </span><del>- ret = self.select_whereclause(self._by_clause(*args, **params), limit=2) </del><ins>+ ret = self.select_whereclause(self.join_by(*args, **params), limit=2) </ins><span class="cx"> if len(ret) == 1: </span><span class="cx"> return ret[0] </span><span class="cx"> raise exceptions.InvalidRequestError('Multiple rows returned for selectone_by') </span><span class="lines">@@ -104,7 +170,7 @@ </span><span class="cx"> def count_by(self, *args, **params): </span><span class="cx"> """returns the count of instances based on the given clauses and key/value criterion. </span><span class="cx"> The criterion is constructed in the same way as the select_by() method.""" </span><del>- return self.count(self._by_clause(*args, **params)) </del><ins>+ return self.count(self.join_by(*args, **params)) </ins><span class="cx"> </span><span class="cx"> def selectfirst(self, *args, **params): </span><span class="cx"> """works like select(), but only returns the first result by itself, or None if no </span><span class="lines">@@ -182,25 +248,6 @@ </span><span class="cx"> finally: </span><span class="cx"> result.close() </span><span class="cx"> </span><del>- def _by_clause(self, *args, **params): - clause = None - for arg in args: - if clause is None: - clause = arg - else: - clause &= arg - for key, value in params.iteritems(): - if value is False: - continue - c = self._get_criterion(self.mapper, key, value) - if c is None: - raise exceptions.InvalidRequestError("Cant find criterion for property '"+ key + "'") - if clause is None: - clause = c - else: - clause &= c - return clause - </del><span class="cx"> def _get(self, key, ident=None, reload=False): </span><span class="cx"> if not reload and not self.always_refresh: </span><span class="cx"> try: </span><span class="lines">@@ -278,18 +325,3 @@ </span><span class="cx"> value.setup(key, statement, **kwargs) </span><span class="cx"> return statement </span><span class="cx"> </span><del>- def _get_criterion(self, mapper, key, value): - """used by select_by to match a key/value pair against - local properties, column names, or a matching property in this mapper's - list of relations.""" - if mapper.props.has_key(key): - return mapper.props[key].columns[0] == value - elif mapper.select_table.c.has_key(key): - return mapper.select_table.c[key] == value - else: - for prop in mapper.props.values(): - c = prop.get_criterion(self, key, value) - if c is not None: - return c - else: - return None </del></span></pre></div> <a id="sqlalchemybranchesschematestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/test/mapper.py (1451 => 1452)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/test/mapper.py 2006-05-13 01:18:04 UTC (rev 1451) +++ sqlalchemy/branches/schema/test/mapper.py 2006-05-13 08:00:52 UTC (rev 1452) </span><span class="lines">@@ -211,6 +211,25 @@ </span><span class="cx"> l = create_session().query(User).select(users.c.user_name.endswith('ed')) </span><span class="cx"> self.assert_result(l, User, *user_result[1:3]) </span><span class="cx"> </span><ins>+ def testjoinvia(self): + m = mapper(User, users, properties={ + 'orders':relation(mapper(Order, orders, properties={ + 'items':relation(mapper(Item, orderitems)) + })) + }) + + q = create_session().query(m) + + l = q.select((orderitems.c.item_name=='item 4') & q.join_via(['orders', 'items'])) + self.assert_result(l, User, user_result[0]) + + l = q.select_by(item_name='item 4') + self.assert_result(l, User, user_result[0]) + + l = q.select((orderitems.c.item_name=='item 4') & q.join_to('item_name')) + self.assert_result(l, User, user_result[0]) + + </ins><span class="cx"> def testorderby(self): </span><span class="cx"> # TODO: make a unit test out of these various combinations </span><span class="cx"> # m = mapper(User, users, order_by=desc(users.c.user_name)) </span><span class="lines">@@ -469,6 +488,7 @@ </span><span class="cx"> ("SELECT orders.order_id AS orders_order_id, orders.user_id AS orders_user_id, orders.description AS orders_description, orders.isopen AS orders_isopen FROM orders ORDER BY %s" % orderby, {}), </span><span class="cx"> ]) </span><span class="cx"> </span><ins>+ </ins><span class="cx"> def testdeepoptions(self): </span><span class="cx"> m = mapper(User, users, properties={ </span><span class="cx"> 'orders':relation(mapper(Order, orders, properties={ </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-13 01:18: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>[1451] sqlalchemy/branches/schema/lib/sqlalchemy: various tweaks to sql generation</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1451</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 20:18:04 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>various tweaks to sql generation</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyansisqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py (1450 => 1451)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-05-13 01:05:14 UTC (rev 1450) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-05-13 01:18:04 UTC (rev 1451) </span><span class="lines">@@ -169,7 +169,7 @@ </span><span class="cx"> # if we are within a visit to a Select, set up the "typemap" </span><span class="cx"> # for this column which is used to translate result set values </span><span class="cx"> self.typemap.setdefault(column.key.lower(), column.type) </span><del>- if column.table is None or column.table.name is None: </del><ins>+ if column.table is None or not column.table.named_with_column(): </ins><span class="cx"> self.strings[column] = column.name </span><span class="cx"> else: </span><span class="cx"> if column.table.oid_column is column: </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1450 => 1451)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-13 01:05:14 UTC (rev 1450) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-13 01:18:04 UTC (rev 1451) </span><span class="lines">@@ -660,6 +660,9 @@ </span><span class="cx"> return Join(self, right, isouter = True, *args, **kwargs) </span><span class="cx"> def alias(self, name=None): </span><span class="cx"> return Alias(self, name) </span><ins>+ def named_with_column(self): + """True if the name of this FromClause may be prepended to a column in a generated SQL statement""" + return False </ins><span class="cx"> def _locate_oid_column(self): </span><span class="cx"> """subclasses override this to return an appropriate OID column""" </span><span class="cx"> return None </span><span class="lines">@@ -1059,7 +1062,9 @@ </span><span class="cx"> return self.selectable.oid_column._make_proxy(self) </span><span class="cx"> else: </span><span class="cx"> return None </span><del>- </del><ins>+ + def named_with_column(self): + return True </ins><span class="cx"> def _exportable_columns(self): </span><span class="cx"> #return self.selectable._exportable_columns() </span><span class="cx"> return self.selectable.columns </span><span class="lines">@@ -1107,7 +1112,7 @@ </span><span class="cx"> self.__label = None </span><span class="cx"> def _get_label(self): </span><span class="cx"> if self.__label is None: </span><del>- if self.table is not None and self.table.name is not None: </del><ins>+ if self.table is not None and self.table.named_with_column(): </ins><span class="cx"> self.__label = self.table.name + "_" + self.name </span><span class="cx"> else: </span><span class="cx"> self.__label = self.name </span><span class="lines">@@ -1129,10 +1134,7 @@ </span><span class="cx"> else: </span><span class="cx"> return [] </span><span class="cx"> def _bind_param(self, obj): </span><del>- if self.table.name is None: - return BindParamClause(self.name, obj, shortname=self.name, type=self.type) - else: - return BindParamClause(self._label, obj, shortname = self.name, type=self.type) </del><ins>+ return BindParamClause(self._label, obj, shortname = self.name, type=self.type) </ins><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> c = ColumnClause(name or self.name, selectable, hidden=self.hidden) </span><span class="cx"> c.orig_set = self.orig_set </span><span class="lines">@@ -1157,7 +1159,9 @@ </span><span class="cx"> self._oid_column = ColumnClause('oid', self, hidden=True) </span><span class="cx"> </span><span class="cx"> indexes = property(lambda s:s._indexes) </span><del>- </del><ins>+ + def named_with_column(self): + return True </ins><span class="cx"> def append_column(self, c): </span><span class="cx"> self._columns[c.name] = c </span><span class="cx"> c.table = self </span><span class="lines">@@ -1347,9 +1351,11 @@ </span><span class="cx"> </span><span class="cx"> for f in from_obj: </span><span class="cx"> self.append_from(f) </span><del>- - name = property(lambda s:"SELECT statement") </del><span class="cx"> </span><ins>+ def _foo(self): + raise "wtf?" + name = property(lambda s:s._foo()) #"SELECT statement") + </ins><span class="cx"> class CorrelatedVisitor(ClauseVisitor): </span><span class="cx"> """visits a clause, locates any Select clauses, and tells them that they should </span><span class="cx"> correlate their FROM list to that of their parent.""" </span><span class="lines">@@ -1420,7 +1426,7 @@ </span><span class="cx"> for f in self._froms.values(): </span><span class="cx"> if f is self: </span><span class="cx"> # TODO: why would we be in our own _froms list ? </span><del>- continue </del><ins>+ raise exceptions.AssertionError("Select statement should not be in its own _froms list") </ins><span class="cx"> oid = f.oid_column </span><span class="cx"> if oid is not None: </span><span class="cx"> return oid </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-13 01:05:22
|
<!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>[1450] sqlalchemy/branches/schema/lib/sqlalchemy: added __str__ to Column to allow simple error reporting</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1450</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 20:05:14 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>added __str__ to Column to allow simple error reporting fixed _clear method on TableClause temporary recursive fix in Select....need to determine why that happens</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyschemapy">sqlalchemy/branches/schema/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/schema.py (1449 => 1450)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 00:50:23 UTC (rev 1449) +++ sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 01:05:14 UTC (rev 1450) </span><span class="lines">@@ -307,6 +307,12 @@ </span><span class="cx"> foreign_key = util.SimpleProperty('_foreign_key') </span><span class="cx"> columns = property(lambda self:[self]) </span><span class="cx"> </span><ins>+ def __str__(self): + if self.table is not None: + return str(self.table) + "." + self.name + else: + return self.name + </ins><span class="cx"> def _derived_metadata(self): </span><span class="cx"> return self.table.metadata </span><span class="cx"> def _get_engine(self): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1449 => 1450)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-13 00:50:23 UTC (rev 1449) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-13 01:05:14 UTC (rev 1450) </span><span class="lines">@@ -1181,6 +1181,7 @@ </span><span class="cx"> def _clear(self): </span><span class="cx"> """clears all attributes on this TableClause so that new items can be added again""" </span><span class="cx"> self.columns.clear() </span><ins>+ self.indexes.clear() </ins><span class="cx"> self.foreign_keys[:] = [] </span><span class="cx"> self.primary_key[:] = [] </span><span class="cx"> try: </span><span class="lines">@@ -1417,6 +1418,9 @@ </span><span class="cx"> fromclause._process_from_dict(self._froms, True) </span><span class="cx"> def _locate_oid_column(self): </span><span class="cx"> for f in self._froms.values(): </span><ins>+ if f is self: + # TODO: why would we be in our own _froms list ? + continue </ins><span class="cx"> oid = f.oid_column </span><span class="cx"> if oid is not None: </span><span class="cx"> return oid </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-13 00:50:31
|
<!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>[1449] sqlalchemy/branches/schema/lib/sqlalchemy/schema.py: explicit 'exceptions' namespsace for ArgumentErrors</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1449</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 19:50:23 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>explicit 'exceptions' namespsace for ArgumentErrors</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyschemapy">sqlalchemy/branches/schema/lib/sqlalchemy/schema.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/schema.py (1448 => 1449)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 00:46:51 UTC (rev 1448) +++ sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 00:50:23 UTC (rev 1449) </span><span class="lines">@@ -70,11 +70,11 @@ </span><span class="cx"> if redefine: </span><span class="cx"> table.reload_values(*args) </span><span class="cx"> elif not useexisting: </span><del>- raise ArgumentError("Table '%s.%s' is already defined. specify 'redefine=True' to remap columns, or 'useexisting=True' to use the existing table" % (schema, name)) </del><ins>+ raise exceptions.ArgumentError("Table '%s.%s' is already defined. specify 'redefine=True' to remap columns, or 'useexisting=True' to use the existing table" % (schema, name)) </ins><span class="cx"> return table </span><span class="cx"> except KeyError: </span><span class="cx"> if mustexist: </span><del>- raise ArgumentError("Table '%s.%s' not defined" % (schema, name)) </del><ins>+ raise exceptions.ArgumentError("Table '%s.%s' not defined" % (schema, name)) </ins><span class="cx"> table = type.__call__(self, name, metadata, **kwargs) </span><span class="cx"> table._set_parent(metadata) </span><span class="cx"> # load column definitions from the database if 'autoload' is defined </span><span class="lines">@@ -298,10 +298,10 @@ </span><span class="cx"> self.unique = kwargs.pop('unique', None) </span><span class="cx"> self.onupdate = kwargs.pop('onupdate', None) </span><span class="cx"> if self.index is not None and self.unique is not None: </span><del>- raise ArgumentError("Column may not define both index and unique") </del><ins>+ raise exceptions.ArgumentError("Column may not define both index and unique") </ins><span class="cx"> self._foreign_key = None </span><span class="cx"> if len(kwargs): </span><del>- raise ArgumentError("Unknown arguments passed to Column: " + repr(kwargs.keys())) </del><ins>+ raise exceptions.ArgumentError("Unknown arguments passed to Column: " + repr(kwargs.keys())) </ins><span class="cx"> </span><span class="cx"> primary_key = util.SimpleProperty('_primary_key') </span><span class="cx"> foreign_key = util.SimpleProperty('_foreign_key') </span><span class="lines">@@ -331,7 +331,7 @@ </span><span class="cx"> </span><span class="cx"> def _set_parent(self, table): </span><span class="cx"> if getattr(self, 'table', None) is not None: </span><del>- raise ArgumentError("this Column already has a table!") </del><ins>+ raise exceptions.ArgumentError("this Column already has a table!") </ins><span class="cx"> table.append_column(self) </span><span class="cx"> if self.index or self.unique: </span><span class="cx"> table.append_index_column(self, index=self.index, </span><span class="lines">@@ -423,7 +423,7 @@ </span><span class="cx"> if isinstance(self._colspec, str): </span><span class="cx"> m = re.match(r"^([\w_-]+)(?:\.([\w_-]+))?(?:\.([\w_-]+))?$", self._colspec) </span><span class="cx"> if m is None: </span><del>- raise ArgumentError("Invalid foreign key column specification: " + self._colspec) </del><ins>+ raise exceptions.ArgumentError("Invalid foreign key column specification: " + self._colspec) </ins><span class="cx"> if m.group(3) is None: </span><span class="cx"> (tname, colname) = m.group(1, 2) </span><span class="cx"> schema = list(self.parent.orig_set)[0].table.schema </span><span class="lines">@@ -562,12 +562,12 @@ </span><span class="cx"> self.table.append_index(self) </span><span class="cx"> elif column.table != self.table: </span><span class="cx"> # all columns muse be from same table </span><del>- raise ArgumentError("All index columns must be from same table. " </del><ins>+ raise exceptions.ArgumentError("All index columns must be from same table. " </ins><span class="cx"> "%s is from %s not %s" % (column, </span><span class="cx"> column.table, </span><span class="cx"> self.table)) </span><span class="cx"> elif column.name in [ c.name for c in self.columns ]: </span><del>- raise ArgumentError("A column may not appear twice in the " </del><ins>+ raise exceptions.ArgumentError("A column may not appear twice in the " </ins><span class="cx"> "same index (%s already has column %s)" </span><span class="cx"> % (self.name, column)) </span><span class="cx"> self.columns.append(column) </span></span></pre> </div> </div> </body> </html> |
<!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>[1448] sqlalchemy/branches/schema/test: query uses session instead of assumed table bound engine to get scalar value of count() now, fixes [ticket:177]</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1448</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 19:46:51 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>query uses session instead of assumed table bound engine to get scalar value of count() now, fixes [ticket:177]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormquerypy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormsessionpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyschemapy">sqlalchemy/branches/schema/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchesschematestmapperpy">sqlalchemy/branches/schema/test/mapper.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyormquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py (1447 => 1448)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-13 00:40:57 UTC (rev 1447) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-13 00:46:51 UTC (rev 1448) </span><span class="lines">@@ -146,13 +146,9 @@ </span><span class="cx"> statement = self._compile(whereclause, **kwargs) </span><span class="cx"> return self._select_statement(statement, params=params) </span><span class="cx"> </span><del>- </del><span class="cx"> def count(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> s = self.table.count(whereclause) </span><del>- if params is not None: - return s.scalar(**params) - else: - return s.scalar() </del><ins>+ return self.session.scalar(self.mapper, s, params=params) </ins><span class="cx"> </span><span class="cx"> def select_statement(self, statement, **params): </span><span class="cx"> return self._select_statement(statement, params=params) </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormsessionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py (1447 => 1448)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-13 00:40:57 UTC (rev 1447) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-13 00:46:51 UTC (rev 1448) </span><span class="lines">@@ -112,6 +112,9 @@ </span><span class="cx"> method will release the resources of the underlying Connection, otherwise its a no-op. </span><span class="cx"> """ </span><span class="cx"> return self.connection(mapper, close_with_result=True).execute(clause, params, **kwargs) </span><ins>+ def scalar(self, mapper, clause, params, **kwargs): + """works like execute() but returns a scalar result.""" + return self.connection(mapper, close_with_result=True).scalar(clause, params, **kwargs) </ins><span class="cx"> </span><span class="cx"> def close(self): </span><span class="cx"> """closes this Session. </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/schema.py (1447 => 1448)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 00:40:57 UTC (rev 1447) +++ sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-13 00:46:51 UTC (rev 1448) </span><span class="lines">@@ -648,7 +648,7 @@ </span><span class="cx"> return self </span><span class="cx"> def _get_engine(self): </span><span class="cx"> if not self.is_bound(): </span><del>- raise exceptions.InvalidRequestError("Schema %s is not bound to any engine" % self.name) </del><ins>+ raise exceptions.InvalidRequestError("MetaData '%s' is not bound to any engine" % self.name) </ins><span class="cx"> return self._engine </span><span class="cx"> </span><span class="cx"> class BoundMetaData(MetaData): </span></span></pre></div> <a id="sqlalchemybranchesschematestmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/test/mapper.py (1447 => 1448)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/test/mapper.py 2006-05-13 00:40:57 UTC (rev 1447) +++ sqlalchemy/branches/schema/test/mapper.py 2006-05-13 00:46:51 UTC (rev 1448) </span><span class="lines">@@ -84,6 +84,7 @@ </span><span class="cx"> u2 = s.get(User, 7) </span><span class="cx"> self.assert_(u is not u2) </span><span class="cx"> </span><ins>+ </ins><span class="cx"> def testrefresh(self): </span><span class="cx"> mapper(User, users, properties={'addresses':relation(mapper(Address, addresses))}) </span><span class="cx"> s = create_session() </span></span></pre> </div> </div> </body> </html> |
<!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>[1447] sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py: restored compiler() and execute_compiled() methods which must be present in order to override those of the base sql.Engine class</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1447</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 19:40:57 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>restored compiler() and execute_compiled() methods which must be present in order to override those of the base sql.Engine class</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyextproxypy">sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py (1446 => 1447)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py 2006-05-12 19:42:51 UTC (rev 1446) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py 2006-05-13 00:40:57 UTC (rev 1447) </span><span class="lines">@@ -18,8 +18,18 @@ </span><span class="cx"> raise NotImplementedError </span><span class="cx"> </span><span class="cx"> engine = property(lambda s:s.get_engine(), lambda s,e:s.set_engine(e)) </span><ins>+ + def execute_compiled(self, *args, **kwargs): + """this method is required to be present as it overrides the execute_compiled present in sql.Engine""" + return self.get_engine().execute_compiled(*args, **kwargs) + def compiler(self, *args, **kwargs): + """this method is required to be present as it overrides the compiler method present in sql.Engine""" + return self.get_engine().compiler(*args, **kwargs) </ins><span class="cx"> </span><span class="cx"> def __getattr__(self, attr): </span><ins>+ """provides proxying for methods that are not otherwise present on this BaseProxyEngine. Note + that methods which are present on the base class sql.Engine will *not* be proxied through this, + and must be explicit on this class.""" </ins><span class="cx"> # call get_engine() to give subclasses a chance to change </span><span class="cx"> # connection establishment behavior </span><span class="cx"> e = self.get_engine() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-12 19:43:01
|
<!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>[1446] sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py: added __all__</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1446</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 14:42:51 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>added __all__</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyextproxypy">sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py (1445 => 1446)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py 2006-05-12 19:25:41 UTC (rev 1445) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ext/proxy.py 2006-05-12 19:42:51 UTC (rev 1446) </span><span class="lines">@@ -6,6 +6,7 @@ </span><span class="cx"> from sqlalchemy import sql </span><span class="cx"> from sqlalchemy.engine import create_engine </span><span class="cx"> </span><ins>+__all__ = ['BaseProxyEngine', 'AutoConnectEngine', 'ProxyEngine'] </ins><span class="cx"> </span><span class="cx"> class BaseProxyEngine(sql.Engine): </span><span class="cx"> """Basis for all proxy engines.""" </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-12 19:26:01
|
<!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>[1445] sqlalchemy/trunk/doc/build: added pre-compiled docstring support</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1445</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 14:25:41 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>added pre-compiled docstring support</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcomponentspydocmyt">sqlalchemy/trunk/doc/build/components/pydoc.myt</a></li> <li><a href="#sqlalchemytrunkdocbuildcontentdocstringsmyt">sqlalchemy/trunk/doc/build/content/docstrings.myt</a></li> <li><a href="#sqlalchemytrunkdocbuildgenhtmlpy">sqlalchemy/trunk/doc/build/genhtml.py</a></li> <li><a href="#sqlalchemytrunkdocbuildrunhtmlpy">sqlalchemy/trunk/doc/build/runhtml.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcompile_docstringspy">sqlalchemy/trunk/doc/build/compile_docstrings.py</a></li> <li><a href="#sqlalchemytrunkdocbuildlibdocstringpy">sqlalchemy/trunk/doc/build/lib/docstring.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcompile_docstringspy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/doc/build/compile_docstrings.py (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/compile_docstrings.py 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/compile_docstrings.py 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -0,0 +1,31 @@ </span><ins>+import cPickle as pickle +import sys, os + +sys.path = ['../../lib', './lib/'] + sys.path + +import docstring + +import sqlalchemy.schema as schema +import sqlalchemy.engine as engine +import sqlalchemy.sql as sql +import sqlalchemy.pool as pool +import sqlalchemy.mapping as mapping +import sqlalchemy.exceptions as exceptions +import sqlalchemy.ext.proxy as proxy + +objects = [] +def make_doc(obj, classes=None, functions=None): + objects.append(docstring.ObjectDoc(obj, classes=classes, functions=functions)) + +make_doc(obj=schema) +make_doc(obj=engine, classes=[engine.SQLSession, engine.SQLEngine, engine.ResultProxy, engine.RowProxy]) +make_doc(obj=sql, classes=[sql.ClauseParameters, sql.Compiled, sql.ClauseElement, sql.TableClause, sql.ColumnClause]) +make_doc(obj=pool, classes=[pool.DBProxy, pool.Pool, pool.QueuePool, pool.SingletonThreadPool]) +make_doc(obj=mapping, classes=[mapping.Mapper, mapping.MapperExtension]) +make_doc(obj=mapping.query, classes=[mapping.query.Query]) +make_doc(obj=mapping.objectstore, classes=[mapping.objectstore.Session, mapping.objectstore.Session.SessionTrans]) +make_doc(obj=exceptions) +make_doc(obj=proxy) + +output = os.path.join(os.getcwd(), 'content', "compiled_docstrings.pickle") +pickle.dump(objects, file(output, 'w')) </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemytrunkdocbuildcomponentspydocmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/components/pydoc.myt (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/components/pydoc.myt 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/components/pydoc.myt 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -1,140 +1,63 @@ </span><span class="cx"> <%global> </span><del>- import re, types </del><ins>+ import re, types, string, docstring </ins><span class="cx"> def format_paragraphs(text): </span><del>- return re.sub(r'([\w ])\n([\w ])', r'\1 \2', text or '', re.S) </del><ins>+ return re.sub(r'([\w])\n([\w])', r'\1 \2', text or '', re.S) </ins><span class="cx"> </%global> </span><span class="cx"> </span><span class="cx"> <%method obj_doc> </span><span class="cx"> <%args> </span><span class="cx"> obj </span><del>- functions = None - classes = None </del><span class="cx"> </%args> </span><del>- <%init> - import types - isclass = isinstance(obj, types.ClassType) or isinstance(obj, types.TypeType) - name= obj.__name__ - - if not isclass: - if hasattr(obj, '__all__'): - objects = obj.__all__ - sort = True - else: - objects = obj.__dict__.keys() - sort = True - if functions is None: - functions = [getattr(obj, x, None) - for x in objects - if getattr(obj,x,None) is not None and - (isinstance(getattr(obj,x), types.FunctionType)) - and not getattr(obj,x).__name__[0] == '_' - ] - if sort: - functions.sort(lambda a, b: cmp(a.__name__, b.__name__)) - if classes is None: - classes = [getattr(obj, x, None) - for x in objects - if getattr(obj,x,None) is not None and - (isinstance(getattr(obj,x), types.TypeType) - or isinstance(getattr(obj,x), types.ClassType)) - and not getattr(obj,x).__name__[0] == '_' - ] - if sort: - classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) - else: - if functions is None: - functions = ( - [getattr(obj, x).im_func for x in obj.__dict__.keys() if isinstance(getattr(obj,x), types.MethodType) - and - (getattr(obj, x).__name__ == '__init__' or not getattr(obj,x).__name__[0] == '_') - ] + - [(x, getattr(obj, x)) for x in obj.__dict__.keys() if isinstance(getattr(obj,x), property) - and - not x[0] == '_' - ] - ) - functions.sort(lambda a, b: cmp(getattr(a, '__name__', None) or a[0], getattr(b, '__name__', None) or b[0] )) - if classes is None: - classes = [] - - if isclass: - description = "Class " + name - if hasattr(obj, '__mro__'): - description += "(" + obj.__mro__[1].__name__ + ")" - else: - description = "Module " + name - </%init> </del><ins>+ +<&|doclib.myt:item, name=obj.name, description=obj.description &> +<&|formatting.myt:formatplain&><% format_paragraphs(obj.doc) %></&> </ins><span class="cx"> </span><del>-<&|doclib.myt:item, name=obj.__name__, description=description &> -<&|formatting.myt:formatplain&><% format_paragraphs(obj.__doc__) %></&> - -% if not isclass and len(functions): </del><ins>+% if not obj.isclass and obj.functions: </ins><span class="cx"> <&|doclib.myt:item, name="modfunc", description="Module Functions" &> </span><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for func in functions: </del><ins>+% for func in obj.functions: </ins><span class="cx"> <& SELF:function_doc, func=func &> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> </&> </span><span class="cx"> % else: </span><del>-% if len(functions): </del><ins>+% if obj.functions: </ins><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for func in functions: -% if isinstance(func, types.FunctionType): </del><ins>+% for func in obj.functions: +% if isinstance(func, docstring.FunctionDoc): </ins><span class="cx"> <& SELF:function_doc, func=func &> </span><del>-% elif isinstance(func, tuple): - <& SELF:property_doc, name = func[0], prop=func[1] &> </del><ins>+% elif isinstance(func, docstring.PropertyDoc): + <& SELF:property_doc, prop=func &> </ins><span class="cx"> % </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> % </span><span class="cx"> % </span><span class="cx"> </span><del>-% if len(classes): </del><ins>+% if obj.classes: </ins><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for class_ in classes: </del><ins>+% for class_ in obj.classes: </ins><span class="cx"> <& SELF:obj_doc, obj=class_ &> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> </span><del>- </del><span class="cx"> </%method> </span><span class="cx"> </span><span class="cx"> <%method function_doc> </span><span class="cx"> <%args>func</%args> </span><del>- <%init> - import inspect - argspec = inspect.getargspec(func) - argnames = argspec[0] - varargs = argspec[1] - varkw = argspec[2] - defaults = argspec[3] or () - argstrings = [] - for i in range(0, len(argnames)): - if i >= len(argnames) - len(defaults): - argstrings.append("%s=%s" % (argnames[i], repr(defaults[i - (len(argnames) - len(defaults))]))) - else: - argstrings.append(argnames[i]) - if varargs is not None: - argstrings.append("*%s" % varargs) - if varkw is not None: - argstrings.append("**%s" % varkw) - </%init> - - <&|formatting.myt:function_doc, name="def " + func.__name__, link=func.__name__, arglist=argstrings &> - <&|formatting.myt:formatplain&><% format_paragraphs(func.__doc__) %></&> </del><ins>+ <&|formatting.myt:function_doc, name=func.name, link=func.link, arglist=func.arglist &> + <&|formatting.myt:formatplain&><% format_paragraphs(func.doc) %></&> </ins><span class="cx"> </&> </span><span class="cx"> </%method> </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> <%method property_doc> </span><span class="cx"> <%args> </span><del>- name </del><span class="cx"> prop </span><span class="cx"> </%args> </span><del>- <&|formatting.myt:member_doc, name=name + " = property()", link=name &> - <&|formatting.myt:formatplain&><% format_paragraphs(prop.__doc__) %></&> </del><ins>+ <&|formatting.myt:member_doc, name=prop.name, link=prop.link &> + <&|formatting.myt:formatplain&><% format_paragraphs(prop.doc) %></&> </ins><span class="cx"> </&> </span><span class="cx"> </%method> </span><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemytrunkdocbuildcontentdocstringsmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/docstrings.myt (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/docstrings.myt 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/content/docstrings.myt 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -2,24 +2,14 @@ </span><span class="cx"> <%attr>title='Modules and Classes'</%attr> </span><span class="cx"> <&|doclib.myt:item, name="docstrings", description="Modules and Classes" &> </span><span class="cx"> <%init> </span><del>- import sqlalchemy.schema as schema - import sqlalchemy.engine as engine - import sqlalchemy.sql as sql - import sqlalchemy.pool as pool - import sqlalchemy.mapping as mapping - import sqlalchemy.exceptions as exceptions - import sqlalchemy.ext.proxy as proxy </del><ins>+ import cPickle as pickle + import os + filename = os.path.join(os.path.dirname(self.file), 'compiled_docstrings.pickle') + data = pickle.load(file(filename)) </ins><span class="cx"> </%init> </span><span class="cx"> </span><ins>+% for obj in data: +<& pydoc.myt:obj_doc, obj=obj &> +% </ins><span class="cx"> </span><del>-<& pydoc.myt:obj_doc, obj=schema &> -<& pydoc.myt:obj_doc, obj=engine, classes=[engine.SQLSession, engine.SQLEngine, engine.ResultProxy, engine.RowProxy] &> -<& pydoc.myt:obj_doc, obj=sql, classes=[sql.ClauseParameters, sql.Compiled, sql.ClauseElement, sql.TableClause, sql.ColumnClause] &> -<& pydoc.myt:obj_doc, obj=pool, classes=[pool.DBProxy, pool.Pool, pool.QueuePool, pool.SingletonThreadPool] &> -<& pydoc.myt:obj_doc, obj=mapping, classes=[mapping.Mapper, mapping.MapperExtension] &> -<& pydoc.myt:obj_doc, obj=mapping.query, classes=[mapping.query.Query] &> -<& pydoc.myt:obj_doc, obj=mapping.objectstore, classes=[mapping.objectstore.Session, mapping.objectstore.Session.SessionTrans] &> -<& pydoc.myt:obj_doc, obj=exceptions &> -<& pydoc.myt:obj_doc, obj=proxy &> - -</&> </del><ins>+</&> </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemytrunkdocbuildgenhtmlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/genhtml.py (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/genhtml.py 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/genhtml.py 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -4,6 +4,9 @@ </span><span class="cx"> print "Running txt2myt.py..." </span><span class="cx"> execfile("txt2myt.py") </span><span class="cx"> </span><ins>+print "Generating docstring data" +execfile("compile_docstrings.py") + </ins><span class="cx"> component_root = [ </span><span class="cx"> {'components': './components'}, </span><span class="cx"> {'content' : './content'} </span><span class="lines">@@ -11,7 +14,7 @@ </span><span class="cx"> doccomp = ['document_base.myt'] </span><span class="cx"> output = os.path.dirname(os.getcwd()) </span><span class="cx"> </span><del>-sys.path = ['../../lib', './lib/'] + sys.path </del><ins>+sys.path = ['./lib/'] + sys.path </ins><span class="cx"> </span><span class="cx"> import documentgen </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunkdocbuildlibdocstringpy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/doc/build/lib/docstring.py (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/lib/docstring.py 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/lib/docstring.py 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -0,0 +1,119 @@ </span><ins>+import re, types, string, inspect + +"""sucks a module and its contents into a simple documentation object, suitable for pickling""" + +class ObjectDoc(object): + def __init__(self, obj, functions=None, classes=None): + self.isclass = isinstance(obj, types.ClassType) or isinstance(obj, types.TypeType) + self.name= obj.__name__ + functions = functions + classes= classes + + if not self.isclass: + if hasattr(obj, '__all__'): + objects = obj.__all__ + sort = True + else: + objects = obj.__dict__.keys() + sort = True + if functions is None: + functions = [getattr(obj, x, None) + for x in objects + if getattr(obj,x,None) is not None and + (isinstance(getattr(obj,x), types.FunctionType)) + and not getattr(obj,x).__name__[0] == '_' + ] + if sort: + functions.sort(lambda a, b: cmp(a.__name__, b.__name__)) + if classes is None: + classes = [getattr(obj, x, None) for x in objects + if getattr(obj,x,None) is not None and + (isinstance(getattr(obj,x), types.TypeType) + or isinstance(getattr(obj,x), types.ClassType)) + and not getattr(obj,x).__name__[0] == '_' + ] + if sort: + classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) + else: + if functions is None: + functions = ( + [getattr(obj, x).im_func for x in obj.__dict__.keys() if isinstance(getattr(obj,x), types.MethodType) + and + (getattr(obj, x).__name__ == '__init__' or not getattr(obj,x).__name__[0] == '_') + ] + + [(x, getattr(obj, x)) for x in obj.__dict__.keys() if isinstance(getattr(obj,x), property) + and + not x[0] == '_' + ] + ) + functions.sort(lambda a, b: cmp(getattr(a, '__name__', None) or a[0], getattr(b, '__name__', None) or b[0] )) + if classes is None: + classes = [] + + if self.isclass: + self.description = "Class " + self.name + if hasattr(obj, '__mro__'): + l = [] + mro = list(obj.__mro__[1:]) + mro.reverse() + for x in mro: + for y in x.__mro__[1:]: + if y in l: + del l[l.index(y)] + l.insert(0, x) + self.description += "(" + string.join([x.__name__ for x in l], ',') + ")" + else: + self.description = "Module " + self.name + + self.doc = obj.__doc__ + + self.functions = [] + if not self.isclass and len(functions): + for func in functions: + self.functions.append(FunctionDoc(func)) + else: + if len(functions): + for func in functions: + if isinstance(func, types.FunctionType): + self.functions.append(FunctionDoc(func)) + elif isinstance(func, tuple): + self.functions.append(PropertyDoc(func[0], func[1])) + + self.classes = [] + for class_ in classes: + self.classes.append(ObjectDoc(class_)) + + def accept_visitor(self, visitor): + visitor.visit_object(self) + +class FunctionDoc(object): + def __init__(self, func): + argspec = inspect.getargspec(func) + argnames = argspec[0] + varargs = argspec[1] + varkw = argspec[2] + defaults = argspec[3] or () + argstrings = [] + for i in range(0, len(argnames)): + if i >= len(argnames) - len(defaults): + argstrings.append("%s=%s" % (argnames[i], repr(defaults[i - (len(argnames) - len(defaults))]))) + else: + argstrings.append(argnames[i]) + if varargs is not None: + argstrings.append("*%s" % varargs) + if varkw is not None: + argstrings.append("**%s" % varkw) + self.argstrings = self.arglist = argstrings + self.name = "def " + func.__name__ + self.link = func.__name__ + self.doc = func.__doc__ + def accept_visitor(self, visitor): + visitor.visit_function(self) + +class PropertyDoc(object): + def __init__(self, name, prop): + self.doc = prop.__doc__ + self.name = name + " = property()" + self.link = name + def accept_visitor(self, visitor): + visitor.visit_property(self) </ins></span></pre></div> <a id="sqlalchemytrunkdocbuildrunhtmlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/runhtml.py (1444 => 1445)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/runhtml.py 2006-05-12 19:16:25 UTC (rev 1444) +++ sqlalchemy/trunk/doc/build/runhtml.py 2006-05-12 19:25:41 UTC (rev 1445) </span><span class="lines">@@ -4,6 +4,9 @@ </span><span class="cx"> print "Running txt2myt.py..." </span><span class="cx"> execfile("txt2myt.py") </span><span class="cx"> </span><ins>+print "Generating docstring data" +execfile("compile_docstrings.py") + </ins><span class="cx"> component_root = [ </span><span class="cx"> {'components': './components'}, </span><span class="cx"> {'content' : './content'} </span><span class="lines">@@ -11,7 +14,7 @@ </span><span class="cx"> doccomp = ['document_base.myt'] </span><span class="cx"> output = os.path.dirname(os.getcwd()) </span><span class="cx"> </span><del>-sys.path = ['../../lib', './lib/'] + sys.path </del><ins>+sys.path = ['./lib/'] + sys.path </ins><span class="cx"> </span><span class="cx"> import myghty.http.HTTPServerHandler as HTTPServerHandler </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-12 19:16:55
|
<!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>[1444] sqlalchemy/branches/schema/doc/build: docstring gen is compiled to a datafile first, then presented.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1444</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 14:16:25 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>docstring gen is compiled to a datafile first, then presented. decouples the need to have the documented library in the sys.path when running myghty formatting</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcomponentspydocmyt">sqlalchemy/branches/schema/doc/build/components/pydoc.myt</a></li> <li><a href="#sqlalchemybranchesschemadocbuildcontentdocstringsmyt">sqlalchemy/branches/schema/doc/build/content/docstrings.myt</a></li> <li><a href="#sqlalchemybranchesschemadocbuildgenhtmlpy">sqlalchemy/branches/schema/doc/build/genhtml.py</a></li> <li><a href="#sqlalchemybranchesschemadocbuildrunhtmlpy">sqlalchemy/branches/schema/doc/build/runhtml.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcompile_docstringspy">sqlalchemy/branches/schema/doc/build/compile_docstrings.py</a></li> <li><a href="#sqlalchemybranchesschemadocbuildlibdocstringpy">sqlalchemy/branches/schema/doc/build/lib/docstring.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcompile_docstringspy"></a> <div class="addfile"><h4>Added: sqlalchemy/branches/schema/doc/build/compile_docstrings.py (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/compile_docstrings.py 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/compile_docstrings.py 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -0,0 +1,36 @@ </span><ins>+import cPickle as pickle +import sys, os + +sys.path = ['../../lib', './lib/'] + sys.path + +import docstring + +import sqlalchemy.schema as schema +import sqlalchemy.engine as engine +import sqlalchemy.engine.strategies as strategies +import sqlalchemy.sql as sql +import sqlalchemy.pool as pool +import sqlalchemy.orm as orm +import sqlalchemy.exceptions as exceptions +import sqlalchemy.ext.proxy as proxy +import sqlalchemy.mods.threadlocal as threadlocal + +objects = [] +def make_doc(obj, classes=None, functions=None): + objects.append(docstring.ObjectDoc(obj, classes=classes, functions=functions)) + +make_doc(obj=sql, classes=[sql.Engine, sql.AbstractDialect, sql.ClauseParameters, sql.Compiled, sql.ClauseElement, sql.TableClause, sql.ColumnClause]) +make_doc(obj=schema) +make_doc(obj=engine, classes=[engine.ComposedSQLEngine, engine.Connection, engine.Transaction, engine.Dialect, engine.ConnectionProvider, engine.ExecutionContext, engine.ResultProxy, engine.RowProxy]) +make_doc(obj=strategies) +make_doc(obj=orm, classes=[orm.Mapper, orm.MapperExtension]) +make_doc(obj=orm.query, classes=[orm.query.Query]) +make_doc(obj=orm.session, classes=[orm.session.Session, orm.session.SessionTransaction]) +make_doc(obj=threadlocal) +make_doc(obj=exceptions) +make_doc(obj=pool, classes=[pool.DBProxy, pool.Pool, pool.QueuePool, pool.SingletonThreadPool]) +make_doc(obj=proxy) + + +output = os.path.join(os.getcwd(), 'content', "compiled_docstrings.pickle") +pickle.dump(objects, file(output, 'w')) </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildcomponentspydocmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/components/pydoc.myt (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/components/pydoc.myt 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/components/pydoc.myt 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -1,5 +1,5 @@ </span><span class="cx"> <%global> </span><del>- import re, types, string </del><ins>+ import re, types, string, docstring </ins><span class="cx"> def format_paragraphs(text): </span><span class="cx"> return re.sub(r'([\w])\n([\w])', r'\1 \2', text or '', re.S) </span><span class="cx"> </%global> </span><span class="lines">@@ -7,142 +7,57 @@ </span><span class="cx"> <%method obj_doc> </span><span class="cx"> <%args> </span><span class="cx"> obj </span><del>- functions = None - classes = None </del><span class="cx"> </%args> </span><del>- <%init> - import types - isclass = isinstance(obj, types.ClassType) or isinstance(obj, types.TypeType) - name= obj.__name__ - - if not isclass: - if hasattr(obj, '__all__'): - objects = obj.__all__ - sort = True - else: - objects = obj.__dict__.keys() - sort = True - if functions is None: - functions = [getattr(obj, x, None) - for x in objects - if getattr(obj,x,None) is not None and - (isinstance(getattr(obj,x), types.FunctionType)) - and not getattr(obj,x).__name__[0] == '_' - ] - if sort: - functions.sort(lambda a, b: cmp(a.__name__, b.__name__)) - if classes is None: - classes = [getattr(obj, x, None) - for x in objects - if getattr(obj,x,None) is not None and - (isinstance(getattr(obj,x), types.TypeType) - or isinstance(getattr(obj,x), types.ClassType)) - and not getattr(obj,x).__name__[0] == '_' - ] - if sort: - classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) - else: - if functions is None: - functions = ( - [getattr(obj, x).im_func for x in obj.__dict__.keys() if isinstance(getattr(obj,x), types.MethodType) - and - (getattr(obj, x).__name__ == '__init__' or not getattr(obj,x).__name__[0] == '_') - ] + - [(x, getattr(obj, x)) for x in obj.__dict__.keys() if isinstance(getattr(obj,x), property) - and - not x[0] == '_' - ] - ) - functions.sort(lambda a, b: cmp(getattr(a, '__name__', None) or a[0], getattr(b, '__name__', None) or b[0] )) - if classes is None: - classes = [] - - if isclass: - description = "Class " + name - if hasattr(obj, '__mro__'): - l = [] - mro = list(obj.__mro__[1:]) - mro.reverse() - for x in mro: - for y in x.__mro__[1:]: - if y in l: - del l[l.index(y)] - l.insert(0, x) - description += "(" + string.join([x.__name__ for x in l], ',') + ")" - else: - description = "Module " + name - </%init> </del><ins>+ +<&|doclib.myt:item, name=obj.name, description=obj.description &> +<&|formatting.myt:formatplain&><% format_paragraphs(obj.doc) %></&> </ins><span class="cx"> </span><del>-<&|doclib.myt:item, name=obj.__name__, description=description &> -<&|formatting.myt:formatplain&><% format_paragraphs(obj.__doc__) %></&> - -% if not isclass and len(functions): </del><ins>+% if not obj.isclass and obj.functions: </ins><span class="cx"> <&|doclib.myt:item, name="modfunc", description="Module Functions" &> </span><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for func in functions: </del><ins>+% for func in obj.functions: </ins><span class="cx"> <& SELF:function_doc, func=func &> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> </&> </span><span class="cx"> % else: </span><del>-% if len(functions): </del><ins>+% if obj.functions: </ins><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for func in functions: -% if isinstance(func, types.FunctionType): </del><ins>+% for func in obj.functions: +% if isinstance(func, docstring.FunctionDoc): </ins><span class="cx"> <& SELF:function_doc, func=func &> </span><del>-% elif isinstance(func, tuple): - <& SELF:property_doc, name = func[0], prop=func[1] &> </del><ins>+% elif isinstance(func, docstring.PropertyDoc): + <& SELF:property_doc, prop=func &> </ins><span class="cx"> % </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> % </span><span class="cx"> % </span><span class="cx"> </span><del>-% if len(classes): </del><ins>+% if obj.classes: </ins><span class="cx"> <&|formatting.myt:paramtable&> </span><del>-% for class_ in classes: </del><ins>+% for class_ in obj.classes: </ins><span class="cx"> <& SELF:obj_doc, obj=class_ &> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> % </span><span class="cx"> </&> </span><span class="cx"> </span><del>- </del><span class="cx"> </%method> </span><span class="cx"> </span><span class="cx"> <%method function_doc> </span><span class="cx"> <%args>func</%args> </span><del>- <%init> - import inspect - argspec = inspect.getargspec(func) - argnames = argspec[0] - varargs = argspec[1] - varkw = argspec[2] - defaults = argspec[3] or () - argstrings = [] - for i in range(0, len(argnames)): - if i >= len(argnames) - len(defaults): - argstrings.append("%s=%s" % (argnames[i], repr(defaults[i - (len(argnames) - len(defaults))]))) - else: - argstrings.append(argnames[i]) - if varargs is not None: - argstrings.append("*%s" % varargs) - if varkw is not None: - argstrings.append("**%s" % varkw) - </%init> - - <&|formatting.myt:function_doc, name="def " + func.__name__, link=func.__name__, arglist=argstrings &> - <&|formatting.myt:formatplain&><% format_paragraphs(func.__doc__) %></&> </del><ins>+ <&|formatting.myt:function_doc, name=func.name, link=func.link, arglist=func.arglist &> + <&|formatting.myt:formatplain&><% format_paragraphs(func.doc) %></&> </ins><span class="cx"> </&> </span><span class="cx"> </%method> </span><span class="cx"> </span><span class="cx"> </span><span class="cx"> <%method property_doc> </span><span class="cx"> <%args> </span><del>- name </del><span class="cx"> prop </span><span class="cx"> </%args> </span><del>- <&|formatting.myt:member_doc, name=name + " = property()", link=name &> - <&|formatting.myt:formatplain&><% format_paragraphs(prop.__doc__) %></&> </del><ins>+ <&|formatting.myt:member_doc, name=prop.name, link=prop.link &> + <&|formatting.myt:formatplain&><% format_paragraphs(prop.doc) %></&> </ins><span class="cx"> </&> </span><span class="cx"> </%method> </span><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildcontentdocstringsmyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/docstrings.myt (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/docstrings.myt 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/content/docstrings.myt 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -2,28 +2,14 @@ </span><span class="cx"> <%attr>title='Modules and Classes'</%attr> </span><span class="cx"> <&|doclib.myt:item, name="docstrings", description="Modules and Classes" &> </span><span class="cx"> <%init> </span><del>- import sqlalchemy.schema as schema - import sqlalchemy.engine as engine - import sqlalchemy.engine.strategies as strategies - import sqlalchemy.sql as sql - import sqlalchemy.pool as pool - import sqlalchemy.orm as orm - import sqlalchemy.exceptions as exceptions - import sqlalchemy.ext.proxy as proxy - import sqlalchemy.mods.threadlocal as threadlocal </del><ins>+ import cPickle as pickle + import os + filename = os.path.join(os.path.dirname(self.file), 'compiled_docstrings.pickle') + data = pickle.load(file(filename)) </ins><span class="cx"> </%init> </span><span class="cx"> </span><ins>+% for obj in data: +<& pydoc.myt:obj_doc, obj=obj &> +% </ins><span class="cx"> </span><del>-<& pydoc.myt:obj_doc, obj=sql, classes=[sql.Engine, sql.AbstractDialect, sql.ClauseParameters, sql.Compiled, sql.ClauseElement, sql.TableClause, sql.ColumnClause] &> -<& pydoc.myt:obj_doc, obj=schema &> -<& pydoc.myt:obj_doc, obj=engine, classes=[engine.ComposedSQLEngine, engine.Connection, engine.Transaction, engine.Dialect, engine.ConnectionProvider, engine.ExecutionContext, engine.ResultProxy, engine.RowProxy] &> -<& pydoc.myt:obj_doc, obj=strategies &> -<& pydoc.myt:obj_doc, obj=orm, classes=[orm.Mapper, orm.MapperExtension] &> -<& pydoc.myt:obj_doc, obj=orm.query, classes=[orm.query.Query] &> -<& pydoc.myt:obj_doc, obj=orm.session, classes=[orm.session.Session, orm.session.SessionTransaction] &> -<& pydoc.myt:obj_doc, obj=threadlocal &> -<& pydoc.myt:obj_doc, obj=exceptions &> -<& pydoc.myt:obj_doc, obj=pool, classes=[pool.DBProxy, pool.Pool, pool.QueuePool, pool.SingletonThreadPool] &> -<& pydoc.myt:obj_doc, obj=proxy &> - -</&> </del><ins>+</&> </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildgenhtmlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/genhtml.py (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/genhtml.py 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/genhtml.py 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -4,6 +4,9 @@ </span><span class="cx"> print "Running txt2myt.py..." </span><span class="cx"> execfile("txt2myt.py") </span><span class="cx"> </span><ins>+print "Generating docstring data" +execfile("compile_docstrings.py") + </ins><span class="cx"> component_root = [ </span><span class="cx"> {'components': './components'}, </span><span class="cx"> {'content' : './content'} </span><span class="lines">@@ -11,7 +14,7 @@ </span><span class="cx"> doccomp = ['document_base.myt'] </span><span class="cx"> output = os.path.dirname(os.getcwd()) </span><span class="cx"> </span><del>-sys.path = ['../../lib', './lib/'] + sys.path </del><ins>+sys.path = ['./lib/'] + sys.path </ins><span class="cx"> </span><span class="cx"> import documentgen </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildlibdocstringpy"></a> <div class="addfile"><h4>Added: sqlalchemy/branches/schema/doc/build/lib/docstring.py (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/lib/docstring.py 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/lib/docstring.py 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -0,0 +1,119 @@ </span><ins>+import re, types, string, inspect + +"""sucks a module and its contents into a simple documentation object, suitable for pickling""" + +class ObjectDoc(object): + def __init__(self, obj, functions=None, classes=None): + self.isclass = isinstance(obj, types.ClassType) or isinstance(obj, types.TypeType) + self.name= obj.__name__ + functions = functions + classes= classes + + if not self.isclass: + if hasattr(obj, '__all__'): + objects = obj.__all__ + sort = True + else: + objects = obj.__dict__.keys() + sort = True + if functions is None: + functions = [getattr(obj, x, None) + for x in objects + if getattr(obj,x,None) is not None and + (isinstance(getattr(obj,x), types.FunctionType)) + and not getattr(obj,x).__name__[0] == '_' + ] + if sort: + functions.sort(lambda a, b: cmp(a.__name__, b.__name__)) + if classes is None: + classes = [getattr(obj, x, None) for x in objects + if getattr(obj,x,None) is not None and + (isinstance(getattr(obj,x), types.TypeType) + or isinstance(getattr(obj,x), types.ClassType)) + and not getattr(obj,x).__name__[0] == '_' + ] + if sort: + classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) + else: + if functions is None: + functions = ( + [getattr(obj, x).im_func for x in obj.__dict__.keys() if isinstance(getattr(obj,x), types.MethodType) + and + (getattr(obj, x).__name__ == '__init__' or not getattr(obj,x).__name__[0] == '_') + ] + + [(x, getattr(obj, x)) for x in obj.__dict__.keys() if isinstance(getattr(obj,x), property) + and + not x[0] == '_' + ] + ) + functions.sort(lambda a, b: cmp(getattr(a, '__name__', None) or a[0], getattr(b, '__name__', None) or b[0] )) + if classes is None: + classes = [] + + if self.isclass: + self.description = "Class " + self.name + if hasattr(obj, '__mro__'): + l = [] + mro = list(obj.__mro__[1:]) + mro.reverse() + for x in mro: + for y in x.__mro__[1:]: + if y in l: + del l[l.index(y)] + l.insert(0, x) + self.description += "(" + string.join([x.__name__ for x in l], ',') + ")" + else: + self.description = "Module " + self.name + + self.doc = obj.__doc__ + + self.functions = [] + if not self.isclass and len(functions): + for func in functions: + self.functions.append(FunctionDoc(func)) + else: + if len(functions): + for func in functions: + if isinstance(func, types.FunctionType): + self.functions.append(FunctionDoc(func)) + elif isinstance(func, tuple): + self.functions.append(PropertyDoc(func[0], func[1])) + + self.classes = [] + for class_ in classes: + self.classes.append(ObjectDoc(class_)) + + def accept_visitor(self, visitor): + visitor.visit_object(self) + +class FunctionDoc(object): + def __init__(self, func): + argspec = inspect.getargspec(func) + argnames = argspec[0] + varargs = argspec[1] + varkw = argspec[2] + defaults = argspec[3] or () + argstrings = [] + for i in range(0, len(argnames)): + if i >= len(argnames) - len(defaults): + argstrings.append("%s=%s" % (argnames[i], repr(defaults[i - (len(argnames) - len(defaults))]))) + else: + argstrings.append(argnames[i]) + if varargs is not None: + argstrings.append("*%s" % varargs) + if varkw is not None: + argstrings.append("**%s" % varkw) + self.argstrings = self.arglist = argstrings + self.name = "def " + func.__name__ + self.link = func.__name__ + self.doc = func.__doc__ + def accept_visitor(self, visitor): + visitor.visit_function(self) + +class PropertyDoc(object): + def __init__(self, name, prop): + self.doc = prop.__doc__ + self.name = name + " = property()" + self.link = name + def accept_visitor(self, visitor): + visitor.visit_property(self) </ins></span></pre></div> <a id="sqlalchemybranchesschemadocbuildrunhtmlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/runhtml.py (1443 => 1444)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/runhtml.py 2006-05-12 17:13:17 UTC (rev 1443) +++ sqlalchemy/branches/schema/doc/build/runhtml.py 2006-05-12 19:16:25 UTC (rev 1444) </span><span class="lines">@@ -4,6 +4,9 @@ </span><span class="cx"> print "Running txt2myt.py..." </span><span class="cx"> execfile("txt2myt.py") </span><span class="cx"> </span><ins>+print "Generating docstring data" +execfile("compile_docstrings.py") + </ins><span class="cx"> component_root = [ </span><span class="cx"> {'components': './components'}, </span><span class="cx"> {'content' : './content'} </span><span class="lines">@@ -11,7 +14,7 @@ </span><span class="cx"> doccomp = ['document_base.myt'] </span><span class="cx"> output = os.path.dirname(os.getcwd()) </span><span class="cx"> </span><del>-sys.path = ['../../lib', './lib/'] + sys.path </del><ins>+sys.path = ['./lib/'] + sys.path </ins><span class="cx"> </span><span class="cx"> import myghty.http.HTTPServerHandler as HTTPServerHandler </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
<!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>[1443] sqlalchemy/branches/schema/lib/sqlalchemy: redundant class_mapper/object_mapper declaration in __ALL__, fixes to tutorial assertions, added !=None support trans</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1443</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 12:13:17 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>redundant class_mapper/object_mapper declaration in __ALL__, fixes to tutorial assertions, added !=None support trans late to "IS NOT NULL"</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontenttutorialtxt">sqlalchemy/branches/schema/doc/build/content/tutorial.txt</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyorm__init__py">sqlalchemy/branches/schema/lib/sqlalchemy/orm/__init__.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontenttutorialtxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/tutorial.txt (1442 => 1443)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/tutorial.txt 2006-05-12 17:11:46 UTC (rev 1442) +++ sqlalchemy/branches/schema/doc/build/content/tutorial.txt 2006-05-12 17:13:17 UTC (rev 1443) </span><span class="lines">@@ -132,11 +132,13 @@ </span><span class="cx"> >>> i.execute(user_name='Mary', password='secure') # doctest:+ELLIPSIS </span><span class="cx"> INSERT INTO users (user_name, password) VALUES (?, ?) </span><span class="cx"> ['Mary', 'secure'] </span><ins>+ COMMIT </ins><span class="cx"> <sqlalchemy.engine.base.ResultProxy instance at 0x...> </span><span class="cx"> </span><span class="cx"> >>> i.execute({'user_name':'Tom'}, {'user_name':'Fred'}, {'user_name':'Harry'}) # doctest:+ELLIPSIS,+NORMALIZE_WHITESPACE </span><span class="cx"> INSERT INTO users (user_name) VALUES (?) </span><span class="cx"> [['Tom'], ['Fred'], ['Harry']] </span><ins>+ COMMIT </ins><span class="cx"> <sqlalchemy.engine.base.ResultProxy instance at 0x...> </span><span class="cx"> </span><span class="cx"> </span><span class="lines">@@ -235,6 +237,7 @@ </span><span class="cx"> ... {'email_address':'ma...@ma...', 'user_id':1}) #doctest:+ELLIPSIS </span><span class="cx"> INSERT INTO email_addresses (email_address, user_id) VALUES (?, ?) </span><span class="cx"> [['to...@to...', 2], ['ma...@ma...', 1]] </span><ins>+ COMMIT </ins><span class="cx"> <sqlalchemy.engine.base.ResultProxy instance at 0x...> </span><span class="cx"> </span><span class="cx"> With two related tables, we can now construct a join amongst them using the `join` method: </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyorm__init__py"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/__init__.py (1442 => 1443)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/__init__.py 2006-05-12 17:11:46 UTC (rev 1442) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/__init__.py 2006-05-12 17:13:17 UTC (rev 1443) </span><span class="lines">@@ -19,7 +19,7 @@ </span><span class="cx"> </span><span class="cx"> __all__ = ['relation', 'backref', 'eagerload', 'lazyload', 'noload', 'deferred', 'defer', 'undefer', </span><span class="cx"> 'mapper', 'clear_mappers', 'sql', 'extension', 'class_mapper', 'object_mapper', 'MapperExtension', 'Query', </span><del>- 'cascade_mappers', 'polymorphic_union', 'current_session', 'create_session', 'class_mapper', 'object_mapper' </del><ins>+ 'cascade_mappers', 'polymorphic_union', 'current_session', 'create_session', </ins><span class="cx"> ] </span><span class="cx"> </span><span class="cx"> def relation(*args, **kwargs): </span><span class="lines">@@ -46,10 +46,7 @@ </span><span class="cx"> return properties.DeferredColumnProperty(*columns, **kwargs) </span><span class="cx"> </span><span class="cx"> def mapper(class_, table=None, *args, **params): </span><del>- """returns a new or already cached Mapper object.""" - if table is None: - return class_mapper(class_) - </del><ins>+ """returns a newMapper object.""" </ins><span class="cx"> return Mapper(class_, table, *args, **params) </span><span class="cx"> </span><span class="cx"> def clear_mappers(): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1442 => 1443)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-12 17:11:46 UTC (rev 1442) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-12 17:13:17 UTC (rev 1443) </span><span class="lines">@@ -561,9 +561,12 @@ </span><span class="cx"> def _compare(self, operator, obj): </span><span class="cx"> if _is_literal(obj): </span><span class="cx"> if obj is None: </span><del>- if operator != '=': - raise exceptions.ArgumentError("Only '=' operator can be used with NULL") - return BooleanExpression(self._compare_self(), null(), 'IS') </del><ins>+ if operator == '=': + return BooleanExpression(self._compare_self(), null(), 'IS') + elif operator == '!=': + return BooleanExpression(self._compare_self(), null(), 'IS NOT') + else: + raise exceptions.ArgumentError("Only '='/'!=' operators can be used with NULL") </ins><span class="cx"> else: </span><span class="cx"> obj = self._bind_param(obj) </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-12 17:12:00
|
<!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>[1442] sqlalchemy/trunk/lib/sqlalchemy/sql.py: added != support for None -> foo IS NOT NULL</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1442</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-12 12:11:46 -0500 (Fri, 12 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>added != support for None -> foo IS NOT NULL</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1441 => 1442)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-05-11 21:01:16 UTC (rev 1441) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-05-12 17:11:46 UTC (rev 1442) </span><span class="lines">@@ -540,8 +540,12 @@ </span><span class="cx"> def _compare(self, operator, obj): </span><span class="cx"> if _is_literal(obj): </span><span class="cx"> if obj is None: </span><del>- if operator != '=': - raise ArgumentError("Only '=' operator can be used with NULL") </del><ins>+ if operator == '=': + return BooleanExpression(self._compare_self(), null(), 'IS') + elif operator == '!=': + return BooleanExpression(self._compare_self(), null(), 'IS NOT') + else: + raise exceptions.ArgumentError("Only '='/'!=' operators can be used with NULL") </ins><span class="cx"> return BooleanExpression(self._compare_self(), null(), 'IS') </span><span class="cx"> else: </span><span class="cx"> obj = self._bind_param(obj) </span></span></pre> </div> </div> </body> </html> |
<!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>[1441] sqlalchemy/branches/schema/doc/build/content: created "Connectable" interface to implement the "connection_or_engine" parameter used in Session</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1441</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-11 16:01:16 -0500 (Thu, 11 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>created "Connectable" interface to implement the "connection_or_engine" parameter used in Session</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentunitofworktxt">sqlalchemy/branches/schema/doc/build/content/unitofwork.txt</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormsessionpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentunitofworktxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/unitofwork.txt (1440 => 1441)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/unitofwork.txt 2006-05-11 20:42:22 UTC (rev 1440) +++ sqlalchemy/branches/schema/doc/build/content/unitofwork.txt 2006-05-11 21:01:16 UTC (rev 1441) </span><span class="lines">@@ -300,7 +300,7 @@ </span><span class="cx"> sess.bind_mapper(mymapper, sqlite_connection) # bind mymapper operations to a single SQLite connection </span><span class="cx"> sess.bind_table(email_addresses_table, engine2) # bind operations with the email_addresses_table to mysql </span><span class="cx"> </span><del>-Normally, when a `Session` is created via `create_session()` with no arguments, the Session has no awareness of individual `Engines`, and when mappers use the `Session` to retrieve connections, the underlying `MetaData` each `Table` is associated with is expected to be "bound" to an `Engine`, else no engine can be located and an exception is raised. A second form of `create_session()` takes the argument `bind_to=engine_or_connection`, where all SQL operations performed by this `Session` use the single `Engine` or `Connection` passed to the constructor. With `bind_mapper()` and `bind_table()`, the operations of individual mapper and/or tables are bound to distinct engines or connections, thereby overriding not only the engine which may be "bound" to the underlying `MetaData`, but also the `Engine` or `Connection` which may have been passed to the `create_session()` function. Configurations which interact with multiple explicit database con! nections at one time must use either or both of these methods in order to associate `Session` operations with the appropriate connection resource. </del><ins>+Normally, when a `Session` is created via `create_session()` with no arguments, the Session has no awareness of individual `Engines`, and when mappers use the `Session` to retrieve connections, the underlying `MetaData` each `Table` is associated with is expected to be "bound" to an `Engine`, else no engine can be located and an exception is raised. A second form of `create_session()` takes the argument `bind_to=engine_or_connection`, where all SQL operations performed by this `Session` use the single `Engine` or `Connection` (collectively known as a `Connectable`) passed to the constructor. With `bind_mapper()` and `bind_table()`, the operations of individual mapper and/or tables are bound to distinct engines or connections, thereby overriding not only the engine which may be "bound" to the underlying `MetaData`, but also the `Engine` or `Connection` which may have been passed to the `create_session()` function. Configurations which inter! act with multiple explicit database connections at one time must use either or both of these methods in order to associate `Session` operations with the appropriate connection resource. </ins><span class="cx"> </span><span class="cx"> Binding a `Mapper` to a resource takes precedence over a `Table` bind, meaning if mapper A is associated with table B, and the Session binds mapper A to connection X and table B to connection Y, an operation with mapper A will use connection X, not connection Y. </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1440 => 1441)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:42:22 UTC (rev 1440) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 21:01:16 UTC (rev 1441) </span><span class="lines">@@ -152,7 +152,16 @@ </span><span class="cx"> indicating that the database inserted data beyond that which we gave it. this value is thread-local.""" </span><span class="cx"> raise NotImplementedError() </span><span class="cx"> </span><del>-class Connection(object): </del><ins>+class Connectable(object): + """interface for an object that can provide an Engine and a Connection object which correponds to that Engine.""" + def contextual_connect(self): + """returns a Connection object which may be part of an ongoing context.""" + raise NotImplementedError() + def _not_impl(self): + raise NotImplementedError() + engine = property(_not_impl, doc="returns the Engine which this Connectable is associated with.") + +class Connection(Connectable): </ins><span class="cx"> """represents a single DBAPI connection returned from the underlying connection pool. Provides </span><span class="cx"> execution support for string-based SQL statements as well as ClauseElement, Compiled and DefaultGenerator objects. </span><span class="cx"> provides a begin method to return Transaction objects.""" </span><span class="lines">@@ -341,7 +350,7 @@ </span><span class="cx"> self.__connection._commit_impl() </span><span class="cx"> self.__is_active = False </span><span class="cx"> </span><del>-class ComposedSQLEngine(sql.Engine): </del><ins>+class ComposedSQLEngine(sql.Engine, Connectable): </ins><span class="cx"> """ </span><span class="cx"> Connects a ConnectionProvider, a Dialect and a CompilerFactory together to </span><span class="cx"> provide a default implementation of SchemaEngine. </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormsessionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py (1440 => 1441)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-11 20:42:22 UTC (rev 1440) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-11 21:01:16 UTC (rev 1441) </span><span class="lines">@@ -24,25 +24,21 @@ </span><span class="cx"> return self.get_or_add(engine) </span><span class="cx"> def _begin(self): </span><span class="cx"> return SessionTransaction(self.session, self) </span><del>- def add(self, connection_or_engine): - if self.connections.has_key(connection_or_engine.engine): </del><ins>+ def add(self, connectable): + if self.connections.has_key(connectable.engine): </ins><span class="cx"> raise exceptions.InvalidRequestError("Session already has a Connection associated for the given Connection's Engine") </span><del>- return self.get_or_add(connection_or_engine) - def get_or_add(self, connection_or_engine): </del><ins>+ return self.get_or_add(connectable) + def get_or_add(self, connectable): </ins><span class="cx"> # we reference the 'engine' attribute on the given object, which in the case of </span><span class="cx"> # Connection, ProxyEngine, Engine, ComposedSQLEngine, whatever, should return the original </span><span class="cx"> # "Engine" object that is handling the connection. </span><del>- if self.connections.has_key(connection_or_engine.engine): - return self.connections[connection_or_engine.engine][0] - if isinstance(connection_or_engine, sqlalchemy.engine.base.Connection): - e = connection_or_engine.engine - c = connection_or_engine - else: - e = connection_or_engine - c = connection_or_engine.contextual_connect() - if not self.connections.has_key(e.engine): - self.connections[e.engine] = (c, c.begin()) - return self.connections[e.engine][0] </del><ins>+ if self.connections.has_key(connectable.engine): + return self.connections[connectable.engine][0] + e = connectable.engine + c = connectable.contextual_connect() + if not self.connections.has_key(e): + self.connections[e] = (c, c.begin()) + return self.connections[e][0] </ins><span class="cx"> def commit(self): </span><span class="cx"> if self.parent is not None: </span><span class="cx"> return </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-11 20:42:35
|
<!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>[1440] sqlalchemy/branches/schema/lib/sqlalchemy: made instance variables of Transaction private</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1440</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-11 15:42:22 -0500 (Thu, 11 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>made instance variables of Transaction private deprecated engine_impl in types switched some engine dependencies in ansisql added transaction() back to ComposedSQLEngine</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyansisqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysql_utilpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql_util.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemytypespy">sqlalchemy/branches/schema/lib/sqlalchemy/types.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py (1439 => 1440)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-05-11 20:12:49 UTC (rev 1439) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-05-11 20:42:22 UTC (rev 1440) </span><span class="lines">@@ -191,7 +191,7 @@ </span><span class="cx"> self.strings[index] = index.name </span><span class="cx"> </span><span class="cx"> def visit_typeclause(self, typeclause): </span><del>- self.strings[typeclause] = typeclause.type.engine_impl(self.engine).get_col_spec() </del><ins>+ self.strings[typeclause] = typeclause.type.dialect_impl(self.dialect).get_col_spec() </ins><span class="cx"> </span><span class="cx"> def visit_textclause(self, textclause): </span><span class="cx"> if textclause.parens and len(textclause.text): </span><span class="lines">@@ -626,10 +626,15 @@ </span><span class="cx"> if isinstance(column.default.arg, str): </span><span class="cx"> return repr(column.default.arg) </span><span class="cx"> else: </span><del>- return str(column.default.arg.compile(self.engine)) </del><ins>+ return str(self._compile(column.default.arg, None)) </ins><span class="cx"> else: </span><span class="cx"> return None </span><span class="cx"> </span><ins>+ def _compile(self, tocompile, parameters): + compiler = self.engine.dialect.compiler(tocompile, parameters) + compiler.compile() + return compiler + </ins><span class="cx"> def visit_column(self, column): </span><span class="cx"> pass </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1439 => 1440)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:12:49 UTC (rev 1439) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:42:22 UTC (rev 1440) </span><span class="lines">@@ -162,6 +162,7 @@ </span><span class="cx"> self.__transaction = None </span><span class="cx"> self.__close_with_result = close_with_result </span><span class="cx"> engine = property(lambda s:s.__engine, doc="The Engine with which this Connection is associated (read only)") </span><ins>+ connection = property(lambda s:s.__connection, doc="The underlying DBAPI connection managed by this Connection.") </ins><span class="cx"> should_close_with_result = property(lambda s:s.__close_with_result, doc="Indicates if this Connection should be closed when a corresponding ResultProxy is closed; this is essentially an auto-release mode.") </span><span class="cx"> def _create_transaction(self, parent): </span><span class="cx"> return Transaction(self, parent) </span><span class="lines">@@ -320,46 +321,42 @@ </span><span class="cx"> class Transaction(object): </span><span class="cx"> """represents a Transaction in progress""" </span><span class="cx"> def __init__(self, connection, parent): </span><del>- self.connection = connection - self.parent = parent or self - self.is_active = True - if self.parent is self: - self.connection._begin_impl() </del><ins>+ self.__connection = connection + self.__parent = parent or self + self.__is_active = True + if self.__parent is self: + self.__connection._begin_impl() </ins><span class="cx"> def rollback(self): </span><del>- if not self.parent.is_active: </del><ins>+ if not self.__parent.__is_active: </ins><span class="cx"> raise exceptions.InvalidRequestError("This transaction is inactive") </span><del>- if self.parent is self: - self.connection._rollback_impl() - self.is_active = False </del><ins>+ if self.__parent is self: + self.__connection._rollback_impl() + self.__is_active = False </ins><span class="cx"> else: </span><del>- self.parent.rollback() </del><ins>+ self.__parent.rollback() </ins><span class="cx"> def commit(self): </span><del>- if not self.parent.is_active: </del><ins>+ if not self.__parent.__is_active: </ins><span class="cx"> raise exceptions.InvalidRequestError("This transaction is inactive") </span><del>- if self.parent is self: - self.connection._commit_impl() - self.is_active = False </del><ins>+ if self.__parent is self: + self.__connection._commit_impl() + self.__is_active = False </ins><span class="cx"> </span><span class="cx"> class ComposedSQLEngine(sql.Engine): </span><span class="cx"> """ </span><span class="cx"> Connects a ConnectionProvider, a Dialect and a CompilerFactory together to </span><span class="cx"> provide a default implementation of SchemaEngine. </span><span class="cx"> """ </span><del>- </del><span class="cx"> def __init__(self, connection_provider, dialect, echo=False, logger=None, **kwargs): </span><span class="cx"> self.connection_provider = connection_provider </span><span class="cx"> self.dialect=dialect </span><span class="cx"> self.echo = echo </span><span class="cx"> self.logger = logger or util.Logger(origin='engine') </span><span class="cx"> </span><ins>+ name = property(lambda s:sys.modules[s.dialect.__module__].descriptor()['name']) + engine = property(lambda s:s) </ins><span class="cx"> </span><del>- def _get_name(self): - return sys.modules[self.dialect.__module__].descriptor()['name'] - name = property(_get_name) - engine = property(lambda s:s) </del><span class="cx"> def dispose(self): </span><span class="cx"> self.connection_provider.dispose() </span><del>- </del><span class="cx"> def create(self, entity, connection=None, **kwargs): </span><span class="cx"> """creates a table or index within this engine's database connection given a schema.Table object.""" </span><span class="cx"> self._run_visitor(self.dialect.schemagenerator, entity, connection=connection, **kwargs) </span><span class="lines">@@ -367,7 +364,7 @@ </span><span class="cx"> """drops a table or index within this engine's database connection given a schema.Table object.""" </span><span class="cx"> self._run_visitor(self.dialect.schemadropper, entity, connection=connection, **kwargs) </span><span class="cx"> def execute_default(self, default, **kwargs): </span><del>- connection = self.contextual_connect(close_with_result=False) </del><ins>+ connection = self.contextual_connect() </ins><span class="cx"> try: </span><span class="cx"> return connection.execute_default(default, **kwargs) </span><span class="cx"> finally: </span><span class="lines">@@ -382,7 +379,7 @@ </span><span class="cx"> </span><span class="cx"> def _run_visitor(self, visitorcallable, element, connection=None, **kwargs): </span><span class="cx"> if connection is None: </span><del>- conn = self.contextual_connect(close_with_result=False) </del><ins>+ conn = self.contextual_connect() </ins><span class="cx"> else: </span><span class="cx"> conn = connection </span><span class="cx"> try: </span><span class="lines">@@ -391,16 +388,34 @@ </span><span class="cx"> if connection is None: </span><span class="cx"> conn.close() </span><span class="cx"> </span><del>- def run_callable(self, callable_, connection=None): </del><ins>+ def transaction(self, callable_, connection=None, *args, **kwargs): </ins><span class="cx"> if connection is None: </span><del>- conn = self.contextual_connect(close_with_result=False) </del><ins>+ conn = self.contextual_connect() </ins><span class="cx"> else: </span><span class="cx"> conn = connection </span><span class="cx"> try: </span><del>- return callable_(conn) </del><ins>+ trans = conn.begin() + try: + ret = callable_(conn, *args, **kwargs) + trans.commit() + return ret + except: + trans.rollback() + raise </ins><span class="cx"> finally: </span><span class="cx"> if connection is None: </span><span class="cx"> conn.close() </span><ins>+ + def run_callable(self, callable_, connection=None, *args, **kwargs): + if connection is None: + conn = self.contextual_connect() + else: + conn = connection + try: + return callable_(conn, *args, **kwargs) + finally: + if connection is None: + conn.close() </ins><span class="cx"> </span><span class="cx"> def execute(self, statement, *multiparams, **params): </span><span class="cx"> connection = self.contextual_connect(close_with_result=True) </span><span class="lines">@@ -425,7 +440,7 @@ </span><span class="cx"> def reflecttable(self, table, connection=None): </span><span class="cx"> """given a Table object, reflects its columns and properties from the database.""" </span><span class="cx"> if connection is None: </span><del>- conn = self.contextual_connect(close_with_result=False) </del><ins>+ conn = self.contextual_connect() </ins><span class="cx"> else: </span><span class="cx"> conn = connection </span><span class="cx"> try: </span><span class="lines">@@ -495,7 +510,6 @@ </span><span class="cx"> if self.props.setdefault(colname, rec) is not rec: </span><span class="cx"> self.props[colname] = (ResultProxy.AmbiguousColumn(colname), 0) </span><span class="cx"> self.keys.append(colname) </span><del>- #print "COLNAME", colname </del><span class="cx"> self.props[i] = rec </span><span class="cx"> i+=1 </span><span class="cx"> def close(self): </span><span class="lines">@@ -507,7 +521,6 @@ </span><span class="cx"> if isinstance(key, sql.ColumnElement): </span><span class="cx"> try: </span><span class="cx"> rec = self.props[key._label.lower()] </span><del>- #print "GOT IT FROM LABEL FOR ", key._label </del><span class="cx"> except KeyError: </span><span class="cx"> try: </span><span class="cx"> rec = self.props[key.key.lower()] </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1439 => 1440)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-11 20:12:49 UTC (rev 1439) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-11 20:42:22 UTC (rev 1440) </span><span class="lines">@@ -483,7 +483,7 @@ </span><span class="cx"> </span><span class="cx"> if compiler is None: </span><span class="cx"> import sqlalchemy.ansisql as ansisql </span><del>- compiler = ansisql.ANSIDialect().compiler(self, parameters=parameters, engine=engine) </del><ins>+ compiler = ansisql.ANSIDialect().compiler(self, parameters=parameters) </ins><span class="cx"> compiler.compile() </span><span class="cx"> return compiler </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysql_utilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql_util.py (1439 => 1440)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql_util.py 2006-05-11 20:12:49 UTC (rev 1439) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql_util.py 2006-05-11 20:42:22 UTC (rev 1440) </span><span class="lines">@@ -7,10 +7,8 @@ </span><span class="cx"> class TableCollection(object): </span><span class="cx"> def __init__(self): </span><span class="cx"> self.tables = [] </span><del>- </del><span class="cx"> def add(self, table): </span><span class="cx"> self.tables.append(table) </span><del>- </del><span class="cx"> def sort(self, reverse=False ): </span><span class="cx"> import sqlalchemy.orm.topological </span><span class="cx"> tuples = [] </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/types.py (1439 => 1440)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/types.py 2006-05-11 20:12:49 UTC (rev 1439) +++ sqlalchemy/branches/schema/lib/sqlalchemy/types.py 2006-05-11 20:42:22 UTC (rev 1440) </span><span class="lines">@@ -32,6 +32,7 @@ </span><span class="cx"> def __init__(self, *args, **params): </span><span class="cx"> pass </span><span class="cx"> def engine_impl(self, engine): </span><ins>+ """deprecated; call dialect_impl with a dialect directly.""" </ins><span class="cx"> return self.dialect_impl(engine.dialect) </span><span class="cx"> def dialect_impl(self, dialect): </span><span class="cx"> try: </span><span class="lines">@@ -48,9 +49,9 @@ </span><span class="cx"> impl = property(_get_impl, _set_impl) </span><span class="cx"> def get_col_spec(self): </span><span class="cx"> raise NotImplementedError() </span><del>- def convert_bind_param(self, value, engine): </del><ins>+ def convert_bind_param(self, value, dialect): </ins><span class="cx"> return value </span><del>- def convert_result_value(self, value, engine): </del><ins>+ def convert_result_value(self, value, dialect): </ins><span class="cx"> return value </span><span class="cx"> def adapt(self, cls): </span><span class="cx"> return cls() </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-11 20:12:57
|
<!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>[1439] sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py: extra rollback_impl</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1439</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-11 15:12:49 -0500 (Thu, 11 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>extra rollback_impl</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1438 => 1439)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:09:13 UTC (rev 1438) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:12:49 UTC (rev 1439) </span><span class="lines">@@ -304,7 +304,7 @@ </span><span class="cx"> try: </span><span class="cx"> self.__engine.dialect.do_executemany(c, statement, parameters, context=context) </span><span class="cx"> except Exception, e: </span><del>- self.__engine.dialect.do_rollback(self.__connection) </del><ins>+ self._rollback_impl() </ins><span class="cx"> if self.__close_with_result: </span><span class="cx"> self.close() </span><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-11 20:09:24
|
<!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>[1438] sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py: factored all instnace variables in Conneciton to be private.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1438</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-11 15:09:13 -0500 (Thu, 11 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>factored all instnace variables in Conneciton to be private.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1437 => 1438)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 19:55:30 UTC (rev 1437) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-05-11 20:09:13 UTC (rev 1438) </span><span class="lines">@@ -157,10 +157,12 @@ </span><span class="cx"> execution support for string-based SQL statements as well as ClauseElement, Compiled and DefaultGenerator objects. </span><span class="cx"> provides a begin method to return Transaction objects.""" </span><span class="cx"> def __init__(self, engine, connection=None, close_with_result=False): </span><del>- self.engine = engine - self.connection = connection or engine.raw_connection() - self.transaction = None - self.close_with_result = close_with_result </del><ins>+ self.__engine = engine + self.__connection = connection or engine.raw_connection() + self.__transaction = None + self.__close_with_result = close_with_result + engine = property(lambda s:s.__engine, doc="The Engine with which this Connection is associated (read only)") + should_close_with_result = property(lambda s:s.__close_with_result, doc="Indicates if this Connection should be closed when a corresponding ResultProxy is closed; this is essentially an auto-release mode.") </ins><span class="cx"> def _create_transaction(self, parent): </span><span class="cx"> return Transaction(self, parent) </span><span class="cx"> def connect(self): </span><span class="lines">@@ -170,21 +172,33 @@ </span><span class="cx"> """contextual_connect() is implemented to return self so that an incoming Engine or Connection object can be treated similarly.""" </span><span class="cx"> return self </span><span class="cx"> def begin(self): </span><del>- if self.transaction is None: - self.transaction = self._create_transaction(None) - return self.transaction </del><ins>+ if self.__transaction is None: + self.__transaction = self._create_transaction(None) + return self.__transaction </ins><span class="cx"> else: </span><del>- return self._create_transaction(self.transaction) </del><ins>+ return self._create_transaction(self.__transaction) + def _begin_impl(self): + if self.__engine.echo: + self.__engine.log("BEGIN") + self.__engine.dialect.do_begin(self.__connection) + def _rollback_impl(self): + if self.__engine.echo: + self.__engine.log("ROLLBACK") + self.__engine.dialect.do_rollback(self.__connection) + def _commit_impl(self): + if self.__engine.echo: + self.__engine.log("COMMIT") + self.__engine.dialect.do_commit(self.__connection) </ins><span class="cx"> def _autocommit(self, statement): </span><span class="cx"> """when no Transaction is present, this is called after executions to provide "autocommit" behavior.""" </span><span class="cx"> # TODO: have the dialect determine if autocommit can be set on the connection directly without this </span><span class="cx"> # extra step </span><del>- if self.transaction is None and re.match(r'UPDATE|INSERT|CREATE|DELETE|DROP', statement.lstrip().upper()): - self.engine.dialect.do_commit(self.connection) </del><ins>+ if self.__transaction is None and re.match(r'UPDATE|INSERT|CREATE|DELETE|DROP', statement.lstrip().upper()): + self._commit_impl() </ins><span class="cx"> def close(self): </span><del>- if self.connection is not None: - self.connection.close() - self.connection = None </del><ins>+ if self.__connection is not None: + self.__connection.close() + self.__connection = None </ins><span class="cx"> def scalar(self, object, parameters, **kwargs): </span><span class="cx"> row = self.execute(object, parameters, **kwargs).fetchone() </span><span class="cx"> if row is not None: </span><span class="lines">@@ -194,10 +208,10 @@ </span><span class="cx"> def execute(self, object, *multiparams, **params): </span><span class="cx"> return Connection.executors[type(object).__mro__[-2]](self, object, *multiparams, **params) </span><span class="cx"> def execute_default(self, default, **kwargs): </span><del>- return default.accept_schema_visitor(self.engine.dialect.defaultrunner(self.engine, self.proxy, **kwargs)) </del><ins>+ return default.accept_schema_visitor(self.__engine.dialect.defaultrunner(self.__engine, self.proxy, **kwargs)) </ins><span class="cx"> def execute_text(self, statement, parameters=None): </span><span class="cx"> cursor = self._execute_raw(statement, parameters) </span><del>- return ResultProxy(self.engine, self, cursor) </del><ins>+ return ResultProxy(self.__engine, self, cursor) </ins><span class="cx"> def _params_to_listofdicts(self, *multiparams, **params): </span><span class="cx"> if len(multiparams) == 0: </span><span class="cx"> return [params] </span><span class="lines">@@ -216,10 +230,10 @@ </span><span class="cx"> param = multiparams[0] </span><span class="cx"> else: </span><span class="cx"> param = params </span><del>- return self.execute_compiled(elem.compile(engine=self.engine, parameters=param), *multiparams, **params) </del><ins>+ return self.execute_compiled(elem.compile(engine=self.__engine, parameters=param), *multiparams, **params) </ins><span class="cx"> def execute_compiled(self, compiled, *multiparams, **params): </span><span class="cx"> """executes a sql.Compiled object.""" </span><del>- cursor = self.connection.cursor() </del><ins>+ cursor = self.__connection.cursor() </ins><span class="cx"> parameters = [compiled.get_params(**m) for m in self._params_to_listofdicts(*multiparams, **params)] </span><span class="cx"> if len(parameters) == 1: </span><span class="cx"> parameters = parameters[0] </span><span class="lines">@@ -227,14 +241,14 @@ </span><span class="cx"> if statement is None: </span><span class="cx"> return cursor </span><span class="cx"> </span><del>- parameters = self.engine.dialect.convert_compiled_params(parameters) </del><ins>+ parameters = self.__engine.dialect.convert_compiled_params(parameters) </ins><span class="cx"> self._execute_raw(statement, parameters, cursor=cursor, context=context) </span><span class="cx"> return cursor </span><del>- context = self.engine.dialect.create_execution_context() - context.pre_exec(self.engine, proxy, compiled, parameters) </del><ins>+ context = self.__engine.dialect.create_execution_context() + context.pre_exec(self.__engine, proxy, compiled, parameters) </ins><span class="cx"> proxy(str(compiled), parameters) </span><del>- context.post_exec(self.engine, proxy, compiled, parameters) - return ResultProxy(self.engine, self, cursor, context, typemap=compiled.typemap) </del><ins>+ context.post_exec(self.__engine, proxy, compiled, parameters) + return ResultProxy(self.__engine, self, cursor, context, typemap=compiled.typemap) </ins><span class="cx"> </span><span class="cx"> # poor man's multimethod/generic function thingy </span><span class="cx"> executors = { </span><span class="lines">@@ -246,24 +260,24 @@ </span><span class="cx"> </span><span class="cx"> def create(self, entity, **kwargs): </span><span class="cx"> """creates a table or index given an appropriate schema object.""" </span><del>- return self.engine.create(entity, connection=self, **kwargs) </del><ins>+ return self.__engine.create(entity, connection=self, **kwargs) </ins><span class="cx"> def drop(self, entity, **kwargs): </span><span class="cx"> """drops a table or index given an appropriate schema object.""" </span><del>- return self.engine.drop(entity, connection=self, **kwargs) </del><ins>+ return self.__engine.drop(entity, connection=self, **kwargs) </ins><span class="cx"> def reflecttable(self, table, **kwargs): </span><span class="cx"> """reflects the columns in the given table from the database.""" </span><del>- return self.engine.reflecttable(table, connection=self, **kwargs) </del><ins>+ return self.__engine.reflecttable(table, connection=self, **kwargs) </ins><span class="cx"> def default_schema_name(self): </span><del>- return self.engine.dialect.get_default_schema_name(self) </del><ins>+ return self.__engine.dialect.get_default_schema_name(self) </ins><span class="cx"> def run_callable(self, callable_): </span><span class="cx"> callable_(self) </span><span class="cx"> def _execute_raw(self, statement, parameters=None, cursor=None, echo=None, context=None, **kwargs): </span><span class="cx"> if cursor is None: </span><del>- cursor = self.connection.cursor() </del><ins>+ cursor = self.__connection.cursor() </ins><span class="cx"> try: </span><del>- if echo is True or self.engine.echo is not False: - self.engine.log(statement) - self.engine.log(repr(parameters)) </del><ins>+ if echo is True or self.__engine.echo is not False: + self.__engine.log(statement) + self.__engine.log(repr(parameters)) </ins><span class="cx"> if parameters is not None and isinstance(parameters, list) and len(parameters) > 0 and (isinstance(parameters[0], list) or isinstance(parameters[0], dict)): </span><span class="cx"> self._executemany(cursor, statement, parameters, context=context) </span><span class="cx"> else: </span><span class="lines">@@ -275,23 +289,23 @@ </span><span class="cx"> </span><span class="cx"> def _execute(self, c, statement, parameters, context=None): </span><span class="cx"> if parameters is None: </span><del>- if self.engine.dialect.positional: </del><ins>+ if self.__engine.dialect.positional: </ins><span class="cx"> parameters = () </span><span class="cx"> else: </span><span class="cx"> parameters = {} </span><span class="cx"> try: </span><del>- self.engine.dialect.do_execute(c, statement, parameters, context=context) </del><ins>+ self.__engine.dialect.do_execute(c, statement, parameters, context=context) </ins><span class="cx"> except Exception, e: </span><del>- self.engine.dialect.do_rollback(self.connection) - if self.close_with_result: </del><ins>+ self._rollback_impl() + if self.__close_with_result: </ins><span class="cx"> self.close() </span><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> def _executemany(self, c, statement, parameters, context=None): </span><span class="cx"> try: </span><del>- self.engine.dialect.do_executemany(c, statement, parameters, context=context) </del><ins>+ self.__engine.dialect.do_executemany(c, statement, parameters, context=context) </ins><span class="cx"> except Exception, e: </span><del>- self.engine.dialect.do_rollback(self.connection) - if self.close_with_result: </del><ins>+ self.__engine.dialect.do_rollback(self.__connection) + if self.__close_with_result: </ins><span class="cx"> self.close() </span><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> def proxy(self, statement=None, parameters=None): </span><span class="lines">@@ -300,7 +314,7 @@ </span><span class="cx"> This callable is a generic version of a connection/cursor-specific callable that </span><span class="cx"> is produced within the execute_compiled method, and is used for objects that require </span><span class="cx"> this style of proxy when outside of an execute_compiled method, primarily the DefaultRunner.""" </span><del>- parameters = self.engine.dialect.convert_compiled_params(parameters) </del><ins>+ parameters = self.__engine.dialect.convert_compiled_params(parameters) </ins><span class="cx"> return self._execute_raw(statement, parameters) </span><span class="cx"> </span><span class="cx"> class Transaction(object): </span><span class="lines">@@ -310,16 +324,12 @@ </span><span class="cx"> self.parent = parent or self </span><span class="cx"> self.is_active = True </span><span class="cx"> if self.parent is self: </span><del>- self.connection.engine.dialect.do_begin(self.connection.connection) - if self.connection.engine.echo: - self.connection.engine.log("BEGIN") </del><ins>+ self.connection._begin_impl() </ins><span class="cx"> def rollback(self): </span><span class="cx"> if not self.parent.is_active: </span><span class="cx"> raise exceptions.InvalidRequestError("This transaction is inactive") </span><span class="cx"> if self.parent is self: </span><del>- if self.connection.engine.echo: - self.connection.engine.log("ROLLBACK") - self.connection.engine.dialect.do_rollback(self.connection.connection) </del><ins>+ self.connection._rollback_impl() </ins><span class="cx"> self.is_active = False </span><span class="cx"> else: </span><span class="cx"> self.parent.rollback() </span><span class="lines">@@ -327,9 +337,7 @@ </span><span class="cx"> if not self.parent.is_active: </span><span class="cx"> raise exceptions.InvalidRequestError("This transaction is inactive") </span><span class="cx"> if self.parent is self: </span><del>- if self.connection.engine.echo: - self.connection.engine.log("COMMIT") - self.connection.engine.dialect.do_commit(self.connection.connection) </del><ins>+ self.connection._commit_impl() </ins><span class="cx"> self.is_active = False </span><span class="cx"> </span><span class="cx"> class ComposedSQLEngine(sql.Engine): </span><span class="lines">@@ -493,7 +501,7 @@ </span><span class="cx"> def close(self): </span><span class="cx"> if not self.closed: </span><span class="cx"> self.closed = True </span><del>- if self.connection.close_with_result and self.dialect.supports_autoclose_results: </del><ins>+ if self.connection.should_close_with_result and self.dialect.supports_autoclose_results: </ins><span class="cx"> self.connection.close() </span><span class="cx"> def _get_col(self, row, key): </span><span class="cx"> if isinstance(key, sql.ColumnElement): </span></span></pre> </div> </div> </body> </html> |
From: <co...@sq...> - 2006-05-11 19:55:44
|
<!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>[1437] sqlalchemy/branches/schema/lib/sqlalchemy/orm: mapper query methods are deprecated</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1437</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-11 14:55:30 -0500 (Thu, 11 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>mapper query methods are deprecated took new_imap option out of Session</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormmapperpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormquerypy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormsessionpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.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 (1436 => 1437)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-11 19:53:11 UTC (rev 1436) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/mapper.py 2006-05-11 19:55:30 UTC (rev 1437) </span><span class="lines">@@ -257,76 +257,9 @@ </span><span class="cx"> class_or_mapper = class_mapper(class_or_mapper, entity_name=entity_name) </span><span class="cx"> self.polymorphic_map[key] = class_or_mapper </span><span class="cx"> </span><del>- def using(self, session): - return querylib.Query(self, session=session) - def query(self, session=None): - """returns an instance of sqlalchemy.orm.query.Query, which implements all the query-constructing - methods such as get(), select(), select_by(), etc.""" - if session is not None: - return querylib.Query(self, session=session) - - try: - if self._query.mapper is not self: - self._query = querylib.Query(self) - return self._query - except AttributeError: - self._query = querylib.Query(self) - return self._query - - def get(self, ident, **kwargs): - """calls get() on this mapper's default Query object.""" - return self.query().get(ident, **kwargs) </del><span class="cx"> </span><del>- def _get(self, key, ident=None, reload=False): - return self.query()._get(key, ident=ident, reload=reload) - - def get_by(self, *args, **params): - """calls get_by() on this mapper's default Query object.""" - return self.query().get_by(*args, **params) - - def select_by(self, *args, **params): - """calls select_by() on this mapper's default Query object.""" - return self.query().select_by(*args, **params) - - def selectfirst_by(self, *args, **params): - """calls selectfirst_by() on this mapper's default Query object.""" - return self.query().selectfirst_by(*args, **params) - - def selectone_by(self, *args, **params): - """calls selectone_by() on this mapper's default Query object.""" - return self.query().selectone_by(*args, **params) - - def count_by(self, *args, **params): - """calls count_by() on this mapper's default Query object.""" - return self.query().count_by(*args, **params) - - def selectfirst(self, *args, **params): - """calls selectfirst() on this mapper's default Query object.""" - return self.query().selectfirst(*args, **params) - - def selectone(self, *args, **params): - """calls selectone() on this mapper's default Query object.""" - return self.query().selectone(*args, **params) - - def select(self, arg=None, **kwargs): - """calls select() on this mapper's default Query object.""" - return self.query().select(arg=arg, **kwargs) - - def select_whereclause(self, whereclause=None, params=None, **kwargs): - """calls select_whereclause() on this mapper's default Query object.""" - return self.query().select_whereclause(whereclause=whereclause, params=params, **kwargs) - - def count(self, whereclause=None, params=None, **kwargs): - """calls count() on this mapper's default Query object.""" - return self.query().count(whereclause=whereclause, params=params, **kwargs) - - def select_statement(self, statement, **params): - """calls select_statement() on this mapper's default Query object.""" - return self.query().select_statement(statement, **params) - - def select_text(self, text, **params): - return self.query().select_text(text, **params) </del><span class="cx"> </span><ins>+ </ins><span class="cx"> def add_properties(self, dict_of_properties): </span><span class="cx"> """adds the given dictionary of properties to this mapper, using add_property.""" </span><span class="cx"> for key, value in dict_of_properties.iteritems(): </span><span class="lines">@@ -400,18 +333,12 @@ </span><span class="cx"> # in order to save on KeyErrors later on </span><span class="cx"> sessionlib.global_attributes.init_attr(self) </span><span class="cx"> </span><del>- nohist = kwargs.pop('_mapper_nohistory', False) </del><span class="cx"> if kwargs.has_key('_sa_session'): </span><span class="cx"> session = kwargs.pop('_sa_session') </span><span class="cx"> else: </span><span class="cx"> session = sessionlib.current_session(self) </span><span class="cx"> if session is not None: </span><del>- if not nohist: - session._register_new(self) - else: - pass - # TODO: this _attach should not be needed.... - #session._attach(self) </del><ins>+ session._register_new(self) </ins><span class="cx"> if oldinit is not None: </span><span class="cx"> oldinit(self, *args, **kwargs) </span><span class="cx"> # override oldinit, insuring that its not already one of our </span><span class="lines">@@ -475,10 +402,6 @@ </span><span class="cx"> """returns the identity (list of primary key values) for the given instance. The list of values can be fed directly into the get() method as mapper.get(*key).""" </span><span class="cx"> return [self._getattrbycolumn(instance, column) for column in self.pks_by_table[self.select_table]] </span><span class="cx"> </span><del>- def compile(self, whereclause = None, **options): - """works like select, except returns the SQL statement object without - compiling or executing it""" - return self.query()._compile(whereclause, **options) </del><span class="cx"> </span><span class="cx"> def copy(self, **kwargs): </span><span class="cx"> mapper = Mapper.__new__(Mapper) </span><span class="lines">@@ -501,13 +424,6 @@ </span><span class="cx"> self._options[optkey] = mapper </span><span class="cx"> return mapper </span><span class="cx"> </span><del>- def __getattr__(self, key): - if (key.startswith('select_by_') or key.startswith('get_by_')): - return getattr(self.query(), key) - else: - if key == 'table': - raise "what!? " + key #AttributeError(key) - raise AttributeError(key) </del><span class="cx"> </span><span class="cx"> def _getpropbycolumn(self, column, raiseerror=True): </span><span class="cx"> try: </span><span class="lines">@@ -846,6 +762,75 @@ </span><span class="cx"> row = frommapper.translate_row(self, row) </span><span class="cx"> for prop in self.props.values(): </span><span class="cx"> prop.execute(session, instance, row, identitykey, imap, isnew) </span><ins>+ + # deprecated query methods. Query is constructed from Session, and the rest + # of these methods are called off of Query now. + def query(self, session=None): + """deprecated. use Query instead.""" + if session is not None: + return querylib.Query(self, session=session) + + try: + if self._query.mapper is not self: + self._query = querylib.Query(self) + return self._query + except AttributeError: + self._query = querylib.Query(self) + return self._query + def using(self, session): + """deprecated. use Query instead.""" + return querylib.Query(self, session=session) + def __getattr__(self, key): + """deprecated. use Query instead.""" + if (key.startswith('select_by_') or key.startswith('get_by_')): + return getattr(self.query(), key) + else: + raise AttributeError(key) + def compile(self, whereclause = None, **options): + """deprecated. use Query instead.""" + return self.query()._compile(whereclause, **options) + def get(self, ident, **kwargs): + """deprecated. use Query instead.""" + return self.query().get(ident, **kwargs) + def _get(self, key, ident=None, reload=False): + """deprecated. use Query instead.""" + return self.query()._get(key, ident=ident, reload=reload) + def get_by(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().get_by(*args, **params) + def select_by(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().select_by(*args, **params) + def selectfirst_by(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().selectfirst_by(*args, **params) + def selectone_by(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().selectone_by(*args, **params) + def count_by(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().count_by(*args, **params) + def selectfirst(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().selectfirst(*args, **params) + def selectone(self, *args, **params): + """deprecated. use Query instead.""" + return self.query().selectone(*args, **params) + def select(self, arg=None, **kwargs): + """deprecated. use Query instead.""" + return self.query().select(arg=arg, **kwargs) + def select_whereclause(self, whereclause=None, params=None, **kwargs): + """deprecated. use Query instead.""" + return self.query().select_whereclause(whereclause=whereclause, params=params, **kwargs) + def count(self, whereclause=None, params=None, **kwargs): + """deprecated. use Query instead.""" + return self.query().count(whereclause=whereclause, params=params, **kwargs) + def select_statement(self, statement, **params): + """deprecated. use Query instead.""" + return self.query().select_statement(statement, **params) + def select_text(self, text, **params): + """deprecated. use Query instead.""" + return self.query().select_text(text, **params) </ins><span class="cx"> </span><span class="cx"> class MapperProperty(object): </span><span class="cx"> """an element attached to a Mapper that describes and assists in the loading and saving </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py (1436 => 1437)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-11 19:53:11 UTC (rev 1436) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/query.py 2006-05-11 19:55:30 UTC (rev 1437) </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>- </del><span class="cx"> import session as sessionlib </span><span class="cx"> from sqlalchemy import sql, util, exceptions </span><span class="cx"> import mapper </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormsessionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py (1436 => 1437)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-11 19:53:11 UTC (rev 1436) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-11 19:55:30 UTC (rev 1437) </span><span class="lines">@@ -67,11 +67,9 @@ </span><span class="cx"> </span><span class="cx"> class Session(object): </span><span class="cx"> """encapsulates a set of objects being operated upon within an object-relational operation.""" </span><del>- def __init__(self, bind_to=None, hash_key=None, new_imap=True, import_session=None, echo_uow=False): </del><ins>+ def __init__(self, bind_to=None, hash_key=None, import_session=None, echo_uow=False): </ins><span class="cx"> if import_session is not None: </span><span class="cx"> self.uow = unitofwork.UnitOfWork(identity_map=import_session.uow.identity_map) </span><del>- elif new_imap is False: - self.uow = unitofwork.UnitOfWork(identity_map=current_session().uow.identity_map) </del><span class="cx"> else: </span><span class="cx"> self.uow = unitofwork.UnitOfWork() </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |