Skip to main content

Embed the Drasi continuous-query engine directly in your Python application

Project description

drasi-lib

PyPI version Python versions license docs

📖 Documentation: https://drasi-project.github.io/drasi-python/ — installation, concepts, the full API reference, guides, and a worked example.

Embed the Drasi continuous-query engine directly in your Python application. drasi-lib is a native PyO3 binding around Drasi's embeddable engine (drasi-lib) and its plugin host SDK (drasi-host-sdk), so you get:

  • In-process continuous queries over a property graph, in Cypher or GQL.
  • A working plugin ecosystem — search, resolve, download, verify and install the Drasi source/reaction/bootstrap plugins published to ghcr.io/drasi-project, picking the build that is compatible with your host.
  • Python-defined components — define a reaction as a Python callback, or a source you push changes into from your own code. No Rust required.
  • Streamingasync for event in drasi.query_results(id), plus lifecycle events and component logs.
  • A blocking APIdrasi.sync.Drasi for scripts and notebooks.

Status: pre-1.0. The API is complete — full parity with @drasi/lib plus streaming as async iterators, a blocking facade, and plugin lockfiles. See docs/api-audit.md.

Install

pip install drasi-lib

Imported as drasi. Wheels are abi3 for Python 3.10+ on Linux (x86_64, aarch64), macOS (x86_64, arm64) and Windows (x86_64), so no Rust toolchain is needed. To build from source instead, see Development, or examples/README.md for a step-by-step walkthrough.

Quickstart

Push changes from your own code and react to the results — no plugins needed:

import asyncio
from drasi import Drasi


async def main() -> None:
    async with await Drasi.create("my-app") as drasi:
        await drasi.start()

        await drasi.add_python_source("orders")
        await drasi.add_query(
            "open",
            "MATCH (o:Order) WHERE o.status = 'open' RETURN o.id AS id, o.total AS total",
            ["orders"],
        )

        def on_results(event):
            for diff in event["results"]:
                print(diff["type"], diff.get("data"))

        await drasi.add_python_reaction("watch", ["open"], on_results)

        await drasi.push_change(
            "orders",
            {
                "op": "insert",
                "id": "o1",
                "labels": ["Order"],
                "properties": {"id": "o1", "status": "open", "total": 42},
            },
        )
        await asyncio.sleep(0.5)
        print(await drasi.get_query_results("open"))


asyncio.run(main())

Using a plugin

install_plugin() resolves the build that is compatible with your machine, downloads it, verifies it and loads it:

async with await Drasi.create("my-app") as drasi:
    await drasi.install_plugin("source/mock")
    await drasi.start()

    await drasi.add_source("mock", "counters", {"dataType": {"type": "counter"}, "intervalMs": 500})
    await drasi.add_query("counts", "MATCH (c:Counter) RETURN c.value AS value", ["counters"])

Browse what is available first, if you like:

for plugin in await drasi.search_plugins():
    print(plugin["reference"])  # e.g. source/postgres, reaction/http

Plugin configuration keys are defined by the plugin itself, so they are passed through untouched — dataType above is the mock source's own spelling. Drasi's own API is snake_case, and accepts the Node.js camelCase spellings as aliases.

Plugins

Drasi plugins are self-contained cdylib files distributed as OCI artifacts from ghcr.io/drasi-project, published per platform:

ghcr.io/drasi-project/{type}/{kind}:{version}-{arch}

Because a plugin is a native library loaded into your process, it is only usable by a host built against a compatible set of Drasi crates. install_plugin() handles this for you — it reads the registry index, picks the newest build whose sdk/core/lib versions and target triple match this host, downloads it, optionally verifies its cosign signature, and loads it.

See the plugins guide, or docs/plugins.md for the contributor-facing detail.

Watching a query

Polling is rarely what you want:

async for event in await drasi.query_results("open"):
    for diff in event["results"]:
        print(diff["type"], diff.get("data"))

Lifecycle events (query_events, source_events, reaction_events, all_events) and logs (query_logs, source_logs, reaction_logs) stream the same way, and replay their history first. Callback forms (on_query_results, on_*_events, on_*_logs) exist for parity with the Node.js binding.

Without async

from drasi.sync import Drasi

with Drasi.create("my-app") as drasi:
    drasi.start()
    drasi.add_python_source("orders")
    print(drasi.get_query_results("open"))

Streams become ordinary iterators. Don't use this inside an existing event loop — it will tell you so rather than deadlocking.

