{ "info": { "author": "Simone Deponti", "author_email": "simone.deponti@abstract.it", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Topic :: Software Development :: Build Tools" ], "description": ".. contents::\n\n.. warning::\n This recipe has been deprecated in favor of `djc.recipe2`_.\n If you are starting a new project,\n **don't use this package**,\n use `djc.recipe2`_.\n This package might see minor bug fixes to keep existing buildouts running,\n but it won't gain new features.\n\nThis recipe allows you to setup a Django_ project through `zc.buildout`_.\n\nUsage\n*****\n\nThe main scope of the recipe is to abstract out the ``settings.py`` file,\nallowing settings to reside inside the buildout instead of having them reside\ninto code (leading to an awkard handling of the same in respect to versioning,\nfor example). The ``settings.py`` file is generated by a template, either the\ndefault one, the default one and a user extension, or a totally new one.\n\nThe template uses the Tempita_ templating system.\n\nThe most basic usage of this recipe is as follows: ::\n\n [buildout]\n parts = django\n\n [django]\n recipe = djc.recipe\n project = my.project\n\nWhere ``my.project`` is an importable package containing a ``urls`` module and\na ``templates`` directory.\n\nAs you see, very few options are specified here: the defaults are used to build\nup the ``settings.py`` file.\n\nOf course, real examples tend to be slightly more complex: see Options_,\n`Default template options`_ and `Example usage`_ for more details.\n\nRunning tests\n*************\n\nThe ``README.txt`` located within the package also acts as main doctest.\n\nTo run the tests, check out the source, and then bootstrap and run the buildout::\n\n $ python bootstrap.py\n $ bin/buildout\n\nThen you can run the tests using::\n\n $ bin/test\n\nLinks\n*****\n\n- Code repository: http://github.com/abstract-open-solutions/djc.recipe\n- Discussions at https://groups.google.com/group/djcrecipe\n- Comments and questions at info@abstract.it\n\n.. _Django: http://www.djangoproject.com/\n.. _`zc.buildout`: http://www.buildout.org/\n.. _Satchmo: http://www.satchmoproject.com\n.. _`djc.recipe2`: http://pypi.python.org/pypi/djc.recipe2\n\nDetailed Documentation\n**********************\n\nOptions\n=======\n\nThe options of this recipe are not fixed, as many of those are used exclusively\nwithin the settings template file (see Templating_).\n\nHere we present the options that have an impact on the recipe aswell:\n\nproject\n This identifies a python module (in dotted notation) that can serve as\n project package. The bare minimum for a project package is to contain a\n ``urls.py`` file and a ``templates`` directory. It is mandatory unless both\n the ``urlconf`` and ``templates`` option are defined.\n\nurlconf\n Identifies the module that contains the url definition: if omitted the file\n ``urls.py`` inside the module given as ``project`` is used.\n\ntemplates\n Identifies the templates directory. If omitted, the directory named\n ``templates`` located in the module given as ``project`` is used.\n\nstatic-directory\n Identifies the folder into which static content (images, CSS and\n Javascripts) will go. Relatives path are considered relative to the\n buildout directory. The directory will be created if not present, and\n nothing will be done if it already exists. If omitted, defaults to\n ``static``.\n\nmedia-directory\n Identifies the folder into which uploaded files will go. If omitted,\n defaults to ``media``.\n\nsettings-template\n If specified, the given template is used to generate the ``settings.py``\n file, if not provided, the default template will be used. See Templating_\n for more details.\n\nsettings-template-extension\n If specified, the given template is appended to the template specified by\n ``settings template`` or to the default one.\n\nstatic-origin\n If specified, defines directories from which to copy the static files that\n have to go in ``static-directory``: see `Static origin`_ for more details.\n\nlink-static-origin\n Boolean value, defaults to ``false``. If set, the files will be symlinked\n instead of copied. Does work only on unix.\n\nmedia-origin\n If specified, defines directories from which to copy the data files that\n have to go in ``media-directory``: see ``static-origin`` option for\n details.\n\nbase-settings\n A settings module (only absolute imports) that is extended by the current\n settings, for example ``my.module.settings``.\n If specified, the defaults for ``apps``, ``middleware`` and\n ``template-loaders`` becomes an empty string (resulting into them not being\n written at all).\n It is unset by default.\n\nwsgi\n Defaults to ``false``. If set to ``true`` (or ``on`` or ``1``) creates a\n script in ``parts/$partname`` named ``$partname.wsgi.py`` that can be used\n as WSGI script in Apache or other WSGI enabled webserver.\n\nwsgi-logfile\n If set, the log will be redirected here: defaults to not being set.\n\nwsgi-loglevel\n Sets the log level: it is only processed if ``wsgi-loglevel`` is also set.\n The accepted values are: ``debug``, ``info``, ``warning``, ``error``,\n ``critical``\n\ncoding\n The encoding of the resulting settings file. Defaults to ``utf-8``.\n\nAdvanced options\n----------------\n\n.. note:: All these options are optional and should not be necessary under\n normal conditions, but might be useful to advanced users.\n\nThe following advanced options are supported:\n\nextra-paths\n A number of non-standard paths where additional python modules are located.\n\npth-files\n A number of pth-files from which to load additional python modulesthat\n should be present in the buildout.\n\ninitialization\n Allows extra python code to be added to both the manage and the *WSGI*\n script: see `Custom initialization`_ for more details.\n\nenvironment-vars\n Allows one to override OS environment vars by setting them during\n ``manage.py`` run. One environment variable name and value per line, space\n separated. Variable values can be hardcoded or buildout template mechanism\n can be used where you refer to other variables set in buildout.\n\n Example::\n\n environment-vars =\n GOOGLE_APPENGINE_PROJECT_ROOT ${buildout:appengine-base-path}\n TZ Europe/Helsinki\n\n You might want to also check ``gocept.recipe.env`` buildout recipe if you\n wish to extend existing environment variables, like ``PATH``.\n See `Custom initialization`_ for more details and an example.\n\nTemplating\n==========\n\nThe ``settings.py`` file is generated by interpolating the options of the\nbuildout section with a template, be it the default one or the one provided by\nthe ``settings-template`` option.\n\nThe template must be a valid Tempita_ template, to which the whole options of\nthe current buildout section is passed as namespace, integrated as follow:\n\n1. In the options name, all minuses (``-``) are converted to underscores\n (``_``)\n\n2. The option ``name`` and ``secret`` are added, respectively mapping to the\n buildout section name and to a randomly-generated secret [#]_.\n\n3. A serie of functions is added to the namespace to simplify the handling of\n some situations, see below for more details.\n\n\nFunctions\n---------\n\nA certain number of functions can be used inside the templates:\n\nabsolute_url\n Takes a path and, if it is relative, concatenates it with the buildout\n location to make it absolute.\n\nlistify\n Takes a chunk of data, splits it into lines, trims those lines and returns\n the obtained list, from which void strings are purged.\n\nrfc822tuplize\n This function is quite specialized and takes any string in the form\n ``Full Name `` into a tuple composed by the full\n name and the mail address. It will return a tuple with the unchanged data\n if the data fed in does not conform to the specifics.\n\nboolify\n This functions returns ``True`` if the data fed is is any of ``true``,\n ``on``, ``1`` (case- insensitive) and ``False`` otherwise\n\njoin\n Equivalent of string's ``join()`` method, with the data to join as first\n parameter, the *infix* as second and two optional parameters *prefix*\n (added just one to the beginning) and *suffix* (added just one to the end)\n\ndump\n An alias of ``repr``.\n\n\nDefault template options\n------------------------\n\nThe default template accepts a number of options. They are to be considered all\noptional, as sensible defaults will be provided if omitted.\n\ndatabase\n The settings of the default Django database, in the form\n ``engine= (user= password=) (host=) (port=) name= (options=())``.\n Parenthesized values are to be considered as optional. It is to be noted\n that the options are expected to be enclosed within parentesis (``(``),\n separated by comma and in the form ``=``.\n An example url might be:\n ``engine=django.db.backends.mysql user=usr password=pwd host=localhost port=3306 name=mydb options=(opt1=val1,opt2=val2)``\n where ``usr``, ``pwd``, ``mydb`` etc should be replaced by your\n configuration values.\n Defaults to\n ``engine=django.db.backends.sqlite3 name=/${buildout:directory}/storage.db``\n\n .. note::\n The old url-like format is still functioning but is currently\n deprecated and might be removed in the future.\n\nadditional-databases\n A list of databases in the form ``name=parameters``, each on one line,\n where ``name`` is the Django-internal database name and ``parameters`` is\n the database settings in the same form as that provided by ``database``\n\nmedia-url\n The static content prefix path. Defaults to ``media``\n\nadmin-media\n The admin only static content prefix path. Defaults to ``admin_media``\n\ntimezone\n The timezone: defaults to ``America/Chicago``\n\nlanguage-code\n The language code: defaults to ``en-us``\n\nuse-l10n\n Whether to use *l10n* or not: defaults to ``true``\n\nserver-mail\n The email address from which site-generate mails come from. Defaults to\n ``root@localhost``\n\nadmins\n The list of site admins, in *RFC822* form. Defaults to\n ``John Smith ``\n\nmanagers\n The list of managers: same as for *admins*. Defaults to copy the value of\n *admins*\n\nmiddleware\n The list of middleware classes to load. If an empty string, the value is\n not written at all.\n\napps\n The list of apps to load. If empty, the value is not written at all.\n\ntemplate-loaders\n The list of template loaders to use. If empty, the value is not written at\n all.\n\ndebug\n If ``true``, activates debug mode. Defaults to ``false``\n\ninternal-ips\n The IPs that are allowed to see full stack traces when in debug. Defaults\n to ``127.0.0.1``\n\nsite-id\n The Django site id. Defaults to unset.\n\ntemplate-context-processors\n The Django template context processors. Defaults to unset.\n\nauthentication-backends\n The Django authentication backends. Defaults to unset\n\nlanguages\n A list of supported languages in the form ``code Fullname``, for example\n ``en-us English (US)``. Defaults to unset.\n\nmail-backend\n The mail backend to use. Defaults to\n ``django.core.mail.backends.smtp.EmailBackend``.\n\nmail-filepath\n The directory to use if the file mail backend is used [#]_.\n\nsmtp-host\n The SMTP host to use when sending mail. Defaults to unset.\n\nsmtp-port\n The SMTP server port. Defaults to unset.\n\nsmtp-user\n The username to use to connect to the SMTP server. Defaults to unset.\n\nsmtp-password\n The password to use to connect to the SMTP server. This is not valid if\n ``smtp-user`` is not set aswell. Defaults to unset.\n\nsmtp-tls\n Whether TLS should be used when connecting to the SMTP server (boolean\n option). Defaults to ``false``.\n\nsite-domain\n The site domain. Defaults to unset.\n\nsite-name\n The site title. Defaults to unset.\n\ncache-backend\n The cache backend. Defaults to ``locmem:///``.\n\ncache-timeout\n The cache timeout in seconds. Defaults to ``60*5``.\n\ncache-prefix\n The cache prefix (prefixed at all cache IDs). Defaults to ``Z``.\n\nfixture-dirs\n The directories into which search for fixtures. Not set by default.\n\nDeprecated options\n------------------\n\nThese options are still supported within templates, but they are pending\ndeletion.\n\ndatabase-engine\n The database engine to use.\n\ndatabase-name\n The name of the database to use.\n\ndatabase-user\n The username to use when connecting to the database server. Defaults to\n empty string.\n\ndatabase-password\n The password to use when connecting to the database server. Defaults to\n empty string.\n\ndatabase-host\n The host on which the database server resides. Defaults to empty string.\n\ndatabase-port\n The port on which the database server accepts connections. Defaults to\n empty string.\n\n\nExample usage\n=============\n\nAs first thing, we need to have a Django project egg around. We have made a\nvery simple one just for testing and we have created a source distribution for\nit located in ``packages``.\n\nThis is of course not the only way you can distribute and obtain the project\negg: for example, during developement, it is recommended to use `mr.developer`_\nfor that.\n\nThat cleared, we create the most simple buildout conceivable using this recipe ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... \"\"\" % cache_dir)\n\nAnd run it ::\n\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n Getting distribution for 'dummydjangoprj'.\n ...\n django: Generating settings in ...\n django: Making empty static directory ...\n django: Creating script at ...\n Generated script ...\n ...\n \n\nThis generated some files and directories for us:\n\n1. A Django ``manage.py`` wrapper located at ``bin/django``\n\n2. A media directory (empty) at ``static`` (default option)\n\n3. A settings file located in ``parts/django/djc_recipe_django/settings.py``\n\nSo, as we can see, we have a ``static`` directory in the root, a ``bin/django``\nscript and a ``parts/django`` part ::\n\n >>> ls(sample_buildout)\n - .installed.cfg\n - .secret.cfg\n d bin\n - buildout.cfg\n d develop-eggs\n d eggs\n d media\n d packages\n d parts\n d src\n d static\n >>> ls('bin')\n - buildout\n - django\n >>> ls('parts')\n d buildout\n d django\n\nLet's look at this first ::\n\n >>> ls('parts', 'django')\n d djc_recipe_django\n >>> ls('parts', 'django', 'djc_recipe_django')\n - __init__.py\n - settings.py\n\nTherefore, we can see how ``djc_recipe_django`` is actually an importable\npython module.\n\nIf we examine it::\n\n >>> cat('parts', 'django', 'djc_recipe_django', 'settings.py')\n # coding=utf-8\n SERVER_EMAIL = 'root@localhost'\n ADMINS = (\n \n ('John Smith', 'root@localhost'),\n )\n MANAGERS = ADMINS\n \n \n DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/sample-buildout/storage.db'}}\n \n TIME_ZONE = 'America/Chicago'\n \n LANGUAGE_CODE = 'en-us'\n \n USE_L10N = True\n \n STATIC_ROOT = '.../static'\n \n STATIC_URL = '/static/'\n \n MEDIA_ROOT = '.../media'\n \n MEDIA_URL = '/media/'\n \n ADMIN_MEDIA_PREFIX = '/admin_media/'\n \n SECRET_KEY = '...'\n \n ROOT_URLCONF = 'dummydjangoprj.urls'\n \n \n TEMPLATE_DIRS = (\n '.../dummydjangoprj/templates',\n )\n \n EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\n EMAIL_USE_TLS = False\n \n CACHE_BACKEND = 'locmem:///'\n CACHE_TIMEOUT = 60*5\n CACHE_PREFIX = 'Z'\n \n DEBUG = False\n TEMPLATE_DEBUG = DEBUG\n\nAs you can see, this is pretty much the standard Django ``settings.py`` as\ncreated by Django's ``django-admin``. It has the peculiarity of not residing in\na module, however, but is loaded at run time into the appropriate manage script\nas a *ghost* module named ``_django_settings``.\n\nLet's have a look at the manage script ::\n\n >>> cat('bin', 'django')\n #!...\n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n import djc.recipe.manage\n \n if __name__ == '__main__':\n djc.recipe.manage.main('djc_recipe_django.settings')\n\nAs we can see, the ``main()`` function of the ``manage`` module is called,\npassing in the file with the settings as only argument.\n\nWe can now try to set up an example development environment, passing\n``debug = true`` to it::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... debug = true\n ... \"\"\" % cache_dir)\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n django: Making ... a module\n django: Generating settings in ...\n django: Making empty static directory ...\n django: Creating script at ...\n Generated script ...\n \n\nAnd look at the generated settings::\n\n >>> cat('parts', 'django', 'djc_recipe_django', 'settings.py')\n # coding=utf-8\n SERVER_EMAIL = 'root@localhost'\n ADMINS = (\n \n ('John Smith', 'root@localhost'),\n )\n MANAGERS = ADMINS\n \n \n DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/sample-buildout/storage.db'}}\n \n TIME_ZONE = 'America/Chicago'\n \n LANGUAGE_CODE = 'en-us'\n \n USE_L10N = True\n \n STATIC_ROOT = '.../static'\n \n STATIC_URL = '/static/'\n \n MEDIA_ROOT = '.../media'\n \n MEDIA_URL = '/media/'\n \n ADMIN_MEDIA_PREFIX = '/admin_media/'\n \n SECRET_KEY = '...'\n \n ROOT_URLCONF = 'dummydjangoprj.urls'\n \n \n TEMPLATE_DIRS = (\n '.../dummydjangoprj/templates',\n )\n \n EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\n EMAIL_USE_TLS = False\n \n CACHE_BACKEND = 'locmem:///'\n CACHE_TIMEOUT = 60*5\n CACHE_PREFIX = 'Z'\n \n DEBUG = True\n TEMPLATE_DEBUG = DEBUG\n \n INTERNAL_IPS = (\n '127.0.0.1',\n )\n\n\nTemplate overriding\n-------------------\n\nAs it was said in Templating_, the default template can be overridden or\nextended.\n\nLet's start by extending it: ::\n\n >>> write('template-extension.py.in',\n ... \"\"\"\n ... # Here we can extend the template, using variables pulled in from the\n ... # buildout section, with the dashes converted to underscores\n ... MY_CONFIG_VARIABLE = '{{config_variable_one}}'\n ... \"\"\")\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... settings-template-extension = template-extension.py.in\n ... config-variable-one = test\n ... \"\"\" % cache_dir)\n\nLaunch the buildout and then take a look at the generated ``settings.py``\nfile ::\n\n >>> print system(buildout)\n Uninstalling django.\n Installing django.\n ...\n Generated script ...\n \n >>> cat('parts', 'django', 'djc_recipe_django', 'settings.py')\n # coding=utf-8\n SERVER_EMAIL = 'root@localhost'\n ADMINS = (\n \n ('John Smith', 'root@localhost'),\n )\n MANAGERS = ADMINS\n \n \n DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/sample-buildout/storage.db'}}\n \n TIME_ZONE = 'America/Chicago'\n \n LANGUAGE_CODE = 'en-us'\n \n USE_L10N = True\n \n STATIC_ROOT = '.../static'\n \n STATIC_URL = '/static/'\n \n MEDIA_ROOT = '.../media'\n \n MEDIA_URL = '/media/'\n \n ADMIN_MEDIA_PREFIX = '/admin_media/'\n \n SECRET_KEY = '...'\n \n ROOT_URLCONF = 'dummydjangoprj.urls'\n \n \n TEMPLATE_DIRS = (\n '.../dummydjangoprj/templates',\n )\n \n EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\n EMAIL_USE_TLS = False\n \n CACHE_BACKEND = 'locmem:///'\n CACHE_TIMEOUT = 60*5\n CACHE_PREFIX = 'Z'\n \n DEBUG = False\n TEMPLATE_DEBUG = DEBUG\n \n \n # Extension template template-extension.py.in\n \n \n # Here we can extend the template, using variables pulled in from the\n # buildout section, with the dashes converted to underscores\n MY_CONFIG_VARIABLE = 'test'\n\nAs you can see, the aditional template has been simply appended to the default,\nand the variable ``config-variable-one`` has been substituted.\n\nIf, instead, we totally override the template: ::\n\n >>> write('template.py.in',\n ... \"\"\"\n ... # Total override\n ... FOODS = (\n ... {{join(listify(foods), \"',\\\\n '\", \"'\", \"',\")}}\n ... )\n ... \"\"\")\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... settings-template = template.py.in\n ... foods =\n ... spam\n ... spam\n ... eggs\n ... spam\n ... \"\"\" % cache_dir)\n\n\nLaunch the buildout and then take a look at the generated ``settings.py``\nfile ::\n\n >>> print system(buildout)\n Uninstalling django.\n Installing django.\n ...\n Generated script ...\n \n >>> cat('parts', 'django', 'djc_recipe_django', 'settings.py')\n # Total override\n FOODS = (\n 'spam',\n 'spam',\n 'eggs',\n 'spam',\n )\n\nAs you can see, the builtin template has been totally discarded.\n\nStatic origin\n=============\n\nStatic files are generally not served through Django_, but instead the\nfront-end web server takes care to serve them by exposing a directory on the\nfilesystem to the web.\n\nHowever, many static files (think ``.js`` or ``.css``) are part of the\nfunctionality of a project or application, and would be interesting to be able\nto distribute them alongside the code.\n\n.. note:: The method here described works only for applications and packages\n that are not installed as zipped modules: for example the egg default format\n is a zipped file that does not get extracted after installation unless a\n proper option is passed to ``easy_install``\n\nThe relevant resources can be included in the distributed package and use of\nthe ``static-origin`` option will allow them to be copied into the\n``static-directory`` folder (see Options_).\n\nA similar feature is present for media files (e.g. image uploads) as well\n(option ``media-origin``, which ends up into ``media-directory``).\n\n``static-origin`` can contain a list of static file sources, and each item of\nthe list can be either in the form ``package:directory`` or\n``package:directory:destination``; ``package`` being the full dotted name of\nthe importable module, ``directory`` the path to the directory inside the\nmodule containing static data, and ``destination`` an optional subdirectory\ninside ``static-directory`` where to copy the files.\n\nLet's then begin from the first, simple case, with a single source of static\ndata.\n\nThe source of static data is the package ``dummydjangoapp1``, residing as a\ndevelopement package inside ``src``. ::\n\n >>> ls('src', 'dummydjangoapp1', 'dummydjangoapp1', 'static')\n - lib1.js\n - main.css\n >>> cat('src', 'dummydjangoapp1', 'dummydjangoapp1', 'static', 'main.css')\n body { font-family: \"Helvetica\" \"Arial\" sans-serif; }\n\nLet's create a buildout config and run it ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ... develop = src/dummydjangoapp1\n ... eggs = dummydjangoapp1\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... static-directory = static\n ... static-origin = dummydjangoapp1:static\n ... \"\"\" % cache_dir)\n >>> rmdir('static')\n >>> print system(buildout)\n Develop: '.../dummydjangoapp1'\n Uninstalling django.\n Installing django.\n ...\n django: Making static directory '.../static'\n ...\n Generated script ...\n \n\nAnd now let's see what's in ``static`` ::\n\n >>> ls('static')\n - lib1.js\n - main.css\n >>> cat('static', 'main.css')\n body { font-family: \"Helvetica\" \"Arial\" sans-serif; }\n\nLet's now try using *two* sources: the second is another dummy app, named\n``dummydjangoapp2``, that like the first one resides in ``src``.\n\nLet's see what's in its ``static`` for us: ::\n\n >>> ls('src', 'dummydjangoapp2', 'dummydjangoapp2', 'static')\n - lib2.js\n - main.css\n\nIt seems this app too defines a ``main.css``, so let's look at the content: ::\n\n >>> cat('src', 'dummydjangoapp2', 'dummydjangoapp2', 'static', 'main.css')\n h1 { color: #92B8D8; }\n\nBut this poses a problem! What happens when I put this as second source, and\nboth define ``main.css``? Well, the intuitive thing to do here is probably to\noverride the file, so that the source at the bottom is the top *skin layer*.\n\nSo if we have this buildout ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ... develop =\n ... src/dummydjangoapp1\n ... src/dummydjangoapp2\n ... eggs =\n ... dummydjangoapp1\n ... dummydjangoapp2\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... static-directory = static\n ... static-origin =\n ... dummydjangoapp1:static\n ... dummydjangoapp2:static\n ... \"\"\" % cache_dir)\n\nIt is reasonable to expect that, after running it, the content of the\n``main.css`` file is the one provided by the version held by\n``dummydjangoapp2`` rather than the one held by ``dummydjangoapp2``.\n\nA quick run and inspect confirms this: ::\n\n >>> rmdir('static')\n >>> print system(buildout)\n Develop: '.../dummydjangoapp1'\n Develop: '.../dummydjangoapp2'\n Uninstalling django.\n Installing django.\n ...\n django: Making static directory '.../static'\n ...\n Generated script ...\n \n >>> ls('static')\n - lib1.js\n - lib2.js\n - main.css\n >>> cat('static', 'main.css')\n h1 { color: #92B8D8; }\n\nHowever, I might not want the ``main.css`` override to happen, or any other\nclash between applications, for that matter. That is easily solved by a\nbuildout written like this ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ... develop =\n ... src/dummydjangoapp1\n ... src/dummydjangoapp2\n ... eggs =\n ... dummydjangoapp1\n ... dummydjangoapp2\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... static-directory = static\n ... static-origin =\n ... dummydjangoapp1:static:app1\n ... dummydjangoapp2:static:app2\n ... \"\"\" % cache_dir)\n\nIt is to be noticed that the ``static-origin`` values have now three elements,\nthe latter being the destination directory, which is defined as a subdirectory\nof ``static``: in this case, both apps live in their subdirectory and no clash\nhappens ::\n\n >>> rmdir('static')\n >>> print system(buildout)\n Develop: '.../dummydjangoapp1'\n Develop: '.../dummydjangoapp2'\n Uninstalling django.\n Installing django.\n ...\n django: Making static directory '.../static'\n ...\n Generated script ...\n \n >>> ls('static')\n d app1\n d app2\n >>> ls('static', 'app1')\n - lib1.js\n - main.css\n >>> cat('static', 'app1', 'main.css')\n body { font-family: \"Helvetica\" \"Arial\" sans-serif; }\n >>> ls('static', 'app2')\n - lib2.js\n - main.css\n >>> cat('static', 'app2', 'main.css')\n h1 { color: #92B8D8; }\n\nOf course, this behaviour is not usefol only in this case: an application might\nactually require you to put the static files in a precise subdirectory\nirrespective of the fact that other apps might be present or a clash occur.\n\nWSGI\n====\n\nThe ``wsgi`` option will create a small module [#]_ inside ``parts``, that will\nallow you to hook your application to an upstream ``wsgi`` server.\n\nIn order to have the ``buildout``, we must set the ``wsgi`` option of the\nrecipe to ``true``: ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... wsgi = true\n ... \"\"\" % cache_dir)\n\nAnd launch the buildout: ::\n\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n ...\n django: Generating settings in ...\n ...\n django: Creating script at .../bin/django\n Generated script '.../bin/django'.\n django: Creating script at .../parts/django/djc_recipe_django/app.py\n Generated script '.../parts/django/djc_recipe_django/app.py'.\n \n\nThe script will then create inside ``parts//djc_recipe_``\na python module containing an ``app.py`` file, which can be loaded by\n``Apache`` or ``uwsgi``: ::\n\n >>> ls('parts', 'django', 'djc_recipe_django')\n - __init__.py\n - app.py\n - settings.py\n >>> cat('parts', 'django', 'djc_recipe_django', 'app.py')\n #!...\n \n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n import djc.recipe.wsgi\n \n application = djc.recipe.wsgi.main('djc_recipe_django.settings')\n \n def app_factory(global_config, **local_config):\n \"\"\"This function wraps our simple WSGI app so it\n can be used with paste.deploy\"\"\"\n return application\n\n\nThis will take care to inject all the needed paths into ``sys.path``, so no\nfurther meddling should be needed.\n\nMost *WSGI* servers do handle logging effectively by themselves, however if\nthis was not the case, an option to have a separate log output can be used:\n``wsgi-logfile``, if set, will cause all the applicative log output to be\nwritten to the specified file.\n\nLet's write the buildout ::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... wsgi = true\n ... wsgi-logfile = wsgi.log\n ... \"\"\" % cache_dir)\n\nLaunch it ::\n\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n ...\n django: Generating settings in ...\n ...\n django: Creating script at .../bin/django\n Generated script '.../bin/django'.\n django: Creating script at .../parts/django/djc_recipe_django/app.py\n Generated script '.../parts/django/djc_recipe_django/app.py'.\n \n\nAnd check what changes ::\n\n >>> cat('parts', 'django', 'djc_recipe_django', 'app.py')\n #!...\n \n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n import djc.recipe.wsgi\n \n application = djc.recipe.wsgi.main(..., logfile = '.../wsgi.log')\n \n def app_factory(global_config, **local_config):\n \"\"\"This function wraps our simple WSGI app so it\n can be used with paste.deploy\"\"\"\n return application\n\n\nAs you can see, the log file parameter is passed to the application: it is to\nbe noted that all relative paths are intended as relative to the buildout root.\n\nCustom initialization\n=====================\n\nSometimes we have the need to add some particular initialization code to both\nthe manage script and the *WSGI* application, or have certain environment\nvariables set in that process without recurring to esoteric configuration.\n\nThe first need is resolved by the ``initialization`` option: suppose we want\nour manage and *WSGI* scripts to check that an integer is really an integer\nbefore starting (hence safely aborting if the world has turned upside down).\n\nWe would write our buildout::\n\n >>> write('buildout.cfg', #doctest:-NORMALIZE_WHITESPACE\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... wsgi = true\n ... initialization =\n ... >>> if not isinstance(1, int):\n ... ... raise TypeError(\"World has turned upside down\")\n ... \"\"\" % cache_dir)\n\nAnd launch it::\n\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n ...\n django: Generating settings in ...\n ...\n django: Creating script at .../bin/django\n Generated script '.../bin/django'.\n django: Creating script at .../parts/django/djc_recipe_django/app.py\n Generated script '.../parts/django/djc_recipe_django/app.py'.\n \n\nAnd see that our code is present in both ``bin/django`` and ``app.py``::\n\n >>> cat('bin', 'django') #doctest:-NORMALIZE_WHITESPACE\n #!...\n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n \n \n if not isinstance(1, int):\n raise TypeError(\"World has turned upside down\")\n \n \n import djc.recipe.manage\n \n if __name__ == '__main__':\n djc.recipe.manage.main('djc_recipe_django.settings')\n >>> cat('parts', 'django', 'djc_recipe_django', 'app.py') #doctest:-NORMALIZE_WHITESPACE\n #!...\n \n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n \n if not isinstance(1, int):\n raise TypeError(\"World has turned upside down\")\n \n \n import djc.recipe.wsgi\n \n application = djc.recipe.wsgi.main('djc_recipe_django.settings')\n \n def app_factory(global_config, **local_config):\n \"\"\"This function wraps our simple WSGI app so it\n can be used with paste.deploy\"\"\"\n return application\n\nIt is important to note that the first line of the python code was prepended\nwith ``>>>`` while all the subsequent lines were prepended with ``...`` (plus a\nspace, on both). This syntax is necessary if you want to preserve indentation:\nif you don't want, you can omit them but you must make sure to *never have\nconstructs*.\n\nA slightly more useful example would be the need to have special environment\nvariables set before django is initialized, for example one might want to set\n``GOOGLE_APPENGINE_PROJECT_ROOT`` to ``/my/path``.\n\nIn order to do so, the ``environment-vars`` option is used::::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = django\n ... offline = false\n ... download-cache = %s\n ... newest = false\n ... index = http://pypi.python.org/simple/\n ... find-links = packages\n ...\n ... [django]\n ... recipe = djc.recipe\n ... project = dummydjangoprj\n ... wsgi = true\n ... environment-vars =\n ... GOOGLE_APPENGINE_PROJECT_ROOT /my/path\n ... \"\"\" % cache_dir)\n\nThe buildout is launched::\n\n >>> print \"start\\n\", system(buildout)\n start\n ...\n Installing django.\n ...\n django: Generating settings in ...\n ...\n django: Creating script at .../bin/django\n Generated script '.../bin/django'.\n django: Creating script at .../parts/django/djc_recipe_django/app.py\n Generated script '.../parts/django/djc_recipe_django/app.py'.\n \n\nAnd see that environment variables initialization code is present (via\n``os.environ``) in both ``bin/django`` and ``app.py``::\n\n >>> cat('bin', 'django')\n #!...\n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n \n \n import os\n os.environ[\"GOOGLE_APPENGINE_PROJECT_ROOT\"] = r\"/my/path\"\n \n \n import djc.recipe.manage\n \n if __name__ == '__main__':\n djc.recipe.manage.main('djc_recipe_django.settings')\n >>> cat('parts', 'django', 'djc_recipe_django', 'app.py')\n #!...\n \n \n import sys\n sys.path[0:0] = [\n ...\n ]\n \n \n \n import os\n os.environ[\"GOOGLE_APPENGINE_PROJECT_ROOT\"] = r\"/my/path\"\n \n \n import djc.recipe.wsgi\n \n application = djc.recipe.wsgi.main('djc_recipe_django.settings')\n \n def app_factory(global_config, **local_config):\n \"\"\"This function wraps our simple WSGI app so it\n can be used with paste.deploy\"\"\"\n return application\n\n.. _Tempita: http://pypi.python.org/pypi/Tempita/\n\n.. _`mr.developer`: http://pypi.python.org/pypi/mr.developer\n\n.. [#] In all truth, it tries to read it from ``.secret.txt``: that failing the\n secret code is generated and written to said file to be used\n subsequently.\n\n.. [#] For further information, refer to Django's docs at\n http://docs.djangoproject.com/en/1.3/ref/settings/#email-file-path\n\n.. [#] The small module is needed because ``uwsgi`` will refuse to load a rogue\n script, but will load a module (hence, with some ``PYTHONPATH`` magic,\n all comes along)\n\n\n\nContributors\n************\n\n * Simone Deponti , Initial Author\n * Bruno Ripa \n * Mikko Ohtamaa (@moo9000)\n * Dimitri Roche\n\nInital developement sponsored by `Abstract Open Solutions`_\n\n.. _`Abstract Open Solutions`: http://www.abstract.it\n\nChange history\n**************\n\n0.9.7 (2012-07-02)\n==================\n\n- Made SETTINGS_NAME configurable [Simone Deponti]\n- Made several things more pythonic [Simone Deponti]\n- Deprecated the version [Simone Deponti]\n\n\n0.9.6 (2012-02-10)\n==================\n\n- Added *use-l10n* option to default template [Simone Deponti]\n\n\n0.9.5 (2012-01-12)\n==================\n\n- Fixed media directory deletion bug [Simone Deponti]\n\n\n0.9.4 (2012-01-03)\n==================\n\n- Fixed another bug with the copier when removing linked trees [Simone Deponti]\n\n\n0.9.3 (2012-01-02)\n==================\n\n- Fixed bug with static directory copying [Simone Deponti]\n\n\n0.9.2 (2011-12-23)\n==================\n\n- Added proper \"smart\" symlinking of static and origin [Simone Deponti]\n\n\n0.9.1 (2011-12-13)\n==================\n\n- Fixed reST annoyance [Simone Deponti]\n\n\n0.9 (2011-12-13)\n================\n\n- Added indentation preservation for initialization code. [Simone Deponti]\n\n- Added a new default way to express databases [Simone Deponti]\n\n- Added the ability to reference other sections. [Simone Deponti]\n\n- Made 'settings.py' importable. [Simone Deponti]\n\n- Sped up tests. [Simone Deponti]\n\n\n0.8.1 (2011-09-22)\n==================\n\n- Fixed MANIFEST.in [Simone Deponti]\n\n\n0.8 (2011-09-22)\n================\n\n- Refactored environment variables support [Simone Deponti]\n\n- Added initialization support [Simone Deponti]\n\n- Fixed documentation and added tests [Simone Deponti]\n\n\n0.7.4 (2011-09-15)\n==================\n\n- Changed repository location [Simone Deponti]\n\n- Made DEBUG explicit [Simone Deponti]\n\n- Fixed paths on Windows [Dimitri Roche]\n\n\n0.7.3 (2011-03-30)\n==================\n\n- Added environment-variables support [Mikko Ohtamaa]\n\n\n0.7.2 (2010-11-18)\n==================\n\n- Fixed logging and added loglevel [Simone Deponti]\n\n\n0.7.1 (2010-09-23)\n==================\n\n- Fixed multiple link bug [Simone Deponti]\n\n\n0.7 (2010-09-23)\n================\n\n- Added ability to symlink the static origin [Simone Deponti]\n\n- Refactored working set computation to achieve better\n performances [Simone Deponti]\n\n\n0.6.1 (2010-07-22)\n==================\n\n- Fixed encoding bug. [Simone Deponti]\n\n\n0.6 (2010-07-20)\n================\n\n- Added new mail settings, restructured defaults. [Simone Deponti]\n\n- Added support for multiple databases and new-style database settings.\n [Simone Deponti]\n\n- Fixed bugs in the tests and documentation. [Simone Deponti]\n\n\n0.5.1 (2010-06-07)\n==================\n\n- Made the wsgi module more paster-compatible\n\n\n0.5 (2010-06-03)\n================\n\n.. note:: This release is potentially backwards-incompatible: ``media-url`` and\n ``media-directory`` are now named ``static-url`` and\n ``static-directory`` respectively.\n\n- Fixed MEDIA_URL mess [Simone Deponti]\n\n- Added INTERNAL_IPS support [Simone Deponti]\n\n- No defaults for middleware, template loaders and apps [Simone Deponti]\n\n\n0.3.2 (2010-06-01)\n==================\n\n- Fixed WSGI support (uwsgi, custom loggers) [Simone Deponti]\n\n- Fixed import bugs [Simone Deponti]\n\n0.3.1 (2010-05-19)\n==================\n\naka \"Never release between midnight and 6am\":\n\n- Fixed absolute path bug for fixture dirs in default template [Simone Deponti]\n\n- Fixed small template extension bug [Simone Deponti]\n\n0.3 (2010-05-19)\n================\n\n- Added multiple media-origin support [Simone Deponti]\n\n- Added fixture-dirs support [Simone Deponti]\n\n\n0.2 (2010-05-17)\n================\n\n- First public release [Simone Deponti]\n\n0.1 (2010-04-22)\n================\n\n- Created package [Simone Deponti]", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/abstract-open-solutions/djc.recipe", "keywords": "", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "djc.recipe", "package_url": "https://pypi.org/project/djc.recipe/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/djc.recipe/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/abstract-open-solutions/djc.recipe" }, "release_url": "https://pypi.org/project/djc.recipe/0.9.7/", "requires_dist": null, "requires_python": null, "summary": "A Django buildout recipe", "version": "0.9.7" }, "last_serial": 745198, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "5d84894cbaf419c470bafae667a7fbc9", "sha256": "47460073ec0e2808d3c462929971664c6b06c65313850210ad4db05b025b5fba" }, "downloads": -1, "filename": "djc.recipe-0.2.tar.gz", "has_sig": false, "md5_digest": "5d84894cbaf419c470bafae667a7fbc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17273, "upload_time": "2010-05-17T19:00:23", "url": "https://files.pythonhosted.org/packages/f3/fe/a3c24a00d76a9e9fe726b6ab813d33032a513c50275b0bba804cc91dd40e/djc.recipe-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "8f94c336ec754d7849e3d98a569a581f", "sha256": "a849a3a164f11a6468cf00b015868ed44855be5e46ce43928255276ad4761b0e" }, "downloads": -1, "filename": "djc.recipe-0.3.tar.gz", "has_sig": false, "md5_digest": "8f94c336ec754d7849e3d98a569a581f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29809, "upload_time": "2010-05-19T02:28:32", "url": "https://files.pythonhosted.org/packages/bb/23/bdbc594fac13ab27bd7ac229b9d2b9f4132bd67de48be7fc80f560c6e53c/djc.recipe-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "feb42d2b3fd418614f30d14b1874e159", "sha256": "f7013adda93b37180bcfe317dcc2ba1cfa5c9053c1979256704533ebc5995c11" }, "downloads": -1, "filename": "djc.recipe-0.3.1.tar.gz", "has_sig": false, "md5_digest": "feb42d2b3fd418614f30d14b1874e159", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30557, "upload_time": "2010-05-19T12:09:37", "url": "https://files.pythonhosted.org/packages/44/18/2fdfb688e52a6759b45557a69a9f2ad08b10ef613842b79f5141260699a1/djc.recipe-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "9ed5969af455b96e8b4870595fca3a92", "sha256": "c4e8521497499e79565ae3f46d40e67efdcc6442c2476f2a34e7e61b810093b5" }, "downloads": -1, "filename": "djc.recipe-0.3.2.tar.gz", "has_sig": false, "md5_digest": "9ed5969af455b96e8b4870595fca3a92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34452, "upload_time": "2010-06-01T02:31:42", "url": "https://files.pythonhosted.org/packages/aa/7f/c5f76cd8ae810023ea245ea51d24073c599539928121a8edf4673d4da56f/djc.recipe-0.3.2.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "b456c464fc023f417b3b0807e7c445a7", "sha256": "2be3a9d378621f9057b6c87512e68e87a5ea0de83804f71dbe71775dd51c1945" }, "downloads": -1, "filename": "djc.recipe-0.5.tar.gz", "has_sig": false, "md5_digest": "b456c464fc023f417b3b0807e7c445a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34999, "upload_time": "2010-06-03T16:11:06", "url": "https://files.pythonhosted.org/packages/5b/e2/4f212533ead41378718d90bdb4f4f2f202a5c70bba8c689e50ec64d786dd/djc.recipe-0.5.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "e82a81d34275f8a378d9dc9c14bb72ca", "sha256": "be365c34b09db1c455008365f72a20d0631ec50b0bdc7f7da70e669d638904bc" }, "downloads": -1, "filename": "djc.recipe-0.5.1.tar.gz", "has_sig": false, "md5_digest": "e82a81d34275f8a378d9dc9c14bb72ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35173, "upload_time": "2010-06-07T20:18:48", "url": "https://files.pythonhosted.org/packages/7d/fd/10286723d127311dad20aab2fe31a9c6adf6cba95694b6f5c050841949d7/djc.recipe-0.5.1.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "8c50ac47e2f8d151a2ae47685083aae7", "sha256": "7d4cb5c7129c4ae1383a8bcb308095bd50dd765b716b869615f3b49bded69f59" }, "downloads": -1, "filename": "djc.recipe-0.6.tar.gz", "has_sig": false, "md5_digest": "8c50ac47e2f8d151a2ae47685083aae7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36461, "upload_time": "2010-07-20T17:09:19", "url": "https://files.pythonhosted.org/packages/6a/e9/53ee1c64a08897136f3b01fa66d1092b736870ec9e3e3cecf761eabf3663/djc.recipe-0.6.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "02b9098a9484400641a8b916974769cf", "sha256": "911d013c6a20079423b3b3c9fc49bcde8ac6e5e50a48d392f49c20d8c1cc3683" }, "downloads": -1, "filename": "djc.recipe-0.6.1.tar.gz", "has_sig": false, "md5_digest": "02b9098a9484400641a8b916974769cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36661, "upload_time": "2010-07-22T18:08:30", "url": "https://files.pythonhosted.org/packages/88/c7/a53ff670146ef68b23268eb15c5b1d86d865085286ae37562cbbfa8edaab/djc.recipe-0.6.1.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "1dc147b5194bb8fe7f1dfc5cb204d6ac", "sha256": "9c4e7251825ce4247905bd4fa496d0656463d22818ff2f7b8fc2c505a0e906b3" }, "downloads": -1, "filename": "djc.recipe-0.7.tar.gz", "has_sig": false, "md5_digest": "1dc147b5194bb8fe7f1dfc5cb204d6ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36826, "upload_time": "2010-09-23T18:52:41", "url": "https://files.pythonhosted.org/packages/3c/e4/65ba229d6705dc4847d78a3e61fa3633639cec69be6c3ad813cfa260f7c9/djc.recipe-0.7.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "61195453f7b700b912ec9cc280a7486f", "sha256": "cd24f831127ffea61a147e195b3addc2c68f76093ef2b998f65cde9559d8d9cc" }, "downloads": -1, "filename": "djc.recipe-0.7.1.tar.gz", "has_sig": false, "md5_digest": "61195453f7b700b912ec9cc280a7486f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36907, "upload_time": "2010-09-23T19:36:40", "url": "https://files.pythonhosted.org/packages/d6/d9/46e3b7f6d41c8a5381f79f6c22479ef75650471812839763b15b13a363a2/djc.recipe-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "9da9c73ff3b3988d2d90459fd56b6f57", "sha256": "47f5298903ed3d925a9c926b9f615999420181ccf086a35f4f7fbaf86e209c2f" }, "downloads": -1, "filename": "djc.recipe-0.7.2.tar.gz", "has_sig": false, "md5_digest": "9da9c73ff3b3988d2d90459fd56b6f57", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37460, "upload_time": "2010-11-18T11:02:44", "url": "https://files.pythonhosted.org/packages/6b/5e/92b49f3eb3146cd739a9bdc992fa5d01621e83164d0f8df86f7ff348298c/djc.recipe-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "6d9fdca5d92011a572a3c2c10615451d", "sha256": "b429b467d61b30af056072b6a88413dc1431b70861d60e6b785f03e9da8344e0" }, "downloads": -1, "filename": "djc.recipe-0.7.3.tar.gz", "has_sig": false, "md5_digest": "6d9fdca5d92011a572a3c2c10615451d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38762, "upload_time": "2011-03-30T23:25:56", "url": "https://files.pythonhosted.org/packages/cf/bd/3b5adce8e4fdae22915487451376be4d21e4f596358179c7f02bff5c39b9/djc.recipe-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "75415dab437c61ab7dfbf6c078f98a96", "sha256": "b0bd6af68ec2589b655d892b2c147dfa8fbc067dd289a67953b977165c5dcced" }, "downloads": -1, "filename": "djc.recipe-0.7.4.tar.gz", "has_sig": false, "md5_digest": "75415dab437c61ab7dfbf6c078f98a96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39374, "upload_time": "2011-09-15T17:34:07", "url": "https://files.pythonhosted.org/packages/7d/9b/d89ea221c0337be89d855bde1ce0fc050c72069dbf5c53c288c6971f13dd/djc.recipe-0.7.4.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "f9bef64b4b3e093f753c462c7db685d6", "sha256": "49bd7702cfb2dff882edc8d44ab2fe0f7121d2c92f5847b19173397ad9b2c1b3" }, "downloads": -1, "filename": "djc.recipe-0.8.tar.gz", "has_sig": false, "md5_digest": "f9bef64b4b3e093f753c462c7db685d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32753, "upload_time": "2011-09-22T10:24:45", "url": "https://files.pythonhosted.org/packages/44/93/d0c896cf837ee7ea05892184c3b00dfd0dc9ee054852f22e141245f0446e/djc.recipe-0.8.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "69df314326b3672ee6784ce4a9ba721c", "sha256": "70a2fdfb878c2126b2c5888289be59b8f3ae358a5c996e519039349180ea8c8b" }, "downloads": -1, "filename": "djc.recipe-0.8.1.tar.gz", "has_sig": false, "md5_digest": "69df314326b3672ee6784ce4a9ba721c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41411, "upload_time": "2011-09-22T10:56:14", "url": "https://files.pythonhosted.org/packages/d4/7e/bc708842226a1933cd59dfd3161e9a99f8a30cb763f13fbd8f885f906522/djc.recipe-0.8.1.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "ecae95ad743006f5cd7a1460410df251", "sha256": "810fa278537ce2919dc46867136b8c7a32843a7c874f5a63e9696f5e1868d2c4" }, "downloads": -1, "filename": "djc.recipe-0.9.1.tar.gz", "has_sig": false, "md5_digest": "ecae95ad743006f5cd7a1460410df251", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45297, "upload_time": "2011-12-13T12:46:18", "url": "https://files.pythonhosted.org/packages/44/95/0a3e54420274f0dd3037e246d44bc3362bebf555a787e320755afe9bdceb/djc.recipe-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "1df99c22e0e13607283b58764b7db890", "sha256": "80764d38a556d0189d8f69172a582a05bfa0ec7d2f6860bf66dc04a4e88e102f" }, "downloads": -1, "filename": "djc.recipe-0.9.2.tar.gz", "has_sig": false, "md5_digest": "1df99c22e0e13607283b58764b7db890", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49058, "upload_time": "2011-12-23T13:04:58", "url": "https://files.pythonhosted.org/packages/c2/fb/1acf54341a9bb4e5f05b96837621ebf6050a4495b2f8bfe804c2d91055d4/djc.recipe-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "77f0621c62c1c47a9062b8def611a3b3", "sha256": "10b14aafede711a11bc5028799bebe94bb0834fd758366fd2d7be8ee3d880b56" }, "downloads": -1, "filename": "djc.recipe-0.9.3.tar.gz", "has_sig": false, "md5_digest": "77f0621c62c1c47a9062b8def611a3b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49404, "upload_time": "2012-01-02T12:23:42", "url": "https://files.pythonhosted.org/packages/b6/8e/6d3f9978aaf1703e749caec04b47bf8b2c6d88bcb494210cd1378171fc6c/djc.recipe-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "d6d41a563a696bb3118eaee0bc819d65", "sha256": "115c2c06935d6410cdd61e73bac654711fe8c30e531a7a65f8783acfb8f9ad33" }, "downloads": -1, "filename": "djc.recipe-0.9.4.tar.gz", "has_sig": false, "md5_digest": "d6d41a563a696bb3118eaee0bc819d65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49533, "upload_time": "2012-01-03T11:20:37", "url": "https://files.pythonhosted.org/packages/46/4e/2e3762ec5f1568ecfefde7c343c00d5365d9d81e6fb33fd62d320ce6e273/djc.recipe-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "d13728f8c2a2083242e4a8c31c64fc29", "sha256": "8b62a65853f2769f5219c1990060c4d92a4f3223d25b880715047d4a890324e5" }, "downloads": -1, "filename": "djc.recipe-0.9.5.tar.gz", "has_sig": false, "md5_digest": "d13728f8c2a2083242e4a8c31c64fc29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49622, "upload_time": "2012-01-12T12:06:42", "url": "https://files.pythonhosted.org/packages/cd/35/9dabfee3f4ea0ca57fb2fa22fea39dbe68a74115b00718ebef9a3427e2af/djc.recipe-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "53e6923779dc3ad7c352e157601547ab", "sha256": "ec1eccccaa83e2f7378f6b4586f1169e3d279555524f6bc413cc9176037cc3c5" }, "downloads": -1, "filename": "djc.recipe-0.9.6.tar.gz", "has_sig": false, "md5_digest": "53e6923779dc3ad7c352e157601547ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49852, "upload_time": "2012-02-10T13:37:39", "url": "https://files.pythonhosted.org/packages/5b/cc/42c3a5e1213cec7bec42492b89fe09e5bb7c52330dd600cf8e5d7e5199c5/djc.recipe-0.9.6.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "c5d5873934a3018766f080ac8a0a2a8b", "sha256": "4edd3c81c5cd0f03551ffabe7bdcef442a55226068a2ff11491f732ecea5b379" }, "downloads": -1, "filename": "djc.recipe-0.9.7.zip", "has_sig": false, "md5_digest": "c5d5873934a3018766f080ac8a0a2a8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63431, "upload_time": "2012-07-02T11:36:25", "url": "https://files.pythonhosted.org/packages/13/07/af80facc97c0a2731e0e0be8cc8054ad761ccca06e69bf10628695925feb/djc.recipe-0.9.7.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c5d5873934a3018766f080ac8a0a2a8b", "sha256": "4edd3c81c5cd0f03551ffabe7bdcef442a55226068a2ff11491f732ecea5b379" }, "downloads": -1, "filename": "djc.recipe-0.9.7.zip", "has_sig": false, "md5_digest": "c5d5873934a3018766f080ac8a0a2a8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63431, "upload_time": "2012-07-02T11:36:25", "url": "https://files.pythonhosted.org/packages/13/07/af80facc97c0a2731e0e0be8cc8054ad761ccca06e69bf10628695925feb/djc.recipe-0.9.7.zip" } ] }