Skip to main content

The CEL Python runtime

Project description

CEL Python Wrapper (cel-expr-python)

This is a Python wrapper for the CEL C++ implementation.

Installation

pip install cel-expr-python

Available on PyPI: https://pypi.org/project/cel-expr-python

Usage

Importing CEL module

from cel_expr_python import cel

Creating and configuring CEL environment

To create a CEL environment, you need to define variable types that can be used in expressions.

cel_env = cel.NewEnv(variables={"x": cel.Type.INT, "y": cel.Type.INT})

Optional configuration parameters

The cel.NewEnv constructor also accepts the following optional parameters:

  • pool (descriptor_pool.DescriptorPool): The descriptor pool used for resolving protobuf message types within CEL expressions. If not provided, a default pool (descriptor_pool.Default()) is used.

  • container (str or cel.ExpressionContainer): The container name used for name resolution. For example, if container is "foo.bar", then Baz will resolve to foo.bar.Baz.

    You can also pass a cel.ExpressionContainer to configure abbreviations and aliases:

    container = cel.ExpressionContainer(
        name="foo.bar",
        abbreviations=["foo.bar.baz"],
        aliases={"my_alias": "full.name.of.something"}
    )
    cel_env = cel.NewEnv(container=container)
    
    • abbreviations: A list of fully qualified names that can be referred to by their last component.
    • aliases: A dictionary mapping an alias name to a fully qualified name.
  • extensions (list): A list of extension objects to load. This can include standard extensions (like math or string libraries) or custom extensions defined in Python or C++.

Compiling expressions

Use the compile() method to compile a CEL expression string into a reusable expression object.

expr = cel_env.compile("x + y > 10")

The expr object can be serialized into a binary format for persistence and later deserialized.

serialized_expr = expr.serialize()
# ... can be stored or sent over network ...
deserialized_expr = cel_env.deserialize(serialized_expr)

The compile method can take an optional disable_check=True argument, which disables type checking until runtime. This could be useful when types of variables are not known at compile time.

Evaluation

To evaluate a compiled expression, you need to provide bindings for variables and then call eval().

you need to create an activation, which provides bindings for variables, and then call eval().

# Provide variable values in a dictionary and evaluate the expression.
result = expr.eval(data={"x": 7, "y": 4})

# The result is a `CelValue` object, which contains the result's CEL type and
# value.

# Get the result value.
print(f"Result type: {result.type()}")
print(f"Result value: {result.value()}")

This will output:

Result type: BOOL
Result value: True

Using an Activation

The eval() function can also be invoked with an Activation object that holds variable bindings and a pointer to an Arena (see below). This is particularly useful when multiple expressions need to be evaluated with the same set of variable values, such as multiple policies on the same server request.

expr1 = cel_env.compile("user.role in ['admin', 'owner']")
expr2 = cel_env.compile("user.organization == 'myorg'")

# Provide variable values as an Activation.
activation = cel_env.Activation({"user": user})

# Evaluate the expression.
result1 = expr1.eval(activation)

# Evaluate another expression using the same variable bindings
result2 = expr2.eval(activation)

Using an Arena

The eval() function as well as an Activation can also take an Arena for memory management during evaluation. This is a memory optimization technique that allows temporary C++ objects created during the evaluation to be released as a group. The same Arena can be shared across multiple activations; just keep in mind that none of the associated objects are released until the last object using the arena is garbage-collected in Python.

arena = cel.Arena()

activation1 = cel_env.Activation({"x": 7, "y": 4}, arena)
# evaluate some expressions
activation2 = cel_env.Activation({"x": 8, "y": 9}, arena)
# evaluate some more expressions

# Process all results. Note: Don't put CelValues in long-lived data structures
# if you want the arena to be garbage-collected promptly.

# When `arena` and all `CelValue` objects produced with it go out of scope,
# all memory allocated for C++ objects during evaluation will be released.

Working with Protobufs

You can pass protobuf messages as variables to an activation; CEL expressions can return protobuf messages.

First, ensure your proto messages are available in the descriptor pool used by cel.NewEnv, by importing your proto library in Python:

from cel.expr.conformance.proto2 import test_all_types_pb2 as test_pb

