{ "info": { "author": "Rob Miller", "author_email": "robm@openplans.org", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Plone", "Framework :: Plone :: 5.1", "Intended Audience :: Other Audience", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7" ], "description": "Overview\n========\n\nmembrane is a set of PluggableAuthService (PAS) plug-ins that allow\nfor the user-related behaviour and data (authentication, properties,\nroles, groups, etc.) to be obtained from content within a Plone\nsite. It does not actually provide a full member implementation, it\nis intended to be a set of tools from which a full implementation\ncan be constructed. It is meant to be flexible and pluggable, and\neasy to adapt to different deployment scenarios. It is not meant to\nbe configured through-the-web-only, but to be adapted by filesystem\ncode.\n\nmembrane tries to take a step backwards and re-think some of the\nPlone membership-handling. We have tried to make it as simple as\npossible, so that grasping and extending it is simple. Hopefully,\nsimplicity should also make it easier to make sure it is secure.\n\nFor announcement, help, or to keep up with development discussions,\nsee the poorly named \"remember\" list:\n\nhttp://www.openplans.org/projects/remember/lists/remember/\n\nVision\n======\n\nmembrane is a product to enable users as content in Plone sites, in\ncollaboration with PlonePAS. The name gives you an idea of the intended\ncomplexity and amount of code.\n\nmembrane won't be the only member handling product in your site, instead it\nshould enable us to easily plug in products that enable default Plone member\npolicy, or more exotic setups in corporate intranets. This means that to get\nthe default Plone behaviour you will need something else in addition to\nmembrane.\n\n\nRequirements\n============\n\nSince version 4.0: Plone 5.1.\nVersion 3.0: Plone 4.3 or 5.0. We only test with Python 2.7.\nFor older Plone versions, please use Products.membrane branch 2.1.x.\n\nIf you create a membrane type based on Archetypes, then you must first install Archetypes, then membrane.\nThis is needed so new users are properly indexed by the membrane tool.\nThe canonical implementation of such a membrane type for Plone is ``Products.remember``.\n\nIf you create a membrane type based on dexterity on Plone 4 or Plone 5.0, then you must add ``collective.indexing`` to the eggs of your Plone instance. On Plone 5.1 you should no longer add ``collective.indexing`` to the eggs.\nThe canonical implementation of such a membrane type for Plone is ``dexterity.membrane``.\n\n\nWARNING!!\n=========\n\n Currently, a catalog is used to index the interfaces implemented by\n the objects in the portal. However, interfaces are specified\n programmatically, either via Python code or ZCML. Any time Zope is\n restarted, interfaces may have changed, and, if they have, the\n catalog will have become out of date. Work is under way on a more\n robust interface lookup solution, but for now if you change the\n interfaces implemented on any membrane related type or object, you\n may need to explicitly reindex the 'object_implements' interface on\n the membrane_tool.\n\nChangelog\n=========\n\n4.0 (2017-10-05)\n----------------\n\n**Breaking changes:**\n\n- Requires Plone 5.1 or newer.\n [datakurre]\n\nFixes:\n\n- Modernization and cleanup:\n Use Decorators for ZCA and security.\n Sort and cleanup imports.\n Add utf8 headers.\n Updated bootstrapping and test setup.\n [jensens]\n\n3.0.2 (2017-09-15)\n------------------\n\n- Fix user/group search for ``@@sharing``.\n A unicode search string could get passed, where we expected a string.\n [pysailor]\n\n\n\n3.0.1 (2017-04-05)\n------------------\n\n- Set the return state of the updateUser method to True if membrane is responsible\n for managing the user.\n [agitator]\n\n\n3.0 (2016-07-06)\n----------------\n\nBreaking changes:\n\n- Split user and group groups interface. A group that implemented\n ``user.IUserGroupsProvider`` would get included when listing\n members, which led to ``AttributeError: 'NoneType' object has no\n attribute '__of__'``. The new interface is\n ``group.IGroupGroupsProvider``. We look for this in our group\n manager plugin in the ``getGroupsForPrincipal`` method. If no\n providers are found, we try the old way for backwards compatibility.\n [maurits]\n\n- Split user properties and group properties interface. A group that\n implemented IPropertiesProvider would get included when listing\n members, which led to ``AttributeError: 'NoneType' object has no\n attribute '__of__'``. Renamed ``IPropertiesProvider`` to\n ``IUserPropertiesProvider`` but kept the old name as alias for\n backwards compatibility. Added ``IGroupPropertiesProvider``.\n You may need to reindex the ``membrane_tool`` catalog if you have problems.\n [maurits]\n\n- Dropped compatibility with Plone 4.2 and lower.\n For those Plone versions, please use Products.membrane branch 2.1.x.\n Note that 2.1.x is fine for Plone 4.3 and 5.0 too, but you are missing the fixes done in the 3.0 release.\n [maurits]\n\nNew features:\n\n- Fixed tests on Plone 5. Added Travis for continuous integration\n testing on Plone 4.3 and 5.0. We only test with Python 2.7.\n [maurits]\n\n- Ported tests to plone.app.testing. [maurits]\n\nBug fixes:\n\n- Fixed various pep8 and pyflakes errors and warnings. [maurits]\n\n\n2.1.13 (2015-11-05)\n-------------------\n\n- Fix broken distribution; README file was renamed and MANIFEST.in was updated.\n [hvelarde]\n\n\n2.1.12 (2015-06-25)\n-------------------\n\n- Allow arbitrary indexes to be passed in to the catalog query in groupmanager.\n [cedricmessiant]\n\n- Fix bug where moving a membrane object did not unindex it from the\n membrane catalog.\n [davisagli]\n\n- Replaced getUserId for exact_getUserId to avoid weird lookup side effects.\n [agitator]\n\n\n2.1.11 (2014-03-31)\n-------------------\n\n- Recursive group plugin now works with membrane groups.\n [vincentfretin]\n\n- Fix username/userid error in the PAS users plugin: allowPasswordSet and\n allowDeletePrincipal takes a userid as parameter, not a username.\n [vincentfretin]\n\n\n2.1.10 (2013-10-19)\n-------------------\n\n- Fix: check if the user adder can be acquired.\n [gagaro]\n\n\n2.1.9 (2013-07-18)\n------------------\n\n- When enumerateUsers gets criteria that lead to an empty query, do\n not return any results. When no criteria are passed, return all\n members.\n This refs the discussion at\n https://github.com/collective/Products.membrane/commit/c336a17f926a10ad384ea7b056db8d166a7eea00\n [maurits]\n\n\n2.1.8 (2013-03-31)\n------------------\n\n- Added updateUser and updateEveryLoginName methods. For the moment\n they do nothing. They are needed for compatibility with\n PluggableAuthService 1.10 and higher.\n [maurits]\n\n\n2.1.7 (2013-03-01)\n------------------\n\n- Fixed broken release that was missing README.txt file.\n [maurits]\n\n\n2.1.6 (2013-03-01)\n------------------\n\n- Removed ``getUserAuthProvider`` from ``IMembraneTool`` interface.\n Replaced it with ``getUserObject`` which has been the method to call\n for a few years.\n [maurits]\n\n- Add handling of new keyword argument ``fullname`` passed by\n ``plone.app.controlpanel.usergroups.UsersOverviewControlPanel`` for\n ``enumerateUsers(...)``. This avoids finding all membrane users on any\n searchterm in sharing tab or user control panel.\n [saily]\n\n\n2.1.5 (2012-09-13)\n------------------\n\n- Moved to github: https://github.com/collective/Products.membrane\n [maurits]\n\n\n2.1.4 (2012-04-13)\n------------------\n\n- False user property values were being converted to empty strings which would\n cause the property sheet to treat them as strings and make it impossible to set\n these properties back to True.\n [cah190]\n\n\n2.1.3 (2012-02-27)\n------------------\n\n- Bugfix. The catalog processor called by collective.indexing doesn't unindex users\n from the membrane_tool. [jcbrand]\n\n\n2.1.2 (2011-12-16)\n------------------\n\n- Fixed problem that occurs after upgrading the SearchableText index\n of the membrane_tool, which happens after upgrading to membrane 2.0\n or to Plone 4: the membrane_tool catalog would be empty. Now we\n refresh the membrane_tool catalog when we upgrade the index. If\n this has already happened to you, it should work to just go to the\n membrane_tool, then the Advanced tab, and click on 'Update Catalog.'\n [maurits]\n\n\n2.1.1, 29 November, 2011\n------------------------\n\n- Made the getUserObject method private for better security.\n Use ``portal_membership.getMemberInfo(user_id)`` when you need something\n similar in a skin script or template. Or ``@@pas_member`` on Plone 4.0+.\n Problem reported by Richard Mitchell, thanks!\n [maurits]\n\n\n2.1.0, 15 November, 2011\n------------------------\n\n- Restored compatibility with collective.indexing 1.8 or earlier.\n [maurits]\n\n- Added a normalizer lexicon that does case normalization.\n getUserId and getUserName are the only places where case sensitivity\n makes sense in searches. Title and SearchableText needs normalization.\n [tesdal]\n\n- Fixed a bug where only user objects and not groups would be\n indexed if collective.indexing could be imported.\n Also added a missing check of of portal_type against listMembraneTypes\n before performing re/un/indexing.\n [tesdal]\n\n- Add compatibility with collective.indexing 2.0a1.\n [hannosch]\n\n\n2.0.2, 26 April, 2011\n---------------------\n\n- In the unindexObject patch when collective.indexing is used, when\n the object is no membrane object, try to unwrap it, as it may be a\n PathWrapper around the object, wrapped by collective.indexing.\n Without this, stale brains may be left in the membrane_tool catalog,\n at least when using dexterity objects as members.\n [maurits]\n\n- Changed the test setup so the tests also work on Plone 4.1, next to\n Plone 4.0 and 3.3.\n [maurits]\n\n\n2.0.1, March 11, 2011\n---------------------\n\n- Add an upgrade step to handle cases where meta_type for the SearchableText\n step has been rewritten to \"Broken Because Product is Gone\" which would cause\n the 2.0 upgrade step to not migrate the index.\n [cah190]\n\n\n2.0, March 9, 2011\n------------------\n\n- Add an upgrade step to migrate from membrane 1.1 releases.\n [cah190]\n\n\n2.0b2, September 20, 2010\n-------------------------\n\n- Fix username/userid error in the PAS users plugin: doChangeUser takes a\n userid as parameter, not a username.\n [wichert]\n\n\n2.0b1, August 31, 2010\n----------------------\n\n- Apply the collective.indexing profile when it is available.\n [maurits]\n\n- Removed the dependency on collective.indexing >= 1.1 as it was added\n to allow non-Archetypes content to be used, but it is giving\n problems with some normal Archetypes content. If you add\n collective.indexing to your buildout yourself, we still use it and\n register our own catalog queue processor with it. Please install it\n in your Plone Site yourself.\n [maurits]\n\n- Bug fix: when asked to return a maximum number of users, convert\n max_results to an integer.\n [maurits]\n\n- Remove deprecated workflow state category set status mapper. This should be\n implemented using a workflow based test in an IMembraneUserAuth\n implementation, not in the core Membrane code.\n [rossp, wichert]\n\n- Fix performance problems with the object_implements index using\n marker interfaces registered as utilities. [rossp]\n\n The object_implements index used to use the ZCA to find out not only\n what interfaces an object provided, but what interfaces an object\n could be adapted to out to the second order (adapting two objects).\n Providing this degree of magical awareness proved to be a large\n performance problem.\n\n- Remove BBB method to migrate the list of membrane types from\n archetypes_tool to membrane_tool. [rossp]\n\n- Use ZCTextIndex for the SearchableText index. This fixes problems with\n unicode data.\n [wichert]\n\n- Modify the property plugin to handle property adapters returning\n None and pure dictionaries. Even though the PAS interface does not allow\n it this is common behaviour.\n [wichert]\n\n- Use collective.indexing to update the membrane_tool catalog data. This\n allows non-Archetypes content to be used.\n [wichert]\n\n- Refactor PAS plugins to only depend on the generic interfaces. This\n removes the dependency on Archetypes.\n [wichert]\n\n- Use `plone.indexer`_ to manager indexable attribuets.\n [wichert]\n\n- Update GenericSetup import handler to gracefully handle sites without a\n membrane_tool installed.\n [wichert]\n\n- Improve package description, RESTify the changelog.\n [wichert]\n\n- Move GenericSetup profile and step registration to zcml.\n [wichert]\n\n.. _plone.indexer: http://pypi.python.org/pypi/plone.indexer\n\n\n1.1b5 Released March 23, 2009\n-----------------------------\n\n- Fix git based release problem, now using setuptools-git\n [hannosch]\n\n\n\n1.1b4 Released March 20, 2009\n-----------------------------\n\n- Tested with Plone 3.0-3.2 [rossp]\n\n- Add a warning about upcoming changes to object_implements\n [rossp]\n\n- Deprecate the category mapper support [rossp]\n\n- Deprecate AT assumptions [rossp]\n\n- Provide the offending login name when more than one match\n [witsch]\n\n- Fix AttributeError bug when the search term is None [claytron]\n\n- Distinguish btn substring matches and case-insensitive matches\n for userid and username when supporting case-insensitive logins\n [rafrombrc]\n\n- Only use the membrane user factory plug-in for users for whom\n membrane provides authentication.\n [rafrombrc]\n\n\n1.1b3 Released July 23, 2008\n----------------------------\n\n- Fix issue with retrieving unnamed user adders.\n [witsch]\n\n- Remove counter again as the membrane tool inherits from Plone's\n catalog tool, which already has support for a counter. Keep the\n test and caching helper, though. :)\n [witsch]\n\n\n1.1b2 Released July 22, 2008\n----------------------------\n\n- Add a counter to the membrane tool which can be used as a cache key as\n well as a convenience helper for quickly memoizing adapters and tools.\n [witsch]\n\n- Have rolemanager and groupmanager search for exact userids.\n [mj]\n\n\n1.1b1 Released May 22, 2008\n---------------------------\n\n- Initial egg release.\n [rafrombrc]\n\n\n- removed deprecation messages in Plone 3.0 (Zope 2.10): Import of\n zope.app.annotation turned into zope.annotation\n [jensens]\n\n\n1.0b1\n-----\n\n- Introduced IUserChanger interface to separate the password\n changing from the user addition and deletion portions of\n IUserManagement. [rafrombrc]\n\n- Completed general implementation of roles, groups, properties\n plugins. [rafrombrc, jhammel, rmarianski]\n\n\n0.3\n---\n\n- Added a IUserManagement interface (from PlonePAS) to the\n usermanager. It will be available to implementations that\n provide the corresponding IMembraneUserManagement interface\n directly or through adaptation. This allows thing like\n PasswordResetTool to work.\n\n- Renamed package to 'membrane' from 'Membrane' to reflect current\n standard python naming conventions. [rafrombrc]\n\n- Major refactoring to use Zope 3 component engine to glue\n together all the pieces. Mix-ins have been converted to\n adapters, providers are defined by implementation of specific\n interfaces. [rafrombrc]\n\n\n0.2-alpha\n---------\n\n- Made Title in membrane_tool a ZCTextIndex too, so that\n enumerateGroups() of membrane_groups works without exact_match.\n\n- getUserName and getUserId indexes in membrane_tool are now of\n type ZCTextIndex, allowing us to do exact_match=False queries in\n MembraneUserManager.enumerateUsers.\n\n PluggableAuthService.enumerateUsers recommends treating id and\n login as \"contains\" search tokens, but with our text index we\n can only do \"starts with\" searches. However, that's much better\n than returning () for every call that has \"exact_match=False\".\n [dpunktnpunkt]", "description_content_type": null, "docs_url": "https://pythonhosted.org/Products.membrane/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/Products.membrane", "keywords": "plone membrane member content remember", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "Products.membrane", "package_url": "https://pypi.org/project/Products.membrane/", "platform": "Any", "project_url": "https://pypi.org/project/Products.membrane/", "project_urls": { "Homepage": "https://github.com/collective/Products.membrane" }, "release_url": "https://pypi.org/project/Products.membrane/4.0/", "requires_dist": null, "requires_python": "", "summary": "Content-based users and groups for Plone", "version": "4.0" }, "last_serial": 3227824, "releases": { "1.1": [ { "comment_text": "", "digests": { "md5": "9742ccb95c2d47cb139108800cf3c394", "sha256": "b9243f76750aaed2954edcc06ae268cd272ba5e1f1b141b14482d304efa5c96b" }, "downloads": -1, "filename": "Products.membrane-1.1.tar.gz", "has_sig": false, "md5_digest": "9742ccb95c2d47cb139108800cf3c394", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 117984, "upload_time": "2011-12-01T02:19:52", "url": "https://files.pythonhosted.org/packages/24/bc/0ebaf08782a873fe3c532954c249a29bb8f80ae38ec77489e10f00164fa5/Products.membrane-1.1.tar.gz" } ], "1.1b1": [ { "comment_text": "", "digests": { "md5": "ae5c5d2f20e235cf5a7660d47180faea", "sha256": "d7130d93b3b384a76e8d65ac2e7014f9cac2b53c04d36a1fca566c85f3a52438" }, "downloads": -1, "filename": "Products.membrane-1.1b1-py2.4.egg", "has_sig": false, "md5_digest": "ae5c5d2f20e235cf5a7660d47180faea", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 232826, "upload_time": "2008-05-23T09:08:01", "url": "https://files.pythonhosted.org/packages/65/ee/d4e3107a0820b8edb1e9fcc69f37ae00a3c838ef47ed776ea961d9641729/Products.membrane-1.1b1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "6a55b6683b2043e955bccbee179c20bf", "sha256": "79370e52386ec705d4e765dcbebe73b58d8629bd049fb8ee596fd36d604038fe" }, "downloads": -1, "filename": "Products.membrane-1.1b1.tar.gz", "has_sig": false, "md5_digest": "6a55b6683b2043e955bccbee179c20bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 111434, "upload_time": "2008-05-23T09:07:56", "url": "https://files.pythonhosted.org/packages/84/f6/f7374f39ce50e111492874ac29c13c645064dd9422f0f65c66b1e0e14626/Products.membrane-1.1b1.tar.gz" } ], "1.1b2": [ { "comment_text": "", "digests": { "md5": "edc634684400850ffaf17c1052c208d0", "sha256": "b0c8be0dd63135dc2ad83ff9fc0619abafe922de0517aa143520e263899cc100" }, "downloads": -1, "filename": "Products.membrane-1.1b2-py2.4.egg", "has_sig": true, "md5_digest": "edc634684400850ffaf17c1052c208d0", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 236187, "upload_time": "2008-07-22T14:02:57", "url": "https://files.pythonhosted.org/packages/7a/e4/4bc05f991bd144ce068d99231ea9357c42b266222cbd94824f7e41ee5098/Products.membrane-1.1b2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "93a3a3c687a5b20086ae968c8fddea61", "sha256": "a5a6e185f14f1cb09d3b97db211651f1b121b10b44bcaea6233df604d7c785de" }, "downloads": -1, "filename": "Products.membrane-1.1b2.tar.gz", "has_sig": true, "md5_digest": "93a3a3c687a5b20086ae968c8fddea61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 116123, "upload_time": "2008-07-22T14:02:48", "url": "https://files.pythonhosted.org/packages/0f/70/79f7cc83114a7457aeca154e54ca5384babb4211002e0121d38ff60c1906/Products.membrane-1.1b2.tar.gz" } ], "1.1b3": [ { "comment_text": "", "digests": { "md5": "9c5f201983fc9b66da0bab326be0c0b6", "sha256": "e0b0bc1157b81c464ec3063c5dbab455ca3503542a2907a5e4188eea5e3e5702" }, "downloads": -1, "filename": "Products.membrane-1.1b3-py2.4.egg", "has_sig": true, "md5_digest": "9c5f201983fc9b66da0bab326be0c0b6", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 235735, "upload_time": "2008-07-23T17:05:15", "url": "https://files.pythonhosted.org/packages/c5/17/f2e59e2c37b1f0b234db286a5905d4d4c8c12a93985a67409571e040a0bc/Products.membrane-1.1b3-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "31af2e99c175be2bbc8f7924a905c369", "sha256": "6e7cea07b76bc9e70acf1086fe8a07b7681ca87a01d03c6c88d583db8b97347a" }, "downloads": -1, "filename": "Products.membrane-1.1b3.tar.gz", "has_sig": true, "md5_digest": "31af2e99c175be2bbc8f7924a905c369", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 116674, "upload_time": "2008-07-23T17:05:03", "url": "https://files.pythonhosted.org/packages/62/6b/ea4f60b1b37464b4c8a10d9c7c9b735728e26bd469769109a4bb0f9d3383/Products.membrane-1.1b3.tar.gz" } ], "1.1b4": [ { "comment_text": "", "digests": { "md5": "ac84a9bd36a18064ec95771478639b45", "sha256": "291213157e7d1ad0f06602fd05c4e47ef2fc7df505bfa0bae0c369e0f0a9649b" }, "downloads": -1, "filename": "Products.membrane-1.1b4.tar.gz", "has_sig": false, "md5_digest": "ac84a9bd36a18064ec95771478639b45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115368, "upload_time": "2009-03-23T17:59:37", "url": "https://files.pythonhosted.org/packages/06/2e/32175e697434b2c909e6b75bbd9cf1ecb698f41329f247cc36a875c477f6/Products.membrane-1.1b4.tar.gz" } ], "1.1b5": [ { "comment_text": "", "digests": { "md5": "e2e1b0b0cffa95fe55f96f4c12e92a63", "sha256": "0d817c9de82898e01e6543957ed1ac1110e8895685d1ecd0c5aa16e42d3d0075" }, "downloads": -1, "filename": "Products.membrane-1.1b5.tar.gz", "has_sig": false, "md5_digest": "e2e1b0b0cffa95fe55f96f4c12e92a63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115396, "upload_time": "2009-03-23T18:06:04", "url": "https://files.pythonhosted.org/packages/6c/7e/3e5f87e209f3845ad821bffb75794ca059e638f568957bbac46bc92f82cf/Products.membrane-1.1b5.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "a9e0017c72c4f3d57faef15ea395c6ce", "sha256": "922b2e2ab19bbfe33ca1a5b4f583a7db1469724fecd2e948bd795e91337d63f0" }, "downloads": -1, "filename": "Products.membrane-2.0.zip", "has_sig": false, "md5_digest": "a9e0017c72c4f3d57faef15ea395c6ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 164437, "upload_time": "2011-03-09T18:32:19", "url": "https://files.pythonhosted.org/packages/c9/63/fe483cd2e570a7d20057c28611c3002ca8346a77112f84507f8861ca3807/Products.membrane-2.0.zip" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "fb5a157180eedd0d68dceaea8d304f96", "sha256": "5f8b94ec3ad6cd36c512fd96bfed18b20227e4ed12b261ad8b20f01a40a2db05" }, "downloads": -1, "filename": "Products.membrane-2.0.1.zip", "has_sig": false, "md5_digest": "fb5a157180eedd0d68dceaea8d304f96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 165385, "upload_time": "2011-03-11T16:45:46", "url": "https://files.pythonhosted.org/packages/4f/b8/d4dea95f3f9935e2db0abade99db5bea7ab8cec52fe0df19e1e8e9e9b6e3/Products.membrane-2.0.1.zip" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "b8f737878e95f6d8cd92717c7ea7d618", "sha256": "0a6c3f6470a94a8782228a06c4af6e4e0762e374bfa5209568fa58921f977cd5" }, "downloads": -1, "filename": "Products.membrane-2.0.2.zip", "has_sig": false, "md5_digest": "b8f737878e95f6d8cd92717c7ea7d618", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 168256, "upload_time": "2011-04-26T14:18:07", "url": "https://files.pythonhosted.org/packages/83/dd/a8519be672bc61ea4ca93742518c57072ad0c40cdee9238e26e11f87b67d/Products.membrane-2.0.2.zip" } ], "2.0b1": [ { "comment_text": "", "digests": { "md5": "08f1cb9560099d070d19365dc529b34c", "sha256": "394525607a9df3be5895bef2dbe7d7d8a954bf12f5498e51c5e3c80ca9cce162" }, "downloads": -1, "filename": "Products.membrane-2.0b1.tar.gz", "has_sig": false, "md5_digest": "08f1cb9560099d070d19365dc529b34c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119778, "upload_time": "2010-08-31T10:43:19", "url": "https://files.pythonhosted.org/packages/98/51/2f403e489f28c9198b98e40eda34e31339118195f3dbd072e56631dc983e/Products.membrane-2.0b1.tar.gz" } ], "2.0b2": [ { "comment_text": "", "digests": { "md5": "a09d1d78035cc9b9ee4b6bee12ca8a34", "sha256": "9fd05f3b31b988af49a92cbe3b4ca0bf0434eba34aeab5b65702ddcc5e825a05" }, "downloads": -1, "filename": "Products.membrane-2.0b2.tar.gz", "has_sig": false, "md5_digest": "a09d1d78035cc9b9ee4b6bee12ca8a34", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119930, "upload_time": "2010-09-20T13:40:12", "url": "https://files.pythonhosted.org/packages/2d/0a/2937a3e76c27ff0741a48e11e399f3fefd9b04eb362799e95dac3c1ec298/Products.membrane-2.0b2.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "75e8c47f790b61cbf8349ee6b745b6d7", "sha256": "35a97976099022915bf66cc4fe35b853742ec79e197d702d6de13fba2caf15fc" }, "downloads": -1, "filename": "Products.membrane-2.1.0.tar.gz", "has_sig": false, "md5_digest": "75e8c47f790b61cbf8349ee6b745b6d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 123536, "upload_time": "2011-11-15T17:13:46", "url": "https://files.pythonhosted.org/packages/79/b2/cd21fa5b8948f5527dc22ffe1523522c2be98f1889a4ab07ace84eb6d872/Products.membrane-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "fc8b3916cbbef363b21c207ca03da255", "sha256": "7a3ac6c2483517e51cab8929db813e1b5c9f1a94c176d861dab4071f54c8b9dc" }, "downloads": -1, "filename": "Products.membrane-2.1.1.tar.gz", "has_sig": false, "md5_digest": "fc8b3916cbbef363b21c207ca03da255", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 123805, "upload_time": "2011-11-29T21:24:56", "url": "https://files.pythonhosted.org/packages/ec/92/17465d3618a0943d6df5f2882ed15b995d883200ee985ce8a6380b4d2cf6/Products.membrane-2.1.1.tar.gz" } ], "2.1.10": [ { "comment_text": "", "digests": { "md5": "c259476827446c5799584b0962e61526", "sha256": "8edaecc7293088e2314c8bfe6e9ae3dafb9bef540b94b9970044db9764368654" }, "downloads": -1, "filename": "Products.membrane-2.1.10.zip", "has_sig": false, "md5_digest": "c259476827446c5799584b0962e61526", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 173670, "upload_time": "2013-10-18T22:24:11", "url": "https://files.pythonhosted.org/packages/f9/7c/4b81eb320e0f00322a02901a4994c9b44f61628d288bf00c552f426ce687/Products.membrane-2.1.10.zip" } ], "2.1.11": [ { "comment_text": "", "digests": { "md5": "3daae948a6dc7544c960e7e77a609a2f", "sha256": "a9fca6c867028e6cb2342fbe3c0d2d72368d54df5fe895c7d615510b08296824" }, "downloads": -1, "filename": "Products.membrane-2.1.11.zip", "has_sig": false, "md5_digest": "3daae948a6dc7544c960e7e77a609a2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 173981, "upload_time": "2014-03-31T09:30:07", "url": "https://files.pythonhosted.org/packages/5d/9a/d3bd17e5c9ac02783ce4155b4c4f25f0809ffa728550ccce59dc5139abbc/Products.membrane-2.1.11.zip" } ], "2.1.12": [ { "comment_text": "", "digests": { "md5": "caa1070ea930ea110500bb041e05ea02", "sha256": "f67e1d699369a7a2ea3ef5e1234ab988f84853028c815c92d7e2f8a9dcbf8e42" }, "downloads": -1, "filename": "Products.membrane-2.1.12.tar.gz", "has_sig": false, "md5_digest": "caa1070ea930ea110500bb041e05ea02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130953, "upload_time": "2015-06-25T00:24:18", "url": "https://files.pythonhosted.org/packages/03/67/fdbd1905f888f948ee3804b6562cdbadb9e1db2e9e14f72fc362334e3d3a/Products.membrane-2.1.12.tar.gz" } ], "2.1.13": [ { "comment_text": "", "digests": { "md5": "12e93bc65a931daae973355e87203217", "sha256": "f53c3439986237b649406a1986dba4ce874988f81eb504408601af5117b41dbd" }, "downloads": -1, "filename": "Products.membrane-2.1.13.tar.gz", "has_sig": false, "md5_digest": "12e93bc65a931daae973355e87203217", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 131034, "upload_time": "2015-11-05T18:26:08", "url": "https://files.pythonhosted.org/packages/72/e1/523beacd3a150a42f4047d7f75bebb3f2f503a5788292db9a5d65f2e3807/Products.membrane-2.1.13.tar.gz" } ], "2.1.14": [ { "comment_text": "", "digests": { "md5": "cb29f6d9f12348acf40040c277e7e95c", "sha256": "ae446c181f4a2668718cd8722bdea060baf3f31618280a275857012fdfa47bac" }, "downloads": -1, "filename": "Products.membrane-2.1.14.tar.gz", "has_sig": false, "md5_digest": "cb29f6d9f12348acf40040c277e7e95c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 133087, "upload_time": "2016-07-06T09:31:18", "url": "https://files.pythonhosted.org/packages/0c/51/b2eaf349839f5a3841443d7769ba625485b6583e7671e6ee149d8dd18d6d/Products.membrane-2.1.14.tar.gz" } ], "2.1.15": [ { "comment_text": "", "digests": { "md5": "cf4cdc24eb5ddc33ef01a53caf33e2f6", "sha256": "b0fdfa30f59ca9c4f8db982fd331e6f0de8d6d4faee3f7a50e1bb0e82d0d48d9" }, "downloads": -1, "filename": "Products.membrane-2.1.15.tar.gz", "has_sig": false, "md5_digest": "cf4cdc24eb5ddc33ef01a53caf33e2f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 131378, "upload_time": "2016-07-06T09:40:46", "url": "https://files.pythonhosted.org/packages/fc/db/c0335a85a7f034bdc5aa623abdcf5f4742aaca7cb30c6e5e2480a5b78d64/Products.membrane-2.1.15.tar.gz" } ], "2.1.2": [ { "comment_text": "", "digests": { "md5": "b8cbd55707672ff9fbf3cb3666d748b0", "sha256": "f2164d1313c168922f2a919ce728faba31afe11e5c88c3095d87d9ad2c586ed2" }, "downloads": -1, "filename": "Products.membrane-2.1.2.tar.gz", "has_sig": false, "md5_digest": "b8cbd55707672ff9fbf3cb3666d748b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 124387, "upload_time": "2011-12-16T23:03:18", "url": "https://files.pythonhosted.org/packages/69/9c/7e524fa4a8e3e6d402308d8a83fd546e272c27c04af0fa5c10349879dce3/Products.membrane-2.1.2.tar.gz" } ], "2.1.3": [ { "comment_text": "", "digests": { "md5": "74bbcebd316b98cd2d22aaec8f0a8783", "sha256": "5928d9519b881f4566d3c150dbf8524eaf078e77a7323bd30b551f0e04128c15" }, "downloads": -1, "filename": "Products.membrane-2.1.3.tar.gz", "has_sig": false, "md5_digest": "74bbcebd316b98cd2d22aaec8f0a8783", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 123385, "upload_time": "2012-02-27T14:31:57", "url": "https://files.pythonhosted.org/packages/12/9c/33db5be31ad05e3129c0b501c8f678efe901c24b5213dac36d05122916cc/Products.membrane-2.1.3.tar.gz" } ], "2.1.4": [ { "comment_text": "", "digests": { "md5": "96316ca86506b4e1880e0b81d44d54f7", "sha256": "359c210aaacdbab68ef2adc6616a52c3c450ed068ed611e2dfc57d19d4c3da79" }, "downloads": -1, "filename": "Products.membrane-2.1.4.zip", "has_sig": false, "md5_digest": "96316ca86506b4e1880e0b81d44d54f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 169411, "upload_time": "2012-04-13T13:30:54", "url": "https://files.pythonhosted.org/packages/e8/b9/b9fcbbfcbbe314158a9e3fcc87bde87a2e6b5eda23fba6c30b1519ff3555/Products.membrane-2.1.4.zip" } ], "2.1.5": [ { "comment_text": "", "digests": { "md5": "d44ac41cc3e99f6260ec48b4bf2bfcac", "sha256": "8d36feb81e43ff6a8eaebebfa47d913ce349d1480a10425b1db7a19235ae3029" }, "downloads": -1, "filename": "Products.membrane-2.1.5.zip", "has_sig": false, "md5_digest": "d44ac41cc3e99f6260ec48b4bf2bfcac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 173393, "upload_time": "2012-09-13T12:56:09", "url": "https://files.pythonhosted.org/packages/3d/0d/8af01d3aaf1920c5feb8955ac176eb4df693e14c0a07426222f14b809cb2/Products.membrane-2.1.5.zip" } ], "2.1.6": [ { "comment_text": "", "digests": { "md5": "cdd374633d863997e773037ede7e3e58", "sha256": "04f01c892b4bc9160e2b03213be44e099977e56db50e78a6ca3e13084ec6ecda" }, "downloads": -1, "filename": "Products.membrane-2.1.6.zip", "has_sig": false, "md5_digest": "cdd374633d863997e773037ede7e3e58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 170282, "upload_time": "2013-03-01T13:08:49", "url": "https://files.pythonhosted.org/packages/4a/7c/6389c8117505c744ba50c201c131fee0c863e16b656c8cdb11471b9b4a46/Products.membrane-2.1.6.zip" } ], "2.1.7": [ { "comment_text": "", "digests": { "md5": "a73c6c93ef0e3d9bdafa1a5bf4e508a8", "sha256": "da3de43b11ca46eb0ba94330e901642673cb0f0e0c3ab207af62f421b1399c7d" }, "downloads": -1, "filename": "Products.membrane-2.1.7.zip", "has_sig": false, "md5_digest": "a73c6c93ef0e3d9bdafa1a5bf4e508a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 176470, "upload_time": "2013-03-01T15:48:06", "url": "https://files.pythonhosted.org/packages/21/ce/aedb98c823a40c2a279178f50fb7269e0fff992a4aa583c50c01ffd66321/Products.membrane-2.1.7.zip" } ], "2.1.8": [ { "comment_text": "", "digests": { "md5": "f2f8597fa959814bfeda54cc0298b0a3", "sha256": "2a876f43d465749ff439b6bc125741a1e5ca11db31a02a61d74c679112034d8c" }, "downloads": -1, "filename": "Products.membrane-2.1.8.zip", "has_sig": false, "md5_digest": "f2f8597fa959814bfeda54cc0298b0a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 172160, "upload_time": "2013-03-30T23:38:31", "url": "https://files.pythonhosted.org/packages/7a/64/288bdc27bce487c0ab573febdc8199337245fd8176097bc209f02aaf98a0/Products.membrane-2.1.8.zip" } ], "2.1.9": [ { "comment_text": "", "digests": { "md5": "70e8a77b6dca511b781de9fa6082ab28", "sha256": "7d7340ace311ceda63c4e3c94cb403bd1b14eee3d1e0cb595d30e13cba63d2f4" }, "downloads": -1, "filename": "Products.membrane-2.1.9.zip", "has_sig": false, "md5_digest": "70e8a77b6dca511b781de9fa6082ab28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 173275, "upload_time": "2013-07-18T21:31:18", "url": "https://files.pythonhosted.org/packages/76/87/fd7ba47ce36797cc531b00c33f0b483eb690574e0f0f3c611d913b6b4746/Products.membrane-2.1.9.zip" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "a26e64a07776b335f804dc0d19ea77a3", "sha256": "40832af2ab72be59a96d12d201628e36aadd7bf094bd98f8a62840befbb5c28e" }, "downloads": -1, "filename": "Products.membrane-3.0.tar.gz", "has_sig": false, "md5_digest": "a26e64a07776b335f804dc0d19ea77a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 133106, "upload_time": "2016-07-06T09:43:42", "url": "https://files.pythonhosted.org/packages/ba/c0/233866623684ae36b1991507270ec2b5cdd8df1cf1a0ffd2feaf15e0e92d/Products.membrane-3.0.tar.gz" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "1f1cc4ce03b8f86bd7f2e5145ea87781", "sha256": "4943c48ab455a6d2001aec152113e99434d98e1d5d21e2715bbd0d3d3eefb325" }, "downloads": -1, "filename": "Products.membrane-3.0.1.tar.gz", "has_sig": false, "md5_digest": "1f1cc4ce03b8f86bd7f2e5145ea87781", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 133430, "upload_time": "2017-04-05T16:29:17", "url": "https://files.pythonhosted.org/packages/05/62/45cc1cd0da768282716abaf5643be1ed1f260e00f0a0d95cc80428fa6d15/Products.membrane-3.0.1.tar.gz" } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "1b93695cd355b8eeb08013501231ba93", "sha256": "2ef8526499e9cf73beedd78a6acdd5d35567a0da079c3d95016cc021a807b427" }, "downloads": -1, "filename": "Products.membrane-3.0.2.tar.gz", "has_sig": false, "md5_digest": "1b93695cd355b8eeb08013501231ba93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 133619, "upload_time": "2017-09-15T15:17:41", "url": "https://files.pythonhosted.org/packages/38/48/315a4ddcbfa42abda8a37e03df1dd1e7a44bda3e618d9922006ad48956f7/Products.membrane-3.0.2.tar.gz" } ], "4.0": [ { "comment_text": "", "digests": { "md5": "800b8174a2bedfa55613aa424a6adb1b", "sha256": "499e4a0f87a2fc6377f7c2f91e4c2674ead9c731d19e4bc8e1c919421086dc6f" }, "downloads": -1, "filename": "Products.membrane-4.0.tar.gz", "has_sig": false, "md5_digest": "800b8174a2bedfa55613aa424a6adb1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 72389, "upload_time": "2017-10-05T12:29:58", "url": "https://files.pythonhosted.org/packages/47/fe/ffd95f54f557c2d4945d32ee1197936602882ecf019ef2afb4c42173551f/Products.membrane-4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "800b8174a2bedfa55613aa424a6adb1b", "sha256": "499e4a0f87a2fc6377f7c2f91e4c2674ead9c731d19e4bc8e1c919421086dc6f" }, "downloads": -1, "filename": "Products.membrane-4.0.tar.gz", "has_sig": false, "md5_digest": "800b8174a2bedfa55613aa424a6adb1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 72389, "upload_time": "2017-10-05T12:29:58", "url": "https://files.pythonhosted.org/packages/47/fe/ffd95f54f557c2d4945d32ee1197936602882ecf019ef2afb4c42173551f/Products.membrane-4.0.tar.gz" } ] }