================
Nose Progressive
================

Nose Progressive is a nose_ plugin which displays progress in a stationary
progress bar, freeing the rest of the screen (as well as the scrollback buffer)
for the compact display of test failures. It displays failures and errors as
soon as they occur and avoids scrolling them off the screen in favor of less
useful output.

.. _nose: http://somethingaboutorange.com/mrl/projects/nose/

The governing philosophy of Nose Progressive is to get useful information onto
the screen as soon as possible and keep it there as long as possible while
still indicating progress.

Features
========

* Indicate progress in a stationary progress bar rather than scrolling useful
  tracebacks off the screen or spacing them out with dots and cruft.
* Show tracebacks as soon as they occur rather than waiting until the bitter
  end. Strip the "Traceback (most recent call last):" off tracebacks so they
  take less space.
* Identify failed tests in a format that can be fed back to nose, so it's easy
  to re-run them.
* Print a filesystem path complete with vi-style line number, so you can paste
  it to the commandline and be taken straight to the bug in your editor.
* Work great with Django via django-nose_ (of course).

.. _django-nose: https://github.com/jbalogh/django-nose

Installation
============

::

  pip install nose-progressive

Or, to get the bleeding-edge, unreleased version::

  pip install -e \
    git://github.com/erikrose/nose-progressive.git#egg=nose-progressive

Use
===

::

  nosetests --with-progressive

Example
=======

The following doesn't quite do it justice; in an actual terminal, the 2
pathname lines after FAIL or ERROR are **bold** to aid visual chunking, and the
progress bar at the bottom is bold as well::

  % nosetests --with-progressive
  
  FAIL: kitsune.apps.notifications.tests.test_events:MailTests.test_anonymous
        apps/notifications/tests/test_events.py +31
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 279, in run
      testMethod()
    File "/Users/erose/Checkouts/kitsune/../kitsune/apps/notifications/tests/test_events.py", line 361, in test_anonymous
      eq_(1, len(mail.outbox))
    File "/Users/erose/Checkouts/kitsune/vendor/packages/nose/nose/tools.py", line 31, in eq_
      assert a == b, msg or "%r != %r" % (a, b)
  AssertionError

  ERROR: kitsune.apps.questions.tests.test_templates:TemplateTestCase.test_woo
         apps/questions/tests/test_templates.py +494
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 279, in run
      testMethod()
    File "/Users/erose/Checkouts/kitsune/vendor/packages/mock/mock.py", line 196, in patched
      return func(*args, **keywargs)
    File "/Users/erose/Checkouts/kitsune/../kitsune/apps/questions/tests/test_templates.py", line 494, in test_woo
      attrs_eq(mail.outbox[0], to=['some@bo.dy'],
  IndexError: list index out of range

  kitsune.apps.questions.tests.test_templates:TaggingViewTestsAsAdmin.test_add_new_canonicalizes         [===========-  ]

Caveats and known bugs
======================

* Skipped tests get counted in Python 2.6, but they don't get printed. I
  consider skips something to be discouraged, so I plan to fix this.
* Tests which themselves write to stderr will smear bits of the progress bar
  upward if they don't print complete lines. I hope to fix this with some
  monkeypatching, but in the meantime, passing ``--logging-clear-handlers``
  fixes most of these in practice.
* I haven't tried this in anything but Python 2.6. Bug reports are welcome!
* No tests yet. Ironic? :-)

Got more? Pop over to the `issue tracker`_.

.. _`issue tracker`: https://github.com/erikrose/nose-progressive/issues

Future plans
============

* Commandline switches for every little thing

Kudos
=====

Thanks to Kumar McMillan for his nose-nicedots_ plugin, which provided
inspiration and starting points for the path formatting. Thanks to my
support.mozilla.com teammates for writing so many tests that this became
necessary.

.. _nose-nicedots: https://github.com/kumar303/nose-nicedots

Version history
===============

0.3
  * Progress bar now works with plain old nosetests, not just django-nose.
    Sorry about that!
  * Stop printing the test name twice in the progress bar.
  * Add basic terminal resizing (SIGWINCH) support. Expanding is great, but
    contracting is still a little ugly. Suggestions welcome.

0.2
  * Real progress bar!
  * Don't crash at the end when ``--no-skips`` is passed.
  * Print the exception, not just the traceback. That's kind of important. :-)
  * Don't crash when a requested test doesn't exist.

0.1.2
  * More documentation tweaks. Package ``long_description`` now contains README.

0.1.1
  * Add instructions for installing without git.
  * Change package name in readme to the hypenated one. No behavior changes.

0.1
  * Initial release