Then declare any variables of message type using cel.Type with their fully qualified name.

# Declare 'msg_var' as a message type.
cel = cel.NewEnv(
    pool,
    variables={
        "msg_var": cel.Type("cel.expr.conformance.proto2.TestAllTypes"),
    },
)

Compile an expression that uses message fields:

expr = cel.compile("msg_var.single_int32 == 42")

Pass a message in the activation. When passing a message to an activation, use an instance of the Python proto message class.

my_msg = test_pb.TestAllTypes(single_int32=42)

activation = cel_env.Activation({"msg_var": my_msg})
result = expr.eval(activation)
print(f"Result: {result.value()}")

An expression can also return a proto message:

msg_expr = cel_env.compile(
    "cel.expr.conformance.proto2.TestAllTypes{single_int32: 123}"
)
msg_result = msg_expr.eval(activation)
proto_val = msg_result.value()
print(f"Resulting message type: {type(proto_val)}")
print(f"Resulting message value: {proto_val.single_int32}")

This will output:

Resulting message type: <class '...TestAllTypes'>
Resulting message value: 123

Custom functions

When configuring cel.Env you can supply custom functions. For each function there needs to be a declaration and an implementation. The implementation, which is a Python function, can be provided either as part of the declaration or separately.

Let's say we want to be able to invoke this function from CEL expressions:

  def good_time_of_day(ampm, arg):
    if ampm == 'am':
      time_of_day = 'morning'
    else:
      time_of_day = 'afternoon'
    return f"Good {time_of_day}, {arg}"

The implementation can be supplied along with the declaration:

  cel_env = cel.NewEnv(functions=[
            cel.FunctionDecl(
                "hello",
                [
                    cel.Overload(
                        "hello(string,string)",
                        return_type=cel.Type.STRING,
                        parameters=[
                            cel.Type.STRING,
                            cel.Type.STRING,
                        ],
                        impl=good_time_of_day,
                    )
                ],
            )
        ])

It can also be provided separately in a dictionary that maps overload IDs to their respective implementations:

  cel_env = cel.NewEnv(functions=[
            cel.FunctionDecl(
                "hello",
                [
                    cel.Overload(
                        "hello(string,string)",
                        return_type=cel.Type.STRING,
                        parameters=[
                            cel.Type.STRING,
                            cel.Type.STRING,
                        ],
                    )
                ],
            )
        ],
        function_impls={
            "hello(string,string)": good_time_of_day,
        })

Now that the function implementation is bound to the CEL environment, we can invoke it from CEL like this:

    result = env.compile("hello('am', 'breakfast is ready!')").eval()
    print(result.value())   # Good morning, breakfast is ready!
    result = env.compile("hello('pm', 'tea is served.')").eval()
    print(result.value())   # Good afternoon, tea is served.

Extensions

Standard extensions

Standard extensions are available under cel_expr_python.ext.

from cel_expr_python.ext import ext_math

env = cel.NewEnv(pool, extensions=[ext_math.ExtMath()])
expr = env.compile("math.sqrt(4)")

Defining a custom extension in Python

You can define custom functions and pass them as an extension.

def my_func_impl(x):
  return x + 1

my_ext = cel.CelExtension(
    "my_extension",
    [
        cel.FunctionDecl(
            "my_func",
            [
                cel.Overload(
                    "my_func_int",
                    cel.Type.INT,
                    [cel.Type.INT],
                    impl=my_func_impl,
                )
            ],
        )
    ],
)

cel_env = cel.NewEnv(pool, extensions=[my_ext])
expr = cel_env.compile("my_func(1)")

Defining a custom extension in C++

To define a custom extension in C++, define a class extending cel_python::CelExtension. There are two methods you will need to implement: GetCompilerLibrary and ConfigureRuntime. The implementations of these methods use the same API as extensions written for the C++ CEL runtime. In fact, extensions written for the C++ runtime can be used unchanged with cel-expr-python - you would just need to write a trivial wrapper class invoking the registration functions defined by the C++ extension.

