business-rule-engine
As a software system grows in complexity and usage, it can become burdensome if every change to the logic/behavior of the system also requires you to write and deploy new code. The goal of this business rules engine is to provide a simple interface allowing anyone to capture new rules and logic defining the behavior of a system, and a way to then process those rules on the backend.
You might, for example, find this is a useful way for analysts to define marketing logic around when certain customers or items are eligible for a discount or to automate emails after users enter a certain state or go through a particular sequence of events.
Usage
1. Define Your set of variables
Variables represent values in your system, usually the value of some particular object. You create rules by setting threshold conditions such that when a variable is computed that triggers the condition some action is taken.
params = {
'products_in_stock': 10
}
2. Define custom functions
def order_more(items_to_order):
print("you ordered {} new items".format(items_to_order))
return items_to_order
3. Write the rules
rules = """
rule "order new items"
when
products_in_stock < 20
then
order_more(50)
end
"""
3. Create the parser and parse the rule
from business_rule_engine import RuleParser
parser = RuleParser()
parser.register_function(order_more)
parser.parsestr(rules)
parser.execute(params)
Supported functions
Business rule engine uses Excel like functions (thanks to formulas. So it is possible to use most of them in rules.
Multiple conditions and multiple actions
You can make multiple checks on the same params, and call multiple actions as needed:
rules = """
rule "order new items"
when
AND(products_in_stock < 20,
products_in_stock >= 5)
then
order_more(50)
end
rule "order new items urgent"
when
products_in_stock < 5,
then
AND(order_more(10, true),
order_more(50))
end
"""
Custom functions
You can also write your own functions to validate conditions and use other libraries functions as actions:
from business_rule_engine import RuleParser
def is_even(num):
if (num % 2) == 0:
return True
return False
params = {
'number': 10
}
rules = """
rule "check even number"
when
is_even(number) = True
then
print("is even")
end
"""
parser = RuleParser()
parser.register_function(is_even)
parser.register_function(print)
parser.parsestr(rules)
parser.execute(params)
Handle missing rule parameters
If some argruments are missing, the rule engine will raise a ValueError.
There are some use cases, when you have to work with incomplete data. In such cases, you can define default arguments.
You enable default rule arguments with the parameter set_defaule_arg. The default argument will have the Value None. To provide another value you can use default_arg.
params = {}
rules = """
rule "order new items"
when
products_in_stock < 20
then
order_more(50)
end
"""
parser = RuleParser()
parser.register_function(order_more)
parser.parsestr(rules)
parser.execute(params, set_default_arg=True, default_arg=0)
Error Handling
Most of the errors are caused by missing parameters, you can handle the errors and interpret the results handling ValueError:
from business_rule_engine import RuleParser
# proposital typo
params = {
'produtcs_in_stock': 30
}
rules = """
rule "order new items"
when
products_in_stock < 20
then
order_more(50)
end
"""
parser = RuleParser()
parser.register_function(order_more)
parser.parsestr(rules)
try:
ret = parser.execute(params)
if ret is False:
print("No conditions matched")
except ValueError as e:
print(e)
Debug
To debug the rules processing, use the logging lib.
You can insert in your Python script to log to stdout:
import logging
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
Metadata
Release files for business-rule-engine 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| business-rule-engine-0.1.0.tar.gz | 5.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| business_rule_engine-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.6 kB
Release files / business-rule-engine-0.1.0.tar.gz
| Download URL | business-rule-engine-0.1.0.tar.gz |
|---|---|
| Size | 5.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e3b2bcd8d7c39ab2153e28f576964fba669dedad2fbd492630d0b3a51cd4111
|
|
BLAKE2b-256 checksum How to use checksums |
b5235cba9d072ec3368e8c348385d0362b57ac16d58f37e331d37c74b6abf149
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4
|
Release files / business_rule_engine-0.1.0-py3-none-any.whl
| Download URL | business_rule_engine-0.1.0-py3-none-any.whl |
|---|---|
| Size | 17.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5666fa6bf1d82855051a831bb2636bba09239800f504efbff1ff18957656d3b9
|
|
BLAKE2b-256 checksum How to use checksums |
15a50f8bed4ac1955e9419674816c25c6421bb4c98bed5361efe30449ba04cd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4
|
Security for business-rule-engine 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.