Metadata-Version: 2.1
Name: apyum
Version: 0.1.2
Summary: Adapter for Celery that implements JSON-RPC 2.0 protocol.
Home-page: https://github.com/aiselis/apyum
Author: Alessio Pinna
Author-email: alessio.pinna@aiselis.com
Maintainer: Alessio Pinna <alessio.pinna@aiselis.com>
License: Apache 2
Project-URL: Bug Reports, https://github.com/aiselis/apyum/issues
Project-URL: Source, https://github.com/aiselis/apyum
Platform: UNKNOWN
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Development Status :: 3 - Alpha
Classifier: Operating System :: OS Independent
Classifier: Framework :: AsyncIO
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: celery
Requires-Dist: aiohttp
Requires-Dist: pyyaml
Requires-Dist: jsonschema

Apyum
=====

[![Latest PyPI package version](https://badge.fury.io/py/apyum.svg)](https://pypi.org/project/apyum)  
Adapter for Celery that implements JSON-RPC 2.0 protocol.

Key Features
------------
- Turns existing Celery implementation into a JSON RPC api
- Simple to run
- Implements JSON-RPC 2.0 protocol. (see https://www.jsonrpc.org)
- Support asyncio

Getting started
---------------
Create a yml config file (for example **settings.yaml**):
```yaml
celery:
  broker_url: "amqp://guest:guest@localhost:5672//"
  result_backend: "rpc://"
  result_persistent: False
  ...
logging:
  ...
 ```

The *celery* section is to be written as described by the Celery configuration (see https://docs.celeryproject.org/en/stable/userguide/configuration.html).  
The *logging* section is optional and can be customized as described by the Python logging manual (see https://docs.python.org/3/library/logging.config.html).  

To start Apyum launch standalone:
```sh
apyum settings.yml
```
This starts Apyum listening to 8080 port. For change listening port user parameter --port or to listen in a unix socket use parameter --path  

Or start with gunicorn:
```sh
APYUM_SETTINGS=settings.yml gunicorn apyum.main:create --bind localhost:5000 --worker-class aiohttp.GunicornWebWorker --worker 4
```

Calling service example
-----------------------
Suppose we have defined some Celery tasks as **myapp.tasks** python module in a external worker like this:
(tasks.py)
```python
@app.task
def example_task_x(a, b, c):
    ...

@app.task
def example_task_y(a, b, c):
    ...
```
For running by JSON-RPC call we must send POST to http://localhost:8080/myapp/tasks with body:
```json
{ "jsonrpc": "2.0", "method": "example_task_x", "params": { "a": 5, "b": 3, "c":1}, "id": "1" }
```
or
```json
{ "jsonrpc": "2.0", "method": "example_task_x", "params": [ 5, 3, 1], "id": "1" }
```
or can be called on root by:
```json
{ "jsonrpc": "2.0", "method": "myapp.tasks.example_task_x", "params": [ 5, 3, 1], "id": "1" }
```
The endpoints return response if have it. Also batch calls are supported:
```json
[
  { "jsonrpc": "2.0", "method": "myapp.tasks.example_task_x", "params": [ 5, 3, 1], "id": "1" },
  { "jsonrpc": "2.0", "method": "myapp.tasks.example_task_y", "params": [ 1, 2, 1], "id": "2" },
  { "jsonrpc": "2.0", "method": "myapp.tasks.example_task_y", "params": [ 6, 1, 4], "id": "3" }
]
```
See JSON-RPC specification for more details.  

Installation
------------
It's very simple to install Apyum:
```sh
pip install apyum
```

To Do
-----
- More tests
- Autentication requests
- Insert an api documentation (like https://open-rpc.org)
- Documentation and examples

Requirements
------------
- Python >= 3.8
- Celery 5

License
-------
`apyum` is offered under the Apache 2 license.

Source code
-----------
The latest developer version is available in a GitHub repository:
<https://github.com/aiselis/apyum>

