ó J9•Qc@s·dZeZddlZddlZddlmZddlmZm Z yddl m Z m Z Wn'e k rddlm Z m Z nXejeƒZdefd„ƒYZdS(sŒ This plugin adds a test id (like #1) to each test name output. After you've run once to generate test ids, you can re-run individual tests by activating the plugin and passing the ids (with or without the # prefix) instead of test names. For example, if your normal test run looks like:: % nosetests -v tests.test_a ... ok tests.test_b ... ok tests.test_c ... ok When adding ``--with-id`` you'll see:: % nosetests -v --with-id #1 tests.test_a ... ok #2 tests.test_b ... ok #2 tests.test_c ... ok Then you can re-run individual tests by supplying just an id number:: % nosetests -v --with-id 2 #2 tests.test_b ... ok You can also pass multiple id numbers:: % nosetests -v --with-id 2 3 #2 tests.test_b ... ok #3 tests.test_c ... ok Since most shells consider '#' a special character, you can leave it out when specifying a test id. Note that when run without the -v switch, no special output is displayed, but the ids file is still written. Looping over failed tests ------------------------- This plugin also adds a mode that will direct the test runner to record failed tests. Subsequent test runs will then run only the tests that failed last time. Activate this mode with the ``--failed`` switch:: % nosetests -v --failed #1 test.test_a ... ok #2 test.test_b ... ERROR #3 test.test_c ... FAILED #4 test.test_d ... ok On the second run, only tests #2 and #3 will run:: % nosetests -v --failed #2 test.test_b ... ERROR #3 test.test_c ... FAILED As you correct errors and tests pass, they'll drop out of subsequent runs. First:: % nosetests -v --failed #2 test.test_b ... ok #3 test.test_c ... FAILED Second:: % nosetests -v --failed #3 test.test_c ... FAILED When all tests pass, the full set will run on the next invocation. First:: % nosetests -v --failed #3 test.test_c ... ok Second:: % nosetests -v --failed #1 test.test_a ... ok #2 test.test_b ... ok #3 test.test_c ... ok #4 test.test_d ... ok .. note :: If you expect to use ``--failed`` regularly, it's a good idea to always run run using the ``--with-id`` option. This will ensure that an id file is always created, allowing you to add ``--failed`` to the command line as soon as you have failing tests. Otherwise, your first run using ``--failed`` will (perhaps surprisingly) run *all* tests, because there won't be an id file containing the record of failed tests from your previous run. iÿÿÿÿN(tPlugin(tsrctset(tdumptloadtTestIdcBsƒeZdZdZd ZeZeZ d„Z d„Z d„Z d d„Z d„Zd„Zd„Zd „Zd „Zd „ZRS( s Activate to add a test id (like #1) to each test name output. Activate with --failed to rerun failing tests only. tidc Csgtj|||ƒ|jddddddddd d d ƒ|jd dd dddtd dƒdS(s&Register commandline options. s --id-filetactiontstoretdestt testIdFiletdefaults.noseidstmetavartFILEthelpsfStore test ids found in test runs in this file. Default is the file .noseids in the working directory.s--failedt store_truetfaileds/Run the tests that failed in the last test run.N(Rtoptionst add_optiontFalse(tselftparsertenv((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pyRxs  cCsØtj|||ƒ|jr>t|_t|_tjdƒntj j |j ƒ|_ tj j |j ƒsŒtj j|j|j ƒ|_ nd|_i|_i|_g|_g|_i|_|jdk|_dS(sConfigure plugin. sLooping on failed testsiiN(Rt configureRtTruetenabledt loopOnFailedtlogtdebugtostpatht expanduserR tidfiletisabstjoint workingDirRtidsttestst source_namest_seent verbosityt _write_hashes(RRtconf((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pyR†s   !      cCsÊ|jƒrg|_n|jr]tttt|jjƒƒt|jjƒƒƒƒƒ}n |j }t |j dƒ}t i|d6|jd6|j d6|ƒ|jƒtjd||j|j ƒdS(s&Save new ids file, if needed. twbR$RR&s#Saved test ids: %s, failed %s to %sN(t wasSuccessfulRt collectingtdicttlisttzipR%tvaluestkeysR$topenR RR&tcloseRR(RtresultR$tfh((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pytfinalizes   <     c Cs‹tjd||ƒyt|jdƒ}t|ƒ}d|krj|d|_|d|_|d|_n||_g|_||_|jrãt|jƒd|_ t t t t |jj ƒƒt |jjƒƒƒƒƒ|_n d|_ tjd|j|j|j|j|jƒ|jƒWn$tk rHtjd|jƒnX|jry|jryt|_|j}g|_ng}g}g}xF|D]>}|j|ƒ} | |krÃ|j| ƒq’|j|ƒq’W|rXt|ƒ} t|jƒ} tjd | | ƒg|D]} | | kr| ^q}|rF|jj|ƒn|sa|}qan t|_tjd |||ƒd ||p‡|fS( sTranslate ids in the list of requested names into their test addresses, if they are found in my dict of tests. s ltfn %s %strbR$RR&is8Loaded test ids %s tests %s failed %s sources %s from %ssIO error reading %ssold: %s new: %ss&translated: %s new sources %s names %sN(RRR3R RR$RR&tmaxRR.R/R0R1R2R%R4tIOErrorRRR-ttrtappendRtextendtNone( RtnamestmoduleR6tdatat translatedt new_sourcet really_newtnamettranstnew_settold_setts((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pytloadTestsFromNames®s`        ?              cCs^tjd|ƒ|\}}}|dk r:t|ƒ}n|}|dk rZd||fS|S(Ns Make name %ss%s:%s(RRR>R(RtaddrtfilenameR@tcallthead((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pytmakeNameñs  cCs ||_dS(sBGet handle on output stream so the plugin can print id #s N(tstream(RRP((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pytsetOutputStreamüscCs¶|jƒ}tjd|||jkƒ||jkr||jkrV|jdƒn%|jd|j|ƒd|j|R RR-RRRRR7RJRORQRVR[R;RS(((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pyRns    C   (RdRt__test__tloggingRt nose.pluginsRt nose.utilRRtcPickleRRt ImportErrortpicklet getLoggerRbRR(((s7/sys/lib/python2.7/site-packages/nose/plugins/testid.pyt^s