rufus-decision 1.3.1 → 1.3.2

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.
@@ -2,6 +2,13 @@
2
2
  = rufus-decision CHANGELOG.txt
3
3
 
4
4
 
5
+ == rufus-decision - 1.3.2 released 2010/05/28
6
+
7
+ - ruote participant : passing the participant options to the decision table
8
+ Thanks Wes Gamble
9
+ - accepting symbol or string as table option keys
10
+
11
+
5
12
  == rufus-decision - 1.3.1 released 2010/02/16
6
13
 
7
14
  - implemented Rufus::Decision::Participant, a ruote participant
@@ -3,6 +3,7 @@
3
3
 
4
4
  == Feedback
5
5
 
6
+ - Wes Gamble
6
7
  - ocgarlan
7
8
  - Fu Zhang
8
9
 
@@ -7,10 +7,13 @@
7
7
  gem install rufus-decision
8
8
 
9
9
 
10
- == intro blog post
10
+ == blog posts
11
11
 
12
12
  http://jmettraux.wordpress.com/2009/04/25/rufus-decision-11-ruby-decision-tables/
13
13
 
14
+ http://jmettraux.wordpress.com/2010/02/17/ruote-and-decision-tables/
15
+
16
+
14
17
 
15
18
  == usage
16
19
 
data/Rakefile CHANGED
@@ -37,6 +37,7 @@ CSV based Ruby decision tables
37
37
 
38
38
  gem.add_dependency 'rufus-dollar'
39
39
  gem.add_dependency 'rufus-treechecker'
40
+ gem.add_development_dependency 'rake'
40
41
  gem.add_development_dependency 'yard'
41
42
  gem.add_development_dependency 'jeweler'
42
43
  #gem.add_development_dependency 'ruote', '>= 2.1.7'
data/TODO.txt CHANGED
@@ -11,3 +11,5 @@
11
11
 
12
12
  [ ] rufus-jig for GETting the table (304 ftw)
13
13
 
