{
"info": {
"author": "Plone Foundation",
"author_email": "plone-developers@lists.sourceforge.net",
"bugtrack_url": null,
"classifiers": [
"Framework :: Plone",
"Framework :: Plone :: 5.0",
"Framework :: Plone :: 5.1",
"Framework :: Plone :: 5.2",
"License :: OSI Approved :: GNU General Public License (GPL)",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": ".. contents:: Table of Contents\n\n\nIntroduction\n------------\n\nThe ``plone.caching`` package provides a framework for the management of cache headers, built\natop `z3c.caching`_. It consists of the following elements:\n\n* An interface ``ICachingOperation``, describing components which:\n * Modify the response for caching purposes. The most common operation will\n be to set cache headers.\n * Intercept a request before view rendering (but after traversal and\n authorisation) to provide a cached response. The most common operation\n will be to set a \"304 Not Modified\" response header and return an empty\n response, although it is also possible to provide a full response body.\n\n Caching operations are named multi-adapters on the published object (e.g. a\n view) and the request.\n\n* An interfaces ``ICachingOperationType`` which is used for utilities\n describing caching operations. This is mainly for UI purposes, although this\n package does not provide any UI of its own.\n\n* Hooks into the Zope 2 ZPublisher (installed provided ZPublisher is\n available) which will execute caching operations as appropriate.\n\n* Helper functions for looking up configuration options caching operations in\n a registry managed by `plone.registry`_\n\n* An operation called ``plone.caching.operations.chain``, which can be used to\n chain together multiple operations. It will look up the option\n ``plone.caching.operations.chain.${rulename}.operations`` in the\n registry, expecting a list of strings indicating the names of operations to\n execute. (${rulename} refers to the name of the caching rule set in use -\n more on this later).\n\n\nUsage\n-----\n\nTo use ``plone.caching``, you must first install it into your build and load\nits configuration. If you are using Plone, you can do that by installing\n`plone.app.caching`_. Otherwise, depend on ``plone.caching`` in your\nown package's ``setup.py``::\n\n install_requires = [\n ...\n 'plone.caching',\n ]\n\nThen load the package's configuration from your own package's\n``configure.zcml``::\n\n \n\nNext, you must ensure that the the cache settings records are installed in\nthe registry. (``plone.caching`` uses ``plone.registry`` to store various\nsettings, and provides helpers for caching operations to do the same.)\n\nTo use the registry, you must register a (usually local) utility providing\n``plone.registry.interfaces.IRegistry``. If you are using Plone, installing\n``plone.app.registry`` will do this for you. Otherwise, configure one manually\nusing the ``zope.component`` API.\n\nIn tests, you can do the following::\n\n from zope.component import provideAdapter\n from plone.registry.interfaces import IRegistry\n from plone.registry import Registry\n\n provideAdapter(Registry(), IRegistry)\n\nNext, you must add the ``plone.caching`` settings to the registry. If you use\n`plone.app.caching`_, it will do this for you. Otherwise, you can register\nthem like so::\n\n from zope.component import getUtility\n from plone.registry.interfaces import IRegistry\n from plone.caching.interfaces import ICacheSettings\n\n registry = getUtility(IRegistry)\n registry.registerInterface(ICacheSettings)\n\nFinally, you must turn on the caching engine, by setting the registry value\n``plone.caching.interfaces.ICacheSettings.enabled`` to ``True``.\nIf you are using Plone and have installed `plone.app.caching`_, you can do\nthis from the caching control panel. In code, you can do::\n\n registry['plone.caching.interfaces.ICacheSettings.enabled'] = True\n\n\nDeclaring cache rules for a view\n--------------------------------\n\nThe entry point for caching is a *cache rule set*. A rule set is simply a name\ngiven to a collection of publishable resources, such as views, for caching\npurposes. Take a look at `z3c.caching`_ for details, but a simple example may\nlook like this::\n\n \n\n \n\n \n\n \n\nHere, the view implemented by the class ``FrontpageView`` is associated with\nthe rule set ``plone.contentTypes``.\n\n**NOTE:** Ruleset names should be *dotted names*. That is, they should consist\nonly of upper or lowercase letters, digits, underscores and/or periods (dots).\nThe idea is that this forms a namespace similar to namespaces created by\npackages and modules in Python.\n\nElsewhere (or in the same file) the ``plone.contentTypes`` ruleset should be\ndeclared with a title and description. This is can be used by a UI such as\nthat provided by `plone.app.caching`_. If \"explicit\" mode is set in\n``z3c.caching``, this is required. By default it is optional::\n\n \n\nHints:\n\n* Try to re-use existing rule sets rather than invent your own.\n* Rule sets inherit according to the same rules as those that apply to\n adapters. Thus, you can register a generic rule set for a generic interface\n or base class, and then override it for a more specific class or interface.\n* If you need to modify rule sets declared by packages not under your control,\n you can use an ``overrides.zcml`` file for your project.\n\n\nMapping cache rules to operations\n---------------------------------\n\n``plone.caching`` maintains a mapping of rule sets to caching operations in\nthe registry. This mapping is stored in a dictionary of dotted name string\nkeys to dotted name string values, under the record\n``plone.caching.interfaces.ICacheSettings.operationMapping``.\n\nTo set the name of the operation to use for the ``plone.contentTypes`` rule\nshown above, a mapping like the following might be used::\n\n from zope.component import getUtility\n from plone.registry.interfaces import IRegistry\n from plone.caching.interfaces import ICacheSettings\n\n registry = getUtility(IRegistry)\n settings = registry.forInterface(ICacheSettings)\n if settings.operationMapping is None: # initialise if not set already\n settings.operationMapping = {}\n settings.operationMapping['plone.contentTypes'] = 'my.package.operation'\n\nHere, ``my.package.operation`` is the name of a caching operation. We will\nsee an example of using one shortly.\n\nIf you want to use several operations, you can chain them together using the\n``plone.caching.operations.chain`` operation::\n\n settings.operationMapping['plone.contentTypes'] = 'plone.caching.operations.chain'\n\n registry['plone.caching.operations.chain.plone.contentTypes.operations'] = \\\n ['my.package.operation1', 'my.package.operation2']\n\nThe last line here is setting the ``operations`` option for the chain\noperation, in a way that is specific to the ``plone.contentTypes`` rule set.\nMore on the configuration syntax shortly.\n\nIf you need to list all operations for UI purposes, you can look up\nthe registered instances of the ``ICachingOperationType`` utility::\n\n from zope.component import getUtilitiesFor\n from plone.caching.interfaces import ICachingOperationType\n\n for name, type_ in getUtilitiesFor(ICachingOperationType):\n ...\n\nThe ``ICachingOperationType`` utility provides properties like ``title`` and\n``description`` to help build a user interface around caching operations.\n`plone.app.caching`_ provides just such an interface.\n\n\nSetting options for caching operations\n--------------------------------------\n\n``plone.caching`` does not strictly enforce how caching operations configure\nthemselves, if at all. However, it provides helper functionality to encourage\na pattern based on settings stored in ``plone.registry``. We have already seen\nthis pattern in use for the chain operation above. Let's now take a closer\nlook.\n\nThe chain operation is implemented by the class\n``plone.caching.operations.Chain``. The ``ICachingOperationType`` utility\nnamed ``plone.caching.operations.chain`` provides two attributes in addition\nto the ``title`` and ``description`` attributes mentioned above:\n\nprefix\n A dotted name prefix used for all registry keys. This key must be unique.\n By convention, it is the name of the caching operation\noptions\n A tuple of option names\n\nTaken together, these attributes describe the configurable options (if any)\nof the caching operation. By default, the two are concatenated, so that if\nyou have an operation called ``my.package.operation``, the prefix is the same\nstring, and the options are ``('option1', 'option2')``, two registry keys\nwill be used: ``my.package.operation.option1`` and\n``my.package.operation.option2``. (The type of those records and their value\nwill obviously depend on how the registry is configured. Typically, the\ninstallation routine for a given operation will create them with sensible\ndefaults).\n\nIf you need to change these settings on a per-cache-rule basis, you can do\nso by inserting the cache rule name between the prefix and the option name.\nFor example, for the cache rule ``my.rule``, the rule-specific version of\n``option1`` would be ``my.package.operation.my.rule.option1``.\n\nIn this case, you probably want to use a field reference (``FieldRef``) for\nthe \"override\" record that references the field of the \"base\" record. See\nthe `plone.registry`_ documentation for details.\n\nFinally, note that it is generally safe to use caching operations if their\nregistry keys are not installed. That is, they should fall back on sensible\ndefaults and not crash.\n\n\nWriting caching operations\n--------------------------\n\nNow that we have seen how to configure cache rules and operations, let's look\nat how we can write our own caching operations\n\nCaching operations consist of two components:\n\n* A named multi-adapter implementing the operation itself\n* A named utility providing metadata about the operation\n\nTypically, both of these are implemented within a single class, although this\nis not a requirement. Typically, the operation will also look up options in\naccordance with the configuration methodology outlines above.\n\nHere is an example of an operation that sets a fixed max-age cache control\nheader. It is registered for any published resource, and for any HTTP request\n(but not other types of request.)::\n\n from plone.caching.interfaces import _\n from plone.caching.interfaces import ICachingOperation\n from plone.caching.interfaces import ICachingOperationType\n from plone.caching.utils import lookupOptions\n from zope.component import adapter\n from zope.component import queryMultiAdapter\n from zope.interface import implementer\n from zope.interface import Interface\n from zope.interface import provider\n from zope.publisher.interfaces.http import IHTTPRequest\n\n\n @implementer(ICachingOperation)\n @adapter(Interface, IHTTPRequest)\n @provider(ICachingOperationType)\n class MaxAge(object):\n\n # Type metadata\n title = _(u\"Max age\")\n description = _(u\"Sets a fixed max age value\")\n prefix = 'plone.caching.tests.maxage'\n options = ('maxAge',)\n\n def __init__(self, published, request):\n self.published = published\n self.request = request\n\n def interceptResponse(self, rulename, response):\n return None\n\n def modifyResponse(self, rulename, response):\n options = lookupOptions(MaxAge, rulename)\n maxAge = options['maxAge'] or 3600\n response.setHeader('Cache-Control', 'max-age=%s, must-revalidate' % maxAge)\n\nThere are two methods here:\n\n* ``interceptResponse()`` is called before Zope attempts to render the\n published object. If this returns None, publication continues as normal. If\n it returns a string, the request is intercepted and the cached response is\n returned.\n* ``modifyResponse()`` is called after Zope has rendered the response (in a\n late stage of the transformation chain set up by `plone.transformchain`_).\n This should not return a value, but can modify the response passed in. It\n should not modify the response body (in fact, doing so will have on effect),\n but may set headers.\n\nNote the use of the ``lookupOptions()`` helper method. You can pass this\neither an ``ICachingOperationType`` instance, or the name of one (in which\ncase it will be looked up from the utility registry), as well as the current\nrule name. It will return a dictionary of all the options listed (only\n``maxAge`` in this case), taking rule set overrides into account. The\noptions are guaranteed to be there, but will fall back on a default of\n``None`` if not set.\n\nTo register this component in ZCML, we would do::\n\n \n \n\nNote that by using ``component`` instead of ``factory`` in the ````\ndeclaration, we register the class object itself as the utility. The\nattributes are provided as class variables for that reason - setting them in\n``__init__()``, for example, would not work.\n\nWhat about the ``interceptResponse()`` method? Here is a simple example that\nsends a 304 not modified response always. (This is probably not very useful,\nbut it serves as an example.)::\n\n from plone.caching.interfaces import _\n from plone.caching.interfaces import ICachingOperation\n from plone.caching.interfaces import ICachingOperationType\n from plone.caching.utils import lookupOptions\n from zope.component import adapter\n from zope.component import queryMultiAdapter\n from zope.interface import implementer\n from zope.interface import Interface\n from zope.interface import provider\n from zope.publisher.interfaces.http import IHTTPRequest\n\n\n @implementer(ICachingOperation)\n @adapter(Interface, IHTTPRequest)\n @provider(ICachingOperationType)\n class Always304(object):\n\n # Type metadata\n title = _(u\"Always send 304\")\n description = _(u\"It's not modified, dammit!\")\n prefix = 'plone.caching.tests.always304'\n options = ('temporarilyDisable',)\n\n def __init__(self, published, request):\n self.published = published\n self.request = request\n\n def interceptResponse(self, rulename, response):\n options = lookupOptions(self.__class__, rulename)\n if options['temporarilyDisable']:\n return None\n\n response.setStatus(304)\n return u\"\"\n\n def modifyResponse(self, rulename, response):\n pass\n\nHere, we return ``None`` to indicate that the request should not be\nintercepted if the ``temporarilyDisable`` option is set to ``True``.\nOtherwise, we modify the response and return a response body. The return value\nmust be a unicode string. In this case, an empty string will suffice.\n\nThe ZCML registration would look like this::\n\n \n \n\n.. _z3c.caching: http://pypi.python.org/pypi/z3c.caching\n.. _plone.registry: http://pypi.python.org/pypi/plone.registry\n.. _plone.app.caching: http://pypi.python.org/pypi/plone.app.caching\n.. _plone.transformchain: http://pypi.python.org/pypi/plone.transformchain\n\nChangelog\n=========\n\n1.2.1 (2018-11-29)\n------------------\n\nBug fixes:\n\n- Remove five.globalrequest usage.\n [gforcada]\n\n1.2.0 (2018-09-28)\n------------------\n\nNew features:\n\n- Add support for Python 3.\n [pbauer]\n\nBug fixes:\n\n- Fix caching and tests in python 3\n [ale-rt, pbauer]\n\n\n1.1.2 (2016-09-16)\n------------------\n\nBug fixes:\n\n- Cleanup: isort, readability, pep8, utf8-headers.\n [jensens]\n\n\n1.1.1 (2016-08-12)\n------------------\n\nBug fixes:\n\n- Use zope.interface decorator.\n [gforcada]\n\n\n1.1.0 (2016-05-18)\n------------------\n\nFixes:\n\n- Use plone i18n domain. [klinger]\n\n\n1.0.1 (2015-03-21)\n------------------\n\n- Fix ruleset registry test isolation so that is no longer order dependent.\n [jone]\n\n\n1.0 - 2011-05-13\n----------------\n\n- Release 1.0 Final.\n [esteele]\n\n- Add MANIFEST.in.\n [WouterVH]\n\n\n1.0b2 - 2011-02-10\n------------------\n\n- Updated tests to reflect operation parameter overrides can now use\n plone.registry FieldRefs. Requires plone.registry >= 1.0b3.\n [optilude]\n\n- Removed monkey patches unneeded since Zope 2.12.4.\n [optilude]\n\n\n1.0b1 - 2010-08-04\n------------------\n\n- Preparing release to coincide with plone.app.caching 1.0b1\n [optilude]\n\n\n1.0a1 - 2010-04-22\n------------------\n\n- Initial release\n [optilude, newbery]\n\n\n\n",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://pypi.org/project/plone.caching",
"keywords": "plone http caching",
"license": "GPL",
"maintainer": "",
"maintainer_email": "",
"name": "plone.caching",
"package_url": "https://pypi.org/project/plone.caching/",
"platform": "",
"project_url": "https://pypi.org/project/plone.caching/",
"project_urls": {
"Homepage": "https://pypi.org/project/plone.caching"
},
"release_url": "https://pypi.org/project/plone.caching/1.2.1/",
"requires_dist": [
"setuptools",
"z3c.caching[zcml]",
"plone.registry",
"zope.interface",
"zope.component",
"zope.i18nmessageid",
"zope.schema",
"plone.transformchain",
"Zope2 (>=2.12.4)"
],
"requires_python": "",
"summary": "Zope 2 integration for z3c.caching",
"version": "1.2.1"
},
"last_serial": 4545254,
"releases": {
"1.0": [
{
"comment_text": "",
"digests": {
"md5": "2c2e3b27d13b9101c92dfed222fde36c",
"sha256": "e2b12c4fff12fb5e97df04f253f6399b3c87d0f3c3f1807f7794016c7c4465a0"
},
"downloads": -1,
"filename": "plone.caching-1.0.zip",
"has_sig": false,
"md5_digest": "2c2e3b27d13b9101c92dfed222fde36c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 62935,
"upload_time": "2011-05-13T17:45:46",
"url": "https://files.pythonhosted.org/packages/d4/bd/92b0c7b32d15d030778142bbe52e4634041403bd78a80dfe3eefac85440c/plone.caching-1.0.zip"
}
],
"1.0.1": [
{
"comment_text": "",
"digests": {
"md5": "f80c063c9ce3946350fab9ab7a440b1e",
"sha256": "d9e524b5b37b1ad352bd6fc5b4b9e845a2372a5f3bc9f76ec04619b57f6564a3"
},
"downloads": -1,
"filename": "plone.caching-1.0.1.zip",
"has_sig": false,
"md5_digest": "f80c063c9ce3946350fab9ab7a440b1e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 40573,
"upload_time": "2015-03-21T18:18:23",
"url": "https://files.pythonhosted.org/packages/57/e6/c86c4dd5f0a3053e3bc248928b3ff3972854ee66a667f35b9b441d0ce263/plone.caching-1.0.1.zip"
}
],
"1.0a1": [
{
"comment_text": "",
"digests": {
"md5": "45bda5086f3b7ec0d0c7f62cc6e8bf80",
"sha256": "e8941e21750c13184b2cf67a70b9b4a12be22a7d487ef7593774b3d8e9ed1ce6"
},
"downloads": -1,
"filename": "plone.caching-1.0a1.tar.gz",
"has_sig": false,
"md5_digest": "45bda5086f3b7ec0d0c7f62cc6e8bf80",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27043,
"upload_time": "2010-04-22T12:16:26",
"url": "https://files.pythonhosted.org/packages/0d/c1/62f1c2aef170cbea5003ffeacb704065a580d6b55d90d45a472c0417a042/plone.caching-1.0a1.tar.gz"
}
],
"1.0b1": [
{
"comment_text": "",
"digests": {
"md5": "3ca0c0d9eb97d074fa09014920db4338",
"sha256": "d5a9c03589e0d3109372f0e88abbe2e19e117daab5b97f1f3402ced8946b1e3e"
},
"downloads": -1,
"filename": "plone.caching-1.0b1.zip",
"has_sig": false,
"md5_digest": "3ca0c0d9eb97d074fa09014920db4338",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 40428,
"upload_time": "2010-08-04T15:51:56",
"url": "https://files.pythonhosted.org/packages/da/b5/c581b650d2f3b0d1f689adbdaedd5d51d1b14a649023a96ec1c9eb5c4567/plone.caching-1.0b1.zip"
}
],
"1.0b2": [
{
"comment_text": "",
"digests": {
"md5": "c19defb68c68df1619685a969fd10716",
"sha256": "acc446a112f2a76fac898017a189ecc078c64f2dae16c48ed75700cd7fdd03e2"
},
"downloads": -1,
"filename": "plone.caching-1.0b2.zip",
"has_sig": false,
"md5_digest": "c19defb68c68df1619685a969fd10716",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 39586,
"upload_time": "2011-02-10T16:06:53",
"url": "https://files.pythonhosted.org/packages/fc/8a/21797e281392704eab63be3385e63da7e19dfffccf91e06471f3ffdf7284/plone.caching-1.0b2.zip"
}
],
"1.1.0": [
{
"comment_text": "",
"digests": {
"md5": "04fcd0ed8dfabec9ab83201b9fde4ad4",
"sha256": "f86cb57e508bdef8ff2f7995aa7375a726a6054c27ac76fbd31963d84b2f3ad4"
},
"downloads": -1,
"filename": "plone.caching-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "04fcd0ed8dfabec9ab83201b9fde4ad4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28048,
"upload_time": "2016-05-17T22:28:59",
"url": "https://files.pythonhosted.org/packages/ae/48/415e0d24a280fd6aa9ec7abebea7828b2efa87f308af441be64bd7831063/plone.caching-1.1.0.tar.gz"
}
],
"1.1.1": [
{
"comment_text": "",
"digests": {
"md5": "c52729c0398fef8c2e93363c0dbd3209",
"sha256": "ebde3fa84cdc90edb9e3e53df8248a7f9b4a8f0a111b21718963a34f8589e727"
},
"downloads": -1,
"filename": "plone.caching-1.1.1.tar.gz",
"has_sig": false,
"md5_digest": "c52729c0398fef8c2e93363c0dbd3209",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28125,
"upload_time": "2016-08-12T16:41:19",
"url": "https://files.pythonhosted.org/packages/3a/cf/81ee94c396d871a9774d5b4e862a4f2cc96533a17c8ad51e189f71cc88fc/plone.caching-1.1.1.tar.gz"
}
],
"1.1.2": [
{
"comment_text": "",
"digests": {
"md5": "bc74cb9a890f26c028812c391be90fdd",
"sha256": "ba4c6d560db2f9c5ddf4594d61c3ed09b73586bb3c4a362414fe0bce5dab9dd0"
},
"downloads": -1,
"filename": "plone.caching-1.1.2.tar.gz",
"has_sig": false,
"md5_digest": "bc74cb9a890f26c028812c391be90fdd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28544,
"upload_time": "2016-09-16T16:57:08",
"url": "https://files.pythonhosted.org/packages/43/89/e5e457c9e6219615315396683d9f82f19697825bc4100bd9bc4d200c0e95/plone.caching-1.1.2.tar.gz"
}
],
"1.2.0": [
{
"comment_text": "",
"digests": {
"md5": "6b5c54636012b832197ea9cf23489dd4",
"sha256": "21a6943c76c34504e6a3dc89b9195a027c21a4183699e05b8482ec586adae930"
},
"downloads": -1,
"filename": "plone.caching-1.2.0-py2-none-any.whl",
"has_sig": false,
"md5_digest": "6b5c54636012b832197ea9cf23489dd4",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 21957,
"upload_time": "2018-09-28T20:28:31",
"url": "https://files.pythonhosted.org/packages/6b/40/014448a175a6008e69b10add78ce179d46bcb8f438f385b444e0c6c70063/plone.caching-1.2.0-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "e01088cb19469031b1fcda25f5f65acd",
"sha256": "a92240fdc19c3e2b0280649e1a29499afb9e34f95de5050cdebce2298fdeb1ef"
},
"downloads": -1,
"filename": "plone.caching-1.2.0.tar.gz",
"has_sig": false,
"md5_digest": "e01088cb19469031b1fcda25f5f65acd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27499,
"upload_time": "2018-09-28T20:28:33",
"url": "https://files.pythonhosted.org/packages/2c/9c/1724d46ad8194701760197c0af49e500ccddb9981c1e9e52c712b2f6a169/plone.caching-1.2.0.tar.gz"
}
],
"1.2.1": [
{
"comment_text": "",
"digests": {
"md5": "17ef6d463650d785881f401b98fab694",
"sha256": "04f1343a68d818218ab145f0b5e8c73f557e736c9cbae835f1ea0a5d83be8b94"
},
"downloads": -1,
"filename": "plone.caching-1.2.1-py2-none-any.whl",
"has_sig": false,
"md5_digest": "17ef6d463650d785881f401b98fab694",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 21964,
"upload_time": "2018-11-30T02:10:22",
"url": "https://files.pythonhosted.org/packages/98/77/31bb8bb40185355fb0ad4ec036cc58a25191346cd7bb24b87f4425f8049a/plone.caching-1.2.1-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "bf9036690519ff5d36c394d01843664a",
"sha256": "e5b1394f13e94c9d1288dd54642fccd8f4a44ce0939c304af75e0b402512f6be"
},
"downloads": -1,
"filename": "plone.caching-1.2.1.tar.gz",
"has_sig": false,
"md5_digest": "bf9036690519ff5d36c394d01843664a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27688,
"upload_time": "2018-11-30T02:10:24",
"url": "https://files.pythonhosted.org/packages/64/aa/9e508fb00688a8e30eb0847a5dd91323eb15e5111c31b007e6dd6d8be21d/plone.caching-1.2.1.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "17ef6d463650d785881f401b98fab694",
"sha256": "04f1343a68d818218ab145f0b5e8c73f557e736c9cbae835f1ea0a5d83be8b94"
},
"downloads": -1,
"filename": "plone.caching-1.2.1-py2-none-any.whl",
"has_sig": false,
"md5_digest": "17ef6d463650d785881f401b98fab694",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 21964,
"upload_time": "2018-11-30T02:10:22",
"url": "https://files.pythonhosted.org/packages/98/77/31bb8bb40185355fb0ad4ec036cc58a25191346cd7bb24b87f4425f8049a/plone.caching-1.2.1-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "bf9036690519ff5d36c394d01843664a",
"sha256": "e5b1394f13e94c9d1288dd54642fccd8f4a44ce0939c304af75e0b402512f6be"
},
"downloads": -1,
"filename": "plone.caching-1.2.1.tar.gz",
"has_sig": false,
"md5_digest": "bf9036690519ff5d36c394d01843664a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27688,
"upload_time": "2018-11-30T02:10:24",
"url": "https://files.pythonhosted.org/packages/64/aa/9e508fb00688a8e30eb0847a5dd91323eb15e5111c31b007e6dd6d8be21d/plone.caching-1.2.1.tar.gz"
}
]
}