This method adds extension function definitions to the provided CompilerBuilder, for example:

  cel::CompilerLibrary GetCompilerLibrary() {
    return cel::CompilerLibrary(
        "translate-ext",
        [](cel::TypeCheckerBuilder& checker_builder) -> absl::Status {
          CEL_PYTHON_ASSIGN_OR_RETURN(
              auto func_translate,
              cel::MakeFunctionDecl(
                  "translate",
                  cel::MakeMemberOverloadDecl("translate_inst",
                                              /*return_type=*/cel::StringType(),
                                              /*target=*/cel::StringType(),
                                              /*from_lang=*/cel::StringType(),
                                              /*to_lang=*/cel::StringType())));
          CEL_PYTHON_RETURN_IF_ERROR(
              checker_builder.AddFunction(func_translate));
          return absl::OkStatus();
        });
  }

The other method registers the actual implementation of the extension function with the runtime:

absl::Status ConfigureRuntime(cel::RuntimeBuilder& runtime_builder,
                              const cel::RuntimeOptions& opts);

For example,

static absl::StatusOr<cel::StringValue> Translate(
    const cel::StringValue& text, const cel::StringValue& from_lang,
    const cel::StringValue& to_lang, const proto2::DescriptorPool* absl_nonnull,
    proto2::MessageFactory* absl_nonnull, proto2::Arena* absl_nonnull arena) {
  return cel::StringValue::From("¡Hola Mundo!", arena);
}

absl::Status ConfigureRuntime(cel::RuntimeBuilder& runtime_builder,
                                const cel::RuntimeOptions& opts) override {
    using TranslateFunctionAdapter =
        cel::TernaryFunctionAdapter<absl::StatusOr<StringValue>,
                                      const StringValue&, const StringValue&,
                                      const StringValue&>;
    auto status = TranslateFunctionAdapter::RegisterMemberOverload(
        "translate", &Translate, runtime_builder.function_registry());
    CEL_PYTHON_RETURN_IF_ERROR(status);
    return absl::OkStatus();
}

Once you have the custom subclass of cel_python::CelExtension, add this line to turn this class into a Python module:

CEL_EXTENSION_MODULE(translation_cel_ext, TranslationCelExtension);

To build the Python module, use the pybind_extension BUILD rule:

pybind_extension(
    name = "translation_cel_ext",
    srcs = ["translation_cel_ext.cc"],
    data = [
        "@cel_expr_python:cel",
    ]
    deps = [
        "@cel_expr_python:cel",
        "@cel_expr_python:cel_extension",
        "@cel_expr_python:status_macros",
        ...
    ],
)

Now you can use the extension in cel_expr_python:

import translation_cel_ext

cel_env = cel.NewEnv(variables={},
  extensions=[translation_cel_ext.TranslationCelExtension()])

expr = cel_env.compile("'Hello, world!'.translate('en', 'es')")

Late-bound extension functions

Sometimes it is required to delay the binding of an extension function implementation until the runtime. To do this in an extension written in Python, simply leave the implementation parameter unspecified:

my_ext = cel.CelExtension(
    "my_extension",
    [
        cel.FunctionDecl(
            "my_func",
            [
                cel.Overload(
                    "my_func_int",
                    cel.Type.INT,
                    [cel.Type.INT],
                    # Note: no impl provided here.
                )
            ],
        )
    ],
)

If the extension is written in C++, use the RegisterLazyFunction function:

  absl::Status ConfigureRuntime(cel::RuntimeBuilder& runtime_builder,
                                const cel::RuntimeOptions& opts) override {
    using MyFunctionAdapter =
        cel::UnaryFunctionAdapter<absl::StatusOr<cel::IntValue>,
                                    const cel::IntValue&>;
    CEL_PYTHON_RETURN_IF_ERROR(
        runtime_builder.function_registry().RegisterLazyFunction(
            MyFunctionAdapter::CreateDescriptor(
                "my_func",
                /*receiver_style=*/false)));
    return absl::OkStatus();
  }

Now you can bind the function at runtime:

cel_env = cel.NewEnv(variables={}, extensions=[my_ext])
expr = cel_env.compile("my_func(42)")

multiplier = 2
act = cel_env.Activation({}, functions={"my_func": lambda x: x * multiplier})
res = expr.eval(act)
# res.value() == 84

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

cel_expr_python-0.1.3-cp314-cp314-win_amd64.whl (13.9 MB view details)