14
+ [ ] participant : give decision table URL at runtime
15
+
@@ -0,0 +1,142 @@
1
+
2
+ #
3
+ # ruote + rufus-decision example
4
+ #
5
+ # featured in
6
+ #
7
+ # http://jmettraux.wordpress.com/2010/02/17/ruote-and-decision-tables/
8
+ #
9
+
10
+ require 'rubygems'
11
+
12
+
13
+ #
14
+ # preparing the workflow engine
15
+
16
+ require 'ruote'
17
+
18
+ engine = Ruote::Engine.new(Ruote::Worker.new(Ruote::HashStorage.new()))
19
+ # for this example we use a transient, in-memory engine
20
+
21
+ #engine.context.logger.noisy = true
22
+ # useful when debugging
23
+
24
+
25
+ #
26
+ # the process definition
27
+
28
+ pdef = Ruote.process_definition :name => 'reimbursement', :revision => '1.0' do
29
+ cursor do
30
+ customer :task => 'fill form'
31
+ clerk :task => 'control form'
32
+ rewind :if => '${f:missing_info}'
33
+ determine_reimbursement_level
34
+ finance :task => 'reimburse customer'
35
+ customer :task => 'reimbursement notification'
36
+ end
37
+ end
38
+
39
+
40
+ #
41
+ # the 'inbox/worklist' participant
42
+ #
43
+ # for this example, they are only STDOUT/STDIN participants
44
+
45
+ class StdoutParticipant
46
+ include Ruote::LocalParticipant
47
+
48
+ def initialize (opts)
49
+ end
50
+
51
+ def consume (workitem)
52
+
53
+ puts '-' * 80
54
+ puts "participant : #{workitem.participant_name}"
55
+
56
+ if workitem.fields['params']['task'] == 'fill form'
57
+ puts " * reimbursement claim, please fill details :"
58
+ echo "description : "
59
+ workitem.fields['description'] = STDIN.gets.strip
60
+ echo "type of visit (doctor office / hospital visit / lab visit) : "
61
+ workitem.fields['type of visit'] = STDIN.gets.strip
62
+ echo "participating physician ? (yes or no) : "
63
+ workitem.fields['participating physician ?'] = STDIN.gets.strip
64
+ else
65
+ puts " . reimbursement claim :"
66
+ workitem.fields.each do |k, v|
67
+ puts "#{k} --> #{v.inspect}"
68
+ end
69
+ end
70
+
71
+ reply_to_engine(workitem)
72
+ end
73
+
74
+ def echo (s)
75
+ print(s); STDOUT.flush
76
+ end
77
+ end
78
+
79
+ engine.register_participant 'customer', StdoutParticipant
80
+ engine.register_participant 'clerk', StdoutParticipant
81
+ engine.register_participant 'finance', StdoutParticipant
82
+
83
+
84
+ #
85
+ # the "decision" participant
86
+
87
+ #engine.register_participant 'determine_reimbursement_level' do |workitem|
88
+ # workitem.fields['reimbursement'] =
89
+ # case workitem.fields['type of visit']
90
+ # when 'doctor office'
91
+ # workitem.fields['participating physician ?'] == 'yes' ? '90%' : '50%'
92
+ # when 'hospital visit'
93
+ # workitem.fields['participating physician ?'] == 'yes' ? '0%' : '80%'
94
+ # when 'lab visit'
95
+ # workitem.fields['participating physician ?'] == 'yes' ? '0%' : '70%'
96
+ # else
97
+ # '0%'
98
+ # end
99
+ #end
100
+
101
+ require 'rufus/decision/participant'
102
+
103
+ #engine.register_participant(
104
+ # 'determine_reimbursement_level',
105
+ # Rufus::Decision::Participant,
106
+ # :table => %{
107
+ #in:type of visit,in:participating physician ?,out:reimbursement
108
+ #doctor office,yes,90%
109
+ #doctor office,no,50%
110
+ #hospital visit,yes,0%
111
+ #hospital visit,no,80%
112
+ #lab visit,yes,0%
113
+ #lab visit,no,70%
114
+ # })
115
+
116
+ engine.register_participant(
117
+ 'determine_reimbursement_level',
118
+ Rufus::Decision::Participant,
119
+ :table => 'http://github.com/jmettraux/rufus-decision/raw/master/examples/reimbursement2.csv')
120
+
121
+
122
+ #
123
+ # running the example...
124
+
125
+ puts '=' * 80
126
+ puts "launching process"
127
+
128
+ wfid = engine.launch(pdef)
129
+
130
+ engine.wait_for(wfid)
131
+ # don't let the Ruby runtime exits until our [unique] process instance is over
132
+
133
+ #ps = engine.process(wfid)
134
+ #if ps
135
+ # puts ps.errors.first.message
136
+ # puts ps.errors.first.trace
137
+ #end
138
+ # useful when debugging
139
+
140
+ puts '=' * 80
141
+ puts "done."
142
+
@@ -0,0 +1,7 @@
1
+ in:type of visit,in:participating physician ?,out:reimbursement
2
+ doctor office,yes,90%
3
+ doctor office,no,50%
4
+ hospital visit,yes,0%
5
+ hospital visit,no,80%
6
+ lab visit,yes,0%
7
+ lab visit,no,70%
@@ -34,6 +34,17 @@ module Rufus::Decision
34
34
  # Make sure you have the gem "rufus-decision" installed in order to
35
35
  # use this decision participant.
36
36
  #
37
+ #
38
+ # == blog post
39
+ #
40
+ # This Rufus::Decision::Participant was introduced in the "ruote and
41
+ # decision tables" blog post :
42
+ #
43
+ # http://jmettraux.wordpress.com/2010/02/17/ruote-and-decision-tables/
44
+ #
45
+ #
46
+ # == example
47
+ #
37
48
  # In this example, a participant named 'decide_team_member' is bound in the
38
49
  # ruote engine and, depending on the value of the workitem fields 'topic'
39
50
  # and region, sets the value of the field named 'team_member' :
