Skip to content

Instantly share code, notes, and snippets.

@agrojas
Last active February 10, 2022 13:00
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agrojas/ece06a79cb00f1f416edf2ed131d22b6 to your computer and use it in GitHub Desktop.
Save agrojas/ece06a79cb00f1f416edf2ed131d22b6 to your computer and use it in GitHub Desktop.
Ejemplo de utilización de un motor de reglas con python, utilizando la libreria (https://github.com/venmo/business-rules)
import datetime
from business_rules import run_all
from business_rules.actions import BaseActions, rule_action
from business_rules.fields import FIELD_NUMERIC
from business_rules.variables import (BaseVariables,
numeric_rule_variable,
string_rule_variable)
class User:
def __init__(self, user_name, followers, zone):
self.user_name = user_name
self.followers = followers
self.zone = zone
def __repr__(self):
return '<User(user_name={self.user_name!r},followers={self.followers!r},zone={self.zone!r})>'.format(self=self)
class Story:
def __init__(self, user, likes, dislikes, views):
self.user = user
self.likes = likes
self.dislikes = dislikes
self.views = views
self.date_time = datetime.datetime.now()
self.score = 10 # default
def __repr__(self):
return '<Story(user={self.user!r},date_time={self.date_time!r},likes={self.likes!r},dislikes={self.dislikes!r},views={self.views!r},score={self.score!r})>'.format(
self=self)
def set_score(self, score):
# Validar el score
self.score = score
class StoryVariables(BaseVariables):
def __init__(self, story):
self.story = story
@numeric_rule_variable()
def views(self):
return self.story.views
@numeric_rule_variable()
def likes(self):
return self.story.likes
@numeric_rule_variable(label='Days until expiration')
def expiration_days(self):
return (self.story.date_time.date - datetime.date.today()).days
@numeric_rule_variable()
def dislikes(self):
return self.story.dislikes
@numeric_rule_variable()
def like_rate(self):
return (self.story.likes / (self.story.dislikes + self.story.likes))
@string_rule_variable()
def user_zone(self):
return self.story.user.zone
@numeric_rule_variable()
def user_followers(self):
return self.story.user.followers
class StoryActions(BaseActions):
def __init__(self, story):
self.story = story
@rule_action(params={"score": FIELD_NUMERIC})
def top_score(self, score):
print("top_score---> {}".format(score))
calculated_score = self.story.score + 0.5 * score
self.story.set_score(calculated_score)
@rule_action(params={"bonus": FIELD_NUMERIC})
def apply_bonus(self, bonus):
print("apply_bonus---> {}".format(bonus))
calculated_score = self.story.score + 0.1 * bonus
self.story.set_score(calculated_score)
@rule_action(params={"penalty": FIELD_NUMERIC})
def apply_penalty(self, penalty):
print("apply_penalty ---> {}".format(penalty))
calculated_score = self.story.score - 0.1 * penalty
self.story.set_score(calculated_score)
rules = [
# likes < 5 AND views < 20
{"conditions": {"all": [
{"name": "likes",
"operator": "less_than",
"value": 5
},
{"name": "views",
"operator": "less_than",
"value": 20
}
]},
"actions": [
{"name": "apply_penalty",
"params": {"penalty": 10}
}
]
},
# views > 20
{"conditions": {"all": [
{"name": "views",
"operator": "greater_than",
"value": 20
},
{"name": "likes",
"operator": "greater_than",
"value": 20
}
,
{"name": "dislikes",
"operator": "less_than",
"value": 10
}
]},
"actions": [
{"name": "apply_bonus",
"params": {"bonus": 10}
}
]
}
]
if __name__ == '__main__':
# Creo las historias
user_1 = User("user_name_1", 100, "AR")
user_2 = User("user_name_2", 10, "BR")
user_3 = User("user_name_3", 10000, "AR")
story_1 = Story(user_1, 1, 0, 10)
story_2 = Story(user_2, 10, 0, 1000)
story_3 = Story(user_3, 100, 5, 1000)
stories = [story_1, story_2, story_3]
# Aplico las reglas
for story in stories:
run_all(rule_list=rules,
defined_variables=StoryVariables(story),
defined_actions=StoryActions(story),
stop_on_first_trigger=True
)
# Imprimo resultados luego de aplicar las reglas
for story in stories:
print(story)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment