Ñò ‡„[Jc @s‹dZddkZddkZddkZddkZddkZddkZddklZddk l Z l Z ddk l Z ddklZlZlZlZheid6eid6eid 6eid 6eid 6eid 6eid 6d„d6ZdZdZd„Zd„Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&d„Z'dd„Z(dd„Z)d„Z*d„Z+d„Z,d„Z-d„Z.d „Z/d!„Z0dd"„Z1dd#„Z2dd$„Z3dd%„Z4dd&„Z5d'„Z6d(„Z7d)„Z8d*„Z9d+„Z:d,e;fd-„ƒYZ<d.e=fd/„ƒYZ>d0e=fd1„ƒYZ?d2e=fd3„ƒYZ@d4e=fd5„ƒYZAdS(6s8TestCase and TestSuite artifacts and testing decorators.iÿÿÿÿN(tStringIO(tconfigt assertsql(tfunction_named(texctutilttypestschemats==s!=s<=s>=tincCs||djo||djS(ii((tvaltpair((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytstbetweencsEtˆddƒpˆi}|idƒd‰‡‡fd†}|S(sWMark a test as expected to fail if callable_ returns True. If the callable returns false, the test is run and reported as normal. However if the callable returns true, the test is expected to fail and the unit test logic is inverted: if the test fails, a success is reported. If the test succeeds, a failure is reported. t__doc__s ics.ˆi‰‡‡‡‡fd†}t|ˆƒS(Ncstˆƒpˆ||ŽSyˆ||ŽWn.tj o"}dˆˆt|ƒfGHtSXtdˆˆfƒ‚dS(Ns,'%s' failed as expected (condition: %s): %s s+Unexpected success for '%s' (condition: %s)(t ExceptiontstrtTruetAssertionError(targstkwtex(t descriptiont callable_tfn_nametfn(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytmaybe.s (t__name__R(RR(RR(RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytdecorate,s N(tgetattrtNoneRtsplit(Rt docstringR((RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfails_if s cs(ˆi‰‡‡fd†}t|ˆƒS(suMark a test as expected to unconditionally fail. Takes no arguments, omit parens when using as a decorator. csSyˆ||ŽWn+tj o}dˆt|ƒfGHtSXtdˆƒ‚dS(Ns(Future test '%s' failed as expected: %s s'Unexpected success for future test '%s'(RRRR(RRR(RR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt decoratedGs(RR(RR#((RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfuture@s  cs‡‡fd†}|S(sUMark a test as expected to fail on the specified database implementation. Unlike ``crashes``, tests marked as ``fails_on`` will be run for the named databases. The test is expected to fail and the unit test logic is inverted: if the test fails, a success is reported. If the test succeeds, a failure is reported. cs.ˆi‰‡‡‡‡fd†}t|ˆƒS(Ncsƒtiiˆjoˆ||ŽSyˆ||ŽWn.tj o"}dˆtiiˆfGHtSXtdˆtiifƒ‚dS(Ns5'%s' failed as expected on DB implementation '%s': %ss5Unexpected success for '%s' on DB implementation '%s'(RtdbtnameRRR(RRR(treasonRtdbsR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR_s(RR(RR(R'R((RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR]s ((R(R'R((R(R's;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfails_onSs cs‡fd†}|S(s¯Mark a test as expected to fail on most database implementations. Like ``fails_on``, except failure is the expected outcome on all databases except those listed. cs+ˆi‰‡‡‡fd†}t|ˆƒS(Ncs‰tiiˆjoˆ||ŽSyˆ||ŽWn4tj o(}dˆtiit|ƒfGHtSXtdˆtiifƒ‚dS(Ns5'%s' failed as expected on DB implementation '%s': %ss5Unexpected success for '%s' on DB implementation '%s'(RR%R&RRRR(RRR(RR(R(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRzs(RR(RR(R((RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRxs ((R(R((R(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfails_on_everything_exceptqscs%tˆƒ‰‡‡‡fd†}|S(s¿Mark a test as unsupported by a database implementation. ``crashes`` tests will be skipped unconditionally. Use for feature tests that cause deadlocks or other fatal problems. cs1ˆi‰‡‡‡‡‡fd†}t|ˆƒS(Ncs_tiiˆjo;dˆtiiˆf}|GHˆoti|IJntSˆ||ŽSdS(Ns.'%s' unsupported on DB implementation '%s': %s(RR%R&tsyststderrR(RRtmsg(tcarpR%R'RR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR–s(RR(RR(R.R%R'(RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR”s  (t_should_carp_about_exclusion(R%R'R((R'R%R.s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytcrashesŒs  cs%tˆƒ‰‡‡‡fd†}|S(séMark a test as unsupported by a database implementation. Will never run the test against any version of the given database, ever, no matter what. Use when your assumptions are infallible; past, present and future. cs1ˆi‰‡‡‡‡‡fd†}t|ˆƒS(Ncs_tiiˆjo;dˆtiiˆf}|GHˆoti|IJntSˆ||ŽSdS(Ns.'%s' unsupported on DB implementation '%s': %s(RR%R&R+R,R(RRR-(R.R%R'RR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR®s(RR(RR(R.R%R'(RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR¬s  (R/(R%R'R((R'R%R.s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt_block_unconditionally£s  cs+tˆƒ‰‡‡‡‡‡fd†}|S(sxMark a test as unsupported by specific database server versions. Stackable, both with other excludes and other decorators. Examples:: # Not supported by mydb versions less than 1, 0 @exclude('mydb', '<', (1,0)) # Other operators work too @exclude('bigdb', '==', (9,0,9)) @exclude('yikesdb', 'in', ((0, 3, 'alpha2'), (0, 3, 'alpha3'))) cs7ˆi‰‡‡‡‡‡‡‡fd†}t|ˆƒS(NcsetˆˆˆƒoAdˆtiitƒˆf}|GHˆoti|IJntSˆ||ŽSdS(Ns*'%s' unsupported on DB %s version '%s': %s(t _is_excludedRR%R&t_server_versionR+R,R(RRR-(R.R%R'RtspecRtop(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRËs(RR(RR(R.R%R'R4R5(RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRÉs ! (R/(R%R5R4R'R((R.R%R'R4R5s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytexclude¼s  cCsS|pt‚x>dD]}||iƒjotSqWt|ƒdjotSdS(s#Guard against forgotten exclusions.ttodotfixmetxxxiN(R7R8R9(RtlowerRtlen(R't_((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR/Øs cCsOtii|jotStƒ}t|dƒo|pt|}|||ƒS(s Return True if the configured db matches an exclusion specification. db: A dialect name op: An operator or stringified operator, such as '==' spec: A value that will be compared to the dialect's server_version_info using the supplied operator. Examples:: # Not supported by mydb versions less than 1, 0 _is_excluded('mydb', '<', (1,0)) # Other operators work too _is_excluded('bigdb', '==', (9,0,9)) _is_excluded('yikesdb', 'in', ((0, 3, 'alpha2'), (0, 3, 'alpha3'))) t__call__(RR%R&tFalseR3thasattrt_ops(R%R5R4tversiontoper((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR2âs  !cCs0|djo ti}n|ii|iƒƒS(s#Return a server_version_info tuple.N(RRR%tdialecttserver_version_infotcontextual_connect(tbind((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR3ýs  cs&ˆpˆi‰‡‡fd†}|S(s!Skip a test if predicate is true.cs.ˆi‰‡‡‡‡fd†}t|ˆƒS(NcsDˆƒo)dˆtiitƒˆf}|GHtSˆ||ŽSdS(Ns&'%s' skipped on DB %s version '%s': %s(RR%R&R3R(RRR-(t predicateR'RR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR s  (RR(RR(RGR'(RRs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRs (R(RGR'R((RGR's;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytskip_ifs cs‡fd†}|S(sâMark a test as emitting a warning. With no arguments, squelches all SAWarning failures. Or pass one or more strings; these will be matched to the root of the warning description by warnings.filterwarnings(). cs"‡‡fd†}t|ˆiƒS(Ncsštdddtiƒg}ˆp#|itdddtiƒƒn|id„ˆDƒƒx|D]}ti|qcWzˆ||ŽSWdtƒXdS(Ntactiontignoretcategorycss1x*|]#}tddd|dtiƒVqWdS(RIRJtmessageRKN(tdicttsa_exct SAWarning(t.0RL((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pys *s ( RMRNtSAPendingDeprecationWarningtappendROtextendtwarningstfilterwarningst resetwarnings(RRtfilterstf(tmessagesR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytsafe"s   (RR(RRZ(RY(Rs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR!s((RYR((RYs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt emits_warnings cs‡‡fd†}|S(søMark a test as emitting a warning on a specific dialect. With no arguments, squelches all SAWarning failures. Or pass one or more strings; these will be matched to the root of the warning description by warnings.filterwarnings(). cs%‡‡‡fd†}t|ˆiƒS(Ncs’tˆtƒoDtiiˆjoˆ||ŽStˆŒˆƒ}|||ŽSn;tˆŒpˆ||ŽStˆŒˆƒ}|||ŽSdS(N(t isinstancet basestringRR%R&R[R2(RRtwrapped(RTR%R(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR?s (RR(RR(R%RT(Rs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR>s ((R%RTR((R%RTs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytemits_warning_on7scs‡fd†}|S(sÎMark a test as immune from fatal deprecation warnings. With no arguments, squelches all SADeprecationWarning failures. Or pass one or more strings; these will be matched to the root of the warning description by warnings.filterwarnings(). As a special case, you may pass a function name prefixed with // and it will be re-written as needed to match the standard warning verbiage emitted by the sqlalchemy.util.deprecated decorator. cs"‡‡fd†}t|ˆiƒS(Nc sýtdddtiƒg}ˆp#|itdddtiƒƒn{|ig}g}ˆD],}||idƒod|dp|q]~D]%}|tddd|dtiƒq~ƒx|D]}ti|qÆWzˆ||ŽSWdt ƒXdS(NRIRJRKs//sCall to deprecated function iRL( RMRNRQRRtSADeprecationWarningRSt startswithRTRURV(RRRWt_[1]t_[2]tmRLRX(RYR(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRZ\s f(RR(RRZ(RY(Rs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR[s((RYR((RYs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytuses_deprecatedOs cCsmtiddtiƒtiddtiƒtiddtiƒtidjotiddtƒndS(s+Reset warning behavior to testing defaults.RJRKterroriiN(ii( RTRURNRQR`ROR+t version_infot FutureWarning(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRVvs   cGs¾x·|D]¯}t|tƒotii|jotSq|\}}}tii|joqntiiitiiƒƒ}t |dƒo|pt |}|||ƒotSqWt S(s–Boolean predicate, compares to testing database configuration. Given one or more dialect names, returns True if one is the configured database engine. Also supports comparison to database version when provided with one or more 3-tuples of dialect name, operator, and version specification:: testing.against('mysql', 'postgres') testing.against(('mysql', '>=', (5, 0, 0)) R=( R\R]RR%R&RRCRDRER?R@R>(tqueriestqueryR&R5R4thaveRB((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytagainst„s   ! cGs'x t|ƒD]}||ƒ}q W|S(sCApply a series of decorators to fn, returning a decorated function.(treversed(Rt decoratorst decorator((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt_chain_decorators_on¢s cCs+tg}|D]}|t|ƒq~ƒS(sŠConverts the results of sql execution into a plain set of column tuples. Useful for asserting the results of an unordered query. (tsetttuple(tresultsRbtrow((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytrowset¨scCs,||jpt|pd||f‚dS(s.Assert a == b, with repr messaging on failure.s%r != %rN(R(tatbR-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyteq_±scCs,||jpt|pd||f‚dS(s.Assert a != b, with repr messaging on failure.s%r == %rN(R(RvRwR-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytne_µscCs,||jpt|pd||f‚dS(s.Assert a is b, with repr messaging on failure.s %r is not %rN(R(RvRwR-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytis_¹scCs,||j pt|pd||f‚dS(s2Assert a is not b, with repr messaging on failure.s%r is %rN(R(RvRwR-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytis_not_½scCs/|i|ƒpt|pd||f‚dS(s>Assert a.startswith(fragment), with repr messaging on failure.s%r does not start with %rN(RaR(RvtfragmentR-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt startswith_ÁscOs>y"|||Žtp td‚Wn|j o }nXdS(Ns#Callable did not raise an exception(R>R(t except_clsRRRte((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt assert_raisesÆs  cOsky"|||Žtp td‚WnB|j o6}ti|t|ƒƒptd||f‚nXdS(Ns#Callable did not raise an exceptions%r !~ %s(R>RtretsearchR(R~R-RRtkwargsR((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_raises_messageÍs  cCstp t|‚dS(N(R>R(R-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfailÔscs)‡‡‡fd†}ˆid|ƒdS(s&Insert data into table after creation.c snˆiƒ}g}ˆD]}||iq~}|i|g}ˆD]}|tt||ƒƒqD~ƒdS(N(tinserttkeytexecuteRMtzip( teventt schema_itemt connectionR†Rbtcolt column_namesRct column_values(trowsttabletcolumns(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytonloadÙs $s after-createN(tappend_ddl_listener(R‘R’RR“((R‘RR’s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytfixture×scs‡fd†}t|ˆiƒS(sÍDecorator, augment function globals with tables and classes. Swaps out the function's globals at execution time. The 'global' statement will not work as expected inside a decorated function. csw|d}tˆiƒ}x'|iD]}|it||ƒƒq#Wtiˆi|ˆiˆi ˆi ƒ}|||ŽS(Ni( RMt func_globalst_artifact_registriestupdateRRt FunctionTypet func_codet func_namet func_defaultst func_closure(RRƒtselftcontexttsourcetrebound(R(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytresolvedïs   (RR›(RR¢((Rs;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytresolve_artifact_namesàs tadictcBs eZdZd„Zd„ZRS(s,Dict keys available as attributes. Shadows.cCs3y ||SWn tj oti||ƒSXdS(N(tKeyErrorRMt__getattribute__(RžR‡((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR¦ýs cGs)tg}|D]}|||q~ƒS(N(Rr(RžtkeysRbR‡((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytget_alls(Rt __module__RR¦R¨(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR¤ûs tTestBasecBs8eZdZdZdZdZdZdZdd„Z RS(cCs|p t|‚dS(N(R(RžR R-((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_s(((N(( RR©t __whitelist__t __requires__t__unsupported_on__Rt __only_on__t __skip_if__R—R«(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRªstAssertsCompiledSQLcBseZdddd„ZRS(c CsÝ|djot|ddƒ}n|djo d}n |iƒ}|id|d|ƒ}dt|ƒt|iƒGHtiddt|ƒƒ}t ||d|||fƒ|dj ot |i |ƒ|ƒndS(Nt __dialect__t column_keysRCs SQL String: s\nts%r != %r on dialect %r( RRR§tcompileRtreprtparamsRtsubRxtconstruct_params( RžtclausetresultR·t checkparamsRCR§tctcc((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_compile s     N(RR©RR¿(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR±stComparesTablescBseZd„ZRS(c Cs’tii}t|iƒt|iƒjpt‚xt|i|iƒD]í\}}t|i|iƒ||i|ijpt‚t|i |i ƒt|i |i ƒtt t |i ƒiƒi |ƒit t |i ƒiƒi |ƒƒƒdjptd|i |i f‚t|i tiƒot|i i|i iƒntt g}|iD]}||iiq^~ƒt g}|iD]}||iiq‹~ƒƒ|io!t|itiƒpt‚qHtdddfƒoqH|i ptdƒ o,t|ƒGH|idjp t|i‚qHqHWt|i ƒt|i ƒjpt‚x,|i D]!}|i i|ipt‚qiWdS(Nis)Type '%s' doesn't correspond to type '%s'tmysqlRitpostgres(ii(tsqltypest TypeEnginet__mro__R;R½RR‰RxR&t primary_keytnullableRqttypet differencet intersectionR\tStringtlengtht foreign_keystcolumntdefaulttserver_defaultRt FetchedValueRlR¶RR’( RžR‘treflected_tabletbase_mroR½t reflected_cRbRXRc((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_tables_equal5s6 & !$$a   %& (RR©RÕ(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRÀ4stAssertsExecutionResultscBsJeZd„Zd„Zd„Zd„Zd„Zdd„Zd„Z RS(cGs.t|ƒ}t|ƒGH|i|||ƒdS(N(tlistR¶t assert_list(RžR»tclass_tobjects((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt assert_resultWs  cCsl|it|ƒt|ƒjdd|iƒx8tdt|ƒƒD]!}|i|||||ƒqCWdS(Ns/result list is not the same size as test list, s for class i(R«R;Rtranget assert_row(RžR»RÙR×ti((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRØ\s cCsí|i|i|jdt|ƒƒxÃ|iƒD]µ\}}t|tƒodt|dtƒo(|it||ƒ|d|dƒqå|i |dt||ƒ|dƒq0|it||ƒ|jd|t||ƒ|fƒq0WdS(Nsitem class is not iis'attribute %s value %s does not match %s( R«t __class__R¶t iteritemsR\RrR×RØRRÝ(RžRÙtrowobjtdescR‡tvalue((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRÝcs ((c sUdtfd„ƒY}ti|ƒ}tg}|D]}|||ƒq3~ƒ}xCti‡fd†|ƒD]&}tdt|ƒiˆifƒqnWt |ƒt |ƒjo$tdt |ƒt |ƒfƒnt ƒ‰‡‡fd†} x^|D]V} xM|D](} | | | ƒo|i | ƒPqqWtdˆit | ƒfƒq÷Wt S(sÉAs assert_result, but the order of objects is not considered. The algorithm is very expensive but not a big deal for the small numbers of rows that the test suite manipulates. t frozendictcBseZd„ZRS(cSs t|ƒS(N(tid(Rž((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt__hash__ys(RR©Ræ(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRäxscst|ƒˆjS((RÈ(to(tcls(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyR ss#Unexpected type "%s", expected "%s"s+Unexpected object count "%s", expected "%s"c s’x‹|iƒD]}\}}t|tƒoCy(ˆit||ƒ|d|dŒWqŠtj otSXq t||ˆƒ|jotSq WtS(Nii(RàR\Rrtassert_unordered_resultRRR>R(tobjR4R‡Rã(RžtNOVALUE(s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt _compare_itemˆs "  s2Expected %s instance with attributes %s not found.(RMRt IdentitySetRqt itertoolst ifilterfalseR…RÈRR;tobjecttremoveR¶R( RžR»RètexpectedRätfoundRbRtwrongRìt expected_itemt found_item((RëRžRès;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRéqs.-    cGs=tii|ƒz|ƒtiiƒWdtiiƒXdS(N(Rtassertert add_ruleststatement_completet clear_rules(RžR%Rtrules((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_sql_execution s c CsÐ|dj otiidjo |}n|}g}x€|D]x}t|tƒoFtig}|iƒD]\} } |ti | | ƒqj~Œ} nti |Œ} |i | ƒq=W|i |||ŒdS(NtfirebirdtoracleRÂ(RýRþspostgres( RRR%R&R\RMRtAllOfRàtExactSQLRRRü( RžR%Rtlist_twith_sequencesRûtnewrulestruleRbtktvtnewrule((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyt assert_sql¨s  @cCs |i||ti|ƒƒdS(N(RüRtCountStatements(RžR%Rtcount((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytassert_sql_countºsN( RR©RÛRØRÝRéRüRRR (((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pyRÖVs    /  (BRRîtoperatorRR+RRTt cStringIORtsqlalchemy.testRRtsqlalchemy.utilRt sqlalchemyRRNRRÃRtlttgtteqtnetletgetcontainsR@RR%trequiresR"R$R)R*R0R1R6R/R2R3RHR[R_ReRVRlRpRuRxRyRzR{R}R€R„R…R•R£RMR¤RðRªR±RÀRÖ(((s;/usr/lib/python2.6/site-packages/sqlalchemy/test/testing.pytsj      "                  #  '             "