Aether Python Library
This is the official Python Library with Aether functions.
Table of contents
Requirements
This library requires Python 3.6 and above.
Python libraries:
- eha-jsonpath Provides new Extensions to the jsonpath_ng python library to provide commonly requested functions.
- jsonschema An implementation of JSON Schema validation for Python.
- redis Python client for Redis key-value store.
- requests HTTP for Humans.
- spavro An Avro library, Spavro is a (sp)eedier avro implementation using Cython.
Extra dependencies (based on settings):
-
test
- birdisle A modified version of redis that runs as a library inside another process.
- coverage A tool for measuring code coverage of Python programs.
- flake8 Tool For Style Guide Enforcement.
- flake8-quotes Flake8 extension for checking quotes in python.
- tblib Traceback serialization library.
Installation
# standalone
pip3 install aether.python
Distribution
How to create the package distribution
Execute the following command:
python3 setup.py bdist_wheel
or
./scripts/build.sh
Tests
Depending on your preference you can either use virtualenv or pipenv to test the library locally.
Virtual Env
First install dependencies (execute it only once):
./scripts/install.sh
After that execute the following command:
source ./venv/bin/activate
./scripts/test.sh
Pipenv
In the root folder run:
pipenv install .
Then to test run:
pipenv run scripts/test.sh
The file scripts/test.ini
contains the environment variables used in the tests.
Usage
Redis Tools
This provides an interface to a Redis server via supplied redis parameters.
It makes available a number of CRUD
redis operation which include but not limited to:
- Formats document keys into _{type}:{tenant}:{id}
before being cached on redis.
- Retrieves documents based on preformated keys.
- Removes documents based on preformated keys.
- Subscribes to key based channels with a callback function.
Usage
from aether.python.redis.task import TaskHelper
REDIS_TASK = TaskHelper(settings, redis_instance)
# Settings must have the following properties:
# REDIS_HOST str - Redis server host,
# REDIS_PORT int - Redis server port,
# REDIS_PASSWORD str - Redis server password,
# REDIS_DB str - Redis database name
# redis_instance (Optional) - Pass an existing redis connection
# (If provided, ignores all settings and uses redis_instance)
document = {
'id': 'document_id',
'name': 'document name'
}
document_type = 'test_document'
aether_tenant = 'prod'
# add document to redis
REDIS_TASK.add(task=document, type=document_type, tenant=aether_tenant)
# retrieve document from redis
REDIS_TASK.get(_id=document['id'], type=document_type, tenant=aether_tenant)
# subcribe to a key based channel
CHANNEL = '_test_document*' # listens for messages published to all channels starting with '_test_document'
def handle_callback(msg):
print(msg) # handle returned message
REDIS_TASK.subscribe(callback=handle_callback, pattern=CHANNEL, keep_alive=True)
# publish document
REDIS_TASK.publish(task=document, type=document_type, tenant=aether_tenant) # this will trigger the 'handle_callback' function with the published document to all subscribed clients