{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout :: Recipe", "Programming Language :: Python" ], "description": "======================\nslapos.recipe.template\n======================\n\nTemplate recipe which supports remote resource.\n\nInspired by collective.recipe.template, with minimum set of features, but with\n(hopefully) safer buildout-based templating.\n\n\"jinja2\" entry point allows rendering jinja2 templates.\n\nUsage\n=====\n\nGetting started\n---------------\n\nYou can start by a simple buildout::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ...\n ... [section]\n ... option = value\n ... ''')\n\nAnd a simple template::\n\n >>> write('template.in', '${section:option}')\n\nWe run buildout::\n\n >>> run_buildout()\n Installing template.\n\nAnd the output file has been parsed by buildout itself::\n\n >>> cat('template.out')\n value\n\nFull options\n------------\n\nThere is two non required options:\n\n``md5sum``\n Check the integrity of the input file.\n\n``mode``\n Specify the filesystem permissions in octal notation.\n\nCheck file integrity\n~~~~~~~~~~~~~~~~~~~~\n\nLet's write a file template::\n\n >>> write('template.in', '${buildout:parts}')\n\nCompute its MD5 sum::\n\n >>> from hashlib import md5\n >>> md5sum = md5(open('template.in', 'rb').read()).hexdigest()\n\nWrite the ``buildout.cfg`` using slapos.recipe.template::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ... md5sum = ''' + md5sum + '''\n ... ''')\n\nAnd run buildout, and see the result::\n\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n\n >>> cat('template.out')\n template\n\nIf the md5sum doesn't match, the buildout fail::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ... md5sum = 0123456789abcdef0123456789abcdef\n ... ''')\n >>> run_buildout()\n While:\n Installing.\n Getting section template.\n Initializing section template.\n Error: MD5 checksum mismatch for local resource at 'template.in'.\n\n\nSpecify filesystem permissions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can specify the mode of the written file::\n\n >>> write('template.in', '${buildout:installed}')\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ... mode = 0627\n ... ''')\n\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n\nAnd the generated file with have the right permissions::\n\n >>> import os, stat\n >>> print(\"0%o\" % stat.S_IMODE(os.stat('template.out').st_mode))\n 0627\n\nSection dependency\n------------------\n\nYou can use other part of buildout in the template. This way this parts\nwill be installed as dependency::\n\n >>> write('template.in', '${dependency:foobar}')\n >>> write('buildout.cfg', '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ...\n ... [dependency]\n ... foobar = dependency content\n ... recipe = zc.buildout:debug\n ... ''')\n\n >>> run_buildout()\n Uninstalling template.\n Installing dependency.\n foobar='dependency content'\n recipe='zc.buildout:debug'\n Installing template.\n\nThis way you can get options which are computed in the ``__init__`` of\nthe dependent recipe.\n\nLet's create a sample recipe modifying its option dict::\n\n >>> write('setup.py',\n ... '''\n ... from setuptools import setup\n ...\n ... setup(name='samplerecipe',\n ... entry_points = {\n ... 'zc.buildout': [\n ... 'default = main:Recipe',\n ... ],\n ... }\n ... )\n ... ''')\n >>> write('main.py',\n ... '''\n ... class Recipe(object):\n ...\n ... def __init__(self, buildout, name, options):\n ... options['data'] = 'foobar'\n ...\n ... def install(self):\n ... return []\n ... ''')\n\nLet's just use ``buildout.cfg`` using this egg::\n\n >>> write('template.in', '${sample:data}')\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... develop = .\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template\n ... url = template.in\n ... output = template.out\n ...\n ... [sample]\n ... recipe = samplerecipe\n ... ''')\n >>> run_buildout()\n Develop: '/sample-buildout/.'\n Uninstalling template.\n Uninstalling dependency.\n Installing sample.\n Installing template.\n >>> cat('template.out')\n foobar\n\nJinja2 usage\n============\n\nGetting started\n---------------\n\nExample buildout demonstrating some types::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = foo.in\n ... rendered = foo\n ... context =\n ... key bar section:key\n ... key recipe :recipe\n ... raw knight Ni !\n ... import json_module json\n ... section param_dict parameter-collection\n ...\n ... [parameter-collection]\n ... foo = 1\n ... bar = bar\n ...\n ... [section]\n ... key = value\n ... ''')\n\nAnd according Jinja2 template (kept simple, control structures are possible)::\n\n >>> write('foo.in',\n ... '{{bar}}\\n'\n ... 'Knights who say \"{{knight}}\"\\n'\n ... '${this:is_literal}\\n'\n ... '${foo:{{bar}}}\\n'\n ... 'swallow: {{ json_module.dumps((\"african\", \"european\")) }}\\n'\n ... 'parameters from section: {{ param_dict | dictsort }}\\n'\n ... 'Rendered with {{recipe}}\\n'\n ... 'UTF-8 text: \u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!\\n'\n ... 'Unicode text: {{ \"\u4f60\u597d\u4e16\u754c\" }}\\n'\n ... )\n\nWe run buildout::\n\n >>> run_buildout()\n Installing template.\n\nAnd the template has been rendered::\n\n >>> cat('foo')\n value\n Knights who say \"Ni !\"\n ${this:is_literal}\n ${foo:value}\n swallow: [\"african\", \"european\"]\n parameters from section: [('bar', 'bar'), ('foo', '1')]\n Rendered with slapos.recipe.template:jinja2\n UTF-8 text: \u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!\n Unicode text: \u4f60\u597d\u4e16\u754c\n\nParameters\n----------\n\nMandatory:\n\n``template``\n Template url/path, as accepted by zc.buildout.download.Download.__call__ .\n For very short template, it can make sense to put it directly into\n buildout.cfg: the value is the template itself, prefixed by the string\n \"inline:\" + an optional newline.\n\n``rendered``\n Where rendered template should be stored.\n\nOptional:\n\n``context``\n Jinja2 context specification, one variable per line, with 3\n whitespace-separated parts: type, name and expression. Available types are\n described below. \"name\" is the variable name to declare. Expression semantic\n varies depending on the type.\n\n Available types:\n\n ``raw``\n Immediate literal string.\n\n ``key``\n Indirect literal string.\n\n ``import``\n Import a python module.\n\n ``section``\n Make a whole buildout section available to template, as a dictionary.\n\n Indirection targets are specified as: [section]:key .\n It is possible to use buildout's buit-in variable replacement instead instead\n of ``key`` type, but keep in mind that different lines are different\n variables for this recipe. It might be what you want (factorising context\n chunk declarations), otherwise you should use indirect types.\n\n``md5sum``\n Template's MD5, for file integrity checking. By default, no integrity check\n is done.\n\n``mode``\n Mode, in octal representation (no need for 0-prefix) to set output file to.\n This is applied before storing anything in output file.\n\n``once``\n Path of a marker file to prevents rendering altogether.\n\n``extensions``\n Jinja2 extensions to enable when rendering the template,\n whitespace-separated. By default, none is loaded.\n\n``import-delimiter``\n Delimiter character for in-temlate imports.\n Defaults to ``/``.\n See also: import-list\n\n``import-list``\n Declares a list of import paths. Format is similar to ``context``.\n \"name\" becomes import's base name.\n\n Available types:\n\n ``rawfile``\n Literal path of a file.\n\n ``file``\n Indirect path of a file.\n\n ``rawfolder``\n Literal path of a folder. Any file in such folder can be imported.\n\n ``folder``\n Indirect path of a folder. Any file in such folder can be imported.\n\n``encoding``\n Encoding for input template and output file.\n Defaults to ``utf-8``.\n\nFAQ\n---\n\nQ: How do I generate ${foo:bar} where foo comes from a variable ?\n\nA: ``{{ '${' ~ foo_var ~ ':bar}' }}``\n This is required as jinja2 fails parsing \"${{{ foo_var }}:bar}\". Though,\n jinja2 succeeds at parsing \"${foo:{{ bar_var }}}\" so this trick isn't\n needed for that case.\n\nUse jinja2 extensions\n~~~~~~~~~~~~~~~~~~~~~\n\n >>> write('foo.in',\n ... '''{% set foo = ['foo'] -%}\n ... {% do foo.append(bar) -%}\n ... {{ foo | join(', ') }}''')\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = foo.in\n ... rendered = foo\n ... context = key bar buildout:parts\n ... # We don't actually use all those extensions in this minimal example.\n ... extensions = jinja2.ext.do jinja2.ext.loopcontrols\n ... jinja2.ext.with_\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n\n >>> cat('foo')\n foo, template\n\nCheck file integrity\n~~~~~~~~~~~~~~~~~~~~\n\nCompute template's MD5 sum::\n\n >>> write('foo.in', '{{bar}}')\n >>> from hashlib import md5\n >>> with open('foo.in', 'rb') as f:\n ... md5sum = md5(f.read()).hexdigest()\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = foo.in\n ... rendered = foo\n ... context = key bar buildout:parts\n ... md5sum = ''' + md5sum + '''\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n\n >>> cat('foo')\n template\n\nIf the md5sum doesn't match, the buildout fail::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = foo.in\n ... rendered = foo\n ... context = key bar buildout:parts\n ... md5sum = 0123456789abcdef0123456789abcdef\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n While:\n Installing template.\n Error: MD5 checksum mismatch for local resource at 'foo.in'.\n\n\nSpecify filesystem permissions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can specify the mode for rendered file::\n\n >>> write('template.in', '{{bar}}')\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = template.in\n ... rendered = foo\n ... context = key bar buildout:parts\n ... mode = 205\n ... ''')\n >>> run_buildout()\n Installing template.\n\nAnd the generated file with have the right permissions::\n\n >>> import os, stat\n >>> print(\"0%o\" % stat.S_IMODE(os.stat('foo').st_mode))\n 0205\n\nNote that Buildout will not allow you to have write permission for others\nand will silently remove it (i.e a 207 mode will become 205).\n\nTemplate imports\n~~~~~~~~~~~~~~~~\n\nHere is a simple template importing an equaly-simple library:\n\n >>> write('template.in', '''\n ... {%- import \"library\" as library -%}\n ... {{ library.foo() }}\n ... ''')\n >>> write('library.in', '{% macro foo() %}FOO !{% endmacro %}')\n\nTo import a template from rendered template, you need to specify what can be\nimported::\n\n >>> write('buildout.cfg', '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = template.in\n ... rendered = bar\n ... import-list = rawfile library library.in\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n >>> cat('bar')\n FOO !\n\nJust like context definition, it also works with indirect values::\n\n >>> write('buildout.cfg', '''\n ... [buildout]\n ... parts = template\n ...\n ... [template-library]\n ... path = library.in\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = template.in\n ... rendered = bar\n ... import-list = file library template-library:path\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n >>> cat('bar')\n FOO !\n\nThis also works to allow importing from identically-named files in different\ndirectories::\n\n >>> write('template.in', '''\n ... {%- import \"dir_a/1.in\" as a1 -%}\n ... {%- import \"dir_a/2.in\" as a2 -%}\n ... {%- import \"dir_b/1.in\" as b1 -%}\n ... {%- import \"dir_b/c/1.in\" as bc1 -%}\n ... {{ a1.foo() }}\n ... {{ a2.foo() }}\n ... {{ b1.foo() }}\n ... {{ bc1.foo() }}\n ... ''')\n >>> mkdir('a')\n >>> mkdir('b')\n >>> mkdir(join('b', 'c'))\n >>> write(join('a', '1.in'), '{% macro foo() %}a1foo{% endmacro %}')\n >>> write(join('a', '2.in'), '{% macro foo() %}a2foo{% endmacro %}')\n >>> write(join('b', '1.in'), '{% macro foo() %}b1foo{% endmacro %}')\n >>> write(join('b', 'c', '1.in'), '{% macro foo() %}bc1foo{% endmacro %}')\n\nAll templates can be accessed inside both folders::\n\n >>> write('buildout.cfg', '''\n ... [buildout]\n ... parts = template\n ...\n ... [template-library]\n ... path = library.in\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = template.in\n ... rendered = bar\n ... import-list =\n ... rawfolder dir_a a\n ... rawfolder dir_b b\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n >>> cat('bar')\n a1foo\n a2foo\n b1foo\n bc1foo\n\nIt is possible to override default path delimiter (without any effect on final\npath)::\n\n >>> write('template.in', r'''\n ... {%- import \"dir_a\\\\1.in\" as a1 -%}\n ... {%- import \"dir_a\\\\2.in\" as a2 -%}\n ... {%- import \"dir_b\\\\1.in\" as b1 -%}\n ... {%- import \"dir_b\\\\c\\\\1.in\" as bc1 -%}\n ... {{ a1.foo() }}\n ... {{ a2.foo() }}\n ... {{ b1.foo() }}\n ... {{ bc1.foo() }}\n ... ''')\n >>> write('buildout.cfg', r'''\n ... [buildout]\n ... parts = template\n ...\n ... [template-library]\n ... path = library.in\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = template.in\n ... rendered = bar\n ... import-delimiter = \\\n ... import-list =\n ... rawfolder dir_a a\n ... rawfolder dir_b b\n ... ''')\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n >>> cat('bar')\n a1foo\n a2foo\n b1foo\n bc1foo\n\nSection dependency\n------------------\n\nYou can use other part of buildout in the template. This way this parts\nwill be installed as dependency::\n\n >>> write('buildout.cfg', '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = inline:{{bar}}\n ... rendered = foo\n ... context = key bar dependency:foobar\n ...\n ... [dependency]\n ... foobar = dependency content\n ... recipe = zc.buildout:debug\n ... ''')\n\n >>> run_buildout()\n Uninstalling template.\n Installing dependency.\n foobar='dependency content'\n recipe='zc.buildout:debug'\n Installing template.\n\nThis way you can get options which are computed in the ``__init__`` of\nthe dependent recipe.\n\nLet's create a sample recipe modifying its option dict::\n\n >>> write('setup.py',\n ... '''\n ... from setuptools import setup\n ...\n ... setup(name='samplerecipe',\n ... entry_points = {\n ... 'zc.buildout': [\n ... 'default = main:Recipe',\n ... ],\n ... }\n ... )\n ... ''')\n >>> write('main.py',\n ... '''\n ... class Recipe(object):\n ...\n ... def __init__(self, buildout, name, options):\n ... options['data'] = 'foobar'\n ...\n ... def install(self):\n ... return []\n ... ''')\n\nLet's just use ``buildout.cfg`` using this egg::\n\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... develop = .\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = inline:\n ... {{bar}}\n ... rendered = foo\n ... context = key bar sample:data\n ...\n ... [sample]\n ... recipe = samplerecipe\n ... ''')\n >>> run_buildout()\n Develop: '/sample-buildout/.'\n Uninstalling template.\n Uninstalling dependency.\n Installing sample.\n Installing template.\n >>> cat('foo')\n foobar\n\nAvoiding file re-creation\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nNormally, each time the section is installed/updated the file gets\nre-generated. This may be undesirable in some cases.\n\n``once`` allows specifying a marker file, which when present prevents template\nrendering.\n\n >>> import os\n >>> write('buildout.cfg',\n ... '''\n ... [buildout]\n ... parts = template\n ...\n ... [template]\n ... recipe = slapos.recipe.template:jinja2\n ... template = inline:dummy\n ... rendered = foo_once\n ... once = foo_flag\n ... ''')\n >>> run_buildout() # doctest: +ELLIPSIS\n Uninstalling template.\n Uninstalling sample.\n Getting distribution for 'samplerecipe'.\n Got samplerecipe 0.0.0.\n Installing template.\n The template install returned None. A path or iterable os paths should be returned.\n warning: install_lib: '...' does not exist -- no Python modules to install\n \n zip_safe flag not set; analyzing archive contents...\n\nTemplate was rendered::\n\n >>> cat('foo_once')\n dummy\n\nAnd canary exists::\n\n >>> os.path.exists('foo_flag')\n True\n\nRemove rendered file and re-render::\n\n >>> import os\n >>> os.unlink('foo_once')\n >>> with open('buildout.cfg', 'a') as f:\n ... f.writelines(['extra = useless'])\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n The template install returned None. A path or iterable os paths should be returned.\n Unused options for template: 'extra'.\n\nTemplate was not rendered::\n\n >>> os.path.exists('foo_once')\n False\n\nRemoving the canary allows template to be re-rendered::\n\n >>> os.unlink('foo_flag')\n >>> with open('buildout.cfg', 'a') as f:\n ... f.writelines(['moreextra = still useless'])\n >>> run_buildout()\n Uninstalling template.\n Installing template.\n The template install returned None. A path or iterable os paths should be returned.\n Unused options for template: 'extra'.\n >>> cat('foo_once')\n dummy\n\n\n4.3 (2018-01-25)\n================\n\n* jinja2: Compile the same source only once and use compiled source next time.\n\n4.2 (2017-12-12)\n================\n\n* jinja2: try to not rewrite on update if there's no change\n\n4.1 (2017-10-18)\n================\n\n* Fix $$ escaping in basic templates.\n\n4.0 (2017-10-13)\n================\n\n* jinja2: read template at install/update and fix 'mode' option\n* Add support for Python 3.\n\n3.0 (2017-05-23)\n================\n\n* jinja2: make 'import' return the leaf module instead of the root one.\n\n2.10 (2017-01-18)\n=================\n\n* jinja2: Add support for render-once.\n\n2.9 (2015-11-18)\n================\n\n* jinja2: Add support for non-ascii templates.\n Encoding for input/output and imported files can be set via new \"encoding\"\n parameter which defaults to utf-8.\n\n2.8 (2015-06-25)\n================\n\n* jinja2: new assert function.\n\n2.7 (2015-05-18)\n================\n\n* jinja2: fix display of source in traceback when there is an error in the\n root template (or in instance parameters).\n\n2.6 (2014-11-26)\n================\n\n * jinja2: add many built-in functions from Python.\n\n2.5 (2013-08-07)\n================\n\n * Fix file import with Jinja2 >= 2.7\n\n2.4.3 (2013-08-02)\n==================\n\n * jinja2: add support for inline templates.\n\n2.4.2 (2012-08-21)\n==================\n\n * jinja2: Mode shall be used instead of umask. [Vincent Pelletier]\n * jinja2: Add jinja2 \"import\" directive support. [Vincent Pelletier,\n Timothee Lacroix]\n * Added rawfile and rawfolder types. [Vincent Pelletier, Timothee Lacroix]\n * Reworked loader classes [Vincent Pelletier]\n\n2.4.1 (2012-08-01)\n==================\n\n * jinja2: Make \"context\" parameter really optional. [Vincent Pelletier]\n\n2.4 (2012-06-01)\n================\n\n * Provide access to zc.buildout.buildout.dumps when it exists. [Vincent\n Pelletier]\n\n * Fix missing jinja2 entry point documentation in pacakge description [Vincent\n Pelletier]\n\n2.3 (2012-03-29)\n================\n\n * Add jinja2 entry point with jinja2 template support. [Vincent Pelletier]\n\n2.2 (2011-10-12)\n================\n\n * Include missing files in package. [\u0141ukasz Nowak]\n\n2.1 (2011-10-12)\n================\n\n * Description update. [\u0141ukasz Nowak]\n\n2.0 (2011-10-12)\n================\n\n * Dropping collective.recipe.template dependency. [Romain Courteaud, Antoine\n Catton]\n\n1.1 (2011-05-30)\n================\n\n * Moved out from slapos.cookbook in order to minimise depenencies [\u0141ukasz\n Nowak]\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "slapos recipe", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "slapos.recipe.template", "package_url": "https://pypi.org/project/slapos.recipe.template/", "platform": "", "project_url": "https://pypi.org/project/slapos.recipe.template/", "project_urls": null, "release_url": "https://pypi.org/project/slapos.recipe.template/4.3/", "requires_dist": null, "requires_python": "", "summary": "Templating recipe with remote resource support.", "version": "4.3" }, "last_serial": 3521138, "releases": { "1.0.dev-r4150": [ { "comment_text": "", "digests": { "md5": "ff7c76662e363b64849670391aba4765", "sha256": "18a8aaf737ded850ce17f85c60c620095445ef0a5083b06dc7ee7b0b45bd5ab5" }, "downloads": -1, "filename": "slapos.recipe.template-1.0.dev-r4150.tar.gz", "has_sig": false, "md5_digest": "ff7c76662e363b64849670391aba4765", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2739, "upload_time": "2011-02-08T13:56:44", "url": "https://files.pythonhosted.org/packages/06/77/53a7cf65dcf0341d29189b4575580905ca06eb7bfb1c704a071f7ad43dfd/slapos.recipe.template-1.0.dev-r4150.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "093ac136f46e0cd82743f1092529fd1a", "sha256": "f3d3ab80ca32d0b25c1eac9ed76814a741fac4a6d08ff712f67b8054f0decb56" }, "downloads": -1, "filename": "slapos.recipe.template-1.1.tar.gz", "has_sig": false, "md5_digest": "093ac136f46e0cd82743f1092529fd1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2772, "upload_time": "2011-05-30T13:51:15", "url": "https://files.pythonhosted.org/packages/35/d2/54d261dde77cb483f5c5917f19df6404c44ad9242f04b2c6000fa40e9be1/slapos.recipe.template-1.1.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "15f8bf411bab8e8c9d6db6785ca587c5", "sha256": "0d22b0c50a170122ea94e8e454ac8ffdf96e4b67fabe89d5d71582bfe38f61d6" }, "downloads": -1, "filename": "slapos.recipe.template-2.0.tar.gz", "has_sig": false, "md5_digest": "15f8bf411bab8e8c9d6db6785ca587c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4434, "upload_time": "2011-10-12T12:06:09", "url": "https://files.pythonhosted.org/packages/e1/a3/61837f51e2aaf721986cc31274a77623e3c89f8ff67850620c2e2f5a6937/slapos.recipe.template-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "0b4265b528a458bcb0a3f74e59222407", "sha256": "671c678dd8dd50e18dd43601ee88082a05366704d0c32d80d0d152ed38eee7b8" }, "downloads": -1, "filename": "slapos.recipe.template-2.1.tar.gz", "has_sig": false, "md5_digest": "0b4265b528a458bcb0a3f74e59222407", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4486, "upload_time": "2011-10-12T12:10:26", "url": "https://files.pythonhosted.org/packages/10/dd/6e595da182e3cc7497e08e7e6af428c69eb742c7e1aadb4d300945d3c4d9/slapos.recipe.template-2.1.tar.gz" } ], "2.10": [ { "comment_text": "", "digests": { "md5": "0d0c950983a2e9460e9bc75a2a9d07cc", "sha256": "7de5647dd761670cdb1b7419f0ce773121b7673b77237bf243816ec0bdcc2516" }, "downloads": -1, "filename": "slapos.recipe.template-2.10.tar.gz", "has_sig": false, "md5_digest": "0d0c950983a2e9460e9bc75a2a9d07cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17852, "upload_time": "2017-01-18T11:00:45", "url": "https://files.pythonhosted.org/packages/4e/e7/f43908e72ead591803f4a122ea5b3845e6590daf93e7cfa2fa0f8633ea9c/slapos.recipe.template-2.10.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "b2fc83fed9990b6dff262eada67dc0ff", "sha256": "c02250fd3dc59de65bb7c4507b036b0c778dbc7fc5270e806a160ac4a52d4fef" }, "downloads": -1, "filename": "slapos.recipe.template-2.2.tar.gz", "has_sig": false, "md5_digest": "b2fc83fed9990b6dff262eada67dc0ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5032, "upload_time": "2011-10-12T13:58:53", "url": "https://files.pythonhosted.org/packages/b0/59/3567311807b36d91bc30e0997162f71fe9a97abfd0faec109671a0f5b8b1/slapos.recipe.template-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "06e1a69f4799963fd127438c82bd0b67", "sha256": "ff5ec421744ca262ac6c71a97404d94a3d42e1f6bb635fda03d9e0f8a4fb87ab" }, "downloads": -1, "filename": "slapos.recipe.template-2.3.tar.gz", "has_sig": false, "md5_digest": "06e1a69f4799963fd127438c82bd0b67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8288, "upload_time": "2012-03-29T11:34:25", "url": "https://files.pythonhosted.org/packages/b1/b3/215a694ea3ee09aeeed2b71c3f8926298e21b9cbd2e8099aac4bc0f091bb/slapos.recipe.template-2.3.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "1cefda1c42452b920f1a6e2af48941c0", "sha256": "e74c8ff082c71f31d8922d672ffba681f47ee30d1ad54fac38c9b8dd9c28d34a" }, "downloads": -1, "filename": "slapos.recipe.template-2.4.tar.gz", "has_sig": false, "md5_digest": "1cefda1c42452b920f1a6e2af48941c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9964, "upload_time": "2012-06-01T12:11:54", "url": "https://files.pythonhosted.org/packages/fc/ac/bf59a75a7f763639185e98e19c1e4e6979b1f5f33e977e7bb1e0b418357c/slapos.recipe.template-2.4.tar.gz" } ], "2.4.1": [ { "comment_text": "", "digests": { "md5": "8e6e7be26ea5bf0f61f3fb784b0ee20b", "sha256": "a40e534274a763b6d73c05fb7b8982adb90ddf2632db65519cbb650284b0bc6a" }, "downloads": -1, "filename": "slapos.recipe.template-2.4.1.tar.gz", "has_sig": false, "md5_digest": "8e6e7be26ea5bf0f61f3fb784b0ee20b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10052, "upload_time": "2012-08-01T09:56:40", "url": "https://files.pythonhosted.org/packages/3f/46/d9e8179f1601e07b28e43a559cd2137364c0c0058dac6f051136e46f49af/slapos.recipe.template-2.4.1.tar.gz" } ], "2.4.2": [ { "comment_text": "", "digests": { "md5": "30afdd826bc5ada7e6921399ef236a1c", "sha256": "49c18964b240169a32d510e1adb73516e554bea9520b7492a02c8d9a1d438dfc" }, "downloads": -1, "filename": "slapos.recipe.template-2.4.2.tar.gz", "has_sig": false, "md5_digest": "30afdd826bc5ada7e6921399ef236a1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14157, "upload_time": "2012-08-21T14:34:30", "url": "https://files.pythonhosted.org/packages/b1/a0/3738cdab0b0408447a32122dc7efdfb43be9c361a2eb70e9495e694a155f/slapos.recipe.template-2.4.2.tar.gz" } ], "2.4.3": [ { "comment_text": "", "digests": { "md5": "b58501c07e24bea7400f26cded83d982", "sha256": "ff9844fef706954ba9d85a6fa741c2077fc792822f1ca4ae143e7b416dbbc94c" }, "downloads": -1, "filename": "slapos.recipe.template-2.4.3.tar.gz", "has_sig": false, "md5_digest": "b58501c07e24bea7400f26cded83d982", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15053, "upload_time": "2013-08-02T14:24:56", "url": "https://files.pythonhosted.org/packages/33/28/9079f0f6c0fee1ed08b4fab559a90dfdeb1664a86bc1342d42096409b93e/slapos.recipe.template-2.4.3.tar.gz" } ], "2.5": [ { "comment_text": "", "digests": { "md5": "219b5794493d924c6bffcf0fa77bf907", "sha256": "86dd144c4c66949e225ff69e43e4cc32898e7252b1d34d5fe4172670d6713cc8" }, "downloads": -1, "filename": "slapos.recipe.template-2.5.tar.gz", "has_sig": true, "md5_digest": "219b5794493d924c6bffcf0fa77bf907", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14739, "upload_time": "2013-08-07T17:58:52", "url": "https://files.pythonhosted.org/packages/94/35/2655417154dc3258a3868bdfc3f5248fcb22f88ab29ba379be25550c9e14/slapos.recipe.template-2.5.tar.gz" } ], "2.6": [ { "comment_text": "", "digests": { "md5": "10d09291db282026ee7f2a7b55a0c946", "sha256": "4c6ba60faa961b5c552739afb95209feba04df133df888a39b4ad08effc0e078" }, "downloads": -1, "filename": "slapos.recipe.template-2.6.tar.gz", "has_sig": true, "md5_digest": "10d09291db282026ee7f2a7b55a0c946", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15227, "upload_time": "2014-12-08T13:14:20", "url": "https://files.pythonhosted.org/packages/e9/20/2a6802744be932b1d04b7d71d9b8073d095dba2a7b38b70f072dfbad8231/slapos.recipe.template-2.6.tar.gz" } ], "2.7": [ { "comment_text": "", "digests": { "md5": "1cb1a7dc0928c771a2c3f5f09aa3199d", "sha256": "8b82def69c6cb2ff7ef6f6543763f63e5070326d56a0838455a4041034ebafaa" }, "downloads": -1, "filename": "slapos.recipe.template-2.7.tar.gz", "has_sig": true, "md5_digest": "1cb1a7dc0928c771a2c3f5f09aa3199d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15387, "upload_time": "2015-05-19T17:25:01", "url": "https://files.pythonhosted.org/packages/c9/70/c035c91c6481b5cbb9e2db7797c75e32d6864ff83d801cba4f0a32139d41/slapos.recipe.template-2.7.tar.gz" } ], "2.8": [ { "comment_text": "", "digests": { "md5": "b91b8edd14af1025f52bb3397a32cd9e", "sha256": "2572076d6ddcd86b0de56f5a3b6c5370d86c4ddf9ba211ba51578c144233ef68" }, "downloads": -1, "filename": "slapos.recipe.template-2.8.tar.gz", "has_sig": true, "md5_digest": "b91b8edd14af1025f52bb3397a32cd9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15464, "upload_time": "2015-06-25T10:30:46", "url": "https://files.pythonhosted.org/packages/cf/2d/168640dd8820280964542c8f1dcddd59766ac3f41fc2bfac6304cf006173/slapos.recipe.template-2.8.tar.gz" } ], "2.9": [ { "comment_text": "", "digests": { "md5": "36aae2227e7957b6c0708b66a3839cee", "sha256": "d4c685fa9420b926cd2103907a93c8cc88309ab464b59fe71a42ff20e5226f0d" }, "downloads": -1, "filename": "slapos.recipe.template-2.9.tar.gz", "has_sig": true, "md5_digest": "36aae2227e7957b6c0708b66a3839cee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15958, "upload_time": "2015-11-18T15:53:31", "url": "https://files.pythonhosted.org/packages/ad/29/8e6db7cea3070f5891c06dd76f75a38c3fac3ff68678114093fa52e88286/slapos.recipe.template-2.9.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "41758d427e5a673ea2c9ea1ae814b9b7", "sha256": "1f8ce8ee15419a0c8cde7c33bc48916c6c4f837cd8326b83b7fdedcfe5ce62f7" }, "downloads": -1, "filename": "slapos.recipe.template-3.0.tar.gz", "has_sig": true, "md5_digest": "41758d427e5a673ea2c9ea1ae814b9b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18492, "upload_time": "2017-06-03T19:54:53", "url": "https://files.pythonhosted.org/packages/28/ad/a3c2c0a12af3334b54c1634cdf78b6fdc9f26768351ed28cd7fb70deb69a/slapos.recipe.template-3.0.tar.gz" } ], "4.0": [ { "comment_text": "", "digests": { "md5": "454ea09565c36906a423c6e28a224b18", "sha256": "8c03a338c219ec54b88ff0cb797bfff594a718e7a1fb01622084a5d145527654" }, "downloads": -1, "filename": "slapos.recipe.template-4.0.tar.gz", "has_sig": true, "md5_digest": "454ea09565c36906a423c6e28a224b18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18442, "upload_time": "2017-10-13T17:27:50", "url": "https://files.pythonhosted.org/packages/84/4e/e2ddfb4c7b118d214b4063564b4d81986ac27ea884e179133e51d784d081/slapos.recipe.template-4.0.tar.gz" } ], "4.1": [ { "comment_text": "", "digests": { "md5": "0b2bace66373c318661eda95affedbbc", "sha256": "2d2c39da707c0361280ead2989785b6e2a7f4e7eadd8e4bfaa680292666d665c" }, "downloads": -1, "filename": "slapos.recipe.template-4.1.tar.gz", "has_sig": true, "md5_digest": "0b2bace66373c318661eda95affedbbc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18462, "upload_time": "2017-10-18T16:45:15", "url": "https://files.pythonhosted.org/packages/f7/23/c25b6148eb6a4f43d3dbecd063c90d5765ac9afdddc780bc137286cb4dea/slapos.recipe.template-4.1.tar.gz" } ], "4.2": [ { "comment_text": "", "digests": { "md5": "e04ada4d1d40343fa436fac7715ea616", "sha256": "6724e39c53de876de679e6aef4dd47a97995a3032dc6a7320c24006522baff50" }, "downloads": -1, "filename": "slapos.recipe.template-4.2.tar.gz", "has_sig": true, "md5_digest": "e04ada4d1d40343fa436fac7715ea616", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18938, "upload_time": "2017-12-11T10:50:46", "url": "https://files.pythonhosted.org/packages/47/7f/009ce733c40a8714aea4e9094a725d1c8dcc8cc804ea9642f0611428b85a/slapos.recipe.template-4.2.tar.gz" } ], "4.3": [ { "comment_text": "", "digests": { "md5": "ee2a2cb2c7b2ea079495adaa05a1de52", "sha256": "f84c47b50c4a5021efc922154f5533513701cd90b79ce9d428b6b9a6246da578" }, "downloads": -1, "filename": "slapos.recipe.template-4.3.tar.gz", "has_sig": false, "md5_digest": "ee2a2cb2c7b2ea079495adaa05a1de52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18925, "upload_time": "2018-01-25T16:44:58", "url": "https://files.pythonhosted.org/packages/8f/4c/00a1dcddfd400ecabc8373817c0e736128364cc3c7fe76eb5dcc4d61cfcc/slapos.recipe.template-4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ee2a2cb2c7b2ea079495adaa05a1de52", "sha256": "f84c47b50c4a5021efc922154f5533513701cd90b79ce9d428b6b9a6246da578" }, "downloads": -1, "filename": "slapos.recipe.template-4.3.tar.gz", "has_sig": false, "md5_digest": "ee2a2cb2c7b2ea079495adaa05a1de52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18925, "upload_time": "2018-01-25T16:44:58", "url": "https://files.pythonhosted.org/packages/8f/4c/00a1dcddfd400ecabc8373817c0e736128364cc3c7fe76eb5dcc4d61cfcc/slapos.recipe.template-4.3.tar.gz" } ] }