From 88c9110bd4d5de2a79c91c3d8c6143d49236c745 Mon Sep 17 00:00:00 2001 From: Gabriel Guarisa Date: Wed, 15 Feb 2023 17:08:08 -0300 Subject: [PATCH] Add readme description --- README.md | 62 ++++++++- examples/age-check.json | 296 ++++++++++++++++++++++++++++++++++++++++ logo.png | Bin 15613 -> 11294 bytes 3 files changed, 355 insertions(+), 3 deletions(-) create mode 100644 examples/age-check.json diff --git a/README.md b/README.md index f2428ac..4bdac04 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- brdata + retrack

A business rules engine @@ -9,5 +9,61 @@ [![Package version](https://img.shields.io/pypi/v/retrack?color=%2334D058&label=pypi%20package)](https://pypi.org/project/retrack/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -[![Semantic Versions](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--versions-e10079.svg)](https://github.com/gabrielguarisa/brdata/releases) -[![License](https://img.shields.io/github/license/gabrielguarisa/brdata)](https://github.com/gabrielguarisa/brdata/blob/main/LICENSE) \ No newline at end of file +[![Semantic Versions](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--versions-e10079.svg)](https://github.com/gabrielguarisa/retrack/releases) +[![License](https://img.shields.io/github/license/gabrielguarisa/retrack)](https://github.com/gabrielguarisa/retrack/blob/main/LICENSE) + + + + +## Installation + +```bash +pip install retrack +``` + +## Usage + +```python +from retack.engine.parser import Parser +from retack.engine.runner import Runner + +# Parse the rule/model +parser = Parser(rule) + +# Create a runner +runner = Runner(parser) + +# Run the rule/model passing the data +runner(data) +``` + +### Creating a rule/model + +A rule is a set of conditions and actions that are executed when the conditions are met. The conditions are evaluated using the data passed to the runner. The actions are executed when the conditions are met. + +Each rule is composed of many nodes. To see each node type, check the [nodes](https://github.com/gabrielguarisa/retrack/tree/main/retrack/nodes) folder. To see some examples, check the [examples](https://github.com/gabrielguarisa/retrack/tree/main/examples) folder. + +To create a rule, you need to create a JSON file with the following structure: + +```json +{ + "nodes": { + "node id": { + "id": "node id", + "data": {}, + "inputs": {}, + "outputs": {}, + "name": "node name", + }, + ... more nodes + } +} +``` + +The `nodes` key is a dictionary of nodes. Each node has the following properties: + +- `id`: The node id. This is used to reference the node in the `inputs` and `outputs` properties. +- `data`: The node data. This is used as a metadata for the node. +- `inputs`: The node inputs. This is used to reference the node inputs. +- `outputs`: The node outputs. This is used to reference the node outputs. +- `name`: The node name. This is used to define the node type. diff --git a/examples/age-check.json b/examples/age-check.json new file mode 100644 index 0000000..a543cd8 --- /dev/null +++ b/examples/age-check.json @@ -0,0 +1,296 @@ +{ + "id": "demo@0.1.0", + "nodes": { + "0": { + "id": 0, + "data": {}, + "inputs": {}, + "outputs": { + "output_up_void": { + "connections": [ + { + "node": 2, + "input": "input_void", + "data": {} + } + ] + }, + "output_down_void": { + "connections": [ + { + "node": 3, + "input": "input_void", + "data": {} + } + ] + } + }, + "position": [ + -570.16015625, + -16.7578125 + ], + "name": "Start" + }, + "2": { + "id": 2, + "data": { + "name": "age", + "default": null + }, + "inputs": { + "input_void": { + "connections": [ + { + "node": 0, + "output": "output_up_void", + "data": {} + } + ] + } + }, + "outputs": { + "output_value": { + "connections": [ + { + "node": 4, + "input": "input_value_0", + "data": {} + } + ] + } + }, + "position": [ + -262.082231911288, + -229.52363816128795 + ], + "name": "Input" + }, + "3": { + "id": 3, + "data": { + "value": "18" + }, + "inputs": { + "input_void": { + "connections": [ + { + "node": 0, + "output": "output_down_void", + "data": {} + } + ] + } + }, + "outputs": { + "output_value": { + "connections": [ + { + "node": 4, + "input": "input_value_1", + "data": {} + } + ] + } + }, + "position": [ + -266.79444352384587, + 85.59488398537597 + ], + "name": "Constant" + }, + "4": { + "id": 4, + "data": { + "operator": ">=" + }, + "inputs": { + "input_value_0": { + "connections": [ + { + "node": 2, + "output": "output_value", + "data": {} + } + ] + }, + "input_value_1": { + "connections": [ + { + "node": 3, + "output": "output_value", + "data": {} + } + ] + } + }, + "outputs": { + "output_bool": { + "connections": [ + { + "node": 6, + "input": "input_bool", + "data": {} + } + ] + } + }, + "position": [ + 83.84765625, + -146.80078125 + ], + "name": "Check" + }, + "6": { + "id": 6, + "data": {}, + "inputs": { + "input_bool": { + "connections": [ + { + "node": 4, + "output": "output_bool", + "data": {} + } + ] + } + }, + "outputs": { + "output_then_filter": { + "connections": [ + { + "node": 9, + "input": "input_void", + "data": {} + } + ] + }, + "output_else_filter": { + "connections": [ + { + "node": 8, + "input": "input_void", + "data": {} + } + ] + } + }, + "position": [ + 387.98276806872417, + -127.24641593097007 + ], + "name": "If" + }, + "7": { + "id": 7, + "data": { + "message": "invalid age" + }, + "inputs": { + "input_bool": { + "connections": [ + { + "node": 8, + "output": "output_bool", + "data": {} + } + ] + } + }, + "outputs": {}, + "position": [ + 972.3247551810931, + -8.462733235746624 + ], + "name": "BoolOutput" + }, + "8": { + "id": 8, + "data": { + "value": null + }, + "inputs": { + "input_void": { + "connections": [ + { + "node": 6, + "output": "output_else_filter", + "data": {} + } + ] + } + }, + "outputs": { + "output_bool": { + "connections": [ + { + "node": 7, + "input": "input_bool", + "data": {} + } + ] + } + }, + "position": [ + 696.7790861556878, + -16.077469330043932 + ], + "name": "Bool" + }, + "9": { + "id": 9, + "data": { + "value": true + }, + "inputs": { + "input_void": { + "connections": [ + { + "node": 6, + "output": "output_then_filter", + "data": {} + } + ] + } + }, + "outputs": { + "output_bool": { + "connections": [ + { + "node": 10, + "input": "input_bool", + "data": {} + } + ] + } + }, + "position": [ + 693.7214037048345, + -194.67415220412568 + ], + "name": "Bool" + }, + "10": { + "id": 10, + "data": { + "message": "valid age" + }, + "inputs": { + "input_bool": { + "connections": [ + { + "node": 9, + "output": "output_bool", + "data": {} + } + ] + } + }, + "outputs": {}, + "position": [ + 974.0269089794663, + -190.8242802623253 + ], + "name": "BoolOutput" + } + } +} \ No newline at end of file diff --git a/logo.png b/logo.png index 05981eb572860af9955cfc25c11a324bc864aa08..b35971de2a3c5a142bc0e4fa3256e1967cb8d203 100644 GIT binary patch literal 11294 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ďT|W$C}l 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