ZC Buildout recipe for setting up a Google App Engine development environment
Project description
Buildout recipe for setting up a Google App Engine development environment.
The rod.recipe.appengine is a zc.buildout recipe to build, test and deploy projects for the Google App Engine. 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
- use_setuptools_pkg_resources
Flag whether the recipe shall copy setuptool’s pkg_resources.py into the app directory rather than writing a dummy version. (Default=False)
- 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.2.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 ... use_setuptools_pkg_resources = True ... packages = ... bazpkg ... tinypkg ... zip-packages = False ... exclude = tests ... url = http://googleappengine.googlecode.com/files/google_appengine_1.3.2.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', 'second_sample', 'tinymodule.py')) True >>> os.path.isdir(os.path.join('parts', 'second_sample', 'baz')) True
Setuptool’s original pkg_resources.py file should be copied into our app directory:
>>> pkg_resources = os.path.join( ... 'parts', 'second_sample', 'pkg_resources.py') >>> os.path.isfile(pkg_resources) True >>> pkg_resources_file = open(pkg_resources, "r") >>> pkg_resources_file.read().startswith('def _dummy_func') False >>> pkg_resources_file.close()
Changes
1.5.0 2010-03-27
Adds option to copy setuptool’s original pkg_resources.py file into app directory rather than writing a dummy stub.
1.4.1 2010-01-18
Fixes an issue where egg contents which are just single modules aren’t copied into the project.
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for rod.recipe.appengine-1.5.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 96e7ae3059c4f0b65418e67e8de6a831378cbd933c3911eb285c9eb8e222e27c |
|
MD5 | 59c237ec64f30201285b57a03e4d000a |
|
BLAKE2b-256 | 47de84245ac086ebb302f061214de1faf7e154bd8cc70446c558ec9cafedc6f3 |
Hashes for rod.recipe.appengine-1.5.0-py2.5.egg
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3fcfc8c94ead8dcafd41fab900a660e99c019c4b1147b5aca3133bf4af847f52 |
|
MD5 | 154cc82be32a6e1ee7eb73f1d337d06d |
|
BLAKE2b-256 | 44afbdb7ce1d942394b03e3442cc9fe17a29ce787741bdd9972e64334688c459 |