Metadata-Version: 2.1
Name: fastapi-event
Version: 0.1.2
Summary: Event dispatcher for FastAPI
Home-page: https://github.com/teamhide/fastapi-event
Author: Hide
Author-email: padocon@naver.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENCE

# fastapi-event
[![license]](/LICENSE)
[![pypi]](https://pypi.org/project/fastapi-event/)
[![pyversions]](http://pypi.python.org/pypi/fastapi-event)
[![Downloads](https://pepy.tech/badge/fastapi-event)](https://pepy.tech/project/fastapi-event)

---

fastapi-event is event dispatcher for FastAPI framework.

## Installation

```python
pip3 install fastapi-event
```

## Usage

### Make Event

```python
from fastapi_event import BaseEvent


class TestEvent(BaseEvent):
    async def run(self, parameter=None):
        ...
```

Inherit `BaseEvent` and override `run()` method.

```python
from fastapi_event import BaseEvent


class FirstEvent(BaseEvent):
    ORDER = 1  # HERE(Optional)
    
    async def run(self, parameter=None):
        ...


class SecondEvent(BaseEvent):
    ORDER = 2  # HERE(Optional)
    
    async def run(self, parameter=None):
        ...
```

If you want to determine the order between events, specify `ORDER` in your event. 

Then, regardless of the order in which the events are stored, they will be executed in the order specified in `ORDER` variable.

However, `ORDER` does not work when `run_at_once=True`.

### Parameter(optional)

```python
from pydantic import BaseModel


class TestEventParameter(BaseModel):
    id: str
    pw: str
```

In case of need parameter, you have to inherit `BaseModel` and set fields.

### Middleware

```python
from fastapi import FastAPI
from fastapi_event import EventHandlerMiddleware

app = FastAPI()
app.add_middleware(EventHandlerMiddleware)
```

### EventListener

```python
from fastapi_event import EventListener


@EventListener()
async def test():
    ...
```

Set `@EventListener()` decorator on the function that emits the event.

```python
@EventListener(run_at_once=False)
```

If you pass `run_at_once=False`, it will execute in the order in which `store()` is called. (or according to the `ORDER` variable defined in the event)

Otherwise, it will execute through `asyncio.gather()` to run at once.

### Store event

```python
from fastapi_event import EventListener, event_handler


@EventListener()
async def test():
    await event_handler.store(
        event=TestEvent,
        parameter=TestParameter(id="hide", pw="hide"),  # Optional
    )
```

Store your event to handler via `store()` method. (parameter is optional)

An event will be emitted after the function has finished executing.

[license]: https://img.shields.io/badge/License-Apache%202.0-blue.svg
[pypi]: https://img.shields.io/pypi/v/fastapi-event
[pyversions]: https://img.shields.io/pypi/pyversions/fastapi-event


