Skip to main content

Open-Source Business Rules Engine

Project description

License: MIT

Python Rules Engine

ZEN Engine is a cross-platform, Open-Source Business Rules Engine (BRE). It is written in Rust and provides native bindings for NodeJS, Python and Go. ZEN Engine allows to load and execute JSON Decision Model (JDM) from JSON files.

Open-Source Rules Engine

An open-source React editor is available on our JDM Editor repo.

Usage

ZEN Engine is built as embeddable BRE for your Rust, NodeJS, Python or Go applications. It parses JDM from JSON content. It is up to you to obtain the JSON content, e.g. from file system, database or service call.

Installation

pip install zen-engine

Usage

To execute a simple decision you can use the code below.

import zen

# Example filesystem content, it is up to you how you obtain content
with open("./jdm_graph.json", "r") as f:
  content = f.read()

engine = zen.ZenEngine()

decision = engine.create_decision(content)
result = decision.evaluate({"input": 15})

Loaders

For more advanced use cases where you want to load multiple decisions and utilise graphs you can build loaders.

import zen

def loader(key):
    with open("./jdm_directory/" + key, "r") as f:
        return f.read()

engine = zen.ZenEngine({"loader": loader})
result = engine.evaluate("jdm_graph1.json", {"input": 5})

When engine.evaluate is invoked it will call loader and pass a key expecting a content of the JDM decision graph. In the case above we will assume file jdm_directory/jdm_graph1.json exists.

Similar to this example you can also utilise loader to load from different places, for example from REST API, from S3, Database, etc.

Supported Platforms

List of platforms where Zen Engine is natively available:

For a complete Business Rules Management Systems (BRMS) solution:

JSON Decision Model (JDM)

GoRules JDM (JSON Decision Model) is a modeling framework designed to streamline the representation and implementation of decision models.

Understanding GoRules JDM

At its core, GoRules JDM revolves around the concept of decision models as interconnected graphs stored in JSON format. These graphs capture the intricate relationships between various decision points, conditions, and outcomes in a GoRules Zen-Engine.

Graphs are made by linking nodes with edges, which act like pathways for moving information from one node to another, usually from the left to the right.

The Input node serves as an entry for all data relevant to the context, while the Output nodes produce the result of decision-making process. The progression of data follows a path from the Input Node to the Output Node, traversing all interconnected nodes in between. As the data flows through this network, it undergoes evaluation at each node, and connections determine where the data is passed along the graph.

To see JDM Graph in action you can use Free Online Editor with built in Simulator.

There are 5 main node types in addition to a graph Input Node (Request) and Output Node (Response):

  • Decision Table Node
  • Switch Node
  • Function Node
  • Expression Node
  • Decision Node

Decision Table Node

Overview

Tables provide a structured representation of decision-making processes, allowing developers and business users to express complex rules in a clear and concise manner.

Decision Table

Structure

At the core of the Decision Table is its schema, defining the structure with inputs and outputs. Inputs encompass business-friendly expressions using the ZEN Expression Language, accommodating a range of conditions such as equality, numeric comparisons, boolean values, date time functions, array functions and more. The schema's outputs dictate the form of results generated by the Decision Table. Inputs and outputs are expressed through a user-friendly interface, often resembling a spreadsheet. This facilitates easy modification and addition of rules, enabling business users to contribute to decision logic without delving into intricate code.

Evaluation Process

Decision Tables are evaluated row by row, from top to bottom, adhering to a specified hit policy. Single row is evaluated via Inputs columns, from left to right. Each input column represents AND operator. If cell is empty that column is evaluated truthfully, independently of the value.

If a single cell within a row fails (due to error, or otherwise), the row is skipped.

HitPolicy

The hit policy determines the outcome calculation based on matching rules.

The result of the evaluation is:

  • an object if the hit policy of the decision table is first and a rule matched. The structure is defined by the output fields. Qualified field names with a dot (.) inside lead to nested objects.
  • null/undefined if no rule matched in first hit policy
  • an array of objects if the hit policy of the decision table is collect (one array item for each matching rule) or empty array if no rules match

Inputs

In the assessment of rules or rows, input columns embody the AND operator. The values typically consist of (qualified) names, such as customer.country or customer.age.

