parent
5b127c8eef
commit
f93180bbc7
@ -1,2 +1,5 @@ |
|||||||
# ewents |
# ewents |
||||||
|
|
||||||
|
## Installation |
||||||
|
|
||||||
|
`pip install git+https://git.finnendahl.de/Yugon/ewents` |
||||||
|
@ -0,0 +1,60 @@ |
|||||||
|
import asyncio |
||||||
|
import functools |
||||||
|
|
||||||
|
global_signals = {} |
||||||
|
|
||||||
|
|
||||||
|
async def emit(signal, payload=None): |
||||||
|
for q in global_signals.get(signal, []): |
||||||
|
if payload is not None: |
||||||
|
await q.put({"payload": payload}) |
||||||
|
else: |
||||||
|
await q.put({}) |
||||||
|
|
||||||
|
|
||||||
|
async def shutdown(): |
||||||
|
for key in global_signals: |
||||||
|
for q in global_signals[key]: |
||||||
|
await q.put(None) |
||||||
|
|
||||||
|
|
||||||
|
def shutdown(loop=None): |
||||||
|
if loop is None: |
||||||
|
loop = asyncio.get_event_loop() |
||||||
|
loop.run_until_complete(shutdown()) |
||||||
|
|
||||||
|
|
||||||
|
async def consumer(queue, callback, signal): |
||||||
|
while True: |
||||||
|
item = await queue.get() |
||||||
|
if item is None: |
||||||
|
global_signals[signal].remove(queue) |
||||||
|
break |
||||||
|
if "payload" in item: |
||||||
|
await callback(item["payload"]) |
||||||
|
else: |
||||||
|
await callback() |
||||||
|
|
||||||
|
|
||||||
|
def listen_on(signal, fun=None, *, loop=None): |
||||||
|
if loop is None: |
||||||
|
loop = asyncio.get_event_loop() |
||||||
|
|
||||||
|
def decorator(func, deco=True): |
||||||
|
@functools.wraps(func) |
||||||
|
def fun(*args, **kwargs): |
||||||
|
return func(*args, **kwargs) |
||||||
|
|
||||||
|
q = asyncio.Queue() |
||||||
|
global_signals.setdefault(signal, []).append(q) |
||||||
|
handle = loop.call_soon( |
||||||
|
lambda: asyncio.ensure_future(consumer(q, func, signal)) |
||||||
|
) |
||||||
|
if deco: |
||||||
|
return fun |
||||||
|
else: |
||||||
|
return handle |
||||||
|
|
||||||
|
if fun is not None: |
||||||
|
return decorator(fun, False) |
||||||
|
return decorator |
@ -0,0 +1,25 @@ |
|||||||
|
import ewents |
||||||
|
import asyncio |
||||||
|
|
||||||
|
@ewents.listen_on("eventA") |
||||||
|
async def callbackA(): |
||||||
|
print("Listener A") |
||||||
|
await ewents.emit("eventB") |
||||||
|
|
||||||
|
@ewents.listen_on("eventB") |
||||||
|
async def CallbackB1(): |
||||||
|
print("Listener B1") |
||||||
|
|
||||||
|
@ewents.listen_on("eventB") |
||||||
|
async def CallbackB2(): |
||||||
|
print("Listener B2") |
||||||
|
|
||||||
|
|
||||||
|
async def main(): |
||||||
|
while True: |
||||||
|
await ewents.emit("eventA") |
||||||
|
await asyncio.sleep(2) |
||||||
|
|
||||||
|
loop = asyncio.get_event_loop() |
||||||
|
loop.run_until_complete(main()) |
||||||
|
loop.close() |
@ -0,0 +1,35 @@ |
|||||||
|
from setuptools import setup, find_packages |
||||||
|
import os |
||||||
|
from setuptools import setup |
||||||
|
|
||||||
|
# Utility function to read the README file. |
||||||
|
# Used for the long_description. It's nice, because now 1) we have a top level |
||||||
|
# README file and 2) it's easier to type in the README file than to put a raw |
||||||
|
# string in below ... |
||||||
|
def read(fname): |
||||||
|
return open(os.path.join(os.path.dirname(__file__), fname)).read() |
||||||
|
|
||||||
|
setup( |
||||||
|
name="ewents", |
||||||
|
version="0.1", |
||||||
|
packages=find_packages(), |
||||||
|
# scripts=['say_hello.py'], |
||||||
|
# install_requires=['python_version>=3.5'], |
||||||
|
|
||||||
|
# metadata to display on PyPI |
||||||
|
author="Yugon", |
||||||
|
author_email="ugogon@hotmail.de", |
||||||
|
description="This is an async eventlistener library.", |
||||||
|
keywords="async, ", |
||||||
|
# url="http://example.com/HelloWorld/", # project home page, if any |
||||||
|
# project_urls={ |
||||||
|
# "Bug Tracker": "https://bugs.example.com/HelloWorld/", |
||||||
|
# "Documentation": "https://docs.example.com/HelloWorld/", |
||||||
|
# "Source Code": "https://code.example.com/HelloWorld/", |
||||||
|
# }, |
||||||
|
# classifiers=[ |
||||||
|
# 'License :: OSI Approved :: Python Software Foundation License' |
||||||
|
# ], |
||||||
|
python_requires=">=3.5", |
||||||
|
long_description=read('README.md') |
||||||
|
) |
Loading…
Reference in new issue