Skip to main content

A library implements the Mediator pattern to make your code extensible

Project description

A library implements the Mediator pattern to make your code extensible.

Inspired by symfony/event-dispatcher component.

https://img.shields.io/travis/Kilte/mediator.svg?style=flat-square

Installation

Using pip:

# pip install mediator

Manually:

$ git clone https://github.com/Kilte/mediator
$ cd mediator
# python setup.py install

Usage

from mediator import Mediator

m = Mediator()

Adding a listener

def event_listener(event):
    print('Got event: %r' % event)

m.add_listener('event_name', event_listener)

Triggering events

event = m.dispatch('event_name')
# Got event: <mediator.Event object at 0x7f954bc2b250>
print(event)
# <mediator.Event object at 0x7f954bc2b250>

Removing a listener

def another_listener(event):
    print('Got another event: %r' % event)

m.add_listener('event_name', another_listener)
m.remove_listener('event_name', event_listener)
m.dispatch('event_name')
# Got another event: <mediator.Event object at 0x7f954bbbd510>

Removing all listeners

m.remove_listener('event_name')
m.dispatch('event_name')
# Nothing was happened

Using priorities

m.add_listener('test_event', another_listener, -255)
m.add_listener('test_event', event_listener, 255)
m.dispatch('test_event')
# Got another event: <mediator.Event object at 0x7f954bbbd510>
# Got event: <mediator.Event object at 0x7f954bbbd510>

Defining custom events

from mediator import Event

def my_event_listener(event):
    event.params = 'params'


class MyEvent(Event):
    def __init__(self):
        super(MyEvent, self).__init__('my_event')
        self.params = None

event = MyEvent()
m.add_listener('my_event', my_event_listener)
m.dispatch(event)
print(event.params)
# params

Using Subscribers

from mediator import SubscriberInterface


class Subscriber(SubscriberInterface):
    def first(self, event):
        event.first = True

    def middle(self, event):
        event.middle = True

    def last(self, event):
        event.last = True

    def event2_handler(self, event):
        event.success = True

    def event3_handler(self, event):
        event.success = True

    def get_subscribed_events(self):
        return {
            'event1': [
                ['middle'],
                ['first', -100],
                ['last', 100]
            ],
            'event2': 'event2_handler',
            'event3': ['event3_handler']
        }

class Event1(Event):
     def __init__(self):
         super(Event1, self).__init__('event1')
         self.first = False
         self.middle = False
         self.last = False

class Event2(Event):
     def __init__(self):
         super(Event2, self).__init__('event2')
         self.success = True

class Event3(Event2):
    pass

subscriber = Subscriber()
event1 = Event1()
event2 = Event2()
event3 = Event3()

m.add_subscriber(subscriber)

m.dispatch(event1)
print('%s;%s;%s' % (event1.first, event1.middle, event1.last))
# True;True;True

m.dispatch(event2)
print(event2.success)
# True

m.dispatch(event3)
print(event3.success)
# True

Using a class name as event name

class EventWithoutName(Event):
     def __init__(self):
         super(Event1, self).__init__()
         self.attr = 'val'


 def on_event_without_name(event):
    event.attr = 'new-val'

 m.add_listener('EventWithoutName', on_event_without_name)
 m.dispatch(EventWithoutName())

Adding listeners using decorator

import sys


@EventWithoutName.listen(priority=255)  # Priority is optional
def another_event_without_name_listener(event):
    event.attr = 'another-val'

# Don't forget to call Mediator.scan(module)!
m.scan(sys.modules[__name__])
m.dispatch(EventWithoutName())

See source code and tests for more information.

Changelog

0.2.0 (17.12.2015)

  • Automatic event name detection based on a class name.

  • Added %Event%.listen decorator.

0.1.0 (19.11.2015)

  • First release.

Contributing

  • Fork and clone it

  • Create your feature branch (git checkout -b awesome-feature)

  • Make your changes

  • Write/update tests, if it’s necessary (make buildout && make tests)

  • Update README.md, if it’s necessary

  • Push your branch (git push origin awesome-feature)

  • Send a pull request

LICENSE

The MIT License (MIT)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mediator-0.2.0.tar.gz (4.2 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page