{ "info": { "author": "Thomas Bohmbach, Jr.", "author_email": "thomas@gumption.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Internet :: WWW/HTTP", "Topic :: Utilities" ], "description": "Substrate\n=========\n\nSubstrate is a base application and set of libraries for making\n`Google App Engine python`_ development easier. It includes a base app with management\nscript, testing already set up, a set of common helper functions\n(`agar`_), and a serialization library (`restler`_). It also comes with\ncommon libraries like `webapp2`_ and `pytz`_ ready to go.\n\nSubstrate is based on best practices for `Google App Engine python`_ learned in\ndeveloping several real-world applications with many users.\n\nWe are tired of seeing App Engine frameworks languish unsupported. For\nthat reason, Substrate is **NOT** a framework. It is a base\napplication with a set of libraries and helpers. No more, no less.\n\nResources\n---------\n\n* `Documentation`_\n* `PyPI Package`_\n* `Source Code Repository`_\n\nInstallation\n------------\n\nTo install substrate, run::\n\n $ easy_install substrate\n\nTo update your substrate installation to the newest release::\n\n $ easy_install --upgrade substrate\n\nTo install or update manually, `download the PyPI package`_,\n(or to stay on the bleeding edge, clone the `substrate repository`_) and run::\n\n $ python setup.py install\n\nCreating a new application\n--------------------------\n\nTo create a new application, run::\n\n $ substrate new your-app-id\n\nThis will create a new directory ``your-app-id`` and unpack the substrate\napplication libraries in it. The application name in ``app.yaml`` will be\nset to ``your-app-id``.\n\nOr, if you find installing a script to do this for you tedious, you\ncan clone the `substrate repository`_ and copy the ``app`` directory to\ncreate your application.\n\nUpgrading an existing application\n---------------------------------\n\nIf you have an existing application, you can upgrade it to the latest\nsubstrate code by updating the substrate package (see `Installation`_) and then running::\n\n $ substrate update ~/development/your-app-id\n\nwhere ``~/development/your-app-id`` is the application directory\n(the one containing your ``app.yaml`` file) to upgrade.\n(For example, you could run this in the current directory with ``.``)\n\nThis command will NOT touch any of your application's files. Only\n\"substrate files\" in the ``local/substrate`` and ``lib/substrate`` directories plus\n``manage.py`` and ``env_setup.py`` in the application directory will be\noverwritten. You can add new files to ``local/usr`` and ``lib/usr``, but do not\nedit existing \"substrate files\" or your changes will be lost when upgrading.\n\nManagement Console\n------------------\n\n``manage.py`` is a management console for your app. It can invoke several commands.\n\n::\n\n $ ./manage.py shell\n\nRuns a shell against your local application (uses `iPython`_ if available).\n\n::\n\n $ ./manage.py rshell\n\nRuns a remote shell against your application on Google App\nEngine. To specify a different application ID than what is in your\n``app.yaml``, use ``-A``. If your remote API endpoint is not at\nthe default location, you can pass the path as an argument.\n\n::\n\n $ ./manage.py test\n\nRuns your application's tests. Any additional parameters are passed to the `unitetest2 discover`_ command::\n\n $ ./manage.py test --help\n\n Usage: unit2 discover [options]\n\n Options:\n -h, --help show this help message and exit\n -v, --verbose Verbose output\n -f, --failfast Stop on first fail or error\n -c, --catch Catch ctrl-C and display results so far\n -b, --buffer Buffer stdout and stderr during tests\n -s START, --start-directory=START\n Directory to start discovery ('.' default)\n -p PATTERN, --pattern=PATTERN\n Pattern to match tests ('test*.py' default)\n -t TOP, --top-level-directory=TOP\n Top level directory of project (defaults to start\n directory)\n\nAdding Your Own Commands\n------------------------\n\n``manage.py`` will add .py files in the\n``local/usr/manage/substrate_manage_usr/commands`` directory as\ncommands.\n\nAdding New Libraries to Your App\n--------------------------------\n\nSubstrate stores its libraries in ``lib/substrate`` and\n``local/substrate/lib`` (for libraries that should not be deployed to\nGoogle App Engine). Do not add new libraries to these directories as\nthey are removed and re-copied on upgrade.\n\nUser libraries can be placed in ``lib/usr`` and\n``local/usr/lib``. These paths are added to ``sys.path`` by\n``env_setup.setup``\n\n\nTesting\n-------\n\nAs noted above, ``manage.py`` has a ``test`` command. This runs all\nthe tests in the ``tests`` directory of your application using\n`unittest2`_. Included with the Substrate base app is a simple \"hello\nworld\" test that you can run to verify your installation. It is\nlocated in ``tests/handlers/test_main.py``.\n\nSubstrate includes test helpers located in the `agar.test`_\npackage. ``agar.test`` uses ``google.appengine.ext.testbed`` to set up your\nGoogle App Engine environment fresh before each test run. It is mostly\nAPI compatable with the old `gaetestbed`_ project, plus new additions.\n\nLicense\n-------\n\nSubstrate is mostly a packaging of other libraries, which have their\nown licenses. Original code in Substrate is under the `MIT license`_.\n\n.. Links\n\n.. _Documentation: http://packages.python.org/substrate\n\n.. _PyPI Package: http://pypi.python.org/pypi/substrate\n.. _download the PyPI package: http://pypi.python.org/pypi/substrate#downloads\n\n.. _Source Code Repository: http://bitbucket.org/gumptioncom/substrate\n.. _substrate repository: http://bitbucket.org/gumptioncom/substrate\n\n.. _agar: http://packages.python.org/substrate/agar.html\n.. _restler: http://packages.python.org/substrate/restler.html\n\n.. _Google App Engine python: http://code.google.com/appengine/docs/python/overview.html\n\n.. _unittest2: http://pypi.python.org/pypi/unittest2\n.. _unitetest2 discover: http://docs.python.org/library/unittest.html#test-discovery\n\n.. _webapp2: http://code.google.com/p/webapp-improved/\n\n.. _pytz: http://pytz.sourceforge.net/\n\n.. _iPython: http://ipython.org/\n\n.. _MIT License: http://www.opensource.org/licenses/mit-license.php\n\n.. _agar.test: http://packages.python.org/agar/agar.html#module-agar.test\n\n.. _gaetestbed: https://github.com/jgeewax/gaetestbed", "description_content_type": null, "docs_url": "https://pythonhosted.org/substrate/", "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://bitbucket.org/gumptioncom/substrate", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "substrate", "package_url": "https://pypi.org/project/substrate/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/substrate/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://bitbucket.org/gumptioncom/substrate" }, "release_url": "https://pypi.org/project/substrate/0.7.2/", "requires_dist": null, "requires_python": null, "summary": "A base application with a collection of libraries for making Google App Engine development easier.", "version": "0.7.2" }, "last_serial": 748974, "releases": { "0.4": [ { "comment_text": "", "digests": { "md5": "266707e82ca38246c8c8fd48eac663c5", "sha256": "3938b6d04af98bdc4f1f903cbdaaf1d3036b7039601356606f21484be20a7ab5" }, "downloads": -1, "filename": "substrate-0.4-py2.5.egg", "has_sig": false, "md5_digest": "266707e82ca38246c8c8fd48eac663c5", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 957979, "upload_time": "2011-11-09T00:10:43", "url": "https://files.pythonhosted.org/packages/ad/df/a7696204c96d6bf86fcd913a49c1e5b24c7b570268b887db6a734bb8439f/substrate-0.4-py2.5.egg" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "70c5344a08c9b7ed2fa7ce977fde804b", "sha256": "668fce56f99cae2097d4533b3455c446905af474d8d4d88a96a284a57bcba084" }, "downloads": -1, "filename": "substrate-0.5-py2.5.egg", "has_sig": false, "md5_digest": "70c5344a08c9b7ed2fa7ce977fde804b", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 1059824, "upload_time": "2011-11-16T23:37:56", "url": "https://files.pythonhosted.org/packages/1c/a6/909ff14622fc17e7abd3841385f8750803f0cb739c044906c6c79ea5f012/substrate-0.5-py2.5.egg" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "0b1ab8217d6a7044e93aae918484c799", "sha256": "11358ad5c244bd80f8498ccc5d4d045d2a7687a277c26de0275e1fd971492913" }, "downloads": -1, "filename": "substrate-0.5.1-py2.5.egg", "has_sig": false, "md5_digest": "0b1ab8217d6a7044e93aae918484c799", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 968931, "upload_time": "2011-11-22T22:11:51", "url": "https://files.pythonhosted.org/packages/38/08/23fba35045262a00120d8e2220b787d1bb4eb10e8ef355bdd60779f291ac/substrate-0.5.1-py2.5.egg" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "f12569d1906c347d4ee05d9dacc866f3", "sha256": "2d10bbca5baae45b48d2cbf95bcba6a9fd104085fd1c95c7662e6af59de97d28" }, "downloads": -1, "filename": "substrate-0.7-py2.7.egg", "has_sig": false, "md5_digest": "f12569d1906c347d4ee05d9dacc866f3", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 669290, "upload_time": "2012-09-10T00:11:53", "url": "https://files.pythonhosted.org/packages/43/01/3189eccb3bc78040f7793014f3a88777f3c44689d056c8fb91d56f217214/substrate-0.7-py2.7.egg" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "b67bcc80b202a0c722b0e55ce611e1f3", "sha256": "13839eea2875aa83fd345a773493b297031523145cdd01ccdea53cda0966d4aa" }, "downloads": -1, "filename": "substrate-0.7.1-py2.7.egg", "has_sig": false, "md5_digest": "b67bcc80b202a0c722b0e55ce611e1f3", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 669446, "upload_time": "2012-09-11T15:36:10", "url": "https://files.pythonhosted.org/packages/e4/9f/ef3d029b4604f84a2bb9c8bcb7f9f51dce2a4e304d5310b74f4cf74d6613/substrate-0.7.1-py2.7.egg" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "df74bcaf532027efd80283969338c52e", "sha256": "41620574358b302da83023df9a4e776ab9a1b5619ba12ef727a93b56ce2fcf07" }, "downloads": -1, "filename": "substrate-0.7.2-py2.7.egg", "has_sig": false, "md5_digest": "df74bcaf532027efd80283969338c52e", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 673433, "upload_time": "2012-09-11T15:41:56", "url": "https://files.pythonhosted.org/packages/bf/39/bb1eac4e0a002f8364bd8ec0abd51ceabac1dbf8d40e0f6a992e8235dc28/substrate-0.7.2-py2.7.egg" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "df74bcaf532027efd80283969338c52e", "sha256": "41620574358b302da83023df9a4e776ab9a1b5619ba12ef727a93b56ce2fcf07" }, "downloads": -1, "filename": "substrate-0.7.2-py2.7.egg", "has_sig": false, "md5_digest": "df74bcaf532027efd80283969338c52e", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 673433, "upload_time": "2012-09-11T15:41:56", "url": "https://files.pythonhosted.org/packages/bf/39/bb1eac4e0a002f8364bd8ec0abd51ceabac1dbf8d40e0f6a992e8235dc28/substrate-0.7.2-py2.7.egg" } ] }