From 6880c09be9b4844c82b16f35d2f69853b9140bef Mon Sep 17 00:00:00 2001 From: Dusan Orlovic Date: Tue, 13 Sep 2022 17:51:37 +0200 Subject: [PATCH 1/2] Use require_relative syntax --- README.markdown | 8 ++++++++ examples/fibonacci_example1.rb | 4 ++-- examples/fibonacci_example2.rb | 4 ++-- examples/ticket.rb | 8 ++++---- tests/test.rb | 20 ++++++++++---------- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/README.markdown b/README.markdown index 8fff2ab..21155fd 100644 --- a/README.markdown +++ b/README.markdown @@ -8,6 +8,14 @@ of IF-THEN statements known as production rules. These rules are matched to obje the forward chaining Rete algorithm. Ruleby provides an internal Domain Specific Language (DSL) for building the productions that make up a Ruleby program. +Test +------------- + +Run test with +``` +ruby test/test.rb +``` + Version ------- 0.9.b7 diff --git a/examples/fibonacci_example1.rb b/examples/fibonacci_example1.rb index 7b0636e..c3a31f8 100644 --- a/examples/fibonacci_example1.rb +++ b/examples/fibonacci_example1.rb @@ -11,7 +11,7 @@ $LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/') require 'ruleby' -require 'fibonacci_rulebook' +require_relative 'fibonacci_rulebook' class Fibonacci def initialize(sequence,value=-1) @sequence = sequence @@ -41,4 +41,4 @@ def to_s end t2 = Time.new diff = t2.to_f - t1.to_f -puts diff.to_s \ No newline at end of file +puts diff.to_s diff --git a/examples/fibonacci_example2.rb b/examples/fibonacci_example2.rb index 1160f46..9aa480b 100644 --- a/examples/fibonacci_example2.rb +++ b/examples/fibonacci_example2.rb @@ -11,7 +11,7 @@ $LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/') require 'ruleby' -require 'fibonacci_rulebook' +require_relative 'fibonacci_rulebook' class Fibonacci def initialize(sequence,value=-1) @sequence = sequence @@ -37,4 +37,4 @@ def to_s e.assert fib1 e.assert fib2 e.match -end \ No newline at end of file +end diff --git a/examples/ticket.rb b/examples/ticket.rb index bcfd104..649036e 100644 --- a/examples/ticket.rb +++ b/examples/ticket.rb @@ -46,7 +46,7 @@ def rules # the same rule set. rule :New_Ticket, {:priority => 10}, # :duration => 10}, [Customer, :c], - [Ticket, :ticket, {m.customer => :c}, m.status == :New] do |vars| + [Ticket, :ticket, {m.customer => :ticket_customer}, m.customer == b(:c), m.status == :New] do |vars| puts 'New : ' + vars[:ticket].to_s end @@ -75,13 +75,13 @@ def rules rule :Escalate, [Customer, :c], - [Ticket, :ticket, {m.customer => :c}, m.status == :Escalate] do |vars| + [Ticket, :ticket, {m.customer => :ticket_customer}, m.customer == b(:c), m.status == :Escalate] do |vars| puts 'Email : ' + vars[:ticket].to_s end rule :Done, [Customer, :c], - [Ticket, :ticket, {m.customer => :c}, m.status == :Done] do |vars| + [Ticket, :ticket, {m.customer => :ticket_cutomer}, m.customer == b(:c), m.status == :Done] do |vars| puts 'Done : ' + vars[:ticket].to_s end end @@ -110,4 +110,4 @@ def rules e.assert t3 e.assert t4 e.match -end \ No newline at end of file +end diff --git a/tests/test.rb b/tests/test.rb index 63f6d38..b89a033 100644 --- a/tests/test.rb +++ b/tests/test.rb @@ -8,13 +8,13 @@ # # * Authors: John Mettraux # -require 'common' -require 'duck_type' -require 'self_reference' -require 'regex' -require 'gets' -require 'assert_facts' -require 'not_patterns' -require 'or_patterns' -require 'join_nodes' -require 'nil' +require_relative 'common' +require_relative 'duck_type' +require_relative 'self_reference' +require_relative 'regex' +require_relative 'gets' +require_relative 'assert_facts' +require_relative 'not_patterns' +require_relative 'or_patterns' +require_relative 'join_nodes' +require_relative 'nil' From bf7a91995deba10e377e1c33246428e659aeaeff Mon Sep 17 00:00:00 2001 From: Dusan Orlovic Date: Tue, 13 Sep 2022 17:55:32 +0200 Subject: [PATCH 2/2] Use sort_by.with_index to preserve order On different computers sort behaves differently for array of objects with equal properties. This way we preserve original order of rules --- lib/core/engine.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/core/engine.rb b/lib/core/engine.rb index 92e8ec7..71b66b8 100644 --- a/lib/core/engine.rb +++ b/lib/core/engine.rb @@ -139,7 +139,10 @@ def to_s # properties of the activation. class RulebyConflictResolver def resolve(agenda) - return agenda.sort + # Sorting objects with equal properties will not preserve original sort so + # we need to use index since someone could rely on the order of rules + # https://stackoverflow.com/a/64793425/287166 + agenda.sort_by.with_index { |a, i| [a, i] } end end @@ -296,4 +299,4 @@ def retract_fact(fact) end end end -end \ No newline at end of file +end