py-gnitset

Homepage: https://www.github.com/quodlibetor/py-gnitset

Author: Brandon W Maister

Updated:

Summary

Run your Python tests any way you'd like

Commentary

Description
-----------

This minor mode adds some useful functionality for running Python unittest
programs from within Emacs.

It allows you to run py.test, nose, or custom test runners within various
buffer types.  py-gnitset knows about the ``virtualenv-workon`` dir-local, in
addition to allowing you to specify explicit paths to any test runner so
it's easy to write custom shell scripts that set up your test environment
however you want -- see `py-gnitset-test-runner' and
`py-gnitset-runner-format' for details.

- Compile buffer, via py-gnitset-compile-*: the shortest to type, because
  it's generally the most useful.  These buffers have the fancy "click an
  error message to go to that line in the file" functionality you expect.
- PDB buffer, via py-gnitset-pdb-*: Runs the tests in a `pdb'-buffer, with
  the "--pdb" flag appended.  This is particularly useful if you "import pdb;
  pdb.set_trace()" within your tests, as the pdb buffer tracks stepping
  through code within the associated Emacs code buffer.
- Ansi-term buffer, via py-gnitset-term-*: this is a generic escape hatch
  for when things aren't working in another buffer type.  I mostly use it for
  debugging py-gnitset-mode at this point, although it is also useful if you
  prefer ipdb to pdb+emacs pdb mode.

In addition to the various buffer types, you can select which funcions to
test via the py-gnitset-*-all, py-gnitset-*-module, py-gnitset-*-class
commands which all do the obvious things.  And the py-gnitset-*-one
commands finds the nearest class *or* def statement and runs that.

Additionally, prefixing any command with C-u will allow you to edit it in
the minibuffer before creating the buffer that you'll interact with your
tests in.  This also gets you M-p/M-n command history navigation for free,
which is nice.

My goal is to make testing Python in Emacs *obviously* the best way to do it,
so if you have ideas for how to improve things please open an issue the github
page or send me an email.  This set of commands came from the fact that I use
both py.test and nose, and the pytest and nose Emacs runners have different but
complementary features, so I kinda hacked them all together, much is owed to
both of them.

The home page is https://github.com/quodlibetor/py-gnitset

Setting Up
----------

Adding `(py-gnitset-global-mode)' to your .emacs will attempt to turn on
py-gnitset-mode in every `python-mode' buffer.

You can try py-gnitset without global installation by just calling "M-x
py-gnitset-mode" in any Python buffer.  `py-gnitset-mode' just adds
some keybindings to the C-c t map, so if you want to do something fancy you
could for example do:

   (add-hook 'python-mode-hook
              (lambda ()
                 (local-set-key (kbd "C-c n") py-gnitset-map)))

To bind the keys to the C-c n map instead, with no loss of functionality.

Default Bindings
----------------

key             binding
---             -------
C-c t a         py-gnitset-compile-all
C-c t c         py-gnitset-compile-class
C-c t m         py-gnitset-compile-module
C-c t o         py-gnitset-compile-one

C-c t p a       py-gnitset-pdb-all
C-c t p c       py-gnitset-pdb-class
C-c t p m       py-gnitset-pdb-module
C-c t p o       py-gnitset-pdb-one

C-c t r a       py-gnitset-term-all
C-c t r c       py-gnitset-term-class
C-c t r m       py-gnitset-term-module
C-c t r o       py-gnitset-term-one
C-c t r t       py-gnitset-term-again

To Do
-----

- macro-ize the py-gnitset-*-all/class/module/function duplication, so that
  it's just a matter of (def-py-gnitset-generic ...) instead of the current
  quadruple replication
- Add the ability to save custom command formulations (basically hack
  py-gnitset-run to look for the function to run based on an alist,
  rather than the static cond list)
- Add a history of test runs, instead of just clearing out test buffers.
- Add a way to run tests associated with the current *non-test* function
- Remove dependency on virtualenv.el-defined variables
- Create a new more versatile `py-gnitset-runners' alist into an alist of
  ("runner" . 'format) pairs that combines `py-gnitset-test-runner' and
  `py-gnitset-runner-format' in a way that doesn't require multiple
  dir-locals in the common case of a bunch of projects that use similar
  conventions.

Dependencies