Durability

A durable reaction only advances its checkpoint once your callback succeeds, so an unhandled event is replayed after a restart:

drasi = await Drasi.create("app", state_store={"kind": "redb", "path": "state.redb"})


async def handle(event):
    await write_somewhere(event)  # if this raises, the event is retried


await drasi.add_durable_python_reaction("sink", ["open"], handle)

Status

docs/api-audit.md inventories the public API and compares it against the Node.js bindings and the Rust engine. It is at full parity — 48/48 methods — plus 21 methods Node does not have.

Examples

Runnable programs are in examples/, with a guide covering how to build the package locally and run them. The documentation site also has a worked Postgres dashboard example built entirely on published plugins.

Example What it shows Needs
python_source.py Push changes from your own code; react to results nothing
install_plugin.py Browse the registry, install a plugin, use it network
postgres_cdc.py React to a real Postgres database Docker, network
make venv && make develop
.venv/bin/python examples/python_source.py

Development

make venv        # create .venv with a managed Python and the dev tooling
make develop     # build the native extension and install it editable
make test        # unit tests + hermetic end-to-end tests
make test-oci    # download and install real plugins from ghcr.io

Building requires a Rust toolchain. The optional rocksdb feature additionally requires libclang and a C++ toolchain. See CONTRIBUTING.md.

License

Apache-2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drasi_lib-0.2.0.tar.gz (220.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

drasi_lib-0.2.0-cp310-abi3-win_amd64.whl (10.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_x86_64.whl (10.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.35+ x86-64

drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.35+ ARM64

drasi_lib-0.2.0-cp310-abi3-macosx_11_0_arm64.whl (9.1 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

drasi_lib-0.2.0-cp310-abi3-macosx_10_13_x86_64.whl (9.9 MB view details)

Uploaded CPython 3.10+macOS 10.13+ x86-64

File details

Details for the file drasi_lib-0.2.0.tar.gz.

File metadata

  • Download URL: drasi_lib-0.2.0.tar.gz
  • Upload date:
  • Size: 220.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for drasi_lib-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e6be78650640ca35737e0d95d3cf9a4eefdd4b1418e410e4bc1302348659709f
MD5 ca48f5f2c4cead28adbeb0b8f67b2cb6
BLAKE2b-256 472161e7c76baf70fbdcc977cb666104a93e9f9e88c7863549aad17c30a32102

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0.tar.gz:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drasi_lib-0.2.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: drasi_lib-0.2.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 10.4 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for drasi_lib-0.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5a940d5a8e6b01a04f39c9d353269777d3f80dc3eefbf273363f9c6bff29bd86
MD5 6e9b4b2d1200e19706a4f51d41bf2384
BLAKE2b-256 0e9665880a32fbe0ce25310724aedaa62d6c844be9854f9de81d1bd337c26b3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0-cp310-abi3-win_amd64.whl:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 2d9592cf08b42647f36fde5d601e22e05d678b0af30030e2fc8065ca434317df
MD5 2feb15bf3ad92a76de45dcb0d5734707
BLAKE2b-256 9dcc6c04447b9d696a1fe433492bfd2cdb03f7fc626f6444a1b3b5b3b50a1eb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_x86_64.whl:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 b3519bebaeb765566e4276fb25b225b41aeb3e0cf4f285f144dc14545198eff2
MD5 c7e42da2773d7b51514c5fa0c57e974b
BLAKE2b-256 9c94e4574a53a92c5fedaf5f7924b18a06b58487e62337daf59f75a9b25fd988

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0-cp310-abi3-manylinux_2_35_aarch64.whl:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drasi_lib-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77a6ec9d860655cae6a6461b52128abf2dd4c6d3cedb33eddb6d9686064dc1d9
MD5 651f11ab91ba407407367c86f257c429
BLAKE2b-256 8cecd470e0760ba620f95be5027b99cc858b3e7098e3b74c015dbeb404bdf4e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file drasi_lib-0.2.0-cp310-abi3-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.2.0-cp310-abi3-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c50ae6abb054558de3718fb61216a45f5f85504963d65ef147577b7bdac2554f
MD5 9ec9a147a0f267944f3f3545a4b15417
BLAKE2b-256 1fb643a82e36a4c0e51e549f8425983bc93c3d3522031552327732db4cc96237

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.2.0-cp310-abi3-macosx_10_13_x86_64.whl:

Publisher: release.yml on drasi-project/drasi-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page