Last time I mentioned that running bin/buildout with the -N flag makes it run faster (since it skips looking for newer versions to upgrade). You can tell buildout to do this by default by putting 'newest = false' into the [buildout] section of buildout.cfg. We'll be running bin/buildout a lot now, since we'll be making changes to the project environment, so this will save wear and tear on the '-', 'N' and Shift keys. (And, by the way, I'm not trying to soak up Google juice by repeating the word 'buildout' a lot, honest!)
I will omit bzr commits from this narrative as it's getting long; you can assume that every self-contained change was committed separately.
tests
First, I want a bin/test script to run the test suite. Pylons uses nose, so we need to tell buildout to install the nosetests script (under a different name, since I'm used to typing bin/test no matter what test runner a project happens to use):
$ bzr diff === modified file 'buildout.cfg' --- buildout.cfg 2009-09-15 19:49:11 +0000 +++ buildout.cfg 2009-09-15 19:49:18 +0000 @@ -8,5 +8,8 @@ recipe = zc.recipe.egg eggs = Pylons PasteScript + nose asharing interpreter = python +scripts = paster + nosetests=test $ bin/buildout ... Generated script '/tmp/AlliterationSharing/bin/paster'. Generated script '/tmp/AlliterationSharing/bin/test'. ... $ bin/test ---------------------------------------------------------------------- Ran 0 tests in 0.276s OK
ctags
Documentation is good, but sometimes you want to look at the source code of the framework. There's a tool called ctags that builds a database of identifiers. The popular text editors Vim and Emacs can then use the tags database to jump to a definition of any name with a single keystroke (Ctrl-] in vim, M-. in emacs).
Building the tags database is complicated by each Python package being installed into a separate directory. There's a buildout recipe called z3c.recipe.tag that finds those directories and lets you build a unified tags file. We'll also ask buildout to make sure it unzips any packages distributed as .egg files, since ctags doesn't process those:
$ bzr diff @@ -1,8 +1,9 @@ [buildout] develop = . -parts = pylons +parts = pylons ctags newest = false +unzip = true [pylons] recipe = zc.recipe.egg @@ -13,3 +14,7 @@ interpreter = python scripts = paster nosetests=test + +[ctags] +recipe = z3c.recipe.tag:tags +eggs = ${pylons:eggs} $ bin/buildout ... Generated script '/tmp/AlliterationSharing/bin/ctags'. ... $ bin/ctags
omelette
ctags lets you find classes and functions by name; it doesn't let you find packages or modules. There's another recipe, collective.recipe.omelette that creates a tree of symlinks mirroring the Python package structure (here 'unzip = true' also comes in handy):
$ bzr diff === modified file 'buildout.cfg' --- buildout.cfg 2009-09-15 20:04:42 +0000 +++ buildout.cfg 2009-09-15 20:05:30 +0000 @@ -1,6 +1,6 @@ [buildout] develop = . -parts = pylons ctags +parts = pylons ctags omelette newest = false unzip = true @@ -18,3 +18,7 @@ [ctags] recipe = z3c.recipe.tag:tags eggs = ${pylons:eggs} + +[omelette] +recipe = collective.recipe.omelette +eggs = ${pylons:eggs} $ bin/buildout ... $ ls -l parts/omelette ...
The symlink tree is created under parts/omelette/. For example, if you want to see what webhelper tags were available, you can open parts/omelette/webhelper/html/builder.py in your editor and see.
Makefile
This is getting long (and not everyone may be interested1), but one long post is easier to skip than five medium ones in a row, so I'll continue.
1 Sorry, Planet Maemo! There's an RSS feed of posts tagged 'maemo', if you can figure out the URL, which is very well hidden by PyBlosxom, *sigh*.
Wouldn't it be nice if new developers could check out your project and start it up with just a couple of commands? Make is a time-tested tool that works well for this:
$ cat Makefile # Just remember that you need to use real tabs, not spaces, in a Makefile PYTHON = python .PHONY: all all: bin/paster .PHONY: run run: bin/paster bin/paster serve development.ini --reload .PHONY: test check test check: bin/test bin/test .PHONY: tags tags: bin/ctags bin/ctags bin/paster bin/test bin/python bin/ctags: bin/buildout bin/buildout bin/buildout: bootstrap.py $(PYTHON) bootstrap.py
Now all you need to do after checking out is run 'make' to set up a working development environment. 'make run' or 'make test' will also do that, if necessary, so this one-liner is sufficient to get a working Hello World application on port 5000:
$ bzr branch lp:~mgedmin/+junk/AlliterationSharing && cd AlliterationSharing && make run
Try it! You'll get a Bazaar branch with all the history of this little blog project.