B A[L@sddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZmZmZmZddlmZmZmZerddlZddZdd ZGd d d eZGd d d eZGdddeZGdddejZeedZddZ ddZ!ddZ"ddZ#e$ejds(ejj%ej_&d$ddZ'e$ejdsNe ejde'Gddde(Z)Gd d!d!e)Z*d%d"d#Z+e$ejd#se ejd#e+dS)&)print_functionabsolute_importN)dedent) bind_methodPY26PY3PY2PY27) check_outputSTDOUTCalledProcessErrorcCs|dr|dd}t|S)z, Removes any leading and dedents.  N) startswithr)coderB/opt/alt/python37/lib/python3.7/site-packages/future/tests/base.py reformat_codes  rcsh|dddtD}ddtD}ddtD}||ksTtddd}d d }||||ks|td tfd d|D}tt||}tfd d|D}tt||} tfdd|D} tt|| } g} xpttD]`} | |kr| || q| |kr2| | | q| |krL| | | q| | qWd | S)a Returns the code block with any ``__future__`` import lines sorted, and then any ``future`` import lines sorted, then any ``builtins`` import lines sorted. This only sorts the lines within the expected blocks. See test_order_future_lines() for an example. r cSsg|]\}}|dr|qS)zfrom __future__ import )r).0ilinerrr *sz&order_future_lines..cSs(g|] \}}|ds |dr|qS)z from futurez from past)r)rrrrrrr-s cSsg|]\}}|dr|qS)z from builtins)r)rrrrrrr1szIinternal usage error: dedent the code before calling order_future_lines()cSst|dkrt|SdS)Nr)lenmax)numbersrrrmymax7sz!order_future_lines..mymaxcSst|dkrt|StdS)Nrinf)rminfloat)rrrrmymin:sz!order_future_lines..myminz2the __future__ and future imports are out of ordercsg|] }|qSrr)rr)linesrrrCscsg|] }|qSrr)rr)r rrrFscsg|] }|qSrr)rr)r rrrIs) split enumeratelstripAssertionErrorsorteddictziprangerappendjoin)rZuufuture_line_numbersZfuture_line_numbersZbuiltins_line_numbersrrZuulZsorted_uufuture_linesZflZsorted_future_linesZblZsorted_builtins_linesZ new_linesrr)r rorder_future_liness2    r+c@s"eZdZdZdddZddZdS)VerboseCalledProcessErrorz Like CalledProcessError, but it displays more information (message and script output) for diagnosing test failures etc. NcCs||_||_||_||_dS)N)msg returncodecmdoutput)selfr-r.r/r0rrr__init__`sz"VerboseCalledProcessError.__init__cCsd|j|j|j|jfS)Nz>Command '%s' failed with exit status %d Message: %s Output: %s)r/r.r-r0)r1rrr__str__fsz!VerboseCalledProcessError.__str__)N)__name__ __module__ __qualname____doc__r2r3rrrrr,[s r,c@s eZdZdS) FuturizeErrorN)r4r5r6rrrrr8jsr8c@s eZdZdS)PasteurizeErrorN)r4r5r6rrrrr9msr9c@steZdZdZddZdddZdd d Zd d Zdd dZddZ dddZ dddZ d ddZ de jfddZdS)! CodeHandlerzt Handy mixin for test classes for writing / reading / futurizing / running .py files in the test suite. cCsjtd|_td|_tjg|_ttj j |_ t d}|rXdt tj|i|_ndt i|_dS)zi The outputs from the various futurize stages should have the following headers: z from __future__ import absolute_import from __future__ import division from __future__ import print_function a4 from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from future import standard_library standard_library.install_aliases() from builtins import * Z PYTHONPATHN)rheaders1headers2sys executable interpreterstempfileZmkdtempospathseptempdirgetenvgetcwdpathsepenv)r1ZpypathrrrsetUpvs    zCodeHandler.setUprFTc CsT|r t|}|||j||||d|}|rPx|jD]} |j| d} q from future from future. from builtins or any line containing: install_hooks() or: install_aliases() Limitation: doesn't handle imports split across multiple lines like this: from __future__ import (absolute_import, division, print_function, unicode_literals) r zfrom __future__ import z from future zfrom builtins zinstall_hooks()zinstall_aliases()z from future.)r!rr)r*)r1rr0rrrrrXs    z CodeHandler.strip_future_importsc CsP|j||||||d} |r0d|kr(|jn|j} nd} |j| | t||ddS)a< Convenience method that calls convert() and compare(). Reformats the code blocks automatically using the reformat_code() function. If all_imports is passed, we add the appropriate import headers for the stage(s) selected to the ``expected`` code-block, so they needn't appear repeatedly in the test code. If ignore_imports is True, ignores the presence of any lines beginning: from __future__ import ... from future import ... for the purpose of the comparison. )rLrMrNrUrOrK)r^N)rWr<r;r_r) r1beforer]rLrMr^rNrUrOr0Zheadersrrr convert_checks  zCodeHandler.convert_checkcKs|j||f|dS)ze Convenience method to ensure the code is unchanged by the futurize process. N)rb)r1rkwargsrrr unchangedszCodeHandler.unchangedmytestscript.pyc CsHt|tr|d}tj|j|ddd}|t|WdQRXdS)z Dedents the given code (a multiline string) and writes it out to a file in a temporary folder like /tmp/tmpUDCn7x/mytestscript.py. zutf-8Zwt)encodingN)rYrZr[ioopenrDwriter)r1rfilenamefrrrrQs  zCodeHandler._write_test_scriptc Cs.tj|j|ddd}|}WdQRX|S)NZrtzutf-8)rf)rgrhrDread)r1rjrkZ newsourcerrrrS(szCodeHandler._read_test_scriptc Cs.g}t|}|r|d|r$d}nNd}|dgkr>|dn&|dgkrT|dn|ddgksdt|rr|d|j|}tj|g|d |g} yt| t|jd } Wnt k r(} zbt |*} d d | d |j|d| f} WdQRXd|krt nt}|| | j| j| jdWdd} ~ XYnX| S)Nz --all-importsz pasteurize.pyz futurize.pyrz--stage1rKz--stage2z--conservativez-w)stderrrHz8Error running the command %s %s Contents of file %s: %s zenv=%sz ---- %s ----Zfuturize)r0)listr)r$rDr=r>r r rHr rhr*rlr8r9r.r/r0)r1rjrLrMrNrOZparamsscriptfn call_argsr0erkr-Z ErrorClassrrrrR-s8        (z!CodeHandler._futurize_test_scriptc Cs|j|}yt||g|jtd}Wntk r}zft|.}dd||gd|j|d|f}WdQRXt|dsd|_ t ||j |j |j dWdd}~XYnX|S)N)rHrmz8Error running the command %s %s Contents of file %s: %srnzenv=%sz ---- %s ----r0)r0) rDr rHr r rhr*rlhasattrr0r,r.r/)r1rjrPrqr0rsrkr-rrrrTXs    (zCodeHandler._run_test_scriptN)rJFFTTF)T)rJFTFTF)re)re)rerJFFF)r4r5r6r7rIrWr_rXrbrdrQrSrRr=r>rTrrrrr:qs"+  "   )r:z#this test is known to fail on Py2.6cCsts|St|S)N)runittestexpectedFailure)funcrrrexpectedFailurePY3wsrxcCsts|St|S)N)rrurv)rwrrrexpectedFailurePY26|srycCsts|St|S)N)r rurv)rwrrrexpectedFailurePY27srzcCsts|St|S)N)rrurv)rwrrrexpectedFailurePY2sr{assertRaisesRegexcCsTt|ttfr$|stdt|}||sP|p4d}d||j|f}||dS)z=Fail the test unless the text matches the regular expression.z!expected_regex must not be empty.zRegex didn't matchz%s: %r not found in %rN) rYstrZunicoder$recompilesearchpatternfailureException)r1textexpected_regexr-rrr assertRegexs   rc@s&eZdZdddZddZddZdS) _AssertRaisesBaseContextNcCsp||_||_|dk rBy |j|_WqHtk r>t||_YqHXnd|_t|ttfr`t |}||_ d|_ dS)N) r] test_caser4obj_nameAttributeErrorr}rYrZr~rrr-)r1r]r callable_objrrrrr2s  z!_AssertRaisesBaseContext.__init__cCs |j|j|}|j|dS)N)rZ_formatMessager-r)r1Z standardMsgr-rrr _raiseFailuresz&_AssertRaisesBaseContext._raiseFailurec Cs8|dkr|dd|_|S||||WdQRXdS)z If callable_obj is None, assertRaises/Warns is being used as a context manager, so check for a 'msg' kwarg and return self. If callable_obj is not None, call it passing args and kwargs. Nr-)popr-)r1namerargsrcrrrhandles z_AssertRaisesBaseContext.handle)NN)r4r5r6r2rrrrrrrs rc@s eZdZdZddZddZdS)_AssertWarnsContextzBA context manager used to implement TestCase.assertWarns* methods.cCsRx$tjD]}t|ddr i|_q Wtjdd|_|j|_t d|j |S)N__warningregistry__T)recordalways) r=modulesvaluesgetattrrwarningscatch_warningswarnings_manager __enter__ simplefilterr])r1vrrrrs   z_AssertWarnsContext.__enter__cCs|j||||dk rdSy |jj}Wntk rFt|j}YnXd}xb|jD]X}|j}t||jslqT|dkrx|}|j dk r|j t|sqT||_ |j |_ |j |_ dSW|dk r|d|j jt||jr|d||jn|d|dS)Nz"{}" does not match "{}"z{} not triggered by {}z{} not triggered)r__exit__r]r4rr}rmessagerYrrZwarningrjlinenorformatrr)r1exc_type exc_valuetbZexc_nameZfirst_matchingmwrrrrs8      z_AssertWarnsContext.__exit__N)r4r5r6r7rrrrrrrs rcOst|||}|d|||S)aFail unless a warning of class warnClass is triggered by callable_obj when invoked with arguments args and keyword arguments kwargs. If a different type of warning is triggered, it will not be handled: depending on the other warning filtering rules in effect, it might be silenced, printed out, or raised as an exception. If called with callable_obj omitted or None, will return a context object used like this:: with self.assertWarns(SomeWarning): do_something() An optional keyword argument 'msg' can be provided when assertWarns is used as a context object. The context manager keeps a reference to the first matching warning as the 'warning' attribute; similarly, the 'filename' and 'lineno' attributes give you information about the line of Python code from which the warning was triggered. This allows you to inspect the warning after the assertion:: with self.assertWarns(SomeWarning) as cm: do_something() the_warning = cm.warning self.assertEqual(the_warning.some_attribute, 147) assertWarns)rr)r1Zexpected_warningrrrccontextrrrrs r)N)N),Z __future__rrrAr@rur=r~rrgtextwraprZ future.utilsrrrrr Zfuture.moves.subprocessr r r Z unittest2rr+r,r8r9ZTestCaser:ZskipIfZskip26rxryrzr{rtZassertRaisesRegexpr|robjectrrrrrrrsF  @   "1