{ "info": { "author": "Philip J Grabner, Cadit Health Inc", "author_email": "oss@cadit.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "License :: Public Domain", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development" ], "description": "===============\nTemplateAlchemy\n===============\n\n.. WARNING::\n\n 2013/07/29: TemplateAlchemy is in its very early stages - you should\n come back later.\n\nTemplateAlchemy aims to be to the fragmented world of templates what\nSQLAlchemy is to the world of databases: a generic abstraction for\nsystems that need templated data, but don't care about what language\nor implementation is used to render that data.\n\nIn essence, the primary purpose of this package is to allow other\npackages that need templated data (such as the email generation\npackage `genemail `_) to remain\nun-opinionated about template format and source, while still providing\nuseful higher-level functionality.\n\nBy default, TemplateAlchemy uses pkgutil for template location\n(i.e. files from a package, either on the filesystem or in a zip\narchive) and Mako for rendering, but these settings are trivial to\nconfigure to use something else. For example, you may want to store\ntemplates in a database (with built-in support) and use the Jinja2\nrendering engine (supported via the `TemplateAlchemy-Jinja2\n`_ package).\n\n\nTL;DR\n=====\n\nInstall:\n\n.. code-block:: bash\n\n $ pip install templatealchemy\n\nUse:\n\n.. code-block:: python\n\n import templatealchemy as ta\n\n # create a top-level template manager\n root = ta.Manager(\n source = 'pkg:mypackagename:lib/templates',\n renderer = 'mako',\n )\n\n # load the sub-template 'foo'\n foo = root.getTemplate('foo')\n\n # render the 'text' version with some parameters; the\n # actual template is then in 'mypackagename:lib/templates/foo.text'\n params = dict(value='bar', zig='zog')\n text = foo.render('text', params)\n\n # get meta information about the template\n if 'attachments' in foo.meta:\n for attachment in foo.meta.attachments:\n # ... do something with each attachment\n\n # supported formats are stored in meta.formats\n assert(foo.meta.formats == ['text', 'html'])\n\n\nOverview\n========\n\nThe primary API exposed by TemplateAlchemy is the\n*templatealchemy.Template*. A template has two functions:\n\n* **Generate content**: given a requested format and parameters, a\n template renders serialized output data.\n\n* **Expose meta-information**: certain constructs, such as email\n generation and generated data previews, require that the template\n disclose some kinds of information. Basically, templates can provide\n additional information to give context to the template.\n\nIn order to achieve these functions, templates use *sources* and\n*renderers*. Sources provide read access to persistent storage and\nrenderers convert source data into output form.\n\n.. IMPORTANT::\n\n The special format ``spec`` is reserved and used to parameterize\n template meta information; it must not be used as a format.\n\n\nSources\n-------\n\nAlthough TemplateAlchemy comes with several built-in template sources,\nit exposes a generic API that can be extended to support any template\nstorage mechanism. The following built-in sources exist:\n\n* ``file``:\n\n Fetches templates from the filesystem. See `API Details`_ for more\n information.\n\n* ``pkg``:\n\n The `pkg` source extracts sources from a python package. This means\n that it can stream the data directly from the filesystem or from a\n zip-archive (depending on how the package was installed). See `API\n Details`_ for more information.\n\n* ``sqlalchemy``:\n\n The `sqlalchemy` source fetches sources from a database using the\n SQLAlchemy database abstraction library. See `API Details`_ for more\n information.\n\n* ``stream``:\n\n The `stream` source reads a template from a file-like object;\n because it does not buffer any data, the template is single-use.\n This is typically used in programs that know that the template will\n only be used once, such as command-line programs.\n\n* ``string``:\n\n The `string` source allows a simple way to provide templates inline.\n Generally not very useful beyond that -- serious re-evaluation is\n recommended if this is used frequently in an application.\n\n\nRenderers\n---------\n\nOnce a template has been loaded from a source, it is rendered to\nserialized form by a renderer. Just like sources, TemplateAlchemy uses\nan abstract interface for this function, and therefore can support any\nrendering engine. TemplateAlchemy has support for the following\nengines built-in:\n\n* ``mako``:\n\n Probably the most efficient and most advanced python templating\n engine, mako is the recommended engine. However, it does allow\n arbitrary python to be executed, so the input data must be trusted.\n See `API Details`_ for more information.\n\n* ``mustache``:\n\n A logic-less templating engine that is very simple and effective.\n Since it does not allow arbitrary python to be executed, this is a\n better choice of renderer if the input data is not trusted. See `API\n Details`_ for more information.\n\n\nAPI Details\n===========\n\nThis section provides in-depth API information. Both sources and\nrenderers can be passed to TemplateAlchemy either as an implementation\nof the respective API objects or as string specifications. In the\nlatter case, the string must be in the format ``TYPE:SPEC``, for\nexample ``\"mako:default_filters=[h]\"``. The ``:SPEC`` can be left off\nto use default values, for example ``\"mako\"``.\n\nSources\n-------\n\nAbstract Interface\n~~~~~~~~~~~~~~~~~~\n\nThe abstract interface for a TemplateAlchemy source is in\n`templatealchemy.api.Source`, which has the following definition:\n\n.. code-block:: python\n\n class templatealchemy.api.Source(object):\n\n def get(self, format):\n '''\n Returns the source content stream for the current template\n source for the specified `format`. The returned object must be a\n file-like object supporting read access.\n '''\n\n def getSource(self, name):\n '''\n Returns a subsidiary source template, relative to the current\n template, with the specified `name`. This is seen as a hierchical\n relationship, and is typically represented as a slash ('/')\n delimited path.\n '''\n\n def getFormats(self):\n '''\n Returns a list of all the available formats for this source.\n '''\n\n def getRelated(self, name):\n '''\n Returns a content stream for the related object `name` that\n is relative to the current template. Typically this is used\n for meta-information *spec* definitions using the \"!include\"\n or \"!include-raw\" directives. As with :meth:`get`, the\n returned object must be a file-like object supporting read\n access.\n '''\n\n\nFile Hierarchy ('file' and 'pkg' sources)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe `file` source expects the path to the template hierarchy as a\nspecification, e.g. if the templates are located in\n``/var/lib/templates``, then the `source` spec should be\n``file:/var/lib/templates``.\n\nThe `pkg` source expects the package name and relative path to the\ntemplate hierarchy as a specification separated by a colon (':'),\ne.g. if the templates are located in the ``demo`` package and within\nits ``templates`` directory, then the `source` spec should be\n``pkg:demo:templates``.\n\nTemplate hierarchies for the `file` and `pkg` sources map directly to\nfilesystem hierarchies. (Note that for the `pkg` source, these may be\nstored in a zip archive depending on installation method, but will be\ntreated the same.) When rendering, the `format` maps directly to the\nfile extension, adjusted for any `spec` rules.\n\nFor example, given the following filesystem structure:\n\n.. code-block:: text\n\n -- /myroot/\n `-- foo/\n |-- bar.html | content: '

{{name}}

'\n `-- bar.text | content: 'Name is {{name}}'\n\n\nThe following code will pass the assert:\n\n.. code-block:: python\n\n import templatealchemy as ta\n root = ta.Manager(source='file:/myroot', renderer='mustache')\n bar = root.getTemplate('foo/bar')\n\n assert(bar.render('text', dict(name='Joe')) == 'Name is Joe')\n assert(bar.render('html', dict(name='Joe')) == '

Joe

')\n\n\nSQLAlchemy\n~~~~~~~~~~\n\nThe `sqlalchemy` source allows templates to be store in any database\nthat the SQLAlchemy python library supports. The sqlalchemy\nspecification is simply the database URL as you would pass it to\nsqlalchemy.create_engine. For example, if the templates were stored\nin the /var/lib/templates.db sqlite database, then the `source` spec\nwould be ``sqlalchemy:sqlite:////var/lib/templates.db``.\n\nBy default, the sqlalchemy source expects a table named ``template``\nto exist in the database, with the columns `name`, `format` and\n`content`. Currently, the `templatealchemy.sqlalchemy` implementation\ndoes not support the use of sessions; to use them instead of the\nstandard direct connection, use a subclass of\n`templatealchemy.sqlalchemy.SaSource`.\n\nFor example, given the following database content:\n\n.. code-block:: text\n\n $ sqlite3 -header -column /var/lib/templates.db 'select * from template'\n name format content\n ---------- ---------- ----------------------------\n foo/bar html

{{name}}

\n foo/bar text Name is {{name}}\n\nThe following code will pass the assert:\n\n.. code-block:: python\n\n import templatealchemy as ta\n root = ta.Manager(source='sqlalchemy:sqlite:////var/lib/templates.db',\n renderer='mustache')\n bar = root.getTemplate('foo/bar')\n\n assert(bar.render('text', dict(name='Joe')) == 'Name is Joe')\n assert(bar.render('html', dict(name='Joe')) == '

Joe

')\n\n\nRenderers\n---------\n\nAbstract Interface\n~~~~~~~~~~~~~~~~~~\n\nThe abstract interface for a TemplateAlchemy renderer is in\n`templatealchemy.api.Renderer`, which has the following definition:\n\n.. code-block:: python\n\n class templatealchemy.api.Renderer(object):\n\n def render(self, context, stream, params):\n '''\n Renders the given template data `stream` (as a read-access\n file-like object) to serialized rendered output. The given\n `params` provide variables that are typically passed to the\n template using template-specific mechanisms.\n\n todo: update this when the time comes:\n\n `context` is a reserved parameter that is intended to enable\n cross-driver optimizations, but has not been defined at this\n point.\n '''\n\n\nMako\n~~~~\n\nTODO: add docs\n\n\nMustache\n~~~~~~~~\n\nTODO: add docs\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/cadithealth/templatealchemy", "keywords": "template unopinionated abstraction layer sqlalchemy mako mustache", "license": "MIT (http://opensource.org/licenses/MIT)", "maintainer": "", "maintainer_email": "", "name": "TemplateAlchemy", "package_url": "https://pypi.org/project/TemplateAlchemy/", "platform": "", "project_url": "https://pypi.org/project/TemplateAlchemy/", "project_urls": { "Homepage": "http://github.com/cadithealth/templatealchemy" }, "release_url": "https://pypi.org/project/TemplateAlchemy/0.1.22/", "requires_dist": null, "requires_python": "", "summary": "An un-opinionated template abstraction layer", "version": "0.1.22" }, "last_serial": 3024164, "releases": { "0.1.10": [ { "comment_text": "", "digests": { "md5": "4d8ad43a6177ad8e93f98836fe0c47e2", "sha256": "25c5063a626290ec7fafad6e32e240af9b3344adedfbdc12d7964e5e6fd1fb7e" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.10.tar.gz", "has_sig": false, "md5_digest": "4d8ad43a6177ad8e93f98836fe0c47e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19483, "upload_time": "2013-07-29T17:41:43", "url": "https://files.pythonhosted.org/packages/c9/45/3b8c8de63cbc100302694127fd6edcbac73b363386d53d120476b6b5883f/TemplateAlchemy-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "fe5d621e4626a3dca5533c7c253cf43d", "sha256": "aa55c6290786044622cb0ed2a1b5a85fea948795a20e6c4428a9e4102d7a661b" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.11.tar.gz", "has_sig": false, "md5_digest": "fe5d621e4626a3dca5533c7c253cf43d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19500, "upload_time": "2013-07-29T17:45:12", "url": "https://files.pythonhosted.org/packages/36/ce/c4271f166bcec9378395489309d4e71391e2e6fd1db87895d5affc9b004f/TemplateAlchemy-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "90f7147d9db5accdc8135bc4e4c8638d", "sha256": "8db179e16f4bb6a1afe68ac14995f43e60ebc42ff648ad763b6c42aa51681418" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.12.tar.gz", "has_sig": false, "md5_digest": "90f7147d9db5accdc8135bc4e4c8638d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19193, "upload_time": "2013-07-29T17:54:06", "url": "https://files.pythonhosted.org/packages/9a/07/1115b3b68e4c93681df416f56c81e96253516bb28b27b9580ac68afb6407/TemplateAlchemy-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "237b28315c33b151fcacff5534addf70", "sha256": "4cc98f87d78a8af0955037bea706ea3f0cae15a5626e751696cc4e33ba6ad713" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.13.tar.gz", "has_sig": false, "md5_digest": "237b28315c33b151fcacff5534addf70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19275, "upload_time": "2013-07-29T18:14:44", "url": "https://files.pythonhosted.org/packages/c0/b7/756bec4932950664bfeb76de8ca369cd1eed1dfdbf7b4792415409d799e5/TemplateAlchemy-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "a4db8b4ee08555ebe5e28ea6f978c6f2", "sha256": "9ca1b26d20e0ead5079e0de0dc9e1185dd445f15f8934ec7caad2df435a2de73" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.14.tar.gz", "has_sig": false, "md5_digest": "a4db8b4ee08555ebe5e28ea6f978c6f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19299, "upload_time": "2013-07-29T21:07:33", "url": "https://files.pythonhosted.org/packages/fe/aa/72d356f7ac4ab1934a7f732cb373c81682caf10ba928e416279500620dc1/TemplateAlchemy-0.1.14.tar.gz" } ], "0.1.15": [ { "comment_text": "", "digests": { "md5": "0989178353beab25f45b3ef8f800d5f1", "sha256": "b13b474b77b6ab8a75debc6829af0875758b0a44238fb528248704e3a6cdb533" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.15.tar.gz", "has_sig": false, "md5_digest": "0989178353beab25f45b3ef8f800d5f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19878, "upload_time": "2013-07-30T18:37:38", "url": "https://files.pythonhosted.org/packages/39/3c/4686c27c71aaa3a4ecf8d44f87548f59bb777acf946eefd0a0adf9554d40/TemplateAlchemy-0.1.15.tar.gz" } ], "0.1.16": [ { "comment_text": "", "digests": { "md5": "044f1b768c96521ac092aca4ca145a20", "sha256": "a383bb4d9b51f491aad1f1309c8def0aab1ea3abe12cb22a3bbfa752038b0055" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.16.tar.gz", "has_sig": false, "md5_digest": "044f1b768c96521ac092aca4ca145a20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19920, "upload_time": "2013-07-31T15:45:30", "url": "https://files.pythonhosted.org/packages/64/4b/b5f1cbe54b3644ba42aa0b08cae757e8e6c41f655952134b962e4aa42dbe/TemplateAlchemy-0.1.16.tar.gz" } ], "0.1.17": [ { "comment_text": "", "digests": { "md5": "a7320af42f2d709400379023b3cabad3", "sha256": "70ce6a2cd2cb4e9616ac21ce6e8f8f761110c10f7880066a2a7faaa738d1d1a6" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.17.tar.gz", "has_sig": false, "md5_digest": "a7320af42f2d709400379023b3cabad3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20952, "upload_time": "2013-08-12T18:57:19", "url": "https://files.pythonhosted.org/packages/f4/02/c241ec22c88ead7b3ac448336a7e9e2b57191d40dc57d8b1dc8358d6dce4/TemplateAlchemy-0.1.17.tar.gz" } ], "0.1.18": [ { "comment_text": "", "digests": { "md5": "6a0bad7440df122cf105d5b2f4cb053b", "sha256": "687d2eb22fd51d6450e394bfea5dffcada552db90f163a2a205c523daab9127f" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.18.tar.gz", "has_sig": false, "md5_digest": "6a0bad7440df122cf105d5b2f4cb053b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20930, "upload_time": "2013-08-12T19:12:04", "url": "https://files.pythonhosted.org/packages/51/1e/6632895c4a84c1c74be92ed8145befe9bd3943b2c6075713f7e2ecf3f1b6/TemplateAlchemy-0.1.18.tar.gz" } ], "0.1.19": [ { "comment_text": "", "digests": { "md5": "feda97d7bb8564f3d36d5a834d1981b7", "sha256": "5d052fb0c49ab3cd91f9f4aec19f72cc23bcd6975ad121fa48697b653f041da3" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.19.tar.gz", "has_sig": false, "md5_digest": "feda97d7bb8564f3d36d5a834d1981b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20974, "upload_time": "2013-10-16T22:41:03", "url": "https://files.pythonhosted.org/packages/0f/70/b6e7d80be00968b7b5269a0a7c98dd103832c0265406497db2f1fa566e64/TemplateAlchemy-0.1.19.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "1434ef0b2af6a2efcaa82fa88a108e5a", "sha256": "34d284dd43e33057d2bad84ab4e402ff468df3cba11cae9a77ab0fd493838d7f" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "1434ef0b2af6a2efcaa82fa88a108e5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13724, "upload_time": "2013-07-06T16:40:24", "url": "https://files.pythonhosted.org/packages/a2/b5/fe9eccb0786b78c2b325f5a603cc488bb10253cb991aeb6e3195282ba9fd/TemplateAlchemy-0.1.2.tar.gz" } ], "0.1.20": [ { "comment_text": "", "digests": { "md5": "b4d9e90c81245139c2199b09fa7b1e7f", "sha256": "e3b89f7213645514d4255891cf1ac573ca8d803566365e821032aa912442ec9f" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.20.tar.gz", "has_sig": false, "md5_digest": "b4d9e90c81245139c2199b09fa7b1e7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21034, "upload_time": "2013-10-16T22:44:47", "url": "https://files.pythonhosted.org/packages/48/07/6b664babd2c7ee1bda7ad4d389d2b9564a2e103eea7e979a83b1576fb3ea/TemplateAlchemy-0.1.20.tar.gz" } ], "0.1.21": [ { "comment_text": "", "digests": { "md5": "5cee3d5c575b57401b056c431d74fb60", "sha256": "d9cbad71d964c8b8750545a69a8404f2f0164ec7f20f7705216772645096cd84" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.21.tar.gz", "has_sig": false, "md5_digest": "5cee3d5c575b57401b056c431d74fb60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21451, "upload_time": "2015-10-02T00:29:07", "url": "https://files.pythonhosted.org/packages/74/4a/3702e4c3f702763c465dab123410181e38af41739b3b4855e61226cbaa12/TemplateAlchemy-0.1.21.tar.gz" } ], "0.1.22": [ { "comment_text": "", "digests": { "md5": "d120e9734b43c5ddd84eb0b6faada280", "sha256": "39f4f165ff2f9138a678f4e235da93f76dd8bde715071931eed818464c14e065" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.22.tar.gz", "has_sig": false, "md5_digest": "d120e9734b43c5ddd84eb0b6faada280", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20078, "upload_time": "2017-07-14T23:35:04", "url": "https://files.pythonhosted.org/packages/4f/f9/46c950d90af0b54cec5f36511b15d81e8b89f9b2e38730f70f5bee9b4150/TemplateAlchemy-0.1.22.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "5c306d038969442180bfed9a79ef42d6", "sha256": "c4816dbba9f984568fd8d5894226cc3a90d2b09ed173233eca0e91ec69984673" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5c306d038969442180bfed9a79ef42d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15268, "upload_time": "2013-07-06T17:28:10", "url": "https://files.pythonhosted.org/packages/d4/f4/9c8be5c56149df74c2809f3874c66e4ba9521dee2e7fa3a6545e007c8ee3/TemplateAlchemy-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "f1efd4cb899124c0618da7e79db35e99", "sha256": "dc92880e9c264ce10f9bce8bbc5bff9d03ecc561a105e6bf52bc91025e931e9f" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.4.tar.gz", "has_sig": false, "md5_digest": "f1efd4cb899124c0618da7e79db35e99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17810, "upload_time": "2013-07-07T18:42:19", "url": "https://files.pythonhosted.org/packages/4c/2e/dd7ad2e0550523534960a4c2894c02d89bdc0c33eff1acd86c1b485a682c/TemplateAlchemy-0.1.4.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "5774fe7292eb39121ffe830b21ff2f0e", "sha256": "636b988728b1382d904c4dbb594a9f6cfcf174bd3dc139b55bf952ca757efacf" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.7.tar.gz", "has_sig": false, "md5_digest": "5774fe7292eb39121ffe830b21ff2f0e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18972, "upload_time": "2013-07-17T17:02:14", "url": "https://files.pythonhosted.org/packages/a8/a3/987e3f79b37ee8baf14c5ecb2837cc973f9f32eca5379c0963364f9dd3b0/TemplateAlchemy-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "2011058cb4cdd9e747eb46f453ebbd88", "sha256": "8fbdff03597a47b258e904364587f61c343db5ed879c6464ae44e4256a120a9b" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.8.tar.gz", "has_sig": false, "md5_digest": "2011058cb4cdd9e747eb46f453ebbd88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19223, "upload_time": "2013-07-29T17:29:07", "url": "https://files.pythonhosted.org/packages/66/bd/94db6597cb473262d2c4abd9d0c7993bad0388e02185baff4531f393564b/TemplateAlchemy-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "ceadfa89ad64f383e8815b6c7c7c2444", "sha256": "4fec4148195d8c97ba854f07d8d69c60bdb0c639da9a4c46e04a10340f99c0a8" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.9.tar.gz", "has_sig": false, "md5_digest": "ceadfa89ad64f383e8815b6c7c7c2444", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19243, "upload_time": "2013-07-29T17:32:35", "url": "https://files.pythonhosted.org/packages/40/a8/87d8f2914fca92a40532d5d24e690102070edde44a9b4605b38824c6f61c/TemplateAlchemy-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d120e9734b43c5ddd84eb0b6faada280", "sha256": "39f4f165ff2f9138a678f4e235da93f76dd8bde715071931eed818464c14e065" }, "downloads": -1, "filename": "TemplateAlchemy-0.1.22.tar.gz", "has_sig": false, "md5_digest": "d120e9734b43c5ddd84eb0b6faada280", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20078, "upload_time": "2017-07-14T23:35:04", "url": "https://files.pythonhosted.org/packages/4f/f9/46c950d90af0b54cec5f36511b15d81e8b89f9b2e38730f70f5bee9b4150/TemplateAlchemy-0.1.22.tar.gz" } ] }