There are two types of evaluation of inputs, Unary and Expression.

Unary Evaluation

Unary evaluation is usually used when we would like to compare single fields from incoming context separately, for example customer.country and cart.total . It is activated when a column has field defined in its schema.

Example

For the input:

{
  "customer": {
    "country": "US"
  },
  "cart": {
    "total": 1500
  }
}
Decision Table Unary Test

This evaluation translates to

IF customer.country == 'US' AND cart.total > 1000 THEN {"fees": {"percent": 2}}
ELSE IF customer.country == 'US' THEN {"fees": {"flat": 30}}
ELSE IF customer.country == 'CA' OR customer.country == 'MX' THEN {"fees": {"flat": 50}}
ELSE {"fees": {"flat": 150}}

List shows basic example of the unary tests in the Input Fields:

Input entry Input Expression
"A" the field equals "A"
"A", "B" the field is either "A" or "B"
36 the numeric value equals 36
< 36 a value less than 36
> 36 a value greater than 36
[20..39] a value between 20 and 39 (inclusive)
20,39 a value either 20 or 39
<20, >39 a value either less than 20 or greater than 39
true the boolean value true
false the boolean value false
any value, even null/undefined
null the value null or undefined

Note: For the full list please visit ZEN Expression Language.

Expression Evaluation

Expression evaluation is used when we would like to create more complex evaluation logic inside single cell. It allows us to compare multiple fields from the incoming context inside same cell.

It can be used by providing an empty Selector (field) inside column configuration.

Example

For the input:

{
  "transaction": {
    "country": "US",
    "createdAt": "2023-11-20T19:00:25Z",
    "amount": 10000
  }
}
Decision Table Expression
IF time(transaction.createdAt) > time("17:00:00") AND transaction.amount > 1000 THEN {"status": "reject"}
ELSE {"status": "approve"}

Note: For the full list please visit ZEN Expression Language.

Outputs

Output columns serve as the blueprint for the data that the decision table will generate when the conditions are met during evaluation.

When a row in the decision table satisfies its specified conditions, the output columns determine the nature and structure of the information that will be returned. Each output column represents a distinct field, and the collective set of these fields forms the output or result associated with the validated row. This mechanism allows decision tables to precisely define and control the data output.

Example

Decision Table Output

And the result would be:

{
  "flatProperty": "A",
  "output": {
    "nested": {
      "property": "B"
    },
    "property": 36
  }
}

Switch Node (NEW)

The Switch node in GoRules JDM introduces a dynamic branching mechanism to decision models, enabling the graph to diverge based on conditions.

Conditions are written in a Zen Expression Language.

By incorporating the Switch node, decision models become more flexible and context-aware. This capability is particularly valuable in scenarios where diverse decision logic is required based on varying inputs. The Switch node efficiently manages branching within the graph, enhancing the overall complexity and realism of decision models in GoRules JDM, making it a pivotal component for crafting intelligent and adaptive systems.

The Switch node preserves the incoming data without modification; it forwards the entire context to the output branch(es).

Switch / Branching

HitPolicy

There are two HitPolicy options for the switch node, first and collect.

In the context of a first hit policy, the graph branches to the initial matching condition, analogous to the behavior observed in a table. Conversely, under a collect hit policy, the graph extends to all branches where conditions hold true, allowing branching to multiple paths.

Note: If there are multiple edges from the same condition, there is no guaranteed order of execution.

Available from:

  • Python 0.16.0
  • NodeJS 0.13.0
  • Rust 0.16.0
  • Go 0.1.0

Functions Node

Function nodes are JavaScript snippets that allow for quick and easy parsing, re-mapping or otherwise modifying the data using JavaScript. Inputs of the node are provided as function's arguments. Functions are executed on top of QuickJS Engine that is bundled into the ZEN Engine.

Function timeout is set to a 50ms.

const handler = (input, {dayjs, Big}) => {
    return {
        ...input,
        someField: 'hello'
    };
};

There are two built in libraries:

  • dayjs - for Date Manipulation
  • big.js - for arbitrary-precision decimal arithmetic.

Expression Node

The Expression node serves as a tool for transforming input objects into alternative objects using the Zen Expression Language. When specifying the output properties, each property requires a separate row. These rows are defined by two fields:

  • Key - qualified name of the output property
  • Value - value expressed through the Zen Expression Language

