skip to navigation
skip to content

Not Logged In

rod.recipe.appengine 1.4.1

ZC Buildout recipe for setting up a google appengine development environment

Latest Version: 2.0.2

Buildout recipe for setting up a google appengine development environment.

The rod.recipe.appengine is a zc.buildout recipe to build, test and deploy projects for the google appengine. It makes it easy to use eggs and resolve their dependencies automatically.

To be honest, this is a recipe for scrambled eggs. It produces a zip file containing all configured external packages in a traditional folder hierarchy.

A brief documentation

This recipe takes a number of options:

appengine-lib
Path to an already installed appengine library
eggs
List of required eggs
exclude
A list of basenames to be excluded when setting up the application files, e.g. the whole 'tests' directory.
packages
A list of packages to be included into the zip archive, which will be uploaded to the appspot.
server-script
The name of the script to run the development server.
src
The directory which contains the project source files.
url
The url for fetching the google appengine distribution
zip-name
The name of the zip archive containing all external packages ready to deploy.
zip-packages
Flag whether external packages shall be zipped in single zip file. (Default=True)

Tests

We will define a buildout template used by the recipe:

>>> buildout_template = """
... [buildout]
... develop = %(dev)s
... parts = sample
...
... [sample]
... recipe = rod.recipe.appengine
... eggs = foo.bar
... packages =
...     bazpkg
...     tinypkg
... server-script = dev_appserver
... zip-packages = False
... exclude = tests
... url = http://googleappengine.googlecode.com/files/google_appengine_1.3.0.zip
... """

We'll start by creating a buildout:

>>> import os.path
>>> import rod.recipe.appengine.tests as tests
>>> egg_src = os.path.join(os.path.split(tests.__file__)[0], 'foo.bar')
>>> baz_pkg = os.path.join(os.path.split(tests.__file__)[0], 'bazpkg')
>>> tiny_pkg = os.path.join(os.path.split(tests.__file__)[0], 'tinypkg')
>>> write('buildout.cfg', buildout_template %
...       {'dev': egg_src+' '+baz_pkg+' '+tiny_pkg})

Running the buildout gives us:

>>> output = system(buildout)
>>> if output.endswith("Google App Engine distribution...\n"): True
... else: print output
True

And now we try to run the appserver script:

>>> print system(os.path.join('bin', 'dev_appserver'))
<BLANKLINE>
...
Invalid arguments
<BLANKLINE>

There should be a configuration script in bin as well:

>>> print system(os.path.join('bin', 'appcfg'))
Usage: appcfg [options] <action>
<BLANKLINE>
...
<BLANKLINE>

Let's see if the 'tests' directory has been excluded:

>>> l = os.listdir(os.sep.join(['parts', 'sample', 'foo', 'bar']))
>>> assert 'tests' not in l

There should be a baz package within our application directory:

>>> assert 'baz' in os.listdir(os.sep.join(['parts', 'sample']))

Let's define another buildout template used by the recipe:

>>> buildout_template = """
... [buildout]
... develop = %(dev)s
... parts = second_sample
...
... [second_sample]
... recipe = rod.recipe.appengine
... eggs = foo.bar
... packages =
...     bazpkg
...     tinypkg
... zip-packages = False
... exclude = tests
... url = http://googleappengine.googlecode.com/files/google_appengine_1.3.0.zip
... """

We'll start by creating a buildout:

>>> import os.path
>>> import rod.recipe.appengine.tests as tests
>>> egg_src = os.path.join(os.path.split(tests.__file__)[0], 'foo.bar')
>>> baz_pkg = os.path.join(os.path.split(tests.__file__)[0], 'bazpkg')
>>> tiny_pkg = os.path.join(os.path.split(tests.__file__)[0], 'tinypkg')
>>> write('buildout.cfg', buildout_template %
...       {'dev': egg_src+' '+baz_pkg+' '+tiny_pkg})

Running the buildout gives us:

>>> output = system(buildout)
>>> if output.endswith(
...     "Google App Engine distribution already downloaded.\n"): True
... else: print output
True

And now we try to run the appserver script:

>>> print system(os.path.join('bin', 'second_sample'))
<BLANKLINE>
...
Invalid arguments
<BLANKLINE>

Let's have a look if all dependent packages are copied into our application directory:

>>> os.path.isfile(os.path.join('parts', 'sample', 'tinymodule.py'))
True
>>> os.path.isdir(os.path.join('parts', 'sample', 'baz'))
True

Changes

1.4.1 2010-01-18

1.4.0 2009-08-26

  • Added server-script option.
  • Tests added.

1.3.1 2009-07-15

  • Fixed issue when copying egg contents.

1.3.0 2009-07-04

  • Added options zip-packages and exclude.

1.2.1 2009-07-03

  • Uses a much better method for excluding optional c extensions and compiled modules.
  • A step forward in platform independence.

1.2.0 2009-06-24

  • Creates appcfg script.

1.1.1 2009-06-07

  • Makes symbolic links for application files.
  • Downloads stay untouched.

1.1.0 2009-04-08

  • Mostly rewritten.
  • Installs google appengine as part.
  • Adding dummy pkg_resources module to handle namespace package relicts.
  • Tests added.
  • Ready for Google App Engine SDK 1.2.0

1.0.0b5 2009-01-20

  • Requires Google App Engine SDK 1.1.8

1.0.0b4 2008-09-04

  • Create and use PROJECT_HOME/var to place temporary project files like data base files.

1.0.0b3 2008-09-02

  • Copy package contents to temporary library directory.

1.0.0b2 2008-09-02

  • Installs the whole distribution in the parts directory now. So it is ready to test and deploy.

1.0.0b1 2008-09-01

  • First beta release.
 
File Type Py Version Uploaded on Size
rod.recipe.appengine-1.4.1-py2.5.egg (md5) Python Egg 2.5 2010-01-18 18KB
rod.recipe.appengine-1.4.1.tar.gz (md5) Source 2010-01-18 11KB
  • Downloads (All Versions):
  • 86 downloads in the last day
  • 695 downloads in the last week
  • 2980 downloads in the last month