rules_engine 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/rules_engine.rb +2 -2
- data/lib/rules_engine/discovery.rb +1 -1
- data/lib/rules_engine/process/runner.rb +3 -3
- data/lib/rules_engine/rule/definition.rb +85 -0
- data/lib/rules_engine/rule/outcome.rb +19 -0
- data/rails_generators/manifests/complex.rb +30 -0
- data/rails_generators/manifests/complex.yml +24 -0
- data/rails_generators/manifests/simple.rb +26 -0
- data/rails_generators/manifests/simple.yml +21 -0
- data/rails_generators/rules_engine_generator.rb +2 -2
- data/rails_generators/templates/app/models/re_rule.rb +4 -4
- data/rails_generators/templates/app/models/re_rule_expected_outcome.rb +1 -1
- data/rails_generators/templates/app/rules/complex.rb +133 -0
- data/rails_generators/templates/app/rules/simple.rb +83 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_edit.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_help.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_new.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_script.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_title.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_word.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_words.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/{rule_complex → complex}/_workflow.html.erb +0 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_edit.html.erb +1 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_form.html.erb +16 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_help.html.erb +1 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_new.html.erb +1 -0
- data/rails_generators/templates/doc/README.rules_engine +1 -1
- data/rails_generators/templates/spec/lib/rules/{rule_complex_spec.rb → complex_spec.rb} +30 -30
- data/rails_generators/templates/spec/lib/rules/simple_spec.rb +161 -0
- data/rails_generators/templates/spec/models/re_rule_expected_outcome_spec.rb +3 -3
- data/rails_generators/templates/spec/models/re_rule_spec.rb +11 -11
- data/spec/railsenv/app/rules/mock_rule.rb +9 -10
- data/spec/railsenv/log/debug.log +1356 -0
- data/spec/railsenv/log/test.log +78 -0
- data/spec/rules_engine/discovery_spec.rb +17 -7
- data/spec/rules_engine/process/runner_spec.rb +8 -8
- data/spec/rules_engine/{rule_spec.rb → rule/definition_spec.rb} +17 -17
- metadata +27 -27
- data/lib/rules_engine/rule.rb +0 -84
- data/lib/rules_engine/rule_outcome.rb +0 -17
- data/rails_generators/manifests/rule_complex.rb +0 -30
- data/rails_generators/manifests/rule_complex.yml +0 -24
- data/rails_generators/manifests/rule_simple.rb +0 -26
- data/rails_generators/manifests/rule_simple.yml +0 -21
- data/rails_generators/templates/app/rules/rule_complex.rb +0 -130
- data/rails_generators/templates/app/rules/rule_simple.rb +0 -79
- data/rails_generators/templates/app/views/re_rule_definitions/rule_simple/_edit.html.erb +0 -1
- data/rails_generators/templates/app/views/re_rule_definitions/rule_simple/_form.html.erb +0 -16
- data/rails_generators/templates/app/views/re_rule_definitions/rule_simple/_help.html.erb +0 -1
- data/rails_generators/templates/app/views/re_rule_definitions/rule_simple/_new.html.erb +0 -1
- data/rails_generators/templates/spec/lib/rules/rule_simple_spec.rb +0 -161
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/lib/rules_engine.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/discovery")
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/rule")
|
3
|
-
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/rule/definition")
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/rule/outcome")
|
4
4
|
|
5
5
|
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/cache")
|
6
6
|
require File.expand_path(File.dirname(__FILE__) + "/rules_engine/publish/publisher")
|
@@ -23,7 +23,7 @@ module RulesEngine
|
|
23
23
|
Dir.glob("#{rules_path}/**/*.rb").each do |rule|
|
24
24
|
Kernel.load rule
|
25
25
|
|
26
|
-
rule_class =
|
26
|
+
rule_class = Rule.const_get(File.basename(rule, '.rb').classify)
|
27
27
|
@rule_classes << rule_class
|
28
28
|
|
29
29
|
group = rule_class.options[:group]
|
@@ -98,19 +98,19 @@ module RulesEngine
|
|
98
98
|
rule_outcome = rule.process(process_id, data)
|
99
99
|
RulesEngine::Process.auditor.audit(process_id, "Rule : #{rule.title} : finished")
|
100
100
|
|
101
|
-
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::
|
101
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::Rule::Outcome::STOP_SUCCESS
|
102
102
|
RulesEngine::Process.auditor.audit(process_id, "Workflow : #{current_workflow} : stop success", RulesEngine::Process::AUDIT_SUCCESS)
|
103
103
|
done = true
|
104
104
|
break
|
105
105
|
end
|
106
106
|
|
107
|
-
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::
|
107
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::Rule::Outcome::STOP_FAILURE
|
108
108
|
RulesEngine::Process.auditor.audit(process_id, "Workflow : #{current_workflow} : stop failure", RulesEngine::Process::AUDIT_FAILURE)
|
109
109
|
error = done = true
|
110
110
|
break
|
111
111
|
end
|
112
112
|
|
113
|
-
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::
|
113
|
+
if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::Rule::Outcome::START_WORKFLOW
|
114
114
|
RulesEngine::Process.auditor.audit(process_id, "Workflow : #{current_workflow} : start next workflow - #{rule_outcome.workflow_code}", RulesEngine::Process::AUDIT_INFO)
|
115
115
|
next_workflow = rule_outcome.workflow_code
|
116
116
|
break
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
module Rule
|
3
|
+
class Definition
|
4
|
+
def self.inherited(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def rule_class_name
|
10
|
+
self.name.classify
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
##################################################################
|
15
|
+
# class options
|
16
|
+
class_inheritable_accessor :options
|
17
|
+
@@options = {
|
18
|
+
# :group => "The group the rule belongs to",
|
19
|
+
# :display_name => "name to use on forms and views",
|
20
|
+
# :help_partial => "the help html.erb template",
|
21
|
+
# :new_partial => "the new html.erb template",
|
22
|
+
# :edit_partial => "the edit html.erb template"
|
23
|
+
}
|
24
|
+
|
25
|
+
##################################################################
|
26
|
+
# set the rule data
|
27
|
+
def data= data
|
28
|
+
end
|
29
|
+
|
30
|
+
##################################################################
|
31
|
+
# get the rule attributes
|
32
|
+
def title
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def summary
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def data
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def expected_outcomes
|
45
|
+
[:outcome => RulesEngine::Rule::Outcome::NEXT]
|
46
|
+
end
|
47
|
+
|
48
|
+
##################################################################
|
49
|
+
# set the rule attributes
|
50
|
+
def attributes=(params)
|
51
|
+
end
|
52
|
+
|
53
|
+
##################################################################
|
54
|
+
# validation and errors
|
55
|
+
def valid?
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
def errors
|
60
|
+
@errors ||= {}
|
61
|
+
return @errors
|
62
|
+
end
|
63
|
+
|
64
|
+
##################################################################
|
65
|
+
# callbacks when the rule is added and removed from a workflow
|
66
|
+
def after_add_to_workflow(workflow_code)
|
67
|
+
end
|
68
|
+
|
69
|
+
def before_remove_from_workflow(workflow_code)
|
70
|
+
end
|
71
|
+
|
72
|
+
##################################################################
|
73
|
+
# execute the rule
|
74
|
+
# return an RulesEngine::Rule::Outcome object to define what to do next
|
75
|
+
# if nil to continue to the next rule
|
76
|
+
def process(process_id, data)
|
77
|
+
# process.audit("process #{title}", RulesEngine::Process::AUDIT_INFO)
|
78
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_SUCCESS)
|
79
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_FAILURE)
|
80
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::START_WORKFLOW, 'next_workflow')
|
81
|
+
RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::NEXT)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
module Rule
|
3
|
+
class Outcome
|
4
|
+
|
5
|
+
def initialize(outcome, workflow_code = nil)
|
6
|
+
@outcome = outcome
|
7
|
+
@workflow_code = workflow_code
|
8
|
+
end
|
9
|
+
|
10
|
+
NEXT = 0
|
11
|
+
STOP_SUCCESS = 1
|
12
|
+
STOP_FAILURE = 2
|
13
|
+
START_WORKFLOW = 3
|
14
|
+
|
15
|
+
attr_accessor :outcome
|
16
|
+
attr_accessor :workflow_code
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class ComplexManifest
|
2
|
+
def self.populate_record(m, rule_name ,rule_class)
|
3
|
+
|
4
|
+
%W(
|
5
|
+
app/rules
|
6
|
+
app/views/re_rule_definitions/#{rule_name}
|
7
|
+
lib/tasks
|
8
|
+
spec/lib/rules
|
9
|
+
).each do |dirname|
|
10
|
+
m.directory dirname
|
11
|
+
end
|
12
|
+
|
13
|
+
%W(
|
14
|
+
).each do |filename|
|
15
|
+
m.file filename, filename
|
16
|
+
end
|
17
|
+
|
18
|
+
m.template "app/rules/complex.rb", "app/rules/#{rule_name}.rb"
|
19
|
+
m.template "app/views/re_rule_definitions/complex/_edit.html.erb", "app/views/re_rule_definitions/#{rule_name}/_edit.html.erb"
|
20
|
+
m.template "app/views/re_rule_definitions/complex/_help.html.erb", "app/views/re_rule_definitions/#{rule_name}/_help.html.erb"
|
21
|
+
m.template "app/views/re_rule_definitions/complex/_new.html.erb", "app/views/re_rule_definitions/#{rule_name}/_new.html.erb"
|
22
|
+
m.template "app/views/re_rule_definitions/complex/_script.html.erb", "app/views/re_rule_definitions/#{rule_name}/_script.html.erb"
|
23
|
+
m.template "app/views/re_rule_definitions/complex/_title.html.erb", "app/views/re_rule_definitions/#{rule_name}/_title.html.erb"
|
24
|
+
m.template "app/views/re_rule_definitions/complex/_word.html.erb", "app/views/re_rule_definitions/#{rule_name}/_word.html.erb"
|
25
|
+
m.template "app/views/re_rule_definitions/complex/_words.html.erb", "app/views/re_rule_definitions/#{rule_name}/_words.html.erb"
|
26
|
+
m.template "app/views/re_rule_definitions/complex/_workflow.html.erb", "app/views/re_rule_definitions/#{rule_name}/_workflow.html.erb"
|
27
|
+
m.template "spec/lib/rules/complex_spec.rb", "spec/lib/rules/#{rule_name}_spec.rb"
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
directories :
|
2
|
+
- app/rules
|
3
|
+
- spec/lib/rules
|
4
|
+
- lib/tasks
|
5
|
+
|
6
|
+
templates :
|
7
|
+
replacements :
|
8
|
+
- complex : rule_name
|
9
|
+
- Complex : rule_class
|
10
|
+
|
11
|
+
directories :
|
12
|
+
- app/views/re_rule_definitions/complex
|
13
|
+
|
14
|
+
files :
|
15
|
+
- app/rules/complex.rb
|
16
|
+
- app/views/re_rule_definitions/complex/_edit.html.erb
|
17
|
+
- app/views/re_rule_definitions/complex/_help.html.erb
|
18
|
+
- app/views/re_rule_definitions/complex/_workflow.html.erb
|
19
|
+
- app/views/re_rule_definitions/complex/_script.html.erb
|
20
|
+
- app/views/re_rule_definitions/complex/_title.html.erb
|
21
|
+
- app/views/re_rule_definitions/complex/_new.html.erb
|
22
|
+
- app/views/re_rule_definitions/complex/_word.html.erb
|
23
|
+
- app/views/re_rule_definitions/complex/_words.html.erb
|
24
|
+
- spec/lib/rules/complex_spec.rb
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class SimpleManifest
|
2
|
+
def self.populate_record(m, rule_name ,rule_class)
|
3
|
+
|
4
|
+
%W(
|
5
|
+
app/rules
|
6
|
+
app/views/re_rule_definitions/#{rule_name}
|
7
|
+
lib/tasks
|
8
|
+
spec/lib/rules
|
9
|
+
).each do |dirname|
|
10
|
+
m.directory dirname
|
11
|
+
end
|
12
|
+
|
13
|
+
%W(
|
14
|
+
).each do |filename|
|
15
|
+
m.file filename, filename
|
16
|
+
end
|
17
|
+
|
18
|
+
m.template "app/rules/simple.rb", "app/rules/#{rule_name}.rb"
|
19
|
+
m.template "app/views/re_rule_definitions/simple/_edit.html.erb", "app/views/re_rule_definitions/#{rule_name}/_edit.html.erb"
|
20
|
+
m.template "app/views/re_rule_definitions/simple/_form.html.erb", "app/views/re_rule_definitions/#{rule_name}/_form.html.erb"
|
21
|
+
m.template "app/views/re_rule_definitions/simple/_help.html.erb", "app/views/re_rule_definitions/#{rule_name}/_help.html.erb"
|
22
|
+
m.template "app/views/re_rule_definitions/simple/_new.html.erb", "app/views/re_rule_definitions/#{rule_name}/_new.html.erb"
|
23
|
+
m.template "spec/lib/rules/simple_spec.rb", "spec/lib/rules/#{rule_name}_spec.rb"
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
directories :
|
2
|
+
- app/rules
|
3
|
+
- spec/lib/rules
|
4
|
+
- lib/tasks
|
5
|
+
|
6
|
+
templates :
|
7
|
+
replacements :
|
8
|
+
- simple : rule_name
|
9
|
+
- RuleSimple : rule_class
|
10
|
+
|
11
|
+
directories :
|
12
|
+
- app/views/re_rule_definitions/simple
|
13
|
+
|
14
|
+
files :
|
15
|
+
- app/rules/simple.rb
|
16
|
+
- app/views/re_rule_definitions/simple/_edit.html.erb
|
17
|
+
- app/views/re_rule_definitions/simple/_help.html.erb
|
18
|
+
- app/views/re_rule_definitions/simple/_new.html.erb
|
19
|
+
- app/views/re_rule_definitions/simple/_form.html.erb
|
20
|
+
- spec/lib/rules/simple_spec.rb
|
21
|
+
|
@@ -21,8 +21,8 @@ class RulesEngineGenerator < Rails::Generator::Base
|
|
21
21
|
puts ''
|
22
22
|
end
|
23
23
|
if @rule_name.nil?
|
24
|
-
puts 'run >script/generate rules_engine
|
25
|
-
puts 'run >script/generate rules_engine
|
24
|
+
puts 'run >script/generate rules_engine simple [rule name]'
|
25
|
+
puts 'run >script/generate rules_engine complex [rule name]'
|
26
26
|
puts ''
|
27
27
|
puts "or install the rules_engine_templates gem to see other templates"
|
28
28
|
puts ''
|
@@ -89,19 +89,19 @@ class ReRule < ActiveRecord::Base
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def re_rule_expected_outcome_next
|
92
|
-
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::
|
92
|
+
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::Rule::Outcome::NEXT }
|
93
93
|
end
|
94
94
|
|
95
95
|
def re_rule_expected_outcome_success
|
96
|
-
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::
|
96
|
+
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::Rule::Outcome::STOP_SUCCESS }
|
97
97
|
end
|
98
98
|
|
99
99
|
def re_rule_expected_outcome_failure
|
100
|
-
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::
|
100
|
+
re_rule_expected_outcomes.detect{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::Rule::Outcome::STOP_FAILURE }
|
101
101
|
end
|
102
102
|
|
103
103
|
def re_rule_expected_outcomes_start_workflow
|
104
|
-
re_rule_expected_outcomes.select{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::
|
104
|
+
re_rule_expected_outcomes.select{ |re_rule_expected_outcome| re_rule_expected_outcome.outcome == RulesEngine::Rule::Outcome::START_WORKFLOW }
|
105
105
|
end
|
106
106
|
|
107
107
|
protected
|
@@ -5,7 +5,7 @@ class ReRuleExpectedOutcome < ActiveRecord::Base
|
|
5
5
|
validates_presence_of :outcome
|
6
6
|
|
7
7
|
def validate
|
8
|
-
if outcome == RulesEngine::
|
8
|
+
if outcome == RulesEngine::Rule::Outcome::START_WORKFLOW && workflow_code.blank?
|
9
9
|
errors.add(:workflow_code, "workflow code required")
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
module Rule
|
3
|
+
class <%=rule_class%> < RulesEngine::Rule::Definition
|
4
|
+
|
5
|
+
attr_reader :words
|
6
|
+
attr_reader :workflow_action
|
7
|
+
attr_reader :workflow
|
8
|
+
|
9
|
+
##################################################################
|
10
|
+
# class options
|
11
|
+
self.options =
|
12
|
+
{
|
13
|
+
:group => 'General',
|
14
|
+
:display_name => '<%=rule_class%>',
|
15
|
+
:help_partial => '/re_rule_definitions/<%=rule_name%>/help',
|
16
|
+
:new_partial => '/re_rule_definitions/<%=rule_name%>/new',
|
17
|
+
:edit_partial => '/re_rule_definitions/<%=rule_name%>/edit'
|
18
|
+
}
|
19
|
+
|
20
|
+
##################################################################
|
21
|
+
# set the rule data
|
22
|
+
def data= data
|
23
|
+
if data.nil?
|
24
|
+
@title = nil
|
25
|
+
@words = nil
|
26
|
+
@workflow_action = 'continue'
|
27
|
+
@workflow = nil
|
28
|
+
else
|
29
|
+
@title, @words, @workflow_action, @workflow = ActiveSupport::JSON.decode(data)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
##################################################################
|
34
|
+
# get the rule attributes
|
35
|
+
def title
|
36
|
+
@title
|
37
|
+
end
|
38
|
+
|
39
|
+
def summary
|
40
|
+
"Match the #{words.size == 1 ? 'word' : 'words'} #{words.join(', ')}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def data
|
44
|
+
[title, words, workflow_action, workflow].to_json
|
45
|
+
end
|
46
|
+
|
47
|
+
def expected_outcomes
|
48
|
+
case workflow_action
|
49
|
+
when 'next'
|
50
|
+
[:outcome => RulesEngine::Rule::Outcome::NEXT]
|
51
|
+
when 'stop_success'
|
52
|
+
[:outcome => RulesEngine::Rule::Outcome::STOP_SUCCESS]
|
53
|
+
when 'stop_failure'
|
54
|
+
[:outcome => RulesEngine::Rule::Outcome::STOP_FAILURE]
|
55
|
+
when 'start_workflow'
|
56
|
+
[:outcome => RulesEngine::Rule::Outcome::START_WORKFLOW, :workflow_code => workflow]
|
57
|
+
else
|
58
|
+
[:outcome => RulesEngine::Rule::Outcome::NEXT]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
##################################################################
|
63
|
+
# set the rule attributes
|
64
|
+
def attributes=(params)
|
65
|
+
param_hash = params.symbolize_keys
|
66
|
+
|
67
|
+
@title = param_hash[:<%=rule_name%>_title]
|
68
|
+
|
69
|
+
@words = []
|
70
|
+
return if param_hash[:<%=rule_name%>_words].nil?
|
71
|
+
param_hash[:<%=rule_name%>_words].each do |key, values|
|
72
|
+
if values.is_a?(Hash)
|
73
|
+
word_hash = values.symbolize_keys
|
74
|
+
@words << word_hash[:word].downcase unless word_hash[:word].blank? || word_hash[:_delete] == '1'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
@workflow_action = param_hash[:<%=rule_name%>_workflow_action] || 'continue'
|
79
|
+
@workflow = param_hash[:<%=rule_name%>_workflow] || ''
|
80
|
+
end
|
81
|
+
|
82
|
+
##################################################################
|
83
|
+
# validation and errors
|
84
|
+
def valid?
|
85
|
+
@errors = {}
|
86
|
+
@errors[:<%=rule_name%>_words] = "At least one word must be defined" if words.nil? || words.empty?
|
87
|
+
@errors[:<%=rule_name%>_title] = "Title required" if title.blank?
|
88
|
+
@errors[:<%=rule_name%>_workflow] = "Workflow required" if workflow_action == 'start_workflow' && workflow.blank?
|
89
|
+
return @errors.empty?
|
90
|
+
end
|
91
|
+
|
92
|
+
##################################################################
|
93
|
+
# callbacks when the rule is added and removed from a workflow
|
94
|
+
def after_add_to_workflow(workflow_code)
|
95
|
+
end
|
96
|
+
|
97
|
+
def before_remove_from_workflow(workflow_code)
|
98
|
+
end
|
99
|
+
|
100
|
+
##################################################################
|
101
|
+
# execute the rule
|
102
|
+
# if a match is found procees to the expected outcome
|
103
|
+
# it gets the data parameter :tweet
|
104
|
+
# it sets the data parameter :match
|
105
|
+
def process(process_id, data)
|
106
|
+
tweet = data[:tweet] || data["tweet"]
|
107
|
+
if tweet.blank?
|
108
|
+
return RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::NEXT)
|
109
|
+
end
|
110
|
+
|
111
|
+
words.each do |word|
|
112
|
+
if /#{word}/i =~ tweet
|
113
|
+
RulesEngine::Process.auditor.audit(process_id, "#{title} Found #{word}", RulesEngine::Process::AUDIT_INFO)
|
114
|
+
data[:match] = word
|
115
|
+
|
116
|
+
case workflow_action
|
117
|
+
when 'stop_success'
|
118
|
+
return RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_SUCCESS)
|
119
|
+
when 'stop_failure'
|
120
|
+
return RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_FAILURE)
|
121
|
+
when 'start_workflow'
|
122
|
+
return RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::START_WORKFLOW, workflow)
|
123
|
+
else #'next'
|
124
|
+
return RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::NEXT)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::NEXT)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module RulesEngine
|
2
|
+
module Rule
|
3
|
+
class Simple < RulesEngine::Rule::Definition
|
4
|
+
|
5
|
+
attr_reader :description
|
6
|
+
##################################################################
|
7
|
+
# class options
|
8
|
+
self.options =
|
9
|
+
{
|
10
|
+
:group => 'General',
|
11
|
+
:display_name => 'Simple',
|
12
|
+
:help_partial => '/re_rule_definitions/rule_<%=rule_name%>/help',
|
13
|
+
:new_partial => '/re_rule_definitions/rule_<%=rule_name%>/new',
|
14
|
+
:edit_partial => '/re_rule_definitions/rule_<%=rule_name%>/edit'
|
15
|
+
}
|
16
|
+
|
17
|
+
##################################################################
|
18
|
+
# set the rule data
|
19
|
+
def data= data
|
20
|
+
if data.nil?
|
21
|
+
@title = nil
|
22
|
+
@description = nil
|
23
|
+
else
|
24
|
+
@title, @description = ActiveSupport::JSON.decode(data)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
##################################################################
|
29
|
+
# get the rule attributes
|
30
|
+
def title
|
31
|
+
@title
|
32
|
+
end
|
33
|
+
|
34
|
+
def summary
|
35
|
+
description || "Does Nothing"
|
36
|
+
end
|
37
|
+
|
38
|
+
def data
|
39
|
+
[title, description].to_json
|
40
|
+
end
|
41
|
+
|
42
|
+
def expected_outcomes
|
43
|
+
[:outcome => RulesEngine::Rule::Outcome::NEXT]
|
44
|
+
end
|
45
|
+
|
46
|
+
##################################################################
|
47
|
+
# set the rule attributes
|
48
|
+
def attributes=(params)
|
49
|
+
param_hash = params.symbolize_keys
|
50
|
+
|
51
|
+
@title = param_hash[:rule_<%=rule_name%>_title]
|
52
|
+
@description = param_hash[:rule_<%=rule_name%>_description]
|
53
|
+
end
|
54
|
+
|
55
|
+
##################################################################
|
56
|
+
# validation and errors
|
57
|
+
def valid?
|
58
|
+
@errors = {}
|
59
|
+
@errors[:rule_<%=rule_name%>_title] = "Title required" if title.blank?
|
60
|
+
return @errors.empty?
|
61
|
+
end
|
62
|
+
|
63
|
+
##################################################################
|
64
|
+
# callbacks when the rule is added and removed from a workflow
|
65
|
+
def after_add_to_workflow(workflow_code)
|
66
|
+
end
|
67
|
+
|
68
|
+
def before_remove_from_workflow(workflow_code)
|
69
|
+
end
|
70
|
+
|
71
|
+
##################################################################
|
72
|
+
# execute the rule
|
73
|
+
# this rule does nothing
|
74
|
+
def process(process_id, data)
|
75
|
+
RulesEngine::Process.auditor.audit(process_id, "Inside Rule #{title}", RulesEngine::Process::AUDIT_INFO)
|
76
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_SUCCESS)
|
77
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::STOP_FAILURE)
|
78
|
+
# RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::START_WORKFLOW, 'next_workflow')
|
79
|
+
RulesEngine::Rule::Outcome.new(RulesEngine::Rule::Outcome::NEXT)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|