B t `½&ã@sŒdZdZddlZddlZddlmZddlmZmZyddl m Z m Z Wn$e k rlddl m Z m Z YnXe  e¡ZGdd„deƒZdS) aˆ 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 #3 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 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. FéN)ÚPlugin)ÚsrcÚset)ÚdumpÚloadc@sreZdZdZdZdZdZdZdd„Zdd „Z d d „Z dd d „Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„ZdS)ÚTestIdz Activate to add a test id (like #1) to each test name output. Activate with --failed to rerun failing tests only. ÚidNTFcCs<t |||¡|jddddddd|jdd d d d d dS)z&Register commandline options. z --id-fileÚstoreÚ testIdFilez.noseidsÚFILEzfStore test ids found in test runs in this file. Default is the file .noseids in the working directory.)ÚactionÚdestÚdefaultÚmetavarÚhelpz--failedÚ store_trueÚfailedFz/Run the tests that failed in the last test run.)r r rrN)rÚoptionsÚ add_option)ÚselfÚparserÚenv©rú7/tmp/pip-unpacked-wheel-cjhnoqsi/nose/plugins/testid.pyrxs zTestId.optionscCst |||¡|jr*d|_d|_t d¡tj  |j ¡|_ tj  |j ¡s\tj  |j|j ¡|_ d|_i|_i|_g|_g|_i|_|jdk|_dS)zConfigure plugin. TzLooping on failed testsééN)rÚ configurerZenabledÚ loopOnFailedÚlogÚdebugÚosÚpathÚ expanduserr ÚidfileÚisabsÚjoinZ workingDirrÚidsÚtestsÚ source_namesÚ_seenÚ verbosityÚ _write_hashes)rrÚconfrrrr†s zTestId.configurecCs„| ¡rg|_|jræsz-TestId.loadTestsFromNames..z&translated: %s new sources %s names %s)rrr4r#rr&rr(Úmaxrr/r0r1r2r3r'r5Ú ValueErrorÚstrÚIOErrorrr.ÚtrÚappendrÚextend) rÚnamesÚmoduler7ÚdataÚeZ translatedZ new_sourceZ really_newÚnameZtransZnew_setr)r<rÚloadTestsFromNames®sb    * $       zTestId.loadTestsFromNamescCsDt d|¡|\}}}|dk r(t|ƒ}n|}|dk r@d||fS|S)Nz Make name %sz%s:%s)rrr)rÚaddrÚfilenamerFÚcallÚheadrrrÚmakeNameös    zTestId.makeNamecCs ||_dS)zBGet handle on output stream so the plugin can print id #s N)Ústream)rrPrrrÚsetOutputStreamszTestId.setOutputStreamcCsŒ| ¡}t d|||jk¡||jkr^||jkr<| d¡n| d|j|¡d|j|<dS|j|j|<| d|j¡|jd7_dS)zMaybe output an id # before the test name. Example output:: #1 test.test ... ok #2 test.test_two ... ok zstart test %s (%s)z z#%s rN)Úaddressrrr'r)Úwriter)rÚtestZadrrrrÚ startTests      zTestId.startTestcCsP|jdkrLyt|j| ¡ƒ}Wntk r4YnX||jkrL|j |¡dS)NF)Zpassedr@r'rRÚKeyErrorrrC)rrTÚkeyrrrÚ afterTests  zTestId.afterTestcCs`t d|¡yt| dd¡ƒ}Wntk r4|SXt d|¡||jkr\| |j|¡S|S)Nztr '%s'ú#Úz Got key %s)rrÚintÚreplacer?r&rO)rrIrWrrrrB(s   z TestId.trcCs|jr|j |¡dS)N)r+rPrS)rÚoutputrrrrS5sz TestId.write)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rIr#r.rrrr8rJrOrQrUrXrBrSrrrrrns H   r)raZ__test__Úloggingr Z nose.pluginsrZ nose.utilrrÚpicklerrÚ ImportErrorÚ getLoggerr^rrrrrrÚ^s