@@ -72,6 +83,28 @@ module Rufus::Decision
72
83
  #
73
84
  # would thus get routed to Gilbert.
74
85
  #
86
+ # To learn more about decision tables :
87
+ #
88
+ # http://github.com/jmettraux/rufus-decision
89
+ #
90
+ #
91
+ # == pointing to a table via a URI
92
+ #
93
+ # Note that you can reference the table by its URI :
94
+ #
95
+ # engine.register_participant(
96
+ # :decide_team_member
97
+ # Rufus::Decision::Participant,
98
+ # :table => 'http://decisions.example.com/journalists.csv')
99
+ #
100
+ # If the table were a Google Spreadsheet, it would look like (note the
101
+ # trailing &output=csv) :
102
+ #
103
+ # engine.register_participant(
104
+ # :decide_team_member
105
+ # Rufus::Decision::Participant,
106
+ # :table => 'http://spreadsheets.google.com/pub?key=pCZNVR1TQ&output=csv')
107
+ #
75
108
  class Participant
76
109
  include Ruote::LocalParticipant
77
110
 
@@ -85,7 +118,7 @@ module Rufus::Decision
85
118
  table = @options['table']
86
119
  raise(ArgumentError.new("'table' option is missing")) unless table
87
120
 
88
- table = Rufus::Decision::Table.new(table)
121
+ table = Rufus::Decision::Table.new(table, @options)
89
122
 
90
123
  workitem.fields = table.run(workitem.fields)
91
124
 
@@ -340,7 +340,9 @@ module Decision
340
340
 
341
341
  optnames.each do |oname|
342
342
 
343
- v = options[oname]
343
+ oname = oname.to_s
344
+
345
+ v = options[oname.intern] || options[oname]
344
346
  next unless v != nil
345
347
  instance_variable_set("@#{optnames.first.to_s}", v)
346
348
  return
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Rufus
3
3
  module Decision
4
- VERSION = '1.3.1'
4
+ VERSION = '1.3.2'
5
5
  end
6
6
  end
7
7
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rufus-decision}
8
- s.version = "1.3.1"
8
+ s.version = "1.3.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Mettraux"]
12
- s.date = %q{2010-02-16}
12
+ s.date = %q{2010-05-28}
13
13
  s.default_executable = %q{rufus_decide}
