eventize
HomePage: http://www.python.org/pypi/eventize
Author: Grégory Salvan
Download: https://pypi.python.org/packages/source/e/eventize/eventize-0.3.tar.gz
******** Eventize ******** .. image:: https://pypip.in/v/eventize/badge.png :target: https://pypi.python.org/pypi/eventize Add events to object methods and attributes. Events are triggered at 3 levels in order: * Descriptor Class: for all Attribute or Method types (from version 0.3) * Descriptor Instance: for all classes that have an Attribute or a Method * Object instance: for the given object attribute value or method Methods support events "before" and "after" Attributes support events: "on_get", "on_set", "on_del" Events can be triggered conditionaly within arguments or user condition. Since version 0.3, observers defined at Descriptor Instance level are preserved in descriptor container class children, providing inheritance. see example 4 --------------------------------------------------------------------- **Table of Contents** .. contents:: :local: :depth: 1 :backlinks: none ============= Installation ============= Install it from pypi:: pip install eventize or from sources:: git clone git@github.com:apieum/eventize.git cd eventize python setup.py install ===== Usage ===== ----------------------------- Example 1 - observe a method: ----------------------------- As ObservedMethod class take a function as argument it can be used as a decorator. .. code-block:: python from eventize import ObservedMethod from eventize.events import Expect class Observed(object): def __init__(self): self.valid = False self.logs=[] @ObservedMethod def is_valid(self, *args, **kwargs): return self.valid def not_valid(self, event): event.subject.valid = not event.subject.valid class Logger(list): def log_before(self, event): self.append(self.message('before', *event.args, is_valid=event.subject.valid)) def log_after(self, event): self.append(self.message('after', *event.args, is_valid=event.subject.valid)) def message(self, event_name, *args, **kwargs): return "%s called with args: '%s', current:'%s'" % (event_name, args, kwargs['is_valid']) my_object = Observed() my_logs = Logger() called_with_permute = Expect.arg('permute') my_object.is_valid.before += my_logs.log_before my_object.is_valid.before.when(called_with_permute).do(my_object.not_valid) my_object.is_valid.after += my_logs.log_after assert my_object.is_valid() is False assert my_object.is_valid('permute') is True assert my_logs == [ my_logs.message('before', is_valid=False), my_logs.message('after', is_valid=False), my_logs.message('before', 'permute', is_valid=False), my_logs.message('after', 'permute', is_valid=True), ] --------------------------------- Example 2 - observe an attribute: --------------------------------- .. code-block:: python from eventize import ObservedAttribute class Validator(object): def __init__(self, is_valid=False): self.valid = is_valid class Observed(object): validator = ObservedAttribute(default=Validator(False)) class Logger(list): def log_get(self, event): self.append(self.message('on_get', event.name, event.value.valid)) def log_set(self, event): self.append(self.message('on_set', event.name, event.value.valid)) def log_del(self, event): self.append(self.message('on_del', event.name, event.value.valid)) def message(self, event_name, attr_name, value): return "'%s' called for attribute '%s', with value '%s'" % (event_name, attr_name, value) my_object = Observed() my_logs = Logger() # Note: order matter here ! my_object.validator.on_del += my_logs.log_del my_object.validator.on_set += my_logs.log_set my_object.validator.on_get += my_logs.log_get Observed.validator.on_set += my_logs.log_set Observed.validator.on_del += my_logs.log_del Observed.validator.on_get += my_logs.log_get assert my_object.validator.valid == False, 'Default value was not set' setattr(my_object, 'validator', Validator(True)) del my_object.validator assert my_logs == [ my_logs.message('on_get', 'v