<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pylons on Random notes from mg</title>
    <link>https://mg.pov.lt/blog/tags/pylons.html</link>
    <description>Recent content in Pylons on Random notes from mg</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>marius@gedmin.as (Marius Gedminas)</managingEditor>
    <webMaster>marius@gedmin.as (Marius Gedminas)</webMaster>
    <copyright>Copyright © 2004–2020 Marius Gedminas</copyright>
    <lastBuildDate>Mon, 21 Sep 2009 18:44:14 +0200</lastBuildDate>
    <atom:link href="https://mg.pov.lt/blog/tags/pylons/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Pylons and SQL schema migration</title>
      <link>https://mg.pov.lt/blog/pylons-and-sql-migration.html</link>
      <pubDate>Mon, 21 Sep 2009 18:44:14 +0200</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/pylons-and-sql-migration.html</guid>
      <description>
&lt;p&gt;I&#39;m at the point in my hobby project where I&#39;d like to be able to change my models
without losing all my test data.  And I&#39;m too lazy to do manual dumps and edit
the SQL in place before reimporting it.&lt;/p&gt;

&lt;p&gt;I want a system&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;that is &lt;em&gt;transparent&lt;/em&gt; to the user: if my database is at schema
      version 1, and my code is at version 3, I want it to be automatically
      upgraded to version 3 on server startup.&lt;/li&gt;
  &lt;li&gt;that is &lt;em&gt;not too hard&lt;/em&gt; on the programmer: dropping a numbered Python or SQL
      script in a directory ought to be sufficient to define a transition from
      schema version X to schema version X+1.&lt;/li&gt;
  &lt;li&gt;that &lt;em&gt;handles errors gracefully&lt;/em&gt;: makes a backup of the database
      with the old schema version; runs my script in a transaction and aborts
      that transaction if the conversion fails (while showing me enough
      information to debug the problem).&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;allows prototyping&lt;/em&gt; without having to increment the schema number for every
      little change I make to the models; I should be the one who decides that a new
      schema is ready to go out to the world.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&#39;ve been glancing at &lt;a
  href=&#34;http://code.google.com/p/sqlalchemy-migrate/&#34;&gt;SQLAlchemy-Migrate&lt;/a&gt;, since I&#39;ve
been brought up to believe &lt;abbr title=&#34;Not Invented Here&#34;&gt;NIH&lt;/abbr&gt;ing is
Bad.  But Migrate is &lt;em&gt;scary&lt;/em&gt;.  I have to admit that the longer I stare
at its documentation, the less I can describe &lt;em&gt;why&lt;/em&gt; I think so.  All
those shell commands&amp;mdash;but there&#39;s an API for invoking them from Python, so maybe I can
achieve my goals.  I&#39;ll have to try and see.
&lt;/p&gt;

</description>
    </item>
    
    <item>
      <title>Pylons with zc.buildout, continued</title>
      <link>https://mg.pov.lt/blog/pylons-with-buildout-2.html</link>
      <pubDate>Tue, 15 Sep 2009 23:31:53 +0300</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/pylons-with-buildout-2.html</guid>
      <description>
&lt;p&gt;&lt;a href=&#34;https://mg.pov.lt/blog/pylons-with-buildout.html&#34;&gt;Last time&lt;/a&gt; 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 &#39;newest = false&#39; into the [buildout]
section of buildout.cfg. We&#39;ll be running bin/buildout a lot now, since we&#39;ll
be making changes to the project environment, so this will save wear and tear
on the &#39;-&#39;, &#39;N&#39; and Shift keys.  (And, by the way, I&#39;m not trying to soak up
Google juice by repeating the word &#39;buildout&#39; a lot, honest!)&lt;/p&gt;

&lt;p&gt;I will omit bzr commits from this narrative as it&#39;s getting long; you can
assume that every self-contained change was committed separately.&lt;/p&gt;

&lt;h4&gt;tests&lt;/h4&gt;

&lt;p&gt;  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&#39;m used to typing bin/test no matter
what test runner a project happens to use):&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr diff&lt;/span&gt;
=== modified file &#39;buildout.cfg&#39;
--- 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

&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/buildout&lt;/span&gt;
...
Generated script &#39;/tmp/AlliterationSharing/bin/paster&#39;.
Generated script &#39;/tmp/AlliterationSharing/bin/test&#39;.
...
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/test&lt;/span&gt;

----------------------------------------------------------------------
Ran 0 tests in 0.276s

OK
&lt;/pre&gt;

&lt;h4&gt;ctags&lt;/h4&gt;

&lt;p&gt;Documentation is good, but sometimes you want to look at the source code of
the framework.  There&#39;s a tool called &lt;a
  href=&#34;http://ctags.sourceforge.net/&#34;&gt;ctags&lt;/a&gt; that builds a database of