14
14
  s.description = %q{
15
15
  CSV based Ruby decision tables
@@ -40,6 +40,8 @@ CSV based Ruby decision tables
40
40
  "examples/journalists.rb",
41
41
  "examples/readme_example.rb",
42
42
  "examples/reimbursement.csv",
43
+ "examples/reimbursement.rb",
44
+ "examples/reimbursement2.csv",
43
45
  "lib/rufus-decision.rb",
44
46
  "lib/rufus/decision.rb",
45
47
  "lib/rufus/decision/hashes.rb",
@@ -66,7 +68,7 @@ CSV based Ruby decision tables
66
68
  s.rdoc_options = ["--charset=UTF-8"]
67
69
  s.require_paths = ["lib"]
68
70
  s.rubyforge_project = %q{rufus}
69
- s.rubygems_version = %q{1.3.5}
71
+ s.rubygems_version = %q{1.3.6}
70
72
  s.summary = %q{CSV based Ruby decision tables}
71
73
  s.test_files = [
72
74
  "test/test.rb"
@@ -79,17 +81,20 @@ CSV based Ruby decision tables
79
81
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
80
82
  s.add_runtime_dependency(%q<rufus-dollar>, [">= 0"])
81
83
  s.add_runtime_dependency(%q<rufus-treechecker>, [">= 0"])
84
+ s.add_development_dependency(%q<rake>, [">= 0"])
82
85
  s.add_development_dependency(%q<yard>, [">= 0"])
83
86
  s.add_development_dependency(%q<jeweler>, [">= 0"])
84
87
  else
85
88
  s.add_dependency(%q<rufus-dollar>, [">= 0"])
86
89
  s.add_dependency(%q<rufus-treechecker>, [">= 0"])
90
+ s.add_dependency(%q<rake>, [">= 0"])
87
91
  s.add_dependency(%q<yard>, [">= 0"])
88
92
  s.add_dependency(%q<jeweler>, [">= 0"])
89
93
  end
90
94
  else
91
95
  s.add_dependency(%q<rufus-dollar>, [">= 0"])
92
96
  s.add_dependency(%q<rufus-treechecker>, [">= 0"])
97
+ s.add_dependency(%q<rake>, [">= 0"])
93
98
  s.add_dependency(%q<yard>, [">= 0"])
94
99
  s.add_dependency(%q<jeweler>, [">= 0"])
95
100
  end
@@ -292,6 +292,14 @@ e,f,2
292
292
  do_test(table, wi, { 'fz' => '3' }, false)
293
293
  end
294
294
 
295
+ def test_ruby_eval_string_key
296
+
297
+ table = Rufus::Decision::Table.new(CSV9, 'ruby_eval' => true)
298
+
299
+ wi = { 'fx' => 'c', 'fy' => 'd' }
300
+ do_test(table, wi, { 'fz' => '3' }, false)
301
+ end
302
+
295
303
  CSV10 = %{
296
304
  in:fx,in:fx,out:fz
297
305
  >90,<92,ok
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rufus-decision
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 3
8
+ - 2
9
+ version: 1.3.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - John Mettraux
@@ -9,49 +14,69 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-16 00:00:00 +09:00
17
+ date: 2010-05-28 00:00:00 +09:00
13
18
  default_executable: rufus_decide
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rufus-dollar
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
23
29
  version: "0"
24
- version:
30
+ type: :runtime
31
+ version_requirements: *id001
25
32
  - !ruby/object:Gem::Dependency
26
33
  name: rufus-treechecker
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
27
42
  type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: rake
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
30
48
  requirements:
31
49
  - - ">="
32
50
  - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
33
53
  version: "0"
34
- version:
54
+ type: :development
55
+ version_requirements: *id003
35
56
  - !ruby/object:Gem::Dependency
36
57
  name: yard
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
40
60
  requirements:
41
61
  - - ">="
42
62
  - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
43
65
  version: "0"
44
- version:
66
+ type: :development
67
+ version_requirements: *id004
45
68
  - !ruby/object:Gem::Dependency
46
69
  name: jeweler
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
70
+ prerelease: false
71
+ requirement: &id005 !ruby/object:Gem::Requirement
50
72
  requirements:
51
73
  - - ">="
52
74
  - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
53
77
  version: "0"
54
- version:
78
+ type: :development
79
+ version_requirements: *id005
55
80
  description: "\n\
56
81
  CSV based Ruby decision tables\n "
57
82
  email: jmettraux@gmail.com
@@ -82,6 +107,8 @@ files:
82
107
  - examples/journalists.rb
83
108
  - examples/readme_example.rb
84
109
  - examples/reimbursement.csv
110
+ - examples/reimbursement.rb
111
+ - examples/reimbursement2.csv
85
112
  - lib/rufus-decision.rb
86
113
  - lib/rufus/decision.rb
87
114
  - lib/rufus/decision/hashes.rb
@@ -116,18 +143,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
143
  requirements:
117
144
  - - ">="
118
145
  - !ruby/object:Gem::Version
146
+ segments:
147
+ - 0
119
148
  version: "0"
120
- version:
121
149
  required_rubygems_version: !ruby/object:Gem::Requirement
122
150
  requirements:
123
151
  - - ">="
124
152
  - !ruby/object:Gem::Version
153
+ segments:
154
+ - 0
125
155
  version: "0"
126
- version:
127
156
  requirements: []
128
157
 
129
158
  rubyforge_project: rufus
130
- rubygems_version: 1.3.5
159
+ rubygems_version: 1.3.6
131
160
  signing_key:
132
161
  specification_version: 3
133
162
  summary: CSV based Ruby decision tables