All Projects → timofurrer → Observable

timofurrer / Observable

Licence: mit
minimalist event system for Python

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Observable

Ease
It's magic.
Stars: ✭ 1,213 (+1737.88%)
Mutual labels:  events, observer
ng2-events
Supercharge your Angular2+ event handling
Stars: ✭ 17 (-74.24%)
Mutual labels:  events, event-handlers
Simple Dash
A simple, fully responsive Dashboard to forward to the services of your choice!
Stars: ✭ 222 (+236.36%)
Mutual labels:  simple, minimalist
Hugo Theme Console
A minimal, responsive and light theme for Hugo inspired by Linux console.
Stars: ✭ 143 (+116.67%)
Mutual labels:  simple, minimalist
go-observer
Go package for simplifying channel-based broadcasting of events from multiple publishers to multiple observers
Stars: ✭ 66 (+0%)
Mutual labels:  events, observer
EventEmitter
Simple EventEmitter with multiple listeners
Stars: ✭ 19 (-71.21%)
Mutual labels:  events, observer
laravel-attribute-observer
Observe (and react to) attribute changes made on Eloquent models.
Stars: ✭ 59 (-10.61%)
Mutual labels:  events, observer
untheme
A blank WordPress theme for developers.
Stars: ✭ 82 (+24.24%)
Mutual labels:  simple, minimalist
zola-sam
🌐 A Simple and Minimalist theme with a focus on typography and content.
Stars: ✭ 32 (-51.52%)
Mutual labels:  simple, minimalist
game-map-editor
game-map-editor
Stars: ✭ 17 (-74.24%)
Mutual labels:  events, simple
CleanUI
Android library to create beautiful, clean and minimal UIs.
Stars: ✭ 19 (-71.21%)
Mutual labels:  simple, minimalist
burns
Manage your application's events without writing spaghetti code
Stars: ✭ 86 (+30.3%)
Mutual labels:  events, event-handlers
Simpleparallax.js
Simple and tiny JavaScript library that adds parallax animations on any images
Stars: ✭ 1,075 (+1528.79%)
Mutual labels:  simple
Md Page
📝 create a webpage with just markdown
Stars: ✭ 1,096 (+1560.61%)
Mutual labels:  simple
Ls.joyous
A calendar application for Wagtail
Stars: ✭ 53 (-19.7%)
Mutual labels:  events
Slop
Simple Lightweight Option Parsing - ✨ new contributors welcome ✨
Stars: ✭ 1,067 (+1516.67%)
Mutual labels:  simple
Robin
Robin is a logging library for Bundle data passed between Activities and fragments. It also provides a callback to send screen views of user visited pages to your analytics client
Stars: ✭ 63 (-4.55%)
Mutual labels:  events
It
A Simple Track To Make Sense
Stars: ✭ 55 (-16.67%)
Mutual labels:  simple
Forcal
📅 Das AddOn ist ein variabel einsetzbarer Kalender(-Generator), Skedule, Newssystem, Event- und Terminplaner für REDAXO 5.x.
Stars: ✭ 52 (-21.21%)
Mutual labels:  events
Dropin Minimal Css
Drop-in switcher for previewing minimal CSS frameworks
Stars: ✭ 1,061 (+1507.58%)
Mutual labels:  minimalist

observable

Build Status Code style: black

pyobservable is a minimalist event system for python. It provides you an easy-to-use interface to trigger arbitrary functions when specific events occur.

from observable import Observable

obs = Observable()

@obs.on("error")
def error_handler(message):
    # do some fancy error handling
    logging.error(f"An error occured: {message}")

...

def do_time_travel():
    # do some time traveling
    ...
    if year != 1291:
        obs.trigger("error", "Time travel to 1291 didn't work")

An ObservableProperty type is included as well, which makes observing object properties a breeze.

Note: We are Python 3 only! Only Python Versions >= 3.5 are supported. Use v0.3.2 for older Python Versions.

How to use

Use a pip to install it from PyPI:

pip install observable

After completion you can start using observable:

from observable import Observable

obs = Observable()

Usage of observable.Observable

on: Register event handler with on

There are two ways to register a function to an event.
The first way is to register the event with a decorator like this:

@obs.on("error")
def error_func(message):
    print("Error: %s" % message)

The second way is to register it with a method call:

def error_func(message):
    print("Error: %s" % message)
obs.on("error", error_func)

once: Register event handler with once

once works like on, but once the event handler is triggered it will be removed and cannot be triggered again.

trigger: trigger event

You can trigger a registered event with the trigger method:

obs.trigger("error", "This is my error message")

If no handler for the event error could be found an Observable.NoHandlerFound-Exception will be raised.

off: remove handler and events

Remove a handler from a specified event:

obs.off("error", error_func)
obs.off("error", [error_func, second_error_func])

Remove all handlers from a specified event:

obs.off("error")

Clear all events:

obs.off()

get_all_handlers, get_handlers and is_registered: Check which handlers are registered

Imagine you registered the following handlers:

@obs.on("success")
def success_func():
    print("Success!")

@obs.on("error")
def error_func(message):
    print("Error: %s" % message)

Then you can do the following to inspect the registered handlers:

>>> obs.get_all_handlers()
{'success': [<function success_func at 0x7f7f32d0a1e0>], 'error': [<function error_func at 0x7f7f32d0a268>]}
>>> obs.get_handlers("success")
[<function success_func at 0x7f7f32d0a1e0>]
>>> obs.get_handlers("other_event")
[]

Usage of observable.property.ObservableProperty

A property that can be observed easily by listening for some special, auto-generated events. Its API is identical to that of the build-in property.

The ObservableProperty needs an Observable object for triggering events. If the property is an attribute of an object of type Observable, that one will be used automatically. To specify a different Observable object, pass it as the observable keyword argument when initializing the ObservableProperty. You may also pass a string for observable, which looks for an attribute of that name in the containing object. This is useful to specify the name of an attribute which will only be created at object initialization and thus isn't there when defining the property.

The following events, of which "after_set_<name>" is probably the one used most, are triggered:

  • "before_get_<name>"() and "after_get_<name>"(value)
  • "before_set_<name>"(value) and "after_set_<name>"(value)
  • "before_del_<name>"() and "after_del_<name>"()

<name> has to be replaced with the property's name. Note that names are taken from the individual functions supplied as getter, setter and deleter, so please name those functions like the property itself. Alternatively, the name to use can be specified with the name keyword argument when initializing the ObservableProperty.

The convenience helper ObservableProperty.create_with() can be used as a decorator for creating ObservableProperty objects with custom event and/or observable. It returns a functools.partial() with the chosen attributes pre-set.

Here's an example for using the event and observable keyword arguments:

>>> from observable import Observable
>>> from observable.property import ObservableProperty
>>> class MyObject:
...     def __init__(self):
...         self.events = Observable()
...         self._value = 10
...     @ObservableProperty.create_with(event="prop", observable="events")
...     def some_obscure_name(self):
...         return self._value
...     @some_obscure_name.setter
...     def some_obscure_name(self, value):
...         self._value += value
...
>>> obj = MyObject()
>>> obj.obs.on("after_get_prop", lambda v: print("got", v))
>>> obj.obs.on("before_set_prop",
...            lambda v: print("setting", obs.some_obscure_name, v))
>>> obj.obs.on("after_set_prop", lambda v: print("set", v))
>>> obj.some_obscure_name = 32
got 10
setting 10 32
set 32
>>> obj.some_obscure_name
got 42
42

This project is published under MIT.
A Timo Furrer project.
- 🎉 -

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].