identifiers.  The popular text editors &lt;a href=&#34;http://www.vim.org/&#34;&gt;Vim&lt;/a&gt;
and &lt;a href=&#34;http://www.gnu.org/software/emacs/&#34;&gt;Emacs&lt;/a&gt; can then use the
tags database to jump to a definition of any name with a single keystroke
(Ctrl-] in vim, M-. in emacs).&lt;/p&gt;

&lt;p&gt;Building the tags database is complicated by each Python package being
installed into a separate directory.  There&#39;s a buildout recipe called
z3c.recipe.tag that finds those directories and lets you build a unified tags
file.  We&#39;ll also ask buildout to make sure it &lt;em&gt;unzips&lt;/em&gt; any packages
distributed as .egg files, since ctags doesn&#39;t process those:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr diff&lt;/span&gt;
@@ -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}

&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/buildout&lt;/span&gt;
...
Generated script &#39;/tmp/AlliterationSharing/bin/ctags&#39;.
...
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/ctags&lt;/span&gt;
&lt;/pre&gt;

&lt;h4&gt;omelette&lt;/h4&gt;

&lt;p&gt;ctags lets you find classes and functions by name; it doesn&#39;t let you find
packages or modules.  There&#39;s another recipe, collective.recipe.omelette that
creates a tree of symlinks mirroring the Python package structure (here
&#39;unzip = true&#39; also comes in handy):&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr diff&lt;/span&gt;
=== modified file &#39;buildout.cfg&#39;
--- 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}

&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/buildout &lt;/span&gt;
...
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;ls -l parts/omelette&lt;/span&gt;
...
&lt;/pre&gt;

&lt;p&gt;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.

&lt;h4&gt;Makefile&lt;/h4&gt;

