{ "info": { "author": "Grok Team", "author_email": "grok-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 6 - Mature", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "This package provides base classes of basic component types for the\nZope Component Architecture, as well as means for configuring and\nregistering them directly in Python (without ZCML).\n\n.. contents::\n\nHow to set up ``grokcore.component``\n====================================\n\nIn the following we assume you're writing or extending an application\nthat does bootstrap configuration using ZCML. There's always a single\nZCML file that is executed when the application is started, which then\nincludes everything else. Let's assume this file is called\n``site.zcml`` (that's what it's called in Zope), so that file is what\nwe'll be editing.\n\nIn order to register the components that you wrote using the base\nclasses and directives available from ``grokcore.component``, we'll\nuse the ```` ZCML directive. But before we can use it,\nwe need to make sure it's available to the ZCML machinery. We do this\nby including the meta configuration from ``grokcore.component``::\n\n \n\nPut this line somewhere to the top of ``site.zcml``, next to other\nmeta configuration includes. Now, further down the line, we can tell\nthe machinery in ``grokcore.component`` to register all components in\nyour package (let's say it's called ``helloworld``)::\n\n \n\nTo sum up, your ``site.zcml`` file should look like something like this::\n\n \n\n \n \n \n \n\n \n \n \n\n \n \n\n \n\nThere is an optional ``exclude`` on the `grok` directive. It allows to specify\nnames of packages or modules that if encountered won't be grokked. These\nnames might contain unix shell-style wildcards.\n\n`implementer()` versus `implements()`\n=====================================\n\nNote how the Python 3 compatibility brings a change in how the\n`grokcore.component.implements()` *directive* works. When using this directive\nyou now have to make sure the component is grokkked, to have the underlying\nmechanism to take effect.\n\nAlternatively you could start to use the `grokcore.component.implementer()`\n*class decorator* instead. This will do the same thing, but does not require\nyour component to be grokkked and still have your component declare it\nimplements the given interface.\n\nExamples\n========\n\nAdapter\n-------\n\nHere's a simple adapter that may be useful in Zope. It extracts the\nlanguages that a user prefers from the request::\n\n import grokcore.component\n from zope.publisher.interfaces.browser import IBrowserRequest\n from zope.i18n.interfaces import IUserPreferredLanguages\n\n class CookieLanguage(grokcore.component.Adapter):\n \"\"\"Extract the preferred language from a cookie\"\"\"\n grokcore.component.context(IBrowserRequest)\n grokcore.component.implements(IUserPreferredLanguages)\n\n # No need to implement __init__, it's already provided by the base class.\n\n def getPreferredLanguages(self):\n # This an adapter for the request, so self.context is the request.\n request = self.context\n\n # Extract the preferred language from a cookie:\n lang = request.cookies.get('language', 'en')\n\n # According to IUserPreferredLanguages, we must return a list.\n return [lang]\n\nMulti-adapter\n-------------\n\nHere's a multi-adapter that functions as a content provider as known\nfrom the ``zope.contentprovider`` library. Content providers are\ncomponents that return snippets of HTML. They're multi-adapters for\nthe content object (model), the request and the view that they're\nsupposed to be a part of::\n\n import grokcore.component\n from zope.publisher.interfaces.browser import IBrowserRequest\n from zope.publisher.interfaces.browser import IBrowserPage\n from zope.contentprovider.interfaces import IContentProvider\n\n class HelloWorldProvider(grokcore.component.MultiAdapter):\n \"\"\"Display Hello World!\"\"\"\n grokcore.component.adapts(Interface, IBrowserRequest, IBrowserPage)\n grokcore.component.implements(IContentProvider)\n\n def __init__(self, context, request, view):\n pass\n\n def update(self):\n pass\n\n def render(self):\n return u'

Hello World!

'\n\n\nGlobal utility\n--------------\n\nHere's a simple named utility, again from the Zope world. It's a\ntranslation domain. In other words, it contains translations of user\nmessages and is invoked when the i18n machinery needs to translate\nsomething::\n\n import grokcore.component\n from zope.i18n.interfaces import ITranslationDomain\n\n class HelloWorldTranslationDomain(grokcore.component.GlobalUtility):\n grokcore.component.implements(ITranslationDomain)\n grokcore.component.name('helloworld')\n\n domain = u'helloworld'\n\n def translate(self, msgid, mapping=None, context=None,\n target_language=None, default=None):\n if target_language is None:\n preferred = IUserPreferredLanguages(context)\n target_language = preferred.getPreferredLanguages()[0]\n\n translations = {'de': u'Hallo Welt',\n 'nl': u'Hallo Wereld'}\n return translations.get(target_language, u'Hello World')\n\nOf course, it's silly to implement your own translation domain utility\nif there are already implementations available in ``zope.i18n`` (one\nthat reads translations from a GNU gettext message catalog and a\nsimple implementation for tests). Let's try to reuse that\nimplementation and register an instance::\n\n import grokcore.component\n from zope.i18n.interfaces import ITranslationDomain\n from zope.i18n.simpletranslationdomain import SimpleTranslationDomain\n\n messages = {('de', u'Hello World'): u'Hallo Welt',\n ('nl', u'Hello World'): u'Hallo Wereld'}\n helloworld_domain = SimpleTranslationDomain(u'helloworld', messages)\n\n grokcore.component.global_utility(helloworld_domain,\n provides=ITranslationDomain,\n name='helloworld',\n direct=True)\n\nGlobal adapter\n--------------\n\nSometimes, you may have an object that should be registered as an adapter\nfactory. It may have come from some other framework that configured that\nadapter for you, say, or you may have a class that you instantiate many\ntimes to get different variations on a particular adapter factory. In these\ncases, subclassing grokcore.component.Adapter or MultiAdapter is not\npossible. Instead, you can use the global_adapter() directive. Here is an\nexample drawing on the ``z3c.form`` library, which provides an adapter factory\nfactory for named widget attributes::\n\n import zope.interface\n import zope.schema\n import grokcore.component\n import z3c.form.widget import ComputedWidgetAttribute\n\n class ISchema(Interface):\n \"\"\"This schema will be used to power a z3c.form form\"\"\"\n\n field = zope.schema.TextLine(title=u\"Sample field\")\n\n ...\n\n label_override = z3c.form.widget.StaticWidgetAttribute(\n u\"Override label\", field=ISchema['field'])\n\n grokcore.component.global_adapter(label_override, name=u\"label\")\n\nIn the example above, the provided and adapted interfaces are deduced from the\nobject returned by the ``StaticWidgetAttribute`` factory. The full syntax\nfor global_adapter is::\n\n global_adapter(factory, (IAdapted1, IAdapted2,), IProvided, name=u\"name\")\n\nThe factory must be a callable (the adapter factory). Adapted interfaces are\ngiven as a tuple. You may use a single interface instead of a one-element\ntuple for single adapters. The provided interface is given as shown. The name\ndefaults to u\"\" (an unnamed adapter).\n\nHandling events\n---------------\n\nHere we see an event handler much like it occurs within Zope itself. It\nsubscribes to the modified event for all annotatable objects (in other words,\nobjects that can have metadata associated with them). When invoked, it updates\nthe Dublin Core 'Modified' property accordingly::\n\n import datetime\n import grokcore.component\n from zope.annotation.interfaces import IAnnotatable\n from zope.lifecycleevent.interfaces import IObjectModifiedEvent\n from zope.dublincore.interfaces import IZopeDublinCore\n\n @grokcore.component.subscribe(IAnnotatable, IObjectModifiedEvent)\n def updateDublinCoreAfterModification(obj, event):\n \"\"\"Updated the Dublin Core 'Modified' property when a modified\n event is sent for an object.\"\"\"\n IZopeDublinCore(obj).modified = datetime.datetime.utcnow()\n\nSubscriptions\n-------------\n\nSubscriptions look similar to Adapter, however, unlike regular adapters,\nsubscription adapters are used when we want all of the adapters that adapt an\nobject to a particular adapter.\n\nAnalogous to MultiAdapter, there is a MultiSubscription component that \"adapts\"\nmultiple objects.\n\nChanges\n=======\n\n3.1 (2018-05-09)\n----------------\n\n- Expose ``martian.ignore`` through our API.\n\n3.0.2 (2018-01-17)\n------------------\n\n- Replace the use of `grok.implements()` with the `@grok.implementer()`\n directive throughout.\n\n3.0.1 (2018-01-12)\n------------------\n\n- Rearrange tests such that Travis CI can pick up all functional tests too.\n\n3.0 (2017-10-19)\n----------------\n\n- Add support for Python 3.5, 3.6, PyPy2 and PyPy3.\n\n- Drop support for Python 2.6 and 3.3.\n\n2.7 (2016-02-16)\n----------------\n\n- Add ability to exclude more than one module or package using\n ``\" />`` and allow to use unix shell-style\n wildcards within.\n\n2.6.1 (2016-01-29)\n------------------\n\n- Make grokcore.component.implementer compatible with\n zope.interface.implementer by allowing doing the adapter magic when\n used on functions.\n\n2.6 (2015-05-12)\n----------------\n\n- Compatibility for python 3l\n\n- Python 3 doesn't support the directive ``zope.interface.implements``\n any more and is required to use the ``@implementer`` class decorator instead.\n This version of grokcore.components provides its own\n ``grokcore.component.implements`` directive for both Python 2 and 3.\n So this directive can still be used with the help of a grokker.\n If you use grokcore.components >= 2.6 the new implementation will be used\n while earlier versions used zope.interface.implements.\n\n2.5 (2012-05-01)\n----------------\n\n- Introduce provideUtility, providerAdapter, provideSubscriptionAdapter,\n provideHandler and provideInterface in grokcore.component. These by default\n delegate the registration of components to the global site manager like\n was done before, but provide the possibility for custom registries for the\n grokked components.\n\n- Fix the `global_adapter` to properly use information annotated by\n ``grok.adapter``, and using the IContext object if it was not\n specified. (Fix Launchpad issue #960097).\n\n- Add a ``key`` option to ``sort_components`` that behave like ``key``\n options available on standard Python sort methods.\n\n2.4 (2011-04-27)\n----------------\n\n- Fix the `global_adapter` directive implementation to accept an explicit\n \"empty\" name for nameless adapter registrations (as it used to be that\n providing an empty name in the registration would actually result in\n registering a named adapter in case the factory has a `grok.name`).\n\n2.3 (2011-02-14)\n----------------\n\n- Implement the generic (Multi)Subscriptions components.\n\n2.2 (2010-11-03)\n----------------\n\n- The default values computation for the context directive and the provides\n directive is now defined in the directives themselves. This means that where\n the values for these directives is being retrieved, the \"default_context\"\n function does not need to be passed along anymore for general cases.\n\n Analogous to this, when getting values for the provides directive the\n \"default_provides\" function does not need to be passed along in the general\n case.\n\n2.1 (2010-11-01)\n----------------\n\n* Made package comply to zope.org repository policy.\n\n* Moved directives 'order' from grokcore.viewlet and 'path' from\n grokcore.view to this very package.\n\n* Tiny dependency adjustment: moved zope.event to test dependencies.\n\n* Port from 1.x branch exclude parameter to the Grok ZCML directive.\n\n* Port from 1.x branch the ignore of testing.py modules.\n\n2.0 (2009-09-16)\n----------------\n\n* Use a newer version of Martian that has better support for\n inheritance. This is demonstrated in ``tests/inherit``.\n\n* The ``ContextGrokker`` and the ``scan.py`` module have gone away\n thanks the newer Martian.\n\n* Directive implementations (in their factory method) should *not*\n bind directives. Directive binding cannot take place at import time,\n but only at grok time. Binding directives during import time (when\n directives are executed) can lead to change problems. (we noticed\n this during our refactoring to use the new Martian).\n\n* Use 1.0b1 versions.cfg in Grok's release info instead of a local\n copy; a local copy for all grokcore packages is just too hard to\n maintain.\n\n1.7 (2009-06-01)\n----------------\n\n* Add missing provider, global_adapter, implementsOnly, classProvides() to\n the module interface so that they are included in __all__\n\n1.6 (2009-04-10)\n----------------\n\n* Add convenience imports for implementsOnly() and classProvides() class\n declarations form zope.interface.\n\n* Add support for registering global adapters at module level::\n\n grok.global_adapter(factory, (IAdapted1, IAdapted2,), IProvided, name=u\"name\")\n\n Only 'factory' is required. If only a single interface is adapted, the\n second argument may be a single interface instead of a tuple. If the\n component has declared adapted/provided interfaces, the second and third\n arguments may be omitted.\n\n* Add support for an @provider decorator to let a function directly provide\n an interface::\n\n @grok.provider(IFoo, IBar)\n def some_function():\n ...\n\n This is equivalent to doing alsoProvides(some_function, IFoo, IBar).\n\n* Add support for named adapters with the @adapter decorator::\n\n @grok.adapter(IAdaptedOne, IAdaptedTwo, name=u\"foo\")\n def some_function(one, two):\n ...\n\n1.5.1 (2008-07-28)\n------------------\n\n* The ``IGrokcoreComponentAPI`` interface was missing declarations for\n the ``title`` and ``description`` directives.\n\n1.5 (2008-07-22)\n----------------\n\n* Fix https://bugs.launchpad.net/grok/+bug/242353: grokcore.component\n contains old-style test setup. There is no `register_all_tests`\n method in grokcore.component.testing anymore. Use z3c.testsetup\n instead.\n\n* Allow functions that have been marked with @grok.subscribe also be\n registered with ``zope.component.provideHandler()`` manually. This\n is useful for unit tests where you may not want to grok a whole\n module.\n\n* Document grokcore.component's public API in an interface,\n ``IGrokcoreComponentAPI``. When you now do::\n\n from grokcore.component import *\n\n only the items documented in that interface will be imported into\n your local namespace.\n\n1.4 (2008-06-11)\n----------------\n\n* Ported class grokkers to make use of further improvements in Martian.\n This requires Martian 0.10.\n\n1.3 (2008-05-14)\n----------------\n\n* Ported class grokkers to make use of the new declarative way of\n retrieving directive information from a class. This requires\n Martian 0.9.6.\n\n1.2.1 (2008-05-04)\n------------------\n\n* Upgrade to Martian 0.9.5, which has a slight change in the signature of\n ``scan_for_classes``.\n\n* Remove an unnecessary import ``methods_from_class`` from\n ``grokcore.component.scan``.\n\n1.2 (2008-05-04)\n----------------\n\n* Ported directives to Martian's new directive implementation. As a\n result, nearly all helper functions that were available from\n ``grokcore.component.util`` have been removed. The functionality is\n mostly available from the directives themselves now.\n\n* The ``baseclass`` directive has been moved to Martian.\n\n* The ``order`` directive and its helper functions have been moved\n back to Grok, as it was of no general use, but very specific to\n viewlets.\n\n1.1 (2008-05-03)\n----------------\n\n* ``determine_module_component`` now looks for classes that implement\n a certain interface (such as ``IContext``), instead of taking a list\n of classes. If looking for ``IContext``, it still will find\n ``Context`` subclasses, as these were also made to implement\n ``IContext``.\n\n* Move the ``public_methods_from_class`` helper function back to Grok,\n it isn't used at all in ``grokcore.component``.\n\n1.0.1 (2008-05-02)\n------------------\n\n* The grokkers for adapters and global utilities did not use the\n correct value for the *provided* interface in the configuration\n action discriminator. Because of this, uninformative and\n potentially wrong conflict errors would occur, as well as no\n conflict where a conflict should have occurred.\n\n* The grokker for the ``global_utility()`` directive did immediate\n registrations instead of generating configuration actions.\n Therefore it did not provoke ``ConflictErrors`` for conflicting\n registrations.\n\n* Improved documentation\n\n1.0 (2008-05-01)\n----------------\n\n* Created ``grokcore.component`` in March 2008 by factoring basic\n component base classes and their directives and grokkers out of\n Grok.", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/zopefoundation/grokcore.component", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://grok.zope.org", "keywords": "", "license": "ZPL", "maintainer": "", "maintainer_email": "", "name": "grokcore.component", "package_url": "https://pypi.org/project/grokcore.component/", "platform": "", "project_url": "https://pypi.org/project/grokcore.component/", "project_urls": { "Download": "https://github.com/zopefoundation/grokcore.component", "Homepage": "http://grok.zope.org" }, "release_url": "https://pypi.org/project/grokcore.component/3.1/", "requires_dist": null, "requires_python": "", "summary": "Grok-like configuration for basic components (adapters, utilities, subscribers)", "version": "3.1" }, "last_serial": 3847146, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "a0579e3b0602103e96268ec820c920f9", "sha256": "cd1cb6d543ca69b05adddb590abe2f7844a176ab0875dbc5514aae1d091b341b" }, "downloads": -1, "filename": "grokcore.component-1.0.tar.gz", "has_sig": false, "md5_digest": "a0579e3b0602103e96268ec820c920f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30044, "upload_time": "2008-05-01T11:06:51", "url": "https://files.pythonhosted.org/packages/8d/f9/96224242cf0b16c84237070dc7d78b7d6168670c49eb8cde1f1ad09023a1/grokcore.component-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "ea84d73493d7f53576174725f4f20152", "sha256": "b782eaeb43c372bd226cedb3d57833b0e77b17b07786c009d221433423cd57ea" }, "downloads": -1, "filename": "grokcore.component-1.0.1.tar.gz", "has_sig": false, "md5_digest": "ea84d73493d7f53576174725f4f20152", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36477, "upload_time": "2008-05-02T09:59:40", "url": "https://files.pythonhosted.org/packages/0d/ab/d5973d8d3685bc3a3c4076aa16aac2edd32c1327f79b3aef86b2d9d260d0/grokcore.component-1.0.1.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "71a73d56a5280f4e7c80d1b3c8a1355d", "sha256": "e1fe89a960a2b7aca6a973a7b60c2643587a9b7b95af6fb2f5615159711a0ee9" }, "downloads": -1, "filename": "grokcore.component-1.1.tar.gz", "has_sig": false, "md5_digest": "71a73d56a5280f4e7c80d1b3c8a1355d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34422, "upload_time": "2008-05-03T15:31:42", "url": "https://files.pythonhosted.org/packages/42/05/98da2e1d9bd07cc967f17e160ae395b741a51f4fab997af7cfbc9d3820d4/grokcore.component-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "cd2eb07446b805077776c1a25f7b615d", "sha256": "2f46249261a34d0ebbd2cc50928118adebfb281e5dd603696b4724ca1eb46de6" }, "downloads": -1, "filename": "grokcore.component-1.2.tar.gz", "has_sig": false, "md5_digest": "cd2eb07446b805077776c1a25f7b615d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36169, "upload_time": "2008-05-04T15:15:20", "url": "https://files.pythonhosted.org/packages/79/bb/abaa22f0b5f03d5268dee96dbd588a082f5328f0bde63ce594af5fa1ba96/grokcore.component-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "750ef34f400326530cbe574e8fb5a7e9", "sha256": "6e3b037b767c009922eabfd16aa0bcf30593e679c24f231cdf8f6f943f4bb121" }, "downloads": -1, "filename": "grokcore.component-1.2.1.tar.gz", "has_sig": false, "md5_digest": "750ef34f400326530cbe574e8fb5a7e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32864, "upload_time": "2008-05-04T16:30:52", "url": "https://files.pythonhosted.org/packages/33/6d/857e043ee0b1b83e29d94e4da530299c5ac547dfedf0494363de0a6ecf5f/grokcore.component-1.2.1.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "f9e7bec6d5db077e28fdc1d29f748cc5", "sha256": "cdc554a1f0d7ae22ec9447ce26ad71f81982d9cf8b452ae501991043fdc5cdc7" }, "downloads": -1, "filename": "grokcore.component-1.3.tar.gz", "has_sig": false, "md5_digest": "f9e7bec6d5db077e28fdc1d29f748cc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36537, "upload_time": "2008-05-14T16:20:45", "url": "https://files.pythonhosted.org/packages/75/03/eacabf90ae9cf9c38965c1848a0709ecfc8ca7cb03dcc94a6948e652d89d/grokcore.component-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "415eceac378b2781ea11b76c68a1b6be", "sha256": "8c3feeddb992afef410bc8ab210fc465592a36b4f5d47110616168815c2299ae" }, "downloads": -1, "filename": "grokcore.component-1.4.tar.gz", "has_sig": false, "md5_digest": "415eceac378b2781ea11b76c68a1b6be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36168, "upload_time": "2008-06-11T17:04:35", "url": "https://files.pythonhosted.org/packages/37/cc/9d4dc9cff2bddfa7d6c4a976553d7b58fcb919ee2b3cc33c5360fdbb0fb6/grokcore.component-1.4.tar.gz" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "ec7e0087b89d21d3fb7f13edcc8d54a2", "sha256": "e1a0b72b07ddf641dea2bfaed39ea3efdf8e873cc1799ea0e466915c7fa5d5f5" }, "downloads": -1, "filename": "grokcore.component-1.5.tar.gz", "has_sig": false, "md5_digest": "ec7e0087b89d21d3fb7f13edcc8d54a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31412, "upload_time": "2008-07-22T14:42:27", "url": "https://files.pythonhosted.org/packages/41/e8/dd6221f059a9b3e660a05bf1153ba28d18453cf56a952773b6cee0c27187/grokcore.component-1.5.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "d8e2f335ca8ae974c1794f371bb3a840", "sha256": "bc13b04d0b1b384e5707c99e926a0ae0b5b93486a3f94b4b1d8c2d60775a4fe8" }, "downloads": -1, "filename": "grokcore.component-1.5.1.tar.gz", "has_sig": false, "md5_digest": "d8e2f335ca8ae974c1794f371bb3a840", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31670, "upload_time": "2008-07-28T22:08:43", "url": "https://files.pythonhosted.org/packages/60/69/bda7d7b4d7add01a96323550329f4ef28f1def9ee1bc6431caee258a4197/grokcore.component-1.5.1.tar.gz" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "a624bac308bf60666abcd8871ced1e47", "sha256": "9161ddee643c82118a966c788c6e36333e66eeb3671ba704dd5ad57c7a2d8a92" }, "downloads": -1, "filename": "grokcore.component-1.6.tar.gz", "has_sig": false, "md5_digest": "a624bac308bf60666abcd8871ced1e47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36596, "upload_time": "2009-04-10T22:01:20", "url": "https://files.pythonhosted.org/packages/cb/91/d9f86d8a137c86264e16c2042436d5510147b06c0409d76e5875f67ee535/grokcore.component-1.6.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "7f3f9abe4289cae2dce013a4f224a288", "sha256": "7efed461389b1d2197dff69215f94bbc82f68da09f740547e2d7e26b37b3d707" }, "downloads": -1, "filename": "grokcore.component-1.7.tar.gz", "has_sig": false, "md5_digest": "7f3f9abe4289cae2dce013a4f224a288", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36951, "upload_time": "2009-06-01T20:23:18", "url": "https://files.pythonhosted.org/packages/e2/12/6f33ef31bbec89b0025ae449498a35844b6b98f9235b7521cf808bc3e9ef/grokcore.component-1.7.tar.gz" } ], "1.8": [ { "comment_text": "", "digests": { "md5": "50bb8386fc151351635435ccae628119", "sha256": "eeed4d65ef5a30727ab54a23ea357551a2c8cf2d4dd6ebb3636a9e108aafeeb3" }, "downloads": -1, "filename": "grokcore.component-1.8.tar.gz", "has_sig": false, "md5_digest": "50bb8386fc151351635435ccae628119", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35713, "upload_time": "2009-12-13T20:33:42", "url": "https://files.pythonhosted.org/packages/b1/34/7c5597bc9a2adbf88b9b5e57c34a4f1a9ea270db25b1cd3a1b073870ebce/grokcore.component-1.8.tar.gz" } ], "1.9": [ { "comment_text": "", "digests": { "md5": "24b05b6b132787dbca18acd244c23ffb", "sha256": "d9dec715e98dda0883ae28a6b28e025154dfb59b0cdfce9be38515a50e7f7737" }, "downloads": -1, "filename": "grokcore.component-1.9.tar.gz", "has_sig": false, "md5_digest": "24b05b6b132787dbca18acd244c23ffb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34105, "upload_time": "2010-07-15T16:33:32", "url": "https://files.pythonhosted.org/packages/d3/bc/6fb0439430ffa39dc3bea1d5ffe16106d663015ce14408a8e733d421afcb/grokcore.component-1.9.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "e5dc37f727f1fb916f2cd666807eb203", "sha256": "8a6c670ab1d7651ddc3422a615b7d049281fc7a935c46a5b702c5db75037d9a0" }, "downloads": -1, "filename": "grokcore.component-2.0.tar.gz", "has_sig": false, "md5_digest": "e5dc37f727f1fb916f2cd666807eb203", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36602, "upload_time": "2009-09-16T11:38:34", "url": "https://files.pythonhosted.org/packages/6b/ed/5a66c82780176ee4b2301d34d237ab24aaeff7b20180049f206de0222ce6/grokcore.component-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "336ee3af3f7add466a733096e3847c46", "sha256": "d57d2751182e8e52800e7a389aa153c913510566b57b2f23cbe916302a86c64b" }, "downloads": -1, "filename": "grokcore.component-2.1.tar.gz", "has_sig": false, "md5_digest": "336ee3af3f7add466a733096e3847c46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38631, "upload_time": "2010-11-01T20:28:41", "url": "https://files.pythonhosted.org/packages/7d/5d/c2981b2709f0d330dec7df225c28d8cee5630eb752e403c9a5a363ceea6d/grokcore.component-2.1.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "1249205a95f6e88eafeacd81f414499c", "sha256": "0a4b050ba1a822f18536919256ee237e43a2adfd945c15c888e7b687795b87dd" }, "downloads": -1, "filename": "grokcore.component-2.2.tar.gz", "has_sig": false, "md5_digest": "1249205a95f6e88eafeacd81f414499c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38905, "upload_time": "2010-11-03T14:37:13", "url": "https://files.pythonhosted.org/packages/07/26/3b207360fa1ee148ba32e6b387160eb44c3236f812547d1b37a7f2267645/grokcore.component-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "7332251855d95f142a21e67fc0b045fc", "sha256": "4172911b005e0795541f0a2d7aa2c823dd897d6f0a4a9c891e76a8a55cf7c63f" }, "downloads": -1, "filename": "grokcore.component-2.3.tar.gz", "has_sig": false, "md5_digest": "7332251855d95f142a21e67fc0b045fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40862, "upload_time": "2011-02-14T11:32:55", "url": "https://files.pythonhosted.org/packages/69/19/b3244d4dfa013f37c5a02064b53b385966138261986a504cb8f8140414f3/grokcore.component-2.3.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "a7856824f3615097f6e40897451fb731", "sha256": "c773ab48285a02aa1e2bc88cb1e05bbfc40e5daa64cb8593e69dac541ce2193a" }, "downloads": -1, "filename": "grokcore.component-2.4.tar.gz", "has_sig": false, "md5_digest": "a7856824f3615097f6e40897451fb731", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41215, "upload_time": "2011-04-27T11:24:54", "url": "https://files.pythonhosted.org/packages/0c/5a/db58310460d9e6739d767f8c6e2126a6ed5568bde0c6fd71e74710385dfa/grokcore.component-2.4.tar.gz" } ], "2.5": [ { "comment_text": "", "digests": { "md5": "02980273b9c55e2b47b1454af7c7c764", "sha256": "c0d6e374b91293a9db0de26637dad98fd2c00ca77a46889fd0f4029a77e9896a" }, "downloads": -1, "filename": "grokcore.component-2.5.tar.gz", "has_sig": false, "md5_digest": "02980273b9c55e2b47b1454af7c7c764", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45327, "upload_time": "2012-05-01T19:10:44", "url": "https://files.pythonhosted.org/packages/7b/f8/54e23bdffc7d108149ee6b665dbfeffdc26a4d1567f878634efb28483747/grokcore.component-2.5.tar.gz" } ], "2.5.1": [ { "comment_text": "", "digests": { "md5": "b5a6d3c2c94fd7400f06d1506290237d", "sha256": "81394244d088e091d42f0a41870ad15d4c244ab34d0eb9a42c71bd1426628703" }, "downloads": -1, "filename": "grokcore.component-2.5.1.tar.gz", "has_sig": false, "md5_digest": "b5a6d3c2c94fd7400f06d1506290237d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44845, "upload_time": "2016-02-24T16:29:16", "url": "https://files.pythonhosted.org/packages/18/cf/47b76f195b82b2745aca69c5844b20283c542ec16cd91e43d57b9f9f87cf/grokcore.component-2.5.1.tar.gz" } ], "2.6": [ { "comment_text": "", "digests": { "md5": "bd63e2fc1c5fbc94d489b70b271a699f", "sha256": "9d61abcf89feb738173b3dc18a3c138e2e7ee6580538196ffb4bb8e7dddab6d7" }, "downloads": -1, "filename": "grokcore.component-2.6.tar.gz", "has_sig": false, "md5_digest": "bd63e2fc1c5fbc94d489b70b271a699f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39223, "upload_time": "2015-05-12T05:41:30", "url": "https://files.pythonhosted.org/packages/a3/39/b9c35989595310439b3720213707a8ff88424277c3e0d00a3291db6c5675/grokcore.component-2.6.tar.gz" } ], "2.6.1": [ { "comment_text": "", "digests": { "md5": "2f4bbacb92590726de756a8be14db6be", "sha256": "557406a304560fc0b8190ed026ee3d0f63651531c1747266293b0629b636b239" }, "downloads": -1, "filename": "grokcore.component-2.6.1.tar.gz", "has_sig": false, "md5_digest": "2f4bbacb92590726de756a8be14db6be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44629, "upload_time": "2016-01-29T12:43:21", "url": "https://files.pythonhosted.org/packages/36/3b/dd6eb504290fb52f272769077d39e85b3904b6f4d8f2f78f1814a0df3170/grokcore.component-2.6.1.tar.gz" } ], "2.7": [ { "comment_text": "", "digests": { "md5": "f61fafcab66909a0d33be5cf106fd0d8", "sha256": "d02c5f4a1f5d36df19e6e23532854bc4c0458c595540e95f2ef1fc1b40d05329" }, "downloads": -1, "filename": "grokcore.component-2.7.tar.gz", "has_sig": false, "md5_digest": "f61fafcab66909a0d33be5cf106fd0d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45938, "upload_time": "2016-02-16T08:41:50", "url": "https://files.pythonhosted.org/packages/52/b5/65496ed942e6cde7460e0bbdf904916b674acefbe455e0337e30b2a7107e/grokcore.component-2.7.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "d2ace0fd3e7a29e121434986bd236075", "sha256": "bec8c79354c6f1ad787aa01d267fc9387df414830f785bfdb06b8a07cef061e1" }, "downloads": -1, "filename": "grokcore.component-3.0.tar.gz", "has_sig": false, "md5_digest": "d2ace0fd3e7a29e121434986bd236075", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46891, "upload_time": "2017-10-19T06:09:29", "url": "https://files.pythonhosted.org/packages/ef/17/962aa20d014aadcc1b23a766d01db4f43a1148f80416db4cc815749b88bd/grokcore.component-3.0.tar.gz" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "69d9c8b9abd6b5157b665beaeccbb1a0", "sha256": "1a4a3be4ac3154147cc83955d25a6fb790d1355a59a5bff30cb29e5692c43af3" }, "downloads": -1, "filename": "grokcore.component-3.0.1.tar.gz", "has_sig": false, "md5_digest": "69d9c8b9abd6b5157b665beaeccbb1a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47169, "upload_time": "2018-01-12T12:55:55", "url": "https://files.pythonhosted.org/packages/f8/73/0f898a565a5bc6ae1d8da96472e1ed245c0fa7597f1835f0f5327cf31655/grokcore.component-3.0.1.tar.gz" } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "916146a8a6988f37bddebc7a6762554e", "sha256": "32b911ae836009752133456af2b7039fc17e2a09667104379b50cf8b37c5a647" }, "downloads": -1, "filename": "grokcore.component-3.0.2.tar.gz", "has_sig": false, "md5_digest": "916146a8a6988f37bddebc7a6762554e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47295, "upload_time": "2018-01-17T12:39:37", "url": "https://files.pythonhosted.org/packages/50/72/6227b69c2ffbfef7600a637b6ccb81cef91d990b3d1e4cb5897dcd0cd61b/grokcore.component-3.0.2.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "411871c5aef5ae036494a3c6692f753f", "sha256": "a98afee380d8ca437c06a41d1cd5ecedae45e959208bab95c6f812e0c8ceb909" }, "downloads": -1, "filename": "grokcore.component-3.1.tar.gz", "has_sig": false, "md5_digest": "411871c5aef5ae036494a3c6692f753f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51408, "upload_time": "2018-05-09T11:31:16", "url": "https://files.pythonhosted.org/packages/e2/69/4a6f18ec46e519cf2b090b402d94084ae9094e3bc9435fcbdb4afc6d0d6e/grokcore.component-3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "411871c5aef5ae036494a3c6692f753f", "sha256": "a98afee380d8ca437c06a41d1cd5ecedae45e959208bab95c6f812e0c8ceb909" }, "downloads": -1, "filename": "grokcore.component-3.1.tar.gz", "has_sig": false, "md5_digest": "411871c5aef5ae036494a3c6692f753f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51408, "upload_time": "2018-05-09T11:31:16", "url": "https://files.pythonhosted.org/packages/e2/69/4a6f18ec46e519cf2b090b402d94084ae9094e3bc9435fcbdb4afc6d0d6e/grokcore.component-3.1.tar.gz" } ] }