Skip to main content

opa-golib-python-bindings

Python bindings for the OPA Rego engine, embedding github.com/open-policy-agent/opa/v1/rego via a Go c-shared library and a stdlib-only ctypes wrapper.

Build

Requires Go >= 1.26 and Python >= 3.14.

make build   # builds src/opa_bindings/libopabridge.so
make test    # builds + runs pytest

Usage

from opa_bindings import OpaEngine

users = {"alice": {"role": "admin"}}

with OpaEngine() as engine:
    engine.add_policy("authz.rego", """
package authz

allow if lookup_user(input.user).role == "admin"
""")
    engine.add_data({"admin": ["alice"]}, path="roles")   # deep-merged; conflicts raise
    engine.register_function("lookup_user", lambda name: users.get(name))

    engine.eval_document("authz.allow", {"user": "alice"})  # -> True
    engine.eval_query("x = data.roles.admin[_]")            # -> [{"x": "alice"}]

Notes:

  • add_data deep-merges objects; identical values coexist, conflicting values raise OpaError(code="merge_conflict") naming the conflicting path.

  • register_function infers arity from the callable's signature. A *args function is variadic and is called from Rego with a single array argument: many(["a", "b"]) (OPA does not support variadic builtins with return values).

  • Builtin arguments and return values are JSON-compatible objects. A callback exception becomes an evaluation error; returning is fine.

  • An undefined document raises OpaUndefinedError.

  • Pass coverage=True to eval_document / eval_query to capture a coverage report (OPA's cover tracer) in engine.last_coverage: per-file covered / not_covered line ranges plus line counts and a coverage percentage over all added policies. Evaluating without coverage=True resets it to None.

  • Pass trace=True to capture the full evaluation trace in engine.last_trace: a list of event dicts (op, location, node, locals, ...) in evaluation order. locals holds the plugged variable bindings live at each step, so the value a statement produced is visible (e.g. {"x": 6} after x := input.n * 2); a false condition appears as a Fail event at its location. An undefined document still carries its trace — the main way to see which condition failed. Note that node shows the compiler-rewritten expression (temporaries like __local0__), a statement may appear multiple times (Redo on backtracking), and tracing slows evaluation, so keep it opt-in per call. Coverage only records which statements were evaluated; traces are how to see their results.

  • compile_filters partially evaluates a query and translates the residual policy into a data filter (OPA's Compile-API / data-filter machinery):

    engine.add_policy("filters.rego", """
    package filters
    
    include if input.fruits.colour == "green"
    include if {
        input.fruits.name == "banana"
        input.user == "admin"
    }
    """)
    engine.compile_filters(
        "data.filters.include",
        {"user": "admin"},              # known input
        unknowns=["input.fruits"],      # left symbolic
        target="sql", dialect="postgresql",
    )
    # -> {"query": "WHERE (fruits.colour = E'green' OR fruits.name = E'banana')",
    #     "masks": None}
    

    target="sql" (dialects postgresql, mysql, sqlserver, sqlite) yields a WHERE clause string; target="ucast" (dialects all, prisma, linq, or "") yields a UCAST condition dict (the ucast.json wire format). query is None when the policy can never match and ""/{} when it always matches. mappings renames tables/columns (e.g. {"fruits": {"$self": "fruit_table", "colour": "col"}}), and mask_rule names a rule evaluated to produce column masks (returned under "masks"). Residual conditions that cannot be expressed for the chosen target raise OpaError(code="compile_error").

    Unknown refs must have the shape input.<table>.<column> — exactly two segments after input, whatever the declared unknown boundary is, and for every target/dialect (ucast/all included; mappings cannot deepen it). So unknowns=["input.item"] permits only input.item.<column>, while the bare unknowns=["input"] permits input.<table>.<column>. Deeper refs like input.item.attrs.price.value fail with pe_fragment_error: invalid ref operand, so nested documents (e.g. an EAV entity with per-attribute type/value objects, or per-locale value objects) must be flattened into columns (input.attr.value_number, input.attr.value_de, ...). Dynamic column choice is fine as long as the key is known at compile time: input.attr[sprintf("value_%s", [input.locale])] resolves to a single column during partial evaluation.

  • Rego print(...) output is captured per evaluation: set engine.print_handler to a callable(message, location) to receive it (default: written to stderr); engine.last_prints holds the (message, location) pairs of the last eval.

Metadata

Release files for opa-golib-python-bindings 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for opa-golib-python-bindings 0.4.0
File Size Uploaded
opa_golib_python_bindings-0.4.0.tar.gz 23.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for opa-golib-python-bindings 0.4.0
File
opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_x86_64.whl Python 3 none Linux glibc 2.34+ x86-64 Details
opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_aarch64.whl Python 3 none Linux glibc 2.34+ ARM64 Details
opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_x86_64.whl Python 3 none macOS 11.0+ x86-64 Details
opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details

Total release size: 40.0 MB

Release files / opa_golib_python_bindings-0.4.0.tar.gz

Download URL opa_golib_python_bindings-0.4.0.tar.gz
Size 23.8 kB
Tags Source
SHA-256 checksum
How to use checksums
c5bfc4efa44f7487257c0102dfac69e6c02399e1d11d8e96a9e29534d9457041
BLAKE2b-256 checksum
How to use checksums
ea4ede4d452289b8a2b6d42377437c654f41e3fb9aad8fe1d8ce6b9a851f2c48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.

Transparency log

Release files / opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_x86_64.whl

Download URL opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_x86_64.whl
Size 13.4 MB
Tags Linux glibc 2.34+ x86-64 Python 3
SHA-256 checksum
How to use checksums
684a346f563be42e9786855a4f253e086e236e6b7d8e54b51d1dc26e9865f8bf
BLAKE2b-256 checksum
How to use checksums
8aafe80e73e99440cb5975e2d02f703b7dd9fa2d5ada8ac5d6953d86b723717a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.

Transparency log

Release files / opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_aarch64.whl

Download URL opa_golib_python_bindings-0.4.0-py3-none-manylinux_2_34_aarch64.whl
Size 12.1 MB
Tags Linux glibc 2.34+ ARM64 Python 3
SHA-256 checksum
How to use checksums
d511a8a6fd79df135cdb90975a4207dceae5cb73e1383fa1a2f81ecd381d74a3
BLAKE2b-256 checksum
How to use checksums
fea1d3c291aa9dc34750580fa7f166d0277cf0457817fded5b044a1d7d76fd87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.

Transparency log

Release files / opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_x86_64.whl

Download URL opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_x86_64.whl
Size 7.5 MB
Tags Python 3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
026df3ee15cab52abb31f3ae1550be1f660fea4a83c97477270702283b760e7b
BLAKE2b-256 checksum
How to use checksums
4c508a0567a8970454ee7336973975bcdc89b4122e039bcd302e29c055a2deb9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.

Transparency log

Release files / opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_arm64.whl

Download URL opa_golib_python_bindings-0.4.0-py3-none-macosx_11_0_arm64.whl
Size 6.9 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0710f645beb539f991bb470a77ca8d1d3a2d563674ef9f6ea9b9cb8c2fae8685
BLAKE2b-256 checksum
How to use checksums
9fb942c9ba7ae312419391af3d8445f4ff8fa6b61afd194728a6210f6b09e7d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.4

5 release files

0.4.3

5 release files

0.4.2

5 release files

This release

0.4.0 This release

5 release files

0.3.0

5 release files

0.2.0

5 release files

0.1.2

5 release files

0.1.0

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page