&lt;p&gt;This is getting long (and not everyone may be interested&lt;sup
  class=&#34;footnote&#34;&gt;1&lt;/sup&gt;), but one long post is easier to skip than five
medium ones in a row, so I&#39;ll continue.&lt;/p&gt;

&lt;blockquote class=&#34;footnotes&#34;&gt;
  &lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Sorry, &lt;a href=&#34;http://maemo.org/news/planet-maemo/&#34;&gt;Planet
    Maemo&lt;/a&gt;!  There&#39;s an &lt;a
    href=&#34;https://mg.pov.lt/blog/tag/maemo/index.rss&#34;&gt;RSS feed of posts tagged
    &#39;maemo&#39;&lt;/a&gt;, if you can figure out the URL, which is very well hidden by
    PyBlosxom, *sigh*.
  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wouldn&#39;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:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cat Makefile&lt;/span&gt;
# 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
&lt;/pre&gt;

&lt;p&gt;Now all you need to do after checking out is run &#39;make&#39; to set up a working
development environment.  &#39;make run&#39; or &#39;make test&#39; will also do that, if
necessary, so this one-liner is sufficient to get a working Hello World
application on port 5000:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr branch lp:~mgedmin/+junk/AlliterationSharing &amp;amp;&amp;amp; cd AlliterationSharing &amp;amp;&amp;amp; make run&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Try it!  You&#39;ll get a Bazaar branch with all the history of this little
blog project.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Starting a Pylons project with zc.buildout</title>
      <link>https://mg.pov.lt/blog/pylons-with-buildout.html</link>
      <pubDate>Sun, 13 Sep 2009 16:13:14 +0300</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/pylons-with-buildout.html</guid>
      <description>
&lt;p&gt;For software development I prefer &lt;a
  href=&#34;http://www.buildout.org&#34;&gt;buildout&lt;/a&gt; to &lt;a
  href=&#34;http://pypi.python.org/pypi/virtualenv&#34;&gt;virtualenv&lt;/a&gt;.  This is
because buildout has a text file describing the state of your working
environent, which can be versioned and used later to recreate it, as well
as during development to modify the environment slightly.&lt;/p&gt;

&lt;p&gt;To start a new Pylons project, first create an empty directory.  Let&#39;s
call our new project AlliterationSharing&lt;sup
class=&#34;footnote&#34;&gt;1&lt;/sup&gt;, because everybody is sick of &#39;foo&#39;
and &#39;bar&#39;.&lt;/p&gt;

&lt;blockquote class=&#34;footnotes&#34;&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Generated by randomly picking two words from
/usr/share/dict/words, then chosen over among 120 other variants that weren&#39;t
as good.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir -p ~/src/AlliterationSharing&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd ~/src/AlliterationSharing&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Now create a file called buildout.cfg with the following content:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cat buildout.cfg&lt;/span&gt;
[buildout]
parts = pylons

[pylons]
recipe = zc.recipe.egg
eggs = Pylons
       PasteScript
interpreter = python
&lt;/pre&gt;

&lt;p&gt;Download &lt;a
  href=&#34;http://svn.zope.org/zc.buildout/trunk/bootstrap/&#34;&gt;bootstrap.py&lt;/a&gt; to
it and run it to get bin/buildout.  Note: you can chose which Python version you
want to use by running bootstrap.py with it.  All other scripts under bin/
will be generated by buildout and will use the same Python interpreter.&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;wget http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;python bootstrap.py&lt;/span&gt;
Creating directory &#39;.../AlliterationSharing/bin&#39;.
Creating directory &#39;.../AlliterationSharing/parts&#39;.
Creating directory &#39;.../AlliterationSharing/eggs&#39;.
Creating directory &#39;.../AlliterationSharing/develop-eggs&#39;.
Generated script &#39;.../AlliterationSharing/bin/buildout&#39;.
&lt;/pre&gt;

&lt;p&gt;Run bin/buildout to install Pylons into your sandbox.&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/buildout&lt;/span&gt;
Installing pylons.
Generated script &#39;.../AlliterationSharing/bin/paster&#39;.
Generated interpreter &#39;.../AlliterationSharing/bin/python&#39;.
&lt;/pre&gt;

&lt;p&gt;Aside: buildout has this very nice feature where it can share Python
packages between projects.  This will save you enormous amounts of time that
would otherwise be spent downloading and unpacking eggs.  To make use of this
facility, create a file ~/.buildout/default.cfg with&lt;/p&gt;
&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cat ~/.buildout/default.cfg &lt;/span&gt;
[buildout]
eggs-directory = /home/mg/tmp/buildout-eggs
# XXX replace /home/mg with the full path of *your* home directory
# it would be much nicer if buildout let me use ~ or $HOME
# see &lt;a href=&#34;https://bugs.launchpad.net/zc.buildout/+bug/190260&#34;&gt;https://bugs.launchpad.net/zc.buildout/+bug/190260&lt;/a&gt;
&lt;/pre&gt;

&lt;p&gt;Another useful trick is to pass the -N flag to bin/buildout, which will tell
it not to bother looking for newer versions of packages on the Internet when
there&#39;s already an existing version installed in your eggs directory.&lt;/p&gt;

&lt;p&gt;Back to business: now you&#39;ve got two new scripts: bin/python and bin/paster.
You can use the first one to play with the interactive Python console where you
can now import pylons and all the dependencies; it has no other value.&lt;/p&gt;

&lt;p&gt;Now is a good point to add the files you&#39;ve created into a version control
system.  I&#39;ll arbitrarily use Bazaar.&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr init .&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr add bootstrap.py buildout.cfg&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr ignore bin parts eggs develop-eggs .installed.cfg&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr commit -m &#34;Create AlliterationSharing project&#34;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Run bin/paster create -t pylons to create a skeleton project.&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/paster create -t pylons asharing&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr ignore *.egg-info&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr add asharing&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr commit -m &#34;Generated project files with paster create&#34;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Now paster creates a directory structure that I don&#39;t like:&lt;/p&gt;

&lt;pre&gt;
AlliterationSharing/
  buildout.cfg
  bin/
  asharing/
    setup.py
    README.txt
    MANIFEST.in
    asharing/
      __init__.py
      config/
      controllers/
      templates/
      public/
&lt;/pre&gt;

&lt;p&gt;I&#39;d like the README and setup.py to be in the top level, and I dislike
repeating &#39;asharing&#39; twice in directory names.  I&#39;ll move some files around&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd asharing/&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr mv development.ini docs MANIFEST.in README.txt setup.* test.ini ../&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr rm ez_setup.*&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd ..&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr mv asharing src&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr ci -m &#34;Moved some files around&#34;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Now the tree looks like this:&lt;/p&gt;

&lt;pre&gt;
AlliterationSharing/
  buildout.cfg
  setup.py
  README.txt
  MANIFEST.in
  bin/
  src/
    asharing/
      __init__.py
      config/
      controllers/
      templates/
      public/
&lt;/pre&gt;

&lt;p&gt;We have to tell setup.py where to find the source tree&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr diff&lt;/span&gt;
=== modified file &#39;MANIFEST.in&#39;
--- MANIFEST.in	2009-09-13 13:04:00 +0000
+++ MANIFEST.in	2009-09-13 13:05:59 +0000
@@ -1,3 +1,3 @@
-include asharing/config/deployment.ini_tmpl
-recursive-include asharing/public *
-recursive-include asharing/templates *
+include src/asharing/config/deployment.ini_tmpl
+recursive-include src/asharing/public *
+recursive-include src/asharing/templates *

=== modified file &#39;setup.py&#39;
--- setup.py	2009-09-13 13:04:00 +0000
+++ setup.py	2009-09-13 13:04:40 +0000
@@ -17,7 +17,8 @@
         &#34;SQLAlchemy&amp;gt;=0.5&#34;,
     ],
     setup_requires=[&#34;PasteScript&amp;gt;=1.6.3&#34;],
-    packages=find_packages(exclude=[&#39;ez_setup&#39;]),
+    packages=find_packages(&#39;src&#39;, exclude=[&#39;ez_setup&#39;]),
+    package_dir={&#39;&#39;: &#39;src&#39;},
     include_package_data=True,
     test_suite=&#39;nose.collector&#39;,
     package_data={&#39;asharing&#39;: [&#39;i18n/*/LC_MESSAGES/*.mo&#39;]},
&lt;/pre&gt;

&lt;p&gt;(I&#39;m not sure if you also need to change package_data and/or setup.cfg; it&#39;s
possible that I left i18n in a broken state.  Can somebody comment on
this?)&lt;/p&gt;

&lt;p&gt;And we have to tell buildout that we&#39;ve got a new Python package to enable
in the project environment&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr diff buildout.cfg &lt;/span&gt;
=== modified file &#39;buildout.cfg&#39;
--- buildout.cfg	2009-09-13 12:57:21 +0000
+++ buildout.cfg	2009-09-13 13:08:05 +0000
@@ -1,8 +1,10 @@
 [buildout]
+develop = .
 parts = pylons
 
 [pylons]
 recipe = zc.recipe.egg
 eggs = Pylons
        PasteScript
+       asharing
 interpreter = python
&lt;/pre&gt;

&lt;p&gt;Now you can re-run bin/buildout and start your hello-world project&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr commit -m &#34;Include the new package in the build&#34;&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/buildout -N&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bin/paster serve --reload development.ini&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;p&gt;To be continued: &lt;a href=&#34;https://mg.pov.lt/blog/pylons-with-buildout-2.html&#34;&gt;telling buildbot to create bin/test; using ctags and omelette&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Playing with Pylons</title>
      <link>https://mg.pov.lt/blog/playing-with-pylons.html</link>
      <pubDate>Fri, 06 Feb 2009 21:54:09 +0100</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/playing-with-pylons.html</guid>
      <description>
&lt;p&gt;I&#39;ve an opportunity to get to know &lt;a
href=&#34;http://pylonshq.com/&#34;&gt;Pylons&lt;/a&gt;.  Here&#39;s an unsorted list of first (and
second) impressions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pylons has &lt;a href=&#34;http://pylonsbook.com/&#34;&gt;great&lt;/a&gt; &lt;a
      href=&#34;http://pylonshq.com/docs/en/0.9.7/&#34;&gt;documentation&lt;/a&gt;, though I did
      stumble upon a few broken links&lt;/li&gt;
  &lt;li&gt;Pylons has a great development environment (instant and automatic server
      restarts; interactive Python console in your web browser on errors)&lt;/li&gt;
  &lt;li&gt;It seems that nobody using Paste is interested in logging the startup and
      shutdown time of the web server&lt;/li&gt;
  &lt;li&gt;SQLAlchemy overwhelms with &lt;abbr title=&#34;There&#39;s More Than One Way To Do
      It!&#34;&gt;TMTOWTDI&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;zc.buildout can be replaced by a 4-line shell script using virtualenv and
      easy_install; this will save you &lt;a
        href=&#34;https://bugs.launchpad.net/zc.buildout/+bug/325658&#34;&gt;headaches&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;setuptools is made of pure crazyness, but we can&#39;t live without it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren&#39;t directly related to Pylons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;distributed version control systems are great for throwaway prototypes
      (especially when you want to compare several ways to do it)&lt;/li&gt;
  &lt;li&gt;non-distributed version control systems aren&#39;t&lt;/li&gt;
  &lt;li&gt;py.test is weird and takes some getting used to, but has some nice
      properties as a test runner; shame about breaking compatibility with
      unittest&lt;/li&gt;
  &lt;li&gt;automated functional tests for system deployment in a freshly cloned Xen
      virtual machine are cool, albeit slow-ish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;  About the naive notion that using easy_install
instead of zc.buildout would help me avoid headaches?  Muahahahahaha.  Ha.
Haha.  Muahhaaaaaa.  Wrong.&lt;/p&gt;

&lt;p&gt;Also, TMTOWTDI is maybe too strong a word for SQLAlchemy&#39;s plethora of
choices.  And you really want to be using 0.5.  And Pylons is even more awesome
than I first thought.  Obligatory grain of salt (*thud*): I haven&#39;t finished
writing my first page yet.  Integrating new stuff into existing elaborate
functional test suites takes time.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
