{ "info": { "author": "Uli Fouquet", "author_email": "grok-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.5", "Topic :: Internet :: WWW/HTTP" ], "description": "megrok.chameleon\n****************\n\n`megrok.chameleon` makes it possible to use chameleon templates in Grok. \n\nCurrently support for chameleon genshi templates and chameleon zope\npage templates is provided.\n\nFor more information on Grok and Chameleon templates see:\n\n- http://grok.zope.org/\n- http://chameleon.repoze.org/\n- http://pypi.python.org/pypi/Chameleon\n- http://pypi.python.org/pypi/chameleon.genshi\n\n.. contents::\n\nRequirements\n============\n\n- Chameleon templates (`Chameleon`).\n- Chameleon genshi templates (`chameleon.genshi`).\n- Grok v1.0a1 or later, or five.grok 1.0 or later.\n\nInstallation\n============\n\nTo use Chameleon page templates with Grok all you need is to install\nmegrok.chameleon as an egg and include its ZCML. The best place to do\nthis is to make `megrok.chameleon` a dependency of your application by\nadding it to your ``install_requires`` list in ``setup.cfg``. If you\nused grokproject to create your application ``setup.py`` is located in the\nproject root. It should look something like this::\n\n install_requires=['setuptools',\n 'megrok.chameleon',\n # Add extra requirements here\n ],\n\nThen include ``megrok.chameleon`` in your ``configure.zcml``. If you\nused grokproject to create your application it's at\n``src//configure.zcml``. Add the include line after the\ninclude line for grok, but before the grokking of the current\npackage. It should look something like this::\n\n \n \n \n\nIf you use ``autoInclude`` in your ``configure.zcml``, you should not\nhave to do this latter step.\n\nThen run ``bin/buildout`` again. You should now see buildout saying\nsomething like::\n\n Getting distribution for 'megrok.chameleon'.\n Got megrok.chameleon 0.5.\n\nThat's all. You can now start using Chameleon page templates in your\nGrok application.\n\n\nUsage\n=====\n\n``megrok.chameleon`` supports the Grok standard of placing templates\nin a templates directory, for example ``app_templates``, so you can\nuse Chameleon page templates by simply placing the Chameleon genshi\ntemplates or Chameleon Zope page templates in the templates directory,\njust as you would with regular ZPT templates. Although chameleon\ntemplates themselves do not have a standard for the file extensions\nfor templates, Grok needs to have an association between an\nextension and a type so it knows which type of template each template\nis. `megrok.chameleon` defines the following extensions:\n\n* ``.cpt`` (``Chameleon page template``) for Chameleon page templates\n\n* ``.cg`` (``Chameleon genshi template``) for chameleon driven genshi\n templates\n\n* ``.cgt`` (``Chameleon genshi text template``) for chameleon driven\n genshi text templates\n\nYou can also use Chameleon page templates inline. The syntax for this\nis::\n\n from megrok.chameleon.components import ChameleonPageTemplate\n index = ChameleonPageTemplate('the html code') \n\nOr if you use files::\n\n from megrok.genshi.components import ChameleonPageTemplateFile\n index = ChameleonPageTemplateFile(filename='thefilename.html')\n\n\n\nDetailed Description\n********************\n\nGrok-support for using chameleon driven templates.\n\nWith `megrok.chameleon` you can use templates parsed and rendered by\n`Chameleon`_. Currently Zope page templates and Genshi templates are\nsupported.\n\nChameleon Zope page templates\n=============================\n\nChameleon provides support for Zope page templates which can be used\nfrom grok writing templates with the ``.cpt`` (=Chameleon Page\nTemplate) filename extension.\n\nChameleon page templates differ from standard Zope page templates in a\nfew aspects, most notably:\n\n* Expressions are parsed in ``Python-mode`` by default. This means,\n instead of ``tal:content=\"view/value\"`` you must use\n ``tal:content=\"view.value\"``. Every occurence of TAL-expressions\n starting with ``python:`` now can be shortened by skipping this\n marker.\n\n* Also genshi-like variable substitutions are supported. For example\n you can write ``${myvar}`` instead of ``tal:content=\"myvar\"``.\n\nBeside this, most rules for regular Zope page templates apply also to\nchameleon page templates.\n\nSee the `Chameleon`_ page for more information.\n\n.. _Chameleon: http://chameleon.repoze.org/docs/latest/zpt.html\n\nPrerequisites\n-------------\n\nBefore we can see the templates in action, we care for correct\nregistration and set some used variables:\n\n >>> import os\n >>> testdir = os.path.join(os.path.dirname(__file__), 'tests')\n >>> cpt_fixture = os.path.join(testdir, 'cpt_fixture')\n >>> template_dir = os.path.join(cpt_fixture, 'app_templates')\n\nWe register everything. Before we can grok our fixture, we have to\ngrok the `megrok.chameleon` package. This way the new template types\nare registered with the framework:\n\n >>> import grokcore.view\n >>> grokcore.view.testing.grok('megrok.chameleon')\n >>> grokcore.view.testing.grok('megrok.chameleon.tests.cpt_fixture')\n\nWe create a mammoth, which should provide us a bunch of chameleon page\ntemplate driven views and put it in the database to setup location\ninfo::\n\n >>> from megrok.chameleon.tests.cpt_fixture.app import Mammoth\n >>> manfred = Mammoth()\n >>> getRootFolder()['manfred'] = manfred\n\nFurthermore we prepare for getting the different views on manfred:\n\n >>> from zope.publisher.browser import TestRequest\n >>> from zope.component import getMultiAdapter\n >>> request = TestRequest()\n\nSimple templates\n----------------\n\nWe prepared a plain cavepainting view. The template looks like this:\n\n >>> cavepainting_cpt = os.path.join(template_dir, 'cavepainting.cpt')\n >>> print open(cavepainting_cpt, 'rb').read()\n \n \n A cave painting.\n \n \n\nThe rendered view looks like this:\n\n >>> view = getMultiAdapter((manfred, request),\n ... name='cavepainting')\n >>> print view()\n \n \n A cave painting.\n \n \n\nSubstituting variables\n----------------------\n\nA template can access variables like ``view``, ``context`` and its\nmethods and attributes. The ``food`` view does exactly this. The\ntemplate looks like this:\n\n >>> food_cpt = os.path.join(template_dir, 'food.cpt')\n >>> print open(food_cpt, 'rb').read()\n \n \n \n ${view.me_do()}\n \n CSS-URL: ${static['test.css']()}\n My context is: ${view.url(context)}\n ${foo}\n \n \n \n \n\nThe rendered view looks like this:\n\n >>> view = getMultiAdapter((manfred, request), name='food')\n >>> print view()\n \n \n \n <ME GROK EAT MAMMOTH!>\n \n CSS-URL: http://127.0.0.1/@@/megrok.chameleon.tests.cpt_fixture/test.css\n My context is: http://127.0.0.1/manfred\n a FOO\n a FOO\n \n \n \n\nAs we can see, there is a difference between Genshi-like substitution\nand TAL-like substitution: while both expressions::\n\n ${view.me_do()}\n\nand::\n\n \n\nactually render the same string ````, the former\ndoes this straight and plain, while the latter performs additionally\nHTML-encoding of the string. Therefore the output of both expressions\ndiffer. It's::\n\n \n\nfor the former expression and::\n\n <ME GROK EAT MAMMOTH!>\n\nfor the latter.\n\n\nSupported variables\n-------------------\n\nEach template provides at least the following vars:\n\n* ``template``\n the template instance\n\n* ``view``\n the associated view\n\n* ``context``\n the context of the view\n\n* ``request``\n the current request\n\n* ``static`` \n the static dir of the application\n\nas we can see, when we look at the ``vars.cpt`` from our fixture:\n\n >>> cpt_file = os.path.join(template_dir, 'vars.cpt')\n >>> print open(cpt_file, 'rb').read()\n \n \n This template knows about the following vars:\n \n template (the template instance):\n ${template}\n \n view (the associated view):\n ${view}\n \n context (the context of the view):\n ${context}\n \n request (the current request):\n ${request}\n \n static (the static dir of the application):\n ${static}\n \n \n\nand render it:\n\n >>> view = getMultiAdapter((manfred, request), name='vars')\n >>> print view()\n \n \n This template knows about the following vars:\n \n template (the template instance):\n <vars template in ...vars.cpt>\n \n view (the associated view):\n <megrok.chameleon.tests.cpt_fixture.app.Vars object at 0x...>\n \n context (the context of the view):\n <megrok.chameleon.tests.cpt_fixture.app.Mammoth object at 0x...>\n \n request (the current request):\n CONTENT_LENGTH:\t0\n GATEWAY_INTERFACE:\tTestFooInterface/1.0\n HTTP_HOST:\t127.0.0.1\n SERVER_URL:\thttp://127.0.0.1\n \n static (the static dir of the application):\n <grokcore.view.components.DirectoryResource object at 0x...>\n \n \n\n\nInline Templates\n----------------\n\nWe can also define inline templates. In our ``app.py`` we defined an\ninline template like this::\n\n from megrok.chameleon import components\n\n ...\n\n class Inline(grokcore.view.View):\n sometext = 'Some Text'\n\n inline = components.ChameleonPageTemplate(\n \"ME GROK HAS INLINES! ${view.sometext}\")\n\nIf we render this view we get:\n\n >>> view = getMultiAdapter((manfred, request), name='inline')\n >>> print view()\n ME GROK HAS INLINES! Some Text\n\nTAL expressions\n---------------\n\nStarting with ``megrok.chameleon`` 0.5 we deploy the all-in-one\n`Chameleon`_ package.\n\nWhat TAL/TALES expressions in templates are supported depends mainly\nfrom the installed version of `Chameleon`, while we support some\nadditional, Zope-related TALES expressions.\n\nA list of all supported expressions and statements can be found at the\n`chameleon.zpt documentation\n`_. The additional\nTALES expressions provided by ``megrok.chameleon`` are:\n\n* ``exists``\n Tell whether a name exists in the templates' namespace.\n\n* ``not``\n Evaluate the trailing expression to a boolean value and invert it.\n\n* ``path`` \n Handle the trailing expression as a path and not as a\n Python expression.\n\n* ``provider``\n Support for viewlet providers.\n\n.. warning:: `z3c.pt` support has been dropped with\n ``megrok.chameleon`` 0.5.\n\n.. note:: Starting with ``megrok.chameleon`` 0.5 support for the\n Python expression ``exists()`` has been dropped. The TALES\n expression ``exists: path/to/something`` is still available.\n\nIn our ``app.py`` we defined a special view for showing some special\nexpressions. This also includes a viewlet::\n\n import grok\n from megrok.chameleon import components\n\n class Mammoth(grok.Application, grok.Container):\n pass\n\n ...\n\n class Expressions(grok.View):\n pass\n\n class MainArea(grok.ViewletManager):\n grok.name('main')\n\n class MainContent(grok.Viewlet):\n grok.view(Expressions)\n grok.viewletmanager(MainArea)\n def render(self):\n return 'Hello from viewlet'\n\nNow we can make use of the TALES expressions ``not:``, ``path:``,\n``exists:`` and ``provider:`` in the ``expressions.cpt`` template of\nour fixture:\n\n >>> cpt_file = os.path.join(template_dir, 'expressions.cpt')\n >>> print open(cpt_file, 'rb').read()\n \n \n
\n \n
\n ${food}\n
\n \n \n
\n
\n
\n
\n \n \n
\n \n \n \n \n
\n \n \n\nand render it:\n\n >>> view = getMultiAdapter((manfred, request), name='expressions')\n >>> print view()\n \n \n \n \n
\n Yummy Dinoburger\n
\n \n \n
False
\n
False
\n
True
\n
True
\n \n \n
YUMMY DINOBURGER
\n \n \n Hello from viewlet\n \n \n \n \n\nMacros\n------\n\nWith ``megrok.chameleon`` we can also use macros, although it is a bit\ndifferent from regular Zope page templates.\n\nWe can define macros like this:\n\n >>> cpt_file = os.path.join(template_dir, 'macromaster.cpt')\n >>> print open(cpt_file, 'rb').read()\n

\n Hello from macro master\n

\n\nThe defined macro ``hello`` can be rendered in another Chameleon\ntemplate with the METAL attribute ``use-macro``.\n\nTo refer to a local macro, i.e. a macros defined in the same template,\nyou can use something like::\n\n
']\">\n Replaced by macro\n
\n\nwhere ```` must be an existing macro name.\n\nTo refer to macros in external templates, you must use the ``path:``\nexpression like this::\n\n
/template/macros/\">\n Replaced by external macro\n
\n\nwhere ```` refers to an existing view on ``context`` and\n``macro-name`` again refers to an existing macro in the specified template.\n\nNote, that this is different from how you refer to macros in standard\nZope page templates. The short notation ``view/macros/``\nworks only with regular Zope page templates.\n\nThe following template makes use of both methods:\n\n >>> cpt_file = os.path.join(template_dir, 'macrouser.cpt')\n >>> print open(cpt_file, 'rb').read()\n \n \n

\n Hi there from macro user!\n

\n
\n Fill this\n
\n \n
\n user slot\n Fill this too\n
\n \n \n\nWhen rendered also the slot defined in the master template is filled\nby macro user content:\n\n >>> cpt_file = os.path.join(template_dir, 'macrouser.cpt')\n >>> view = getMultiAdapter((manfred, request), name='macrouser')\n >>> print view()\n \n \n

\n Hi there from macro user!\n

\n

\n Hi there from macro user!\n

\n \n \n

\n Hello from user slot\n \n

\n \n \n\n\nClean up:\n\n >>> del getRootFolder()['manfred']\n\n\nDifferences from regular Zope page templates\n--------------------------------------------\n\n* Macros are referenced differently. See appropriate section above.\n\n* Expressions are parsed in ``Python-mode`` by default. This means,\n instead of ``tal:content=\"view/value\"`` you must use\n ``tal:content=\"view.value\"``. Every occurence of TAL-expressions\n starting with ``python:`` now can be shortened by skipping this\n marker.\n\nChameleon Genshi templates\n==========================\n\nChameleon provides support for Genshi templates which can be used from\ngrok writing templates with the ``.cg`` filename extension.\n\nGenshi text templates can be used with the ``.cgt`` filename\nextension.\n\nNote, that chameleon genshi templates might not cover the full range\nof functionality offered by native genshi parsers. Use `megrok.genshi`\nif you want native genshi support.\n\nSee the `chameleon.genshi`_ page for more information.\n\n.. _chameleon.genshi: http://pypi.python.org/pypi/chameleon.genshi\n\n\nPrerequisites\n-------------\n\nBefore we can see the templates in action, we care for correct\nregistration and set some used variables:\n\n >>> import os\n >>> testdir = os.path.join(os.path.dirname(__file__), 'tests')\n >>> genshi_fixture = os.path.join(testdir, 'genshi_fixture')\n >>> template_dir = os.path.join(genshi_fixture, 'app_templates')\n\nWe register everything. Before we can grok our fixture, we have to\ngrok the `megrok.chameleon` package. This way the new template types\nare registered with the framework:\n\n >>> grokcore.view.testing.grok('megrok.chameleon')\n >>> grokcore.view.testing.grok('megrok.chameleon.tests.genshi_fixture')\n\nWe create a mammoth, which should provide us a bunch of Genshi driven\nviews and put it in the database to setup location info:\n\n >>> from megrok.chameleon.tests.genshi_fixture.app import Mammoth\n >>> manfred = Mammoth()\n >>> getRootFolder()['manfred'] = manfred\n\nFurthermore we prepare for getting the different views on manfred:\n\n >>> from zope.publisher.browser import TestRequest\n >>> from zope.component import getMultiAdapter\n >>> request = TestRequest()\n\n\nSimple templates\n----------------\n\nWe prepared a plain cavepainting view. The template looks like this:\n\n >>> cavepainting_cg = os.path.join(template_dir, 'cavepainting.cg')\n >>> print open(cavepainting_cg, 'rb').read()\n \n \n A cave painting.\n \n \n\nThe rendered view looks like this:\n\n >>> view = getMultiAdapter((manfred, request),\n ... name='cavepainting')\n >>> print view()\n \n \n A cave painting.\n \n \n\n\nSubstituting variables\n----------------------\n\nA template can access variables like ``view``, ``context`` and its\nmethods and attributes. The ``food`` view does exactly this. The\ntemplate looks like this:\n\n >>> food_cg = os.path.join(template_dir, 'food.cg')\n >>> print open(food_cg, 'rb').read()\n \n \n ${view.me_do()}\n CSS-URL: ${static['test.css']()}\n My context is: ${view.url(context)}\n \n \n\nThe rendered view looks like this:\n\n >>> view = getMultiAdapter((manfred, request), name='food')\n >>> print view()\n \n \n ME GROK EAT MAMMOTH!\n CSS-URL: http://127.0.0.1/@@/megrok.chameleon.tests.genshi_fixture/test.css\n My context is: http://127.0.0.1/manfred\n \n \n\n\nIncluding other templates\n-------------------------\n\nWith genshi support we can also include other templates. The\n``gatherer`` view looks like this:\n\n >>> gatherer_cg = os.path.join(template_dir, 'gatherer.cg')\n >>> print open(gatherer_cg, 'rb').read()\n \n \n ME GROK GATHER BERRIES!\n \n \n \n\nApparently here we include a template called ``berries.cg``. It looks\nlike this:\n\n >>> berries_cg = os.path.join(template_dir, 'berries.cg')\n >>> print open(berries_cg, 'rb').read()\n Lovely blueberries!\n\n\nWhen we render the former template, we get:\n\n >>> view = getMultiAdapter((manfred, request), name='gatherer')\n >>> print view()\n \n \n ME GROK GATHER BERRIES!\n Lovely blueberries!\n \n \n\nText templates\n--------------\n\nAlso genshi text templates are supported. We have a template that\nlooks like so:\n\n >>> hunter_cgt = os.path.join(template_dir, 'hunter.cgt')\n >>> print open(hunter_cgt, 'rb').read()\n ME GROK HUNT ${view.game}!\n\nNote, that this template has the ``.cgt`` (= **c**\\ ameleon **g**\\ enshi\n**t**\\ ext template) file extension.\n\nIf we render it, all expressions are substituted:\n\n >>> view = getMultiAdapter((manfred, request), name='hunter')\n >>> print view()\n ME GROK HUNT MAMMOTH!!\n\n\nCHANGES\n*******\n\n0.5.2 (2010-07-19)\n==================\n\n* Remove dependency on chameleon.genshi as this is now included \n into Chameleon itself.\n\n0.5.1 (2010-05-20)\n==================\n\n* Made registering of ITranslatorExpressions conditional: if\n ``z3c.pt`` is installed as well, we don't register our own\n ones. Should fix DuplicationError when using megrok.chameleon\n together with other packages that require z3c.pt like ``z3c.form``\n and dependent packages from grok-ecosphere.\n\n* Get rid of zope.testing, zope.app.testing and z3c.testsetup for\n tests.\n\n0.5 (2010-03-03)\n================\n\n* Added tests to show usage of macros with ``megrok.chameleon``.\n\n* Removed dependency from ``z3c.pt`` by copying the relevant bits over\n and registering them locally.\n\n Drop support for ``exists('varname')`` expressions. The regular\n TALES expression ``exists: varname/path`` can still be used.\n\n* Switch to use ``Chameleon`` instead of ``chameleon.*`` packages.\n\n0.4 (2010-02-23)\n================\n\n* Declared ``megrok`` as namespace package.\n\n* Fixed order of includes in ftesting.zcml.\n\n* Moved pure test-requirements into own setup-section in order to reduce\n dependencies in regular (non-testing) mode.\n\n0.3 (2010-02-14)\n================\n\n* Added license file.\n\n0.2 (2009-09-18)\n================\n\n* Provide macro access from templates.\n\n* Don't depend anymore on grok, but only grokcore.view.\n\n* Added support for `path()` and `exists()` in page templates. This\n was introduced from `z3c.pt`.\n\n* Fix ZCML includes.\n\n0.1 (2009-02-22)\n================\n\n* Initial release", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/megrok.chameleon", "keywords": "grok chameleon template", "license": "ZPL", "maintainer": null, "maintainer_email": null, "name": "megrok.chameleon", "package_url": "https://pypi.org/project/megrok.chameleon/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/megrok.chameleon/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/megrok.chameleon" }, "release_url": "https://pypi.org/project/megrok.chameleon/0.5.2/", "requires_dist": null, "requires_python": null, "summary": "Chameleon page template support for Grok", "version": "0.5.2" }, "last_serial": 794639, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "5e04abe1371602bd2bd50dc2f98ac339", "sha256": "4b1a711f1df558b9734eb0c1d14daf70895f0c13b0cc1aec2b541d9f3d134733" }, "downloads": -1, "filename": "megrok.chameleon-0.1.tar.gz", "has_sig": false, "md5_digest": "5e04abe1371602bd2bd50dc2f98ac339", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11125, "upload_time": "2009-02-22T15:01:44", "url": "https://files.pythonhosted.org/packages/b2/c0/ba33ae9f5f074947413464a52bb730e783ef3f2f333d712aa8a11be187ee/megrok.chameleon-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "441c161894dc2ac1ed7ddb487b04c7cf", "sha256": "f8e81ded46ad482fa3ca204ea2f403bd6c367b5ea536f76692d4b3b657f2f366" }, "downloads": -1, "filename": "megrok.chameleon-0.2.tar.gz", "has_sig": false, "md5_digest": "441c161894dc2ac1ed7ddb487b04c7cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19194, "upload_time": "2009-09-18T17:04:19", "url": "https://files.pythonhosted.org/packages/5a/48/708fda6ca789168ec3bb44f34252e40866f77675dc7980abc3b16230212d/megrok.chameleon-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "a10ce5636bd27c10df0f41d802f665e4", "sha256": "ffa0d03df097988882d82d9e361442fdfb992c0fd1a35ec31e9a6eb7b9116661" }, "downloads": -1, "filename": "megrok.chameleon-0.3.tar.gz", "has_sig": false, "md5_digest": "a10ce5636bd27c10df0f41d802f665e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18890, "upload_time": "2010-02-14T12:40:07", "url": "https://files.pythonhosted.org/packages/7e/88/107522c7cadc3cf0137d4324bd9bca5b02f8791a0bad7065b761d17a974e/megrok.chameleon-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "9fea694e185a92a2d048db322e6ab49f", "sha256": "77f3480220b1240ea78c5d3e182195b69fd523839a2e7a910d92f86f9a1c8e2b" }, "downloads": -1, "filename": "megrok.chameleon-0.4.tar.gz", "has_sig": false, "md5_digest": "9fea694e185a92a2d048db322e6ab49f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19450, "upload_time": "2010-02-23T14:13:05", "url": "https://files.pythonhosted.org/packages/4e/03/35f8171aac8942c53c9e62d576a0a40b9f5dcfe6866b865920f2c378710a/megrok.chameleon-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "1abc4ee150703a9d85d6e3597daf724f", "sha256": "487369e51ec4dae14fa45b3ec0ac4831052f40c1d25b712457f281f336221747" }, "downloads": -1, "filename": "megrok.chameleon-0.5.tar.gz", "has_sig": false, "md5_digest": "1abc4ee150703a9d85d6e3597daf724f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25941, "upload_time": "2010-03-03T13:05:54", "url": "https://files.pythonhosted.org/packages/a1/22/45a189b44d0fc03c9b590c0dde4402422600722c9b2022366bfba061e23c/megrok.chameleon-0.5.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "51da4b01c5496129fb4004a0940fe0fd", "sha256": "1d1047d61708b775268edb306bcee343696580f24703888a156a8cbd7c182940" }, "downloads": -1, "filename": "megrok.chameleon-0.5.1.tar.gz", "has_sig": false, "md5_digest": "51da4b01c5496129fb4004a0940fe0fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26508, "upload_time": "2010-05-20T15:48:45", "url": "https://files.pythonhosted.org/packages/f4/db/d8065347d97b6b7ccd985ff22e1b2554e955fd630c2a6498ef197c95b452/megrok.chameleon-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "7d440eb1f16f153bf0db015c6a37b15d", "sha256": "a6084266f92b36599732c5f89f8d72eb826e63db589fe0b61c9a66ff975d3ba0" }, "downloads": -1, "filename": "megrok.chameleon-0.5.2.tar.gz", "has_sig": false, "md5_digest": "7d440eb1f16f153bf0db015c6a37b15d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20699, "upload_time": "2010-07-29T13:21:44", "url": "https://files.pythonhosted.org/packages/d4/53/92f5256c9c6afba3c2cc6127e4fab85a4f107923be6fed3e11c620f9e585/megrok.chameleon-0.5.2.tar.gz" } ], "1.0rc1": [ { "comment_text": "", "digests": { "md5": "6ced6dc9648c483cb07abb871ada159e", "sha256": "aba500d4fe019bdb24e511fe56bdfc6105415cd8fb733109c4e0aae5532f7d4f" }, "downloads": -1, "filename": "megrok.chameleon-1.0rc1.tar.gz", "has_sig": false, "md5_digest": "6ced6dc9648c483cb07abb871ada159e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19859, "upload_time": "2011-05-19T15:46:56", "url": "https://files.pythonhosted.org/packages/05/d6/3f596812216aebd1e389a1889f6459d6d78a83227e82bf689b13069cbf1b/megrok.chameleon-1.0rc1.tar.gz" } ], "1.0rc2": [ { "comment_text": "", "digests": { "md5": "5ba433e6262a7ec8a05e1d4a70418a31", "sha256": "a702535ff099b13d64415bab0df3ceb9036b901ad12dd662040245bd6a172889" }, "downloads": -1, "filename": "megrok.chameleon-1.0rc2.tar.gz", "has_sig": false, "md5_digest": "5ba433e6262a7ec8a05e1d4a70418a31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22935, "upload_time": "2011-07-13T20:02:34", "url": "https://files.pythonhosted.org/packages/ad/c6/8b03cf2b9630a229d894d086f9dd41e2c5e104c8570b177e12079bcfa541/megrok.chameleon-1.0rc2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7d440eb1f16f153bf0db015c6a37b15d", "sha256": "a6084266f92b36599732c5f89f8d72eb826e63db589fe0b61c9a66ff975d3ba0" }, "downloads": -1, "filename": "megrok.chameleon-0.5.2.tar.gz", "has_sig": false, "md5_digest": "7d440eb1f16f153bf0db015c6a37b15d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20699, "upload_time": "2010-07-29T13:21:44", "url": "https://files.pythonhosted.org/packages/d4/53/92f5256c9c6afba3c2cc6127e4fab85a4f107923be6fed3e11c620f9e585/megrok.chameleon-0.5.2.tar.gz" } ] }