Rule Evaluation Context

The Basic example of the quick start guide shows how the virtual machine needs some context to evaluate the rules:

from mucho.comparison import ComparisonResult
from mucho.dsl.compiler import Compiler
from mucho.dsl.virtualmachine import VirtualMachine

rules_text = """
discarded: Those whose titles are very different
titles.similarity <= 50
=> mismatch

perfect: Those matching almost perfectly
titles.similarity >= 90 and years.difference < 2
=> match
"""

compiler = Compiler()
rules = compiler.compile(rules_text, debug=True)

context = ComparisonResult(
    titles=ComparisionResult(similarity=95),
    years=ComparisonResult(difference=1))

virtual_machine = VirtualMachine()
satisfied_rule = virtual_machine.run(rules, context)
if satisfied_rule:
    print("Rule '{0}' was satisfied with result: {1}".format(
        satisfied_rule.id, satisfied_rule.result.value))
else:
    print("No rule was satisfied")

This context provides the values of the variables used in the rules, e.g. it sets titles.similarity value to 95.

Although the context is modeled with the class mucho.comparison.result.result.ComparisonResult, the method mucho.dsl.virtualmachine.virtualmachine.VirtualMachine.run() will accept as a valid context any object that can be accessed via the dot notation.

Returning to the example, a way to specify the value of the titles.similarity variable is defining it in a ComparisonResult object:

context = ComparisonResult(
    titles=ComparisionResult(similarity=95),
    years=ComparisonResult(difference=1))