Note: Any errors within the Expression node will bring the graph to a halt.

Decision Table

Decision Node

The "Decision" node is designed to extend the capabilities of decision models. Its function is to invoke and reuse other decision models during execution.

By incorporating the "Decision" node, developers can modularize decision logic, promoting reusability and maintainability in complex systems.

Support matrix

Arch Rust NodeJS Python Go
linux-x64-gnu :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
linux-arm64-gnu :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
darwin-x64 :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
darwin-arm64 :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
win32-x64-msvc :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:

We do not support linux-musl currently.

Contribution

JDM standard is growing and we need to keep tight control over its development and roadmap as there are number of companies that are using GoRules Zen-Engine and GoRules BRMS. For this reason we can't accept any code contributions at this moment, apart from help with documentation and additional tests.

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

zen_engine-0.49.1.tar.gz (201.0 kB view details)

Uploaded Source

Built Distributions

zen_engine-0.49.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp313-cp313t-manylinux_2_28_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp313-cp313-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.13Windows x86-64

zen_engine-0.49.1-cp313-cp313-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp313-cp313-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp313-cp313-macosx_11_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

zen_engine-0.49.1-cp313-cp313-macosx_10_12_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

zen_engine-0.49.1-cp312-cp312-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.12Windows x86-64

zen_engine-0.49.1-cp312-cp312-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp312-cp312-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp312-cp312-macosx_11_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

zen_engine-0.49.1-cp312-cp312-macosx_10_12_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

zen_engine-0.49.1-cp311-cp311-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.11Windows x86-64

zen_engine-0.49.1-cp311-cp311-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp311-cp311-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp311-cp311-macosx_11_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

zen_engine-0.49.1-cp311-cp311-macosx_10_12_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

zen_engine-0.49.1-cp310-cp310-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.10Windows x86-64

zen_engine-0.49.1-cp310-cp310-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp310-cp310-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp39-cp39-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.9Windows x86-64

zen_engine-0.49.1-cp39-cp39-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp39-cp39-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp38-cp38-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp38-cp38-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ x86-64

zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_aarch64.whl (4.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ ARM64

File details

Details for the file zen_engine-0.49.1.tar.gz.

File metadata

  • Download URL: zen_engine-0.49.1.tar.gz
  • Upload date:
  • Size: 201.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.0

File hashes

Hashes for zen_engine-0.49.1.tar.gz
Algorithm Hash digest
SHA256 237ef4ba5f7991e5202390ee2273063910809ec62f54de2652c03277c0a94b58
MD5 7a390b9a2de4d2951014b99a1875c10a
BLAKE2b-256 bbb8be3bca997ced41e9fb55f28b1417f1fbcc79c552777089154dc35f9173b1

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 be403be2b5c16f070add5dbbcfedcc5a0ab93c997197d03eea56d2227ad43484
MD5 4902d12c985326b4303294ab5426d4c0
BLAKE2b-256 725dadb4e9759659eb08011a8b165f0d34fed801081ceabd0389a3c61b192d59

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0bf57fa4f925b0ce244ad7a2fa4defad07c579a11ce788e8c17a9c88d51ca592
MD5 bd496987cc34027d767f21f345451491
BLAKE2b-256 b341fd617fa73a16cfb4aad9284e3e8e012843ea2b36c17ed77ee63eb5165c45

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 17a2a40cd49d4df62b75370d7e122b46ddbf4a1ed2f59c8b1a25885429bde0e2
MD5 912f64e1a57591c39a88d675a9be26d9
BLAKE2b-256 0b5fb20687f1efb2de0ad1c78c91b5b6c2c5ac9e86063437e65f0d1bbb45e4ee

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0f211d04802497f071a1ed64416877cb5c08846e93682413d5f75be13546f97f
MD5 6719f19cdb9795aee036f8c932a26a85
BLAKE2b-256 579ac5617b6396c5b7a511af5759c8a1634f34dcb95b2064e090e994a55b35ce

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0a2fac6593562c120ca50f919c6860beac3901e716c0ceb8c26b05199999d157
MD5 d83ef0a6d6e3a55c7b83a0766a7fbe57
BLAKE2b-256 9c3529af4d8913a134d9a5725111cf20d7d822aad691401c0403572db030e5fb

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 de6e73c567618f283a1a80bed95e5bf83697efb2351621b540b629825541d022
MD5 a1dc0b69cbcdb4898afb2014d9d323a6
BLAKE2b-256 c3ce568ec524086cd0c0eb93f1d2a22fbf56d16f1532cc55cb0fa99e0d1735c4

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 72f5e87023fc0b420c9fb0ab5a5b208121819f063e79a91e2e3a7419d41ee475
MD5 670cb060e8484fee3fec539e50bb18f2
BLAKE2b-256 82704715d2b2982ea66b6a41fb8173143c10e991e3afe3fe3a693ff47c898f62

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 72e05946b52d739de4ec50d97d3e4532265f98951904f5fb4c263861a3083e67
MD5 1317e58dd573ce459b5809849b593299
BLAKE2b-256 ceb6f6090c672acdcbd7451a188add8cc35d15658c1956a43e0a98a8a8b3f0fe

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 969af69f1a92a1d505594592edaebfc76c7e3c2a7c7e1f3bcea151314e26eb64
MD5 f83d093b213b0ac8a8014e73659ca110
BLAKE2b-256 f0906f188659fdd37233a5ace6acf7ccb62755413507be5d2fe467dcc7b7a4d6

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf0963403db387c6e37b5fbf12c66cd67f9b351e33a5940af1ab681033a28efd
MD5 c4d32b431d7ed7e705fd7421d53a7114
BLAKE2b-256 13e08d03bb4c694227c22a127ff96b744232f3a9e4fe1a6dc5ab917f0db59f25

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3bc01ddcb6d04dac70c06ff12aa103f1eaf60f2b5da4ffbcc89f9f111ca85a0b
MD5 86dd44791b74df5b9250ee487cf2798d
BLAKE2b-256 724a52acba61c998a14dc66e0c4326de0278c54a849efaf0968ec4dd64ebb6c3

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7cb825eabde3d3f191117c623a4446aa59fa54b8f8e7dd646e9a44c1282e5603
MD5 2fb3066a1f2a960ec506be96f44097ee
BLAKE2b-256 69f77d04834e44980f60cbe9c7d5c0787e996ad5569643ce9e81c9c9d8cdec47

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d446810e30e28e0e4c329f649be680512f7fb428930f4628699b8563e8aee852
MD5 6b7355304c5398da720a9555f96b7d85
BLAKE2b-256 8737b92c2cdab5dfa3c1f2b74737d810d02cc9bb9506bd9e747bae563ad5526e

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 48f26df44a258afa3d985c04f7eaa39f36d19231efc5538208f67b05d853d0e6
MD5 ca315efa95d5a0e0518bf35ada72a696
BLAKE2b-256 5de3fd082e0c3bb664869662166f5591e4e6a0f198141c2bdad3feef75957cd9

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 364fc3a5744c47325d8b70c11ba7cedb014c053c990fe5b9754694927f21f63f
MD5 877850d824a51a9e763f7dee0fe850fd
BLAKE2b-256 80243038fe9a1d9dc9dab4a515111860de01e273e2af77c47d385c5c2a2cb2fe

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 62d81eec254e0cd7665bd33d53ab398e8222d4e5eb0b55e3e8940ab364a6c6b2
MD5 e7f7cb0e451875bef30f3b610572f0ed
BLAKE2b-256 c6debdb4c720656c7c7d905893e4773324a3fa9c585c6e76789ea3e0d4bbc932

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9e635a6eaf69443996718735e8a8bae82324b18b0f20f73f916753facb7c8b63
MD5 eda693dc99bffd581e77e70ebb522474
BLAKE2b-256 39ab8f4f5f4d1fe8498a78891061a509e91e617291fcfc7697f8ca5dd8645ead

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e98a87db1cd2eec8e858f93e18378a3d62b6d1970e7ea63c95d67d7e8a0b77a8
MD5 0689c2f21ec44a5a5ab9ce83682f936c
BLAKE2b-256 a39f0c1871e1ac30423889b06546cd4aced35c38af0b0717ba1804cb4000fbf3

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9ffe650740bef25999aeeee28382cb86d5e43543069aad9338efd024cf1504e9
MD5 b16b8a6484cd40a1485d3aa9ad5faf26
BLAKE2b-256 f693ab8d6e4eacc081de4a37cefae1b490b1e49c91d71327dbf512367b43abcc

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ebfcebfc2de1f4b9a80b1185dd8209f2fc5fc8257d748de0de57fe22f830aa8e
MD5 fe21ad200b3eebf12d0e8390aca06a36
BLAKE2b-256 5c66c12f586947f7ddd46d379fc67cea23503680319f218c5797c395eedadd7f

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3f10d9fddbad6371ba657f203a9c578239126a1ac79c0268fe69c871693e5860
MD5 a10c37b2d39154d64c38400f36f4f4ab
BLAKE2b-256 5a04b47117e2088ecbf567ffe7ac034a5f0a0d2fa26e7a23bb8c5432d13ec4c7

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 08893172eaad3bd8e4a83a540064960348beecef9757fe1e7248e874c2a6bef1
MD5 0eb7a13d54fa360ef83c1b8f57293949
BLAKE2b-256 55cb2110f758e1019417f2c68032bc7f2eae8f0eeeb778ae5c0cb130de724b0f

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b15330550867a9b155ba10918ea171c8dbc4a353108d7e0a210d1d1821375216
MD5 ee3cd054d2c188bbbf2b417d7c1f4cdd
BLAKE2b-256 dd0b28402cfe212623679258b6ffd60a67d887254101d1dc16be2520a6fd2aa8

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 afc1f4500b3ea4fd2cda86f28778b06d8e63dafa4520ff900c5ce632f208200b
MD5 1837dcb890d847e0579695529456d6a2
BLAKE2b-256 8656b3aee66e6f842a69d1641425bc4aa3f990c2423db5c0aa38d084ea531f0e

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 97d27048e33456b88a82c4f16bd3c3b894dda9d9a4c48619191993166d3150e1
MD5 cf2b5c70389c777c0935a0f394a05e7a
BLAKE2b-256 205f52d0d276dfff5291e61469eaa6a700ab46d743d197b301c76b5e98a43a2b

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86b3bd9d62bec7b729dc77ce600610dd932fd7b7d86b1aafcbad9aa889b925a8
MD5 f697af6aa044a7895b613b70f69a4d28
BLAKE2b-256 17c51cd296a003633efe4d03b1b8e2586cdd7f9100d39cbc37c2410034c550d0

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 912ab764a1ba7493f5dd1723a7a3aae75de7f2ecd91a79d5f0d2ae214a138fc1
MD5 19251ecf26fd42bd443be5a5e062930b
BLAKE2b-256 e006ffdeb4b34c4bd95756a601cf6dbcb01f9f1cb7e5236f538f84ec63dd6aba

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7de67020c88de547e0104397ebdc252ec2d0d51b5ec4924fd1f8879261bfa2a5
MD5 255e7b616c682f1bfeb7426bbf5dbdfb
BLAKE2b-256 5f11e30aa3487766dcb62d20e0910b6fc05d3cb415dd043d2fe88796e212592e

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8a1ceab9c377e00de49df816f6486295534691d34be4b70f91064eb83e158abc
MD5 4ddf6bca2335ab8ce506b7c296a0d15c
BLAKE2b-256 a0f6e64f5611e341177dc54604e8e5e79b0cb96cc86f4e499ee9373a5d2539b0

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7d0a9a0fe440f509caf8ea255392944d9440513bd26ccfc2e0749b5994e8f483
MD5 304fbce98130d6fe47c4a693cdd0b4b5
BLAKE2b-256 6fb3377d68c067deadb24720ca1c484ea1ac664b269399979e1802ac9591bffd

See more details on using hashes here.

File details

Details for the file zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zen_engine-0.49.1-cp37-cp37m-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 38fb613caf4f52ba2bed3b940728e7e5e6f261fd82b24ae17a9197f1e9fd945f
MD5 e6083628862d53620ea5b8b5d043539d
BLAKE2b-256 356bb893a587b3ffe148431bf81a8add588427e57e1cdcb4144acbfaa8a43d23

See more details on using hashes here.

Supported by

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