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.1.4.tar.gz (220.0 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.1.4-cp310-abi3-win_amd64.whl (10.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

drasi_lib-0.1.4-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.1.4-cp310-abi3-manylinux_2_35_aarch64.whl (10.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.35+ ARM64

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

Uploaded CPython 3.10+macOS 11.0+ ARM64

drasi_lib-0.1.4-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.1.4.tar.gz.

File metadata

  • Download URL: drasi_lib-0.1.4.tar.gz
  • Upload date:
  • Size: 220.0 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.1.4.tar.gz
Algorithm Hash digest
SHA256 d1500859bc255d4817fd24fbbd3dbc4e565edb61f62b9dca1293b808187412f9
MD5 c84a3f937da071a30237954264aa896f
BLAKE2b-256 ce57f41b161fbed9027037542906b7dec5e5aed7abfc629301c5012852ae9c59

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4.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.1.4-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: drasi_lib-0.1.4-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.1.4-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 99f6e323d290ff86b6cc3716e5be0cdf790dd4f5fb8f2e17af3e75fd625764b8
MD5 1442fc6c146a6b2aaf05714d31e6127a
BLAKE2b-256 71a2eaa7ea5988ca4aaa2e3991e9ddc7bf453e64a67de7d06d43b80af30316cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4-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.1.4-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.1.4-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 932595ab36e943d2327753df45e496be41720cae11d1b406345b4fa658a229ef
MD5 2e8aeaea9921c35bcbba4154eb3ffeee
BLAKE2b-256 b8f32a27938a93a7eb90a21851ba1e684ce1ca7b8a65f7a8ffd2d5f6d0e89e7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4-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.1.4-cp310-abi3-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.1.4-cp310-abi3-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 759f96e54b397af1d06fde08a8341d63bafc84124f48b145cf2ed5d6778a40f9
MD5 33143d89c106647120c950d3a716b6ca
BLAKE2b-256 8554789abacf82e68187f695996fabe2bc95957342efa178cf3f5ebebe2759f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4-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.1.4-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.1.4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c6f3e47a7f516bde83309e3ae21259fdcd153cdb5ee0dd3d01d5d5449ea66fc3
MD5 33dc59b52e519327a88f9649bddf002e
BLAKE2b-256 b358da926b184def450068d2fd097ddd34191d227bf4aebc58f8bab2eb4d21ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4-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.1.4-cp310-abi3-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for drasi_lib-0.1.4-cp310-abi3-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2dca1df52a915efe6b900f5b610716bd519ff4c44f97e990c5e472baa82ec6b6
MD5 6a0e4106dac0ae8a4e45b1350abeb6a5
BLAKE2b-256 64cd2a9975d12b01d9c0873c23346aac1c479a45a085bb933ebe49f5cfe53cc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for drasi_lib-0.1.4-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