{ "info": { "author": "Gr\u00e9gory Salvan", "author_email": "apieum@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Other Environment", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "********\r\nEventize\r\n********\r\n\r\n.. image:: https://pypip.in/v/eventize/badge.png\r\n :target: https://pypi.python.org/pypi/eventize\r\n\r\n\r\nListen methods \"before\" and \"after\" events and attributes \"on_get\", \"on_change\", \"on_set\", \"on_del\" events.\r\n\r\nFeatures:\r\n * Easy to use subject/observer pattern\r\n * Conditionnal events within arguments, values, types... or user defined functions.\r\n * Attributes support events: \"on_get\", \"on_change\",\"on_set\", \"on_del\"\r\n * Methods support events \"before\" and \"after\"\r\n * Precise callbacks inheritance (see Subject)\r\n * Statically and dynamically customizable (via inheritance, visitors, decorators...)\r\n\r\nCan listen for events at 3 levels (by order of execution):\r\n * Descriptor Class: for all Attribute or Method types\r\n * Descriptor Instance: for all classes that have an Attribute or a Method\r\n * Object instance: for the given object attribute value or method\r\n\r\n\r\n---------------------------------------------------------------------\r\n\r\n**Table of Contents**\r\n\r\n\r\n.. contents::\r\n :local:\r\n :depth: 1\r\n :backlinks: none\r\n\r\n\r\n=============\r\nInstallation\r\n=============\r\n\r\nInstall it from pypi::\r\n\r\n pip install eventize\r\n\r\nor from sources::\r\n\r\n git clone git@github.com:apieum/eventize.git\r\n cd eventize\r\n python setup.py install\r\n\r\n=====\r\nUsage\r\n=====\r\n\r\n-------------------------------------------------\r\nExample 0 - as a simple subject/observer pattern:\r\n-------------------------------------------------\r\n**events.Handler is the base class of all eventize handlers (\"on_get\", \"before\"...)**\r\n\r\nIt is a simple callable list of functions wich receive the argument (of type *events.Event*) you've passed when calling your *Handler* object.\r\n\r\n\r\nAs a list an *Handler* support common methods *\"append\"*, *\"remove\"*, *\"prepend\"*, *\"insert\"*, *\"extend\"*, *\"empty\"*..., *\"__setitem__\"*, plus some syntactic sugar like *\"__iadd__\"* (+=) for append and *\"__isub__\"* (-=) for remove.\r\n\r\nYou can stop event propagation by raising an *events.StopPropagation* exception which store exception message in *\"Event.messages\"* by default.\r\n\r\nYou can hook event propagation by overriding methods *\"before_propagation\"* and *\"after_propagation\"* or dynamically change *Handler* behaviour at creation by passing visitors (object with a method *\"visit\"*) see *events.EventType* visitor for example.\r\n\r\nAn handler can build its proper events of the class defined in *Handler.event_type* when calling *Handler.make_event* (just create and returns an event instanciated with given arguments) or *Handler.notify* (create event with *make_event* and propagates it)\r\n\r\nYou can add conditional handlers by using method *\"when\"* or restrict the current handler execution by passing *\"condition\"* kwarg argument to constructor.\r\nConditions can be chained with methods *\"do\"* or *\"then\"* (aliases of *\"append\"*)\r\nYou can dig *eventize-expect* to have a convenient wrapper to create conditions.\r\nIt adds *\"eventize.events.Expect\"* class (like eventize before 0.4.3) thanks to setuptools entry points.\r\n\r\nEach time you trigger an event, it is stored in *Handler.events*. You can empty past events by calling *\"clear_events\"* or all (events and callbacks) with *\"clear\"*.\r\n\r\n.. code-block:: python\r\n\r\n from eventize.events import Handler\r\n def is_string(event):\r\n return isinstance(event.content, str)\r\n\r\n def titlecase(event):\r\n event.content = event.content.title()\r\n\r\n class WeirdVisitor(object):\r\n def visit(self, handler):\r\n handler.prepend([self.save_default])\r\n\r\n def save_default(self, event):\r\n self.default = event.content\r\n\r\n my_visitor = WeirdVisitor()\r\n handler = Handler(titlecase, my_visitor, condition=is_string)\r\n\r\n # An Handler is a callable list\r\n assert isinstance(handler, list)\r\n assert callable(handler)\r\n\r\n # handler contains 2 callbacks:\r\n assert len(handler) == 2\r\n assert titlecase in handler\r\n assert my_visitor.save_default in handler\r\n # it remove titlecase\r\n handler -= titlecase\r\n assert titlecase not in handler\r\n # it adds titlecase\r\n handler += titlecase\r\n\r\n\r\n # Create event with attribute content and trigger it\r\n event1 = handler.notify(content=\"a string\")\r\n\r\n assert my_visitor.default == \"a string\"\r\n assert event1.content == \"A String\"\r\n\r\n # if event.content is not a string propagation is stopped\r\n # these 2 lines are sames as notify\r\n event2 = handler.make_event(content=1234)\r\n handler(event2)\r\n\r\n assert len(handler.events) == 2\r\n assert handler.events == (event1, event2) # it's a tuple since 0.4.1\r\n expected_message = \"Condition '%s' for event 'Event' return False\" % id(is_string)\r\n assert event2.messages[0] == expected_message\r\n\r\n # we remove all past events:\r\n handler.clear_events()\r\n assert len(handler.events) == 0\r\n\r\n # we remove all callbacks and events:\r\n handler.clear()\r\n assert len(handler) == 0\r\n\r\n is_a_name = lambda event: event.content == \"a name\"\r\n # create a new subhandler with a condition:\r\n handler.when(is_a_name).do(my_visitor.save_default).then(titlecase)\r\n event1 = handler.notify(content=\"a name\")\r\n event2 = handler.notify(content=\"a string\")\r\n # only \"a name\" is titlecased\r\n assert event1.content == \"A Name\"\r\n assert event2.content == \"a string\"\r\n\r\n # save_default is called only for event1:\r\n assert my_visitor.default == \"a name\"\r\n\r\n\r\n\r\n-----------------------------\r\nExample 1 - observe a method:\r\n-----------------------------\r\nTo observe a method, you can:\r\n - declare your method at class level with *\"Method\"* and a function as first argument\r\n - decorate a method with *\"Method\"*\r\n - use functions *\"handle\"*, *\"before\"* or *\"after\"* on class or object callable attribute with type of event in the optionalthird argument (recommended)\r\n\r\nMethod events objects are of type BeforeEvent and AfterEvent.\r\n\r\nThey have 4 main attributes:\r\n - *\"subject\"*: the object instance where event happens\r\n - *\"name\"*: the attribute name of object instance\r\n - *\"args\"*: the list of passed args\r\n - *\"kwargs\"*: the dict of named args\r\n\r\n\r\n.. code-block:: python\r\n\r\n\r\n from eventize import before, after\r\n from eventize.method import BeforeEvent, AfterEvent\r\n\r\n\r\n class Observed(object):\r\n def __init__(self):\r\n self.valid = False\r\n\r\n def is_valid(self, *args):\r\n return self.valid\r\n\r\n def not_valid(self, event):\r\n assert event.name == \"is_valid\" # (event subject name)\r\n assert event.subject == self\r\n self.valid = not self.valid\r\n\r\n class Logger(list):\r\n def log_before(self, event):\r\n assert type(event) is BeforeEvent\r\n self.append(self.message('before %s' % event.name, *event.args, is_valid=event.subject.valid))\r\n\r\n def log_after(self, event):\r\n assert type(event) is AfterEvent\r\n self.append(self.message('after %s' % event.name, *event.args, is_valid=event.subject.valid))\r\n\r\n def message(self, event_name, *args, **kwargs):\r\n return \"%s called with args: '%s', current:'%s'\" % (event_name, args, kwargs['is_valid'])\r\n\r\n\r\n\r\n args_have_permute = lambda event: 'permute' in event.args\r\n\r\n my_object = Observed()\r\n my_logs = Logger()\r\n\r\n before_is_valid = before(my_object, 'is_valid')\r\n before_is_valid += my_logs.log_before\r\n before_is_valid.when(args_have_permute).do(my_object.not_valid)\r\n after(my_object, 'is_valid').do(my_logs.log_after)\r\n\r\n assert my_object.is_valid() is False\r\n assert my_object.is_valid('permute') is True\r\n\r\n assert my_logs == [\r\n my_logs.message('before is_valid', is_valid=False),\r\n my_logs.message('after is_valid', is_valid=False),\r\n my_logs.message('before is_valid', 'permute', is_valid=False),\r\n my_logs.message('after is_valid', 'permute', is_valid=True),\r\n ]\r\n\r\n\r\n\r\n---------------------------------\r\nExample 2 - observe an attribute:\r\n---------------------------------\r\n*\"Attribute\"* is like *\"Method\"*, to observe it you can:\r\n - declare your attribute at class level with *\"Attribute\"* and an optionnal default value as first argument\r\n - decorate an existing attribute with *\"Attribute\"*\r\n - use functions *\"handle\"*, *\"on_get\"*, *\"on_change\"*, *\"on_set\"*, *\"on_del\"* on class or object attribute with te type of event on the third argument (recommended)\r\n\r\n\r\nAttribute events objects are of type OnGetEvent, OnChangeEvent, OnSetEvent, OnDelEvent.\r\n\r\nThey have 3 main attributes:\r\n - *\"subject\"*: the object instance where event happens\r\n - *\"name\"*: the attribute name of object instance\r\n - *\"value\"*: the attribute value if set\r\n\r\nIn addition each kwarg is added to event as an attribute. (like \"content\" in ex 0)\r\n\r\n\r\n.. code-block:: python\r\n\r\n from eventize import handle, on_get, Attribute\r\n from eventize.attribute import OnGetEvent, OnGetHandler\r\n\r\n\r\n class Validator(object):\r\n def __init__(self, is_valid):\r\n self.valid = is_valid\r\n def __call__(self):\r\n return self.valid\r\n\r\n class Observed(object):\r\n validate = Validator(False)\r\n\r\n class Logger(list):\r\n def log_get(self, event):\r\n assert type(event) is OnGetEvent, \"Get event of type %s\" % type(event)\r\n self.append(self.message('on_get', event.name, event.value()))\r\n def log_change(self, event):\r\n self.append(self.message('on_change', event.name, event.value()))\r\n def log_set(self, event):\r\n self.append(self.message('on_set', event.name, event.value()))\r\n def log_del(self, event):\r\n self.append(self.message('on_del', event.name, event.value()))\r\n\r\n def message(self, event_name, attr_name, value):\r\n return \"'%s' called for attribute '%s', with value '%s'\" % (event_name, attr_name, value)\r\n\r\n my_object = Observed()\r\n my_logs = Logger()\r\n my_object_validate = handle(my_object, 'validate')\r\n my_object_validate.on_get += my_logs.log_get\r\n my_object_validate.on_change += my_logs.log_change\r\n my_object_validate.on_set += my_logs.log_set\r\n my_object_validate.on_del += my_logs.log_del\r\n\r\n Observed_validate = handle(Observed, 'validate')\r\n Observed_validate.on_get += my_logs.log_get\r\n Observed_validate.on_change += my_logs.log_change\r\n Observed_validate.on_set += my_logs.log_set\r\n Observed_validate.on_del += my_logs.log_del\r\n\r\n # same result with my_object.validate\r\n is_valid = getattr(my_object, 'validate')\r\n # check if default value is False as defined in class\r\n assert is_valid() == False, '[error] Default value was not set'\r\n # same result with my_object.validate = Validator(True)\r\n setattr(my_object, 'validate', Validator(True))\r\n # same result with del my_object.validate\r\n delattr(my_object, 'validate')\r\n\r\n assert my_logs == [\r\n my_logs.message('on_get', 'validate', False), # Called at class level\r\n my_logs.message('on_get', 'validate', False), # Called at instance level\r\n my_logs.message('on_set', 'validate', True), # Called at class level\r\n my_logs.message('on_set', 'validate', True), # Called at instance level\r\n my_logs.message('on_change', 'validate', True), # Called at class level\r\n my_logs.message('on_change', 'validate', True), # Called at instance level\r\n my_logs.message('on_del', 'validate', True), # Called at class level\r\n my_logs.message('on_del', 'validate', True), # Called at instance level\r\n ]\r\n\r\n # You can use your own events types\r\n class OnGetCall(OnGetEvent):\r\n def returns(self):\r\n return self.value()\r\n\r\n # and override Attribute or Method types\r\n class CallAttr(Attribute):\r\n # must be redefined otherwise callbacks are appended to class Attribute\r\n # see example 3 for callbacks inheritance\r\n on_get = OnGetHandler()\r\n\r\n\r\n my_object = Observed()\r\n # third argument permits to set new type of attribute\r\n on_get_validate = on_get(my_object, 'validate', CallAttr)\r\n # set event type\r\n on_get_validate.event_type = OnGetCall\r\n\r\n assert isinstance(Observed.validate, CallAttr)\r\n\r\n # OnGetCall Event returns my_object.validate()\r\n assert my_object.validate is False\r\n assert len(on_get_validate) == 0, \"Expect my_object.validate.on_get has no callbacks\"\r\n\r\n\r\n def set_to_true(event):\r\n assert type(event) == OnGetCall\r\n event.value = Validator(True)\r\n\r\n # All objects with CallAttr attribute will call set_to_true\r\n CallAttr.on_get += set_to_true\r\n\r\n # set_to_true change value and check event is of type OnGetCall\r\n assert my_object.validate is True\r\n\r\n # remove all callbacks and events at descriptor, class and instance level\r\n handle(my_object, 'validate').clear_all()\r\n\r\n assert len(CallAttr.on_get) == 0\r\n\r\n\r\n\r\n\r\n----------------------------------\r\nExample 3 - Observers inheritance:\r\n----------------------------------\r\nDescriptors in python don't know their owner until a getter is called.\r\nYet, as they help to define classes, it could be interesting to bind them to their class at class creation.\r\n\r\nIt's the aim of Subject decorator. A Subject is a class that contains descriptors handlers (on_get, before...)\r\n\r\nSubject makes 2 things:\r\n * it makes children handlers inheriting their parent handlers observers (parent handlers are found by their attribute name).\r\n * it calls method handler.bind (if exists) with the owner class as an argument while class is declared.\r\n\r\nYou can create your own subjects with *\"events.Subject([descriptor_type1, [...]])\"*.\r\n\r\n\r\n.. code-block:: python\r\n\r\n from eventize import Attribute\r\n from eventize.attribute import Subject, OnSetHandler\r\n\r\n def validate_string(event):\r\n if isinstance(event.value, type('')): return\r\n\r\n message = \"%s.%s must be a string!\" % (type(event.subject).__name__, event.name)\r\n raise TypeError(message)\r\n\r\n def titlecase(event):\r\n event.value = event.value.title()\r\n\r\n class StringAttribute(Attribute):\r\n on_set = OnSetHandler(validate_string)\r\n\r\n # Subject == events.Subject(OnGetHandler, OnSetHandler, OnChangeDescriptor, OnDelDescriptor)\r\n @Subject # Bind handlers to the class\r\n class Name(StringAttribute):\r\n on_set = OnSetHandler(titlecase)\r\n\r\n class Person(object):\r\n name = Name('john doe')\r\n\r\n john = Person()\r\n\r\n validation_fails = False\r\n try:\r\n john.name = 0x007\r\n except TypeError:\r\n validation_fails = True\r\n\r\n assert validation_fails, \"Validation should fail\"\r\n assert john.name == 'John Doe' # Name is set in title case\r\n\r\n\r\n===========\r\nDevelopment\r\n===========\r\n\r\nYour feedback, code review, improvements or bugs, and help to document is appreciated.\r\nYou can contact me by mail: apieum [at] gmail [dot] com\r\n\r\nTest recommended requirements::\r\n\r\n pip install -r dev-requirements.txt\r\n\r\nSometimes --spec-color doesn't function. Uninstall nosespec and nosecolor then reinstall nosecolor and nosespec separatly in this order (nosecolor first).\r\n\r\nLaunch tests::\r\n\r\n git clone git@github.com:apieum/eventize.git\r\n cd eventize\r\n nosetests --with-spec --spec-color ./eventize\r\n # or with watch\r\n # nosetests --with-spec --spec-color --with-watch ./eventize\r\n\r\n\r\n\r\n.. image:: https://secure.travis-ci.org/apieum/eventize.png?branch=master\r\n :target: https://travis-ci.org/apieum/eventize", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://eventize.readthedocs.org", "keywords": "", "license": "LGPL", "maintainer": "", "maintainer_email": "", "name": "eventize", "package_url": "https://pypi.org/project/eventize/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/eventize/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://eventize.readthedocs.org" }, "release_url": "https://pypi.org/project/eventize/0.4.3/", "requires_dist": null, "requires_python": null, "summary": "Add events to object methods and attributes", "version": "0.4.3" }, "last_serial": 1325593, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "eba53647f6a64885483ace754b822109", "sha256": "e3bcd3b683b8ff6ccb0f11a73037df7debba50c497ca9eed96ba1c85a45d1e0f" }, "downloads": -1, "filename": "eventize-0.1-py2.7.egg", "has_sig": false, "md5_digest": "eba53647f6a64885483ace754b822109", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 7980, "upload_time": "2013-10-07T18:20:47", "url": "https://files.pythonhosted.org/packages/2c/29/dfef82d4a15729c761ae6ac72d8e7ad0ac110d5d3dc722158ca454254278/eventize-0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "9e52fc55d59d55735166144678584a1e", "sha256": "d6eace49672b3c4c0b375753cbd062a8b002a411eb2b74d8e6e1b663ea8cd235" }, "downloads": -1, "filename": "eventize-0.1.tar.gz", "has_sig": false, "md5_digest": "9e52fc55d59d55735166144678584a1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3804, "upload_time": "2013-10-07T18:20:43", "url": "https://files.pythonhosted.org/packages/db/ac/312caba295ed3ffdd3447e212e169576f251bb027234955fbf64a894518a/eventize-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "7b72fbd52954507b0eb669a07b7fb817", "sha256": "5b16fba991b511547f3db3ea66dfde9e48ff416dbee3ab993e60351a062bc5ca" }, "downloads": -1, "filename": "eventize-0.1.1-py2.7.egg", "has_sig": false, "md5_digest": "7b72fbd52954507b0eb669a07b7fb817", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 8141, "upload_time": "2013-10-07T23:20:39", "url": "https://files.pythonhosted.org/packages/1d/2e/d441d3d72813a39c243e4f8f057aed1be39c10f7551ffbe7d8f8b7db63a2/eventize-0.1.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "d2234d49b44d4f738fccd20680c0d707", "sha256": "c0b633d2e417dc2eae74f82aad176cf739c70900234477137ca5626be54db2ec" }, "downloads": -1, "filename": "eventize-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d2234d49b44d4f738fccd20680c0d707", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3855, "upload_time": "2013-10-07T23:20:36", "url": "https://files.pythonhosted.org/packages/82/9f/25cd28f8f5a9df7e2b6003e500bd0548d0a4168ac355b0a92c146fea072b/eventize-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "5e0e42631d72967a13bcf477e6442cbb", "sha256": "897c816335ec511b1a78a2bc6d9e611c78d6a4b1ee930e46d8184729e74c05af" }, "downloads": -1, "filename": "eventize-0.1.2-py2.7.egg", "has_sig": false, "md5_digest": "5e0e42631d72967a13bcf477e6442cbb", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 9105, "upload_time": "2013-10-09T05:55:04", "url": "https://files.pythonhosted.org/packages/8a/0b/9ece8ae004a3a80dde6b32f8c8be414a4ad1816401773b80700a7a87731b/eventize-0.1.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "44871ee366e48b447cf3142045df4fd1", "sha256": "a6bb0e115097eb0e9ca3bd3b299c6d5a3a2fa3888784cd7c5e63f547cae0edd4" }, "downloads": -1, "filename": "eventize-0.1.2.tar.gz", "has_sig": false, "md5_digest": "44871ee366e48b447cf3142045df4fd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4753, "upload_time": "2013-10-09T05:55:02", "url": "https://files.pythonhosted.org/packages/a8/7b/fedf67089ae9f354ffc8d46c9b37e699d270b0fb16788eccf5b372f3259c/eventize-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "837a34bc50ec4294b7b1eabbe3f8023b", "sha256": "fa45e0727c260953858a393ae0368ff87d34b8c76b829e3d7cc328fe53832182" }, "downloads": -1, "filename": "eventize-0.1.3-py2.7.egg", "has_sig": false, "md5_digest": "837a34bc50ec4294b7b1eabbe3f8023b", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 9115, "upload_time": "2013-10-09T06:07:04", "url": "https://files.pythonhosted.org/packages/12/0f/77782ac624c826abc16d4c2b719f98eba383cf9c04a4b4353af29048b956/eventize-0.1.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "723d4867dca10902f519a28dea745e44", "sha256": "baf0d8257670e01ced3421f7b1f95f84750b4584f91395dcedd92a53baa4bcec" }, "downloads": -1, "filename": "eventize-0.1.3.tar.gz", "has_sig": false, "md5_digest": "723d4867dca10902f519a28dea745e44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4763, "upload_time": "2013-10-09T06:07:01", "url": "https://files.pythonhosted.org/packages/6e/40/61bbd5d2c900ad605c996828f45c7298d986eef9ab135e3724ff8f0b3d63/eventize-0.1.3.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "299e54878381b205db748c59b7ec7411", "sha256": "6b83bab82a7e32d3f5dcfa1f4e6e95cc100b4e1c39efbc1be4da6e5e2757d760" }, "downloads": -1, "filename": "eventize-0.2-py2.7.egg", "has_sig": false, "md5_digest": "299e54878381b205db748c59b7ec7411", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 37532, "upload_time": "2013-10-12T05:39:17", "url": "https://files.pythonhosted.org/packages/75/c1/08833abcae0a83a10547a6c85e459b2aa0829595fdca89e43803ec065592/eventize-0.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "3b7e6426f17ed0bbce9af7e2adf52d75", "sha256": "ba8e4dd5fab5fcc838eeabcd954fa91238db0bea34c4782b0ea3833309fb5236" }, "downloads": -1, "filename": "eventize-0.2-py3.3.egg", "has_sig": false, "md5_digest": "3b7e6426f17ed0bbce9af7e2adf52d75", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 40499, "upload_time": "2013-10-12T05:39:27", "url": "https://files.pythonhosted.org/packages/0b/10/685b6de2ab19660dd6a5efec362d30882e19a29dfb78b8bb50862904bcaf/eventize-0.2-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "64ec0aeb8ffee496d3d41a66b8bbc9ad", "sha256": "8c8761b738cc67e7d899388cc56262347849fda62a52bb9755cff82cda99c223" }, "downloads": -1, "filename": "eventize-0.2.tar.gz", "has_sig": false, "md5_digest": "64ec0aeb8ffee496d3d41a66b8bbc9ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13905, "upload_time": "2013-10-12T05:39:13", "url": "https://files.pythonhosted.org/packages/0b/59/ca554568d96cab7e16ef210d1cc7ee2345d1c72543d009a195fcf578cc9e/eventize-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "2ae0e7996f1d49cbc854773dfa20033a", "sha256": "c9fdbf23aaed62530565a5c2b3b159f802ebdbd4b7d55a8326d75f40558b360b" }, "downloads": -1, "filename": "eventize-0.2.1-py2.7.egg", "has_sig": false, "md5_digest": "2ae0e7996f1d49cbc854773dfa20033a", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 37707, "upload_time": "2013-10-13T05:13:15", "url": "https://files.pythonhosted.org/packages/86/f6/0184cba1a4e488078c508a2f961b47a7841adff69887a6b301ac4e28b965/eventize-0.2.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "abcd503de2d1ee40b7a0eb79ec10cf31", "sha256": "821d8a8cfd7ca4cb3e13a8f268660762b007792caec1a0d5e33461a38ddf5f70" }, "downloads": -1, "filename": "eventize-0.2.1-py3.3.egg", "has_sig": false, "md5_digest": "abcd503de2d1ee40b7a0eb79ec10cf31", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 40668, "upload_time": "2013-10-13T05:13:24", "url": "https://files.pythonhosted.org/packages/5c/d7/03d50a4c7174988d647c9f2f2c387e7cd7cfe3508d5613922efa3c082ab7/eventize-0.2.1-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "44327a0d83efcd2d8b0375ad0c56db10", "sha256": "c051546cab1a4128b9eb77899f55bd54bc44c373254651d1fd690a97b2efe898" }, "downloads": -1, "filename": "eventize-0.2.1.tar.gz", "has_sig": false, "md5_digest": "44327a0d83efcd2d8b0375ad0c56db10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14152, "upload_time": "2013-10-13T05:13:12", "url": "https://files.pythonhosted.org/packages/54/e1/69cc1f1e464cbab543ba63ec1cfb571fef04684274d7e57e0c8babb9e24b/eventize-0.2.1.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "9dae0da2a1d16a0b46a487f18013d2f7", "sha256": "67efa87eff1ccbf1fbf8bbd15cd787964f5ba6d16702c51ebc6b864cda5148f4" }, "downloads": -1, "filename": "eventize-0.3-py2.7.egg", "has_sig": false, "md5_digest": "9dae0da2a1d16a0b46a487f18013d2f7", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 67211, "upload_time": "2013-11-09T07:50:45", "url": "https://files.pythonhosted.org/packages/57/ad/3ad81aae914a964f4e60474487ab1ba0659f43b8740e282bba3f119a4c98/eventize-0.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "bbfe60bad592efa70cb2b8be515861bf", "sha256": "6eb0b8dd6208f1873de644a6014f18c8930da76f0fa6d127711c16be4548dcce" }, "downloads": -1, "filename": "eventize-0.3-py3.3.egg", "has_sig": false, "md5_digest": "bbfe60bad592efa70cb2b8be515861bf", "packagetype": "bdist_egg", "python_version": "3.3", "requires_python": null, "size": 72839, "upload_time": "2013-11-09T07:50:24", "url": "https://files.pythonhosted.org/packages/c7/33/f5df058db85dc4a78506bc95201ae3c86e4f57cac72223a4bd724b3f0c21/eventize-0.3-py3.3.egg" }, { "comment_text": "", "digests": { "md5": "6c086fdcefc4ddcd700bf1f96d5450ce", "sha256": "1b332d98c89b487ac0fe34a85c810f553810a74312b350192d11bc8eacd7cf69" }, "downloads": -1, "filename": "eventize-0.3.tar.gz", "has_sig": false, "md5_digest": "6c086fdcefc4ddcd700bf1f96d5450ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16735, "upload_time": "2013-11-09T07:50:42", "url": "https://files.pythonhosted.org/packages/b0/77/9cea4184d03c71764127b951a79bdb437ca286162705469b021a74a78602/eventize-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "7c3ef65f040b5927ec280dc4e434c84a", "sha256": "dbfa1491f3d9dcc376e9c4889f4f31738d51a63d226c1d3bc28f0d7aab3cbe20" }, "downloads": -1, "filename": "eventize-0.3.1.tar.gz", "has_sig": false, "md5_digest": "7c3ef65f040b5927ec280dc4e434c84a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17791, "upload_time": "2014-05-18T06:44:40", "url": "https://files.pythonhosted.org/packages/e6/12/eb3e185e4da16e1f86112d076a0a7053beed53d1577d7288a9b54f746d9b/eventize-0.3.1.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "99521a92ec7a18ac1d721b0116b15b1f", "sha256": "eab36fd31a9f165d70c12a887bc88cd897f12ee35903a8297e19ac961a7fde5e" }, "downloads": -1, "filename": "eventize-0.4.tar.gz", "has_sig": false, "md5_digest": "99521a92ec7a18ac1d721b0116b15b1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24460, "upload_time": "2014-05-25T03:13:04", "url": "https://files.pythonhosted.org/packages/55/24/7b5a9883bc2c3220220d63b0d7ce30db459d1b4d081b7b4f54f90349a702/eventize-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "ac8b99536eb9c28d2d16377b5ef55021", "sha256": "2d7eda3ae708412e58262cd15087d1ce6828871062d0ecb01d54b59a5858448e" }, "downloads": -1, "filename": "eventize-0.4.1.tar.gz", "has_sig": false, "md5_digest": "ac8b99536eb9c28d2d16377b5ef55021", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24844, "upload_time": "2014-05-28T12:10:36", "url": "https://files.pythonhosted.org/packages/f9/a7/2b6d0c99461d26f50f6da73317b84c1c1d7ff1e73005c8f7bddb7535f098/eventize-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "b28d3b8be987e6ae3205da5f8c5f4cec", "sha256": "785ae2e824c65769199c6763c0f65707abeb0bc1271a8b47e6bec5f4df741289" }, "downloads": -1, "filename": "eventize-0.4.2.tar.gz", "has_sig": false, "md5_digest": "b28d3b8be987e6ae3205da5f8c5f4cec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24796, "upload_time": "2014-05-28T13:39:54", "url": "https://files.pythonhosted.org/packages/68/ef/2190f536331030a51184fe3d6ea44a111d9a2fcd1b0b27ba5deb192d364a/eventize-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "ad3d20421ac14a936361828bb5e8671e", "sha256": "b9a3bd70fb14117088b77de320c0f1c208edf548a6d6471f28decfea205cca74" }, "downloads": -1, "filename": "eventize-0.4.3.tar.gz", "has_sig": false, "md5_digest": "ad3d20421ac14a936361828bb5e8671e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23512, "upload_time": "2014-06-10T18:19:04", "url": "https://files.pythonhosted.org/packages/d2/12/633210d6747b33fe71dfff695884ffda5fff1c5dc7d36251c9362f9a61eb/eventize-0.4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ad3d20421ac14a936361828bb5e8671e", "sha256": "b9a3bd70fb14117088b77de320c0f1c208edf548a6d6471f28decfea205cca74" }, "downloads": -1, "filename": "eventize-0.4.3.tar.gz", "has_sig": false, "md5_digest": "ad3d20421ac14a936361828bb5e8671e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23512, "upload_time": "2014-06-10T18:19:04", "url": "https://files.pythonhosted.org/packages/d2/12/633210d6747b33fe71dfff695884ffda5fff1c5dc7d36251c9362f9a61eb/eventize-0.4.3.tar.gz" } ] }