Skip to content

quodlibetor/py-gnitset

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Description

Run your Python tests any way you'd like

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 there is 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

Note

This is a manually edited version of the description from py-gnitset.el. As such it might have errors or be seriously out of date. Please see that file for the real README.

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.

About

Testing Python in Emacs, any way you want to.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published