Uploaded CPython 3.14Windows x86-64

cel_expr_python-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cel_expr_python-0.1.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (16.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

cel_expr_python-0.1.3-cp314-cp314-macosx_11_0_arm64.whl (12.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

cel_expr_python-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

cel_expr_python-0.1.3-cp313-cp313-win_amd64.whl (13.7 MB view details)

Uploaded CPython 3.13Windows x86-64

cel_expr_python-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cel_expr_python-0.1.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (16.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

cel_expr_python-0.1.3-cp313-cp313-macosx_11_0_arm64.whl (12.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cel_expr_python-0.1.3-cp313-cp313-macosx_10_13_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

cel_expr_python-0.1.3-cp312-cp312-win_amd64.whl (15.0 MB view details)

Uploaded CPython 3.12Windows x86-64

cel_expr_python-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cel_expr_python-0.1.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (16.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

cel_expr_python-0.1.3-cp312-cp312-macosx_11_0_arm64.whl (12.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cel_expr_python-0.1.3-cp312-cp312-macosx_10_13_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

cel_expr_python-0.1.3-cp311-cp311-win_amd64.whl (7.9 MB view details)

Uploaded CPython 3.11Windows x86-64

cel_expr_python-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cel_expr_python-0.1.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (15.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

cel_expr_python-0.1.3-cp311-cp311-macosx_11_0_arm64.whl (12.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cel_expr_python-0.1.3-cp311-cp311-macosx_10_13_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.11macOS 10.13+ x86-64

File details

Details for the file cel_expr_python-0.1.3-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 4711f59f0dd3fcabf68a617685ab2857ed931cc10e2f1595abe7d4d99f921bba
MD5 8cc19c559d5e56812fe49b91b1449609
BLAKE2b-256 c5f571742755695bfbfbe55632e8f83a9e84cac65cb8aefa102353975df8209c

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp314-cp314-win_amd64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9b36c7a36ca865b147e1fc68f3f6faaae5b113e9de4d77e7eb751c95e1547a99
MD5 8f59fc679af8187ffc7c3358a4debedd
BLAKE2b-256 c625f352cdffd78175fe56ef50967a3a9e33d7770d46a0bd3294cbca9738df1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0d2035831cfb9c0ae36c91e3de421828f8fa27173680e86676a7d6e0f68300a0
MD5 95987f09d8235fa42a266bc73a7a4f9e
BLAKE2b-256 890265ab9b3a9dc2b73e798ce237c21811675e1acd898638036a829ccf90c77b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b3e1ba34748796624b2cf8c9bc664b79baccc0662c97299a1991278ef45d3aed
MD5 0c7ec9adde34b5beda313c3edf46c75e
BLAKE2b-256 9f6e3f36105e268e4dd0d8ad1ec233ef8ebca826eee8ad9cb22702bfd5631a34

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 665fbb261c4733e69a4022763c16f7655cfe6e057cd394ad9f36dfee92b9df8c
MD5 10cd4c032942726b2c554cae3d0bc00b
BLAKE2b-256 c733ceba4fdc652d8f3e692cafd065e90eb35e51fd20141abcc0f13d235be995

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cd6ff40b4a89af6b62ca24d431893d8fcce5cca6149f06926a0e88211a370645
MD5 3a6948dbc0339748d4c08f059198dec5
BLAKE2b-256 34cf3532944395d9e4eba7157c2c0414ad7a621e0e3757e654f166190313782b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp313-cp313-win_amd64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aa80370ed20cee201a7671634f9c58dc17fd93f15addf680d7e0393969bc51b3
MD5 ba0671296b75bb27b729120bebaaa760
BLAKE2b-256 a96565ebe0e73c700724b2f8b74ed65309f6326aaf9c2e907d9bc237ab139ae8

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ea4679e74567c145c824e1ef049ae340af5b2a1a4451324d215e58ed5db20969
MD5 b8aeb1459ff8159b690866f2007e6915
BLAKE2b-256 d5b09c3830b5d105204a2ff2775d8e8f89e1cf68f62c28dec736dcdb468c9fb1

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b8eb8d3c92b11e99fffddb846ba68f8b1ba12a3bf1bc0ccdd8c2914c7458f3a4
MD5 787096f65551e92474c0a9cd7bca1e2d
BLAKE2b-256 88baca4dbc50ed3c97454f7b4eb3a6552ea3065cd4ef934a17481c897091765b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ac60fdb981d1435faadc536c0582ada321a3a392c18ba70e94e3f3caa0f37437
MD5 2fbb9194cbf23e14b6bd5463e0c75c83
BLAKE2b-256 a350572b7f65ad961f1227ff58d2c39256b72ce5fcf5c86436a581060eeda867

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 925bbf323fdf2743491ddf411e40b5c4a12ab102e3bc7e0bfec0fed1c6defa3b
MD5 1f3c45ab64d86166289df1d4527ecbe1
BLAKE2b-256 3fb3721ba61eaca18a8d4abe8c9fe5942fa3281e53a6db6335e80236703f8719

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp312-cp312-win_amd64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ab3b0a418b3911177a77ee69fef1f4199b4a053e2ddd1c339119e58c9cd72824
MD5 ab1d10409d814c4eb042a582139a4b32
BLAKE2b-256 da5cfadbe060d821652909f7fbace3106c92dbc71bfad1faf06e8401c768c69e

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4170d1e6a3cf359b0ec7c1fb50317daa3e3e3eb12b61311260714a1e02313fbe
MD5 2428532975960daab53ca000fc56b697
BLAKE2b-256 701acd8a88eccbca175e89d3f55c61e16c1e8f1ed407f3ac1d6b05019eeb4320

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e2694afe68a0484ee7c99a79887309511f6738e562a5d2c4ff566dc791e7ec6
MD5 36d0c8e73c615cb5216d44961e53e0eb
BLAKE2b-256 2339585a1b08d634346cb7dbe158c24a2c4015a8b5f7221fddb471087f570338

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5ab17a336e7f01e3868fc454630c05596fb8a16293833fa34a7a2f946faa835f
MD5 cbea7efb5e3c5099ed4ec8b75b6e9678
BLAKE2b-256 b9e7b7cad8b31394c2123b19559d08caef14130cf8d17245005623acd7727e87

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8b56ebf586df6ec4dae0449d90bd9f6da0027bef407f2ffbb92701a9886ee43c
MD5 76d6c2d7232ab4ececda36ff2e2503d3
BLAKE2b-256 50e3fc514c4d9884ae773f987186957e3b0fe57b8abb5a46d44daf58b91ba9db

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp311-cp311-win_amd64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 292ae505727bfcfc1986c8bf653c2580faa06f46af56b9087060eafdf2a08652
MD5 b87cb20cd52cddec7260e5e86221d15c
BLAKE2b-256 72bd03fb13876057deb3028cd9bf80748f362958944f4a89565b239ada75931b

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cc1d80c53affcaf7f31b09dd3e10d87add48833b1de51f037b8fcfb549e7362f
MD5 88c7196b3d9f48315a2fbc18e9500419
BLAKE2b-256 f734d27fbf56e4f844cff649f980534fc358a2210f61ef19a021ef4c9b4c4ca0

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11e4cf0a3b2bf7b4231df4ed1f359de006001f2680676c99631df86744f9c1f2
MD5 9a8727e85e6b18a363ef21a44ad8c8d6
BLAKE2b-256 436d3b89f7b3473c2c83220a6478b30dda7f9e960f074284e507128ded568c84

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

File details

Details for the file cel_expr_python-0.1.3-cp311-cp311-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for cel_expr_python-0.1.3-cp311-cp311-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5b2ecfc4f4e8120928b446262b13977ee3326b535c1684bdc3eb2fb990298dba
MD5 8f1c42d95ffc85ed8cfa8da6726dc3a4
BLAKE2b-256 cb428a9ee05d86317fd57b8f20853c84076745ef34e38f0ab969c930e6ba8b86

See more details on using hashes here.

Provenance

The following attestation bundles were made for cel_expr_python-0.1.3-cp311-cp311-macosx_10_13_x86_64.whl:

Publisher: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
  • Statement: Publication detail:
    • Token Issuer: https://accounts.google.com
    • Service Account: cel-expr-python-py@oss-exit-gate-prod.iam.gserviceaccount.com

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