{ "info": { "author": "Wichert Akkerman", "author_email": "wichert@wiggy.net", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Introduction\n************\n\nThis recipe can be used to generate textfiles from a (text)\ntemplate.\n\n.. contents::\n\nA short example::\n\n [buildout]\n parts = message\n\n [message]\n recipe = collective.recipe.template\n input = templates/message.in\n output = ${buildout:parts-directory}/etc/message\n\n mymessage = Hello, World!\n\n\nIn the template you can use the exact same variables as you can use\nin the buildout configuration. For example an input file can look like this::\n\n My top level directory is ${buildout:directory}\n Executables are stored in ${buildout:bin-directory}\n\n\nAs an extension to the buildout syntax you can reference variables from\nthe current buildout part directly. For example::\n\n My message is: ${mymessage}\n\n\nFeatures\n========\n\n* Starting with version 1.3, you can also specify a path to the output\n file and the path will be created if it does not exist.\n* Starting with version 1.5, you can use inline templates.\n* Starting with version 1.7, you can use `genshi text templates`_.\n* Starting with version 1.9, you can use a URL to specify template input.\n* Starting with version 1.12, you can specify ``timeout`` as an option to\n configure ``urllib2`` requests.\n* Starting with version 2.1, you can set ``input-encoding`` and\n ``output-encoding`` to specify the character encoding.\n\nGenshi text templates\n---------------------\n\nA short example::\n\n [buildout]\n parts = message\n\n [message]\n recipe = collective.recipe.template[genshi]:genshi\n input = templates/message.in\n output = ${buildout:parts-directory}/etc/message\n some-option = value\n\n mymessage = Hello, World!\n\nIn the template you can use the exact same variables as you can use\nin the buildout configuration, but instead of colons as the separator you\neither have to use attribute access, or for options with a dash dictionary\nsyntax. The global buildout config is accessible through ``parts``, the\ncurrent part through ``options``.\n\nFor example an input file can look like this::\n\n My top level directory is ${parts.buildout.directory}\n Executables are stored in ${parts.buildout['bin-directory']}\n Accessing the current part: ${options['some-option']}\n\n\nWhy another template recipe?\n============================\n\nBoth `iw.recipe.template`_ and `inquant.recipe.textfile`_ claim to do the\nsame thing. I have found them to be undocumented and too buggy for real\nworld use, and neither are in a public repository where I could fix them. In\naddition this implementation leverages the buildout variable substitution\ncode, making it a lot simpler.\n\n\n.. _genshi text templates: http://genshi.edgewall.org/wiki/Documentation/text-templates.html\n.. _iw.recipe.template: http://pypi.python.org/pypi/iw.recipe.template\n.. _inquant.recipe.textfile: http://pypi.python.org/pypi/inquant.recipe.textfile\n\n\nDetailed Description\n********************\n\nSimple creation of a file out of a template\n===========================================\n\nLets create a minimal `buildout.cfg` file::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = template\n ... ''')\n\nWe create a template file::\n\n >>> write('template.in',\n ... '''#\n ... My templ\u00e5te knows about buildout path:\n ... ${buildout:directory}\n ... ''')\n\nNow we can run buildout::\n\n >>> print system(join('bin', 'buildout')),\n Installing template.\n\nThe template was indeed created::\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\nThe variable ``buildout:directory`` was also substituted by a path.\n\nOverriding output file\n======================\n\nBy default re-execute buildout, makes that output file is overwrited, by new\noutput file. But, if you want generate this file ONLY when it doesn't exist,\nyou can use overwrite option:\n\nOnce again check output file content::\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\nLet's change this file::\n >>> print system(\"sed 's/sample-buildout/spam-ham-eggs/g' template > out && mv out template\")\n \n\nLet's check content now::\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../spam-ham-eggs\n\nNow try re-execute buildout, and then check our file again::\n\n >>> print system(join('bin', 'buildout')),\n Updating template.\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\nLike you see, re-execute buildout, caused overwrite ourmodified file. Let's try\nto prevent this behavior. So we must modify buildout.cfg, re-execute buildout,\nand then modify again output file::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = template\n ... overwrite = False\n ... ''')\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\n >>> print system(\"sed 's/sample-buildout/spam-ham-eggs/g' template > out && mv out template\")\n \n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../spam-ham-eggs\n\nLet's check output file again - it shouldn't be modyfied this time::\n\n >>> print system(join('bin', 'buildout')),\n Updating template.\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n .../spam-ham-eggs\n\nUsing inline input\n==================\n\nFor very short script it can make sense to put the source directly into\n`buildout.cfg`::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = inline:\n ... #!/bin/bash\n ... echo foo\n ... output = ${buildout:parts-directory}/template\n ... ''')\n\nNow we can run buildout::\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\nThe template should have been created::\n\n >>> cat('parts', 'template')\n #!/bin/bash\n echo foo\n\nNormally the file mode gets copied from the template, but it can also be\nspecified manually, which especially makes sense in this case:\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... inline =\n ... #!/bin/bash\n ... echo foo\n ... output = ${buildout:parts-directory}/template\n ... mode = 755\n ... ''')\n\nRun buildout again ::\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\nThe template should have the specified file mode::\n\n >>> from os import stat\n >>> from stat import S_IMODE\n >>> print '%o' % S_IMODE(stat('parts/template').st_mode)\n 755\n\nUsing URL input\n===============\n\n.. Warning:: There is a security risk inherent with using URL input.\n Please be careful.\n\nSimilarly, you may want to read input from a URL, e.g.::\n\n >>> import os\n >>> tmpfn = os.path.abspath(join('template.in'))\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... url = file://%s\n ... output = template\n ... ''' % tmpfn)\n\nTo demonstrate this, first we create a template file::\n\n >>> write(tmpfn,\n ... '''#\n ... My templ\u00e5te knows about buildout path:\n ... ${buildout:directory}\n ... ''')\n\nNow we can run buildout::\n\n >>> lines = system(join('bin', 'buildout')).splitlines()\n >>> lines = [x for x in lines if not x.startswith('Not found:')]\n >>> print '\\n'.join(lines),\n Uninstalling template.\n Installing template.\n\nThe template should have been created::\n\n >>> cat('template')\n #\n My templ\u00e5te knows about buildout path:\n /sample-buildout\n\nCreating a template in a variable path\n======================================\n\nLets create a minimal `buildout.cfg` file. This time the output should\nhappen in a variable path::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = ${buildout:parts-directory}/template\n ... ''')\n\nNow we can run buildout::\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\nThe template was indeed created::\n\n >>> cat('parts', 'template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\n\nCreating missing paths\n======================\n\nIf an output file should be created in a path that does not yet exist,\nthen the missing items will be created for us::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = ${buildout:parts-directory}/etc/template\n ... ''')\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\nAlso creation of several subdirectories is supported::\n\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = ${buildout:parts-directory}/foo/bar/template\n ... ''')\n\n >>> print system(join('bin', 'buildout')),\n Uninstalling template.\n Installing template.\n\n >>> cat('parts', 'foo', 'bar', 'template')\n #\n My templ\u00e5te knows about buildout path:\n .../sample-buildout\n\nWhen changes happen to the output path, then the old path is removed\non uninstall. Therefore the ``etc/`` directory created above has\nvanished now::\n\n >>> ls('parts')\n d foo\n\n\nSubstituting variables with options of other parts\n==================================================\n\nWhen substituting variables in a template, dependencies on other buildout\nparts can occur. Buildout will resolve them by determining the values of those\nother parts' options first. To see this, we create a buildout involving a\ntemplate that uses a variable computed by a part that would not otherwise be\nbuilt:\n\n >>> write('dummy.py',\n ... '''\n ... class Recipe(object):\n ...\n ... def __init__(self, buildout, name, options):\n ... options['foo'] = 'bar'\n ...\n ... def install(self):\n ... return ()\n ...\n ... def update(self):\n ... pass\n ... ''')\n\n >>> write('setup.py',\n ... '''\n ... from setuptools import setup\n ...\n ... setup(name='dummyrecipe',\n ... entry_points = {'zc.buildout': ['default = dummy:Recipe']})\n ... ''')\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... develop = .\n ... parts = template\n ... offline = true\n ...\n ... [template]\n ... recipe = collective.recipe.template\n ... input = template.in\n ... output = template\n ...\n ... [other]\n ... recipe = dummyrecipe\n ... ''')\n\n >>> write('template.in',\n ... '''#\n ... My templ\u00e5te knows about another buildout part:\n ... ${other:foo}\n ... ''')\n\n >>> print system(join('bin', 'buildout')),\n Develop: '/sample-buildout/.'\n Uninstalling template.\n Installing other.\n Installing template.\n\n >>> cat('template')\n #\n My templ\u00e5te knows about another buildout part:\n bar\n\nUnchanged output files are not rewritten on update\n==================================================\n\nWhen output content is unchanged, the output file is not rewritten on update.\nThe advantage is that the modification timestamp of the file is not changed.\n(E.g. systemd notices if the timestamp of any unit files change, and issues\nhelpful \"nags\" reminding the user to rerun \"systemctl daemon-reload\".)\n\nNote the mtime of the output file:\n >>> from os.path import getmtime\n >>> from time import sleep\n >>> orig_mtime = getmtime('template')\n\nWait until new files get a different mtime\n >>> def mtime_tick():\n ... write('test.stamp', '')\n ... return getmtime('test.stamp') > orig_mtime\n >>> wait_until('mtime_tick', mtime_tick)\n\nRerun the buildout:\n >>> print system(join('bin', 'buildout')),\n Develop: '/sample-buildout/.'\n Uninstalling other.\n Installing other.\n Updating template.\n\nThe file's mtime is not changed:\n >>> getmtime('template') == orig_mtime\n True\n\nChange the template:\n >>> write('template.in',\n ... '''#\n ... My template still knows about another buildout part:\n ... Foo is ${other:foo}\n ... ''')\n\nRerun the buildout:\n >>> print system(join('bin', 'buildout')),\n Develop: '/sample-buildout/.'\n Uninstalling other.\n Installing other.\n Updating template.\n\nThe file's mtime is changed:\n >>> getmtime('template') > orig_mtime\n True\n\nThe output has changed:\n >>> cat('template')\n #\n My template still knows about another buildout part:\n Foo is bar\n\n\nChangelog\n*********\n\n2.1 (2018-07-14)\n================\n\n* Support new ``input-encoding`` and ``output-encoding`` options.\n [fschulze]\n\n* On update, do not rewrite the output file (thus preserving its\n modification timestamp) unless its content has changed.\n [dairiki]\n\n\n2.0 (2017-01-17)\n================\n\n* Claim support for Python 3.5 and drop support for Python 2.6.\n [sallner]\n\n\n1.13 (2015-10-20)\n=================\n\n* Back compatibility with zc.buildout 1.7.1 [#11]\n [mstaniszczak]\n\n\n1.12 - 2015-07-23\n=================\n\n* Add timeout configuration option.\n [davidjb]\n\n* Fix encoding problem in python 3.\n [cedricmessiant]\n\n* Added overwrite option - possibility to disable overwrite output file after\n re-execute buildout.\n [mstaniszczak]\n\n\n1.11 - 2014-02-07\n=================\n\n* Python 3 support for Genshi and doctests.\n [mitchellrj]\n\n* Delete script before writing to it, this way we avoid chmod permission errors\n when the current user is not the script owner.\n [alecghica]\n\n\n1.10 - 2012-02-26\n=================\n\n* Add Python 3 support using 2to3 flag in setup.\n [mitchellrj]\n\n\n1.9 - 2011-06-19\n================\n\n* Add support for URL input. Use ``url =`` (instead of ``input =``) to specify URL.\n [aclark]\n\n\n1.8 - 2010-06-08\n================\n\n* WARNING! Backward incompatible change for Genshi templates.\n It wasn't possible to access parts with a dash in the name, so now you have\n to use ${parts.partname} or ${parts['part-name']}. In addition it is now\n possible to access the current part with ``options``.\n [fschulze]\n\n* Import genshi modules very late to prevent issues with zc.buildout.\n [fschulze]\n\n\n1.7 - 2010-05-21\n================\n\n* Added support for genshi text templates. Use them with this as the\n recipe:\n `recipe = collective.recipe.template[genshi]:genshi`\n Use a dot between the section name and the option name instead of a colon.\n [fschulze]\n\n\n1.6 - 2010-02-24\n================\n\n* Output file mode is now assumed to be octal, like chmod.\n [elro]\n\n* Inline template can now be specified with the inline option.\n [elro]\n\n\n1.5 - 2010-02-23\n================\n\n* Add support for explicitly setting the output file mode.\n [witsch]\n\n* Add support for inline templates.\n [witsch]\n\n\n1.4 - 2009-07-29\n================\n\n* Fixed the way variables in templates are substituted to allow buildout to\n determine dependencies on other parts and prepare those correctly. [tlotze]\n\n\n1.3 - 2009-04-28\n================\n\n* Add support for output path creation. You can do::\n\n output = /path/to/target\n\n and intermediate path items will be created if they do not exist.\n [ulif]\n\n* Add tests.\n [ulif]\n\n\n1.2 - 2008-12-09\n================\n\n(By accident the 1.1 release was marked as 1.2. So in fact they are\nthe same.)\n\n1.1 - 2008-12-09\n================\n\n* Correct handling of multiple variables in a line. Bugreport and patch from\n Roman Susi.\n [wichert]\n\n\n1.0 - 2008-10-16\n================\n\n* Copy the mode of the input file to the output file. This makes it possible\n to create executable scripts.\n [wichert]\n\n* Add missing link in README.\n [wichert]\n\n\n1.0rc2 - 2008-07-04\n===================\n\n* Add a MANIFEST.in with instructions to include docs/, otherwise the package\n will not install.\n [wichert]\n\n\n1.0rc1 - 2008-07-04\n===================\n\n* Initial release.\n [wichert]\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/collective.recipe.template", "keywords": "template recipe", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "collective.recipe.template", "package_url": "https://pypi.org/project/collective.recipe.template/", "platform": "", "project_url": "https://pypi.org/project/collective.recipe.template/", "project_urls": { "Homepage": "http://pypi.python.org/pypi/collective.recipe.template" }, "release_url": "https://pypi.org/project/collective.recipe.template/2.1/", "requires_dist": null, "requires_python": "", "summary": "Buildout recipe to generate a text file from a template", "version": "2.1" }, "last_serial": 4060949, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "f212adc9b9dfff940d503a394604a77f", "sha256": "ae0659b6a9f95477238e0b170484fde02d830abe2054eb5477916fae570e567e" }, "downloads": -1, "filename": "collective.recipe.template-1.0.zip", "has_sig": false, "md5_digest": "f212adc9b9dfff940d503a394604a77f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8104, "upload_time": "2008-10-16T08:14:05", "url": "https://files.pythonhosted.org/packages/b9/1f/76bcb6cb5b7c72ea1f83d9e88b8af43d67033be3b2fc5117e93405f2dc8f/collective.recipe.template-1.0.zip" } ], "1.0rc1": [ { "comment_text": "", "digests": { "md5": "17c05f91f9cda0220edddbfb314b367c", "sha256": "4356def44275fae7cb56133e69fdcb490a1036027161de714e8aecba8fba90de" }, "downloads": -1, "filename": "collective.recipe.template-1.0rc1.tar.gz", "has_sig": false, "md5_digest": "17c05f91f9cda0220edddbfb314b367c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2636, "upload_time": "2008-07-04T14:23:06", "url": "https://files.pythonhosted.org/packages/b0/ca/4ac3b997dbc90a847295c03168dce902f8077c6167e20ba8ce8b073a609b/collective.recipe.template-1.0rc1.tar.gz" } ], "1.0rc2": [ { "comment_text": "", "digests": { "md5": "586ce207a4b46cf0ae4bfb1e2065e35e", "sha256": "9472ba05bb564cfb753597d682732d49c2fba2c18f1ac99061399d16785fb7cb" }, "downloads": -1, "filename": "collective.recipe.template-1.0rc2.tar.gz", "has_sig": false, "md5_digest": "586ce207a4b46cf0ae4bfb1e2065e35e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2822, "upload_time": "2008-07-04T14:34:44", "url": "https://files.pythonhosted.org/packages/bb/e5/627c97332d581899e0249a3b8d4fae6a77a618b301c76f0d30930255e1c0/collective.recipe.template-1.0rc2.tar.gz" } ], "1.10": [ { "comment_text": "", "digests": { "md5": "7e2144112d647e55ad60345be0df58e1", "sha256": "2fdd3c3924336ece04c58b488f9b460d9df611e8ddbc26de60b4bd3ed6ce4602" }, "downloads": -1, "filename": "collective.recipe.template-1.10.zip", "has_sig": false, "md5_digest": "7e2144112d647e55ad60345be0df58e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18909, "upload_time": "2013-02-26T15:15:55", "url": "https://files.pythonhosted.org/packages/18/87/ed382649f7e2ba24249bbdeda661d17b6459d514bd1dec6e193ec9d05f60/collective.recipe.template-1.10.zip" } ], "1.11": [ { "comment_text": "", "digests": { "md5": "3e3268233b407c88cc81825441628762", "sha256": "9008e6b6068cffc2ca9930a349875e5289b2ed52d009ad0252bc7ed97f641084" }, "downloads": -1, "filename": "collective.recipe.template-1.11.zip", "has_sig": false, "md5_digest": "3e3268233b407c88cc81825441628762", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19322, "upload_time": "2014-02-07T12:36:33", "url": "https://files.pythonhosted.org/packages/87/35/f5bf40dd7f3300abc24510758b490fd5873f166fd7102218db2145a504c3/collective.recipe.template-1.11.zip" } ], "1.12": [ { "comment_text": "", "digests": { "md5": "da90eb9657c1c2bdc57fadb71197324e", "sha256": "0ae9e2345451e7528fd89e384e7e1581fbac20c99dd8998d972ecef5c16a7ae0" }, "downloads": -1, "filename": "collective.recipe.template-1.12.tar.gz", "has_sig": false, "md5_digest": "da90eb9657c1c2bdc57fadb71197324e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11221, "upload_time": "2015-07-23T08:15:06", "url": "https://files.pythonhosted.org/packages/79/b5/cc9b32a026c606c0268d7082d551bc4e24296da32ee02a44d611b39576b5/collective.recipe.template-1.12.tar.gz" }, { "comment_text": "", "digests": { "md5": "809f2aa0f0fe482b763bb40a5d4f8cf0", "sha256": "2722d94b743d6f8d3ab187661fde224526bae0126f56910d55a9298fefa4f410" }, "downloads": -1, "filename": "collective.recipe.template-1.12.zip", "has_sig": false, "md5_digest": "809f2aa0f0fe482b763bb40a5d4f8cf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23503, "upload_time": "2015-07-23T08:15:02", "url": "https://files.pythonhosted.org/packages/85/82/10b46f33c9d3364dbbfc61cef0d5d084db9a52a6cac281b4f44e63c85158/collective.recipe.template-1.12.zip" } ], "1.13": [ { "comment_text": "", "digests": { "md5": "cbdeb5258ceb3a2a2ac9f64374cf8d9d", "sha256": "df3de0ad2f0e9b60ed10912e936eaeaadaadf72c9dc6898c2a09fb6455273eed" }, "downloads": -1, "filename": "collective.recipe.template-1.13-py2-none-any.whl", "has_sig": false, "md5_digest": "cbdeb5258ceb3a2a2ac9f64374cf8d9d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16238, "upload_time": "2015-10-20T17:41:24", "url": "https://files.pythonhosted.org/packages/46/4a/870daf2d2b99d4ccd0433275ee22ff93ae221774a09169e907e07de03bde/collective.recipe.template-1.13-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d526ef8a793762a3ef59a8b64f3b414", "sha256": "737f4c75542bb39d91979dbc1d39104c2344e323b3aeba05d331867a2e649d01" }, "downloads": -1, "filename": "collective.recipe.template-1.13.tar.gz", "has_sig": false, "md5_digest": "3d526ef8a793762a3ef59a8b64f3b414", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10364, "upload_time": "2015-10-20T17:41:29", "url": "https://files.pythonhosted.org/packages/89/52/853f43cb8d2e989953a184e03d5e60824a4bac9f8fefc43501a0ef29b007/collective.recipe.template-1.13.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "a38ba5dc7a9b7ad219d8f9e85af306b6", "sha256": "f79afd0f495c85ae5ed3fe6058edfcb7c6c16f35f17fbed4d11df3abd27a2f7a" }, "downloads": -1, "filename": "collective.recipe.template-1.2.tar.gz", "has_sig": false, "md5_digest": "a38ba5dc7a9b7ad219d8f9e85af306b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3066, "upload_time": "2008-12-09T14:54:00", "url": "https://files.pythonhosted.org/packages/55/18/7adffbc61294cdd76459b112ba87bfd035ee00fe67d1fb643a28befc2967/collective.recipe.template-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "0c8aa0e2723856a1b2e118b39f0e8d9d", "sha256": "44aed35bbf9d618ae18800f181c63a0a5682b282b55e375e17cda0d47222689b" }, "downloads": -1, "filename": "collective.recipe.template-1.3.tar.gz", "has_sig": false, "md5_digest": "0c8aa0e2723856a1b2e118b39f0e8d9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5906, "upload_time": "2009-04-28T13:42:39", "url": "https://files.pythonhosted.org/packages/5f/a4/a8841918e2cee561e3a58b872824af159547610ae2823b7217e138d3673a/collective.recipe.template-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "0fb0fbb90ae7043aefb8f1cbc2b91f39", "sha256": "235d6bdddd7825d27b17c916f900366cb71ab28e24e45b070c601dbbcbcba2d5" }, "downloads": -1, "filename": "collective.recipe.template-1.4.tar.gz", "has_sig": true, "md5_digest": "0fb0fbb90ae7043aefb8f1cbc2b91f39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6599, "upload_time": "2009-07-30T09:11:37", "url": "https://files.pythonhosted.org/packages/97/32/e88309b18dc55b0d5e62ef7eb569c65f58b3013d66f0b0dc39c9aebcff09/collective.recipe.template-1.4.tar.gz" } ], "1.4dev-r93307": [ { "comment_text": "", "digests": { "md5": "96a70b4d97adacc34698e7c928b00651", "sha256": "c0003779cd970da268dd1d9fc8c105b393dd0e6e50ae202366516a1b3e021b8e" }, "downloads": -1, "filename": "collective.recipe.template-1.4dev-r93307.tar.gz", "has_sig": false, "md5_digest": "96a70b4d97adacc34698e7c928b00651", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6614, "upload_time": "2009-07-29T20:23:24", "url": "https://files.pythonhosted.org/packages/6c/31/7a6604069e2e5da82d66880e7ce8bb884d5d88835ac95c1441e5701a4e0d/collective.recipe.template-1.4dev-r93307.tar.gz" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "a2e5ee5a6386690629a253fe00485f1a", "sha256": "d44f94a066460aa0407344c956332db8b27f8338d9cd7281588988f21d29b299" }, "downloads": -1, "filename": "collective.recipe.template-1.5.zip", "has_sig": true, "md5_digest": "a2e5ee5a6386690629a253fe00485f1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16346, "upload_time": "2010-02-23T16:55:01", "url": "https://files.pythonhosted.org/packages/13/aa/e1954bcd20d4ad49b92ff681d90ae9d14f7fb03e92ea4279a933145fb225/collective.recipe.template-1.5.zip" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "7a79ebaf18f18381caa136dda25beddd", "sha256": "1703a1e874f634d3b5f328aac5cae55dbc05e69744ca33fc6732a886e22eced7" }, "downloads": -1, "filename": "collective.recipe.template-1.6.zip", "has_sig": true, "md5_digest": "7a79ebaf18f18381caa136dda25beddd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16629, "upload_time": "2010-02-24T12:21:44", "url": "https://files.pythonhosted.org/packages/80/25/4d4a14317a1db5e2a3266f4142be855e1259008d3cecfe3ee61f69362933/collective.recipe.template-1.6.zip" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "9a765d93fc68835dbb2c3760a4b47929", "sha256": "587814eb130c8891cbbebcf676e736bcd75b066beacd9273d231d58a46e4dead" }, "downloads": -1, "filename": "collective.recipe.template-1.7.zip", "has_sig": false, "md5_digest": "9a765d93fc68835dbb2c3760a4b47929", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21733, "upload_time": "2010-05-21T12:46:17", "url": "https://files.pythonhosted.org/packages/c6/03/7657bb473735e2f6a08224a7673fbfa806593d041de4f0bac689e6fbde71/collective.recipe.template-1.7.zip" } ], "1.8": [ { "comment_text": "", "digests": { "md5": "fad1e733f8d798ff42c83c402958ff26", "sha256": "cd5980e84ae8b3493c83a39da7d9ea05740183fc91807bb2659e20f30d4c9e11" }, "downloads": -1, "filename": "collective.recipe.template-1.8.zip", "has_sig": false, "md5_digest": "fad1e733f8d798ff42c83c402958ff26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22737, "upload_time": "2010-06-08T16:37:49", "url": "https://files.pythonhosted.org/packages/c4/12/466fc1d921b355057d3b091571b165e23a458f8f71d0f3b7c04564313f4f/collective.recipe.template-1.8.zip" } ], "1.9": [ { "comment_text": "", "digests": { "md5": "f8b8eab3cf183ea92c2e50a54da228e8", "sha256": "781362a29af0a65460ae921079d861d626ebf2c93077a789d7da6fa2cb8484d3" }, "downloads": -1, "filename": "collective.recipe.template-1.9.zip", "has_sig": false, "md5_digest": "f8b8eab3cf183ea92c2e50a54da228e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22602, "upload_time": "2011-07-19T23:21:04", "url": "https://files.pythonhosted.org/packages/9b/52/236d234295a5ed94310ea53707dfc1ed23d6c29194931ac756a1e70a94f0/collective.recipe.template-1.9.zip" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "0a36431dadb6cd2fe47847466d002684", "sha256": "503d665c05b814694efeff2ea268da54c424492187bc5711b5a8fde926afc002" }, "downloads": -1, "filename": "collective.recipe.template-2.0.tar.gz", "has_sig": false, "md5_digest": "0a36431dadb6cd2fe47847466d002684", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9333, "upload_time": "2017-01-17T07:06:15", "url": "https://files.pythonhosted.org/packages/f1/1b/949e25d8423df3b6733f9c80cca83c0f70222073b75e0a1227fb31ae7c39/collective.recipe.template-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "6c25387288c290e60253d45268509b79", "sha256": "45780581d155eceb826b541048524dd01ea850f8e535c2fea9697f28494a9d58" }, "downloads": -1, "filename": "collective.recipe.template-2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "6c25387288c290e60253d45268509b79", "packagetype": "bdist_wheel", "python_version": "2", "requires_python": null, "size": 12861, "upload_time": "2018-07-14T10:34:31", "url": "https://files.pythonhosted.org/packages/20/fc/1efc8127a356fb232cbd077e9a0dd42bf7d6395b6f82eb6d4be87d63acb1/collective.recipe.template-2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "67c91f238cc0062ea76368bfbe238338", "sha256": "f01e87232bad742f9c743e61dbf33f95161294c8249d772f4ead99c5502d89c4" }, "downloads": -1, "filename": "collective.recipe.template-2.1.tar.gz", "has_sig": false, "md5_digest": "67c91f238cc0062ea76368bfbe238338", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13992, "upload_time": "2018-07-14T10:34:30", "url": "https://files.pythonhosted.org/packages/a9/46/a34b6254cc8aae43790af9e8bc4077b41edea9f8a8b7f1fc23593f8451de/collective.recipe.template-2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6c25387288c290e60253d45268509b79", "sha256": "45780581d155eceb826b541048524dd01ea850f8e535c2fea9697f28494a9d58" }, "downloads": -1, "filename": "collective.recipe.template-2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "6c25387288c290e60253d45268509b79", "packagetype": "bdist_wheel", "python_version": "2", "requires_python": null, "size": 12861, "upload_time": "2018-07-14T10:34:31", "url": "https://files.pythonhosted.org/packages/20/fc/1efc8127a356fb232cbd077e9a0dd42bf7d6395b6f82eb6d4be87d63acb1/collective.recipe.template-2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "67c91f238cc0062ea76368bfbe238338", "sha256": "f01e87232bad742f9c743e61dbf33f95161294c8249d772f4ead99c5502d89c4" }, "downloads": -1, "filename": "collective.recipe.template-2.1.tar.gz", "has_sig": false, "md5_digest": "67c91f238cc0062ea76368bfbe238338", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13992, "upload_time": "2018-07-14T10:34:30", "url": "https://files.pythonhosted.org/packages/a9/46/a34b6254cc8aae43790af9e8bc4077b41edea9f8a8b7f1fc23593f8451de/collective.recipe.template-2.1.tar.gz" } ] }