ruote 2.1.11 → 2.2.0

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.
Files changed (217) hide show
  1. data/CHANGELOG.txt +60 -0
  2. data/CREDITS.txt +22 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +6 -7
  5. data/Rakefile +58 -59
  6. data/TODO.txt +137 -65
  7. data/couch_url.txt +1 -0
  8. data/jruby_issue.txt +32 -0
  9. data/lib/ruote.rb +1 -1
  10. data/lib/ruote/context.rb +12 -10
  11. data/lib/ruote/engine.rb +280 -145
  12. data/lib/ruote/engine/process_error.rb +5 -5
  13. data/lib/ruote/engine/process_status.rb +47 -28
  14. data/lib/ruote/exp/command.rb +7 -10
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +130 -43
  17. data/lib/ruote/exp/fe_add_branches.rb +2 -2
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_cancel_process.rb +3 -3
  20. data/lib/ruote/exp/fe_command.rb +3 -3
  21. data/lib/ruote/exp/fe_concurrence.rb +4 -4
  22. data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
  23. data/lib/ruote/exp/fe_cron.rb +3 -3
  24. data/lib/ruote/exp/fe_cursor.rb +5 -5
  25. data/lib/ruote/exp/fe_define.rb +3 -3
  26. data/lib/ruote/exp/fe_echo.rb +3 -3
  27. data/lib/ruote/exp/fe_equals.rb +2 -2
  28. data/lib/ruote/exp/fe_error.rb +2 -2
  29. data/lib/ruote/exp/fe_filter.rb +519 -0
  30. data/lib/ruote/exp/fe_forget.rb +9 -2
  31. data/lib/ruote/exp/fe_given.rb +154 -0
  32. data/lib/ruote/exp/fe_if.rb +16 -13
  33. data/lib/ruote/exp/fe_inc.rb +3 -3
  34. data/lib/ruote/exp/fe_iterator.rb +4 -4
  35. data/lib/ruote/exp/fe_let.rb +75 -0
  36. data/lib/ruote/exp/fe_listen.rb +68 -12
  37. data/lib/ruote/exp/fe_lose.rb +110 -0
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
  40. data/lib/ruote/exp/fe_participant.rb +14 -17
  41. data/lib/ruote/exp/fe_redo.rb +10 -6
  42. data/lib/ruote/exp/fe_ref.rb +1 -1
  43. data/lib/ruote/exp/fe_registerp.rb +112 -0
  44. data/lib/ruote/exp/fe_reserve.rb +3 -3
  45. data/lib/ruote/exp/fe_restore.rb +2 -2
  46. data/lib/ruote/exp/fe_save.rb +2 -2
  47. data/lib/ruote/exp/fe_sequence.rb +3 -4
  48. data/lib/ruote/exp/fe_set.rb +16 -7
  49. data/lib/ruote/exp/fe_subprocess.rb +23 -1
  50. data/lib/ruote/exp/fe_that.rb +92 -0
  51. data/lib/ruote/exp/fe_undo.rb +3 -3
  52. data/lib/ruote/exp/fe_unregisterp.rb +71 -0
  53. data/lib/ruote/exp/fe_wait.rb +2 -2
  54. data/lib/ruote/exp/flowexpression.rb +153 -78
  55. data/lib/ruote/exp/iterator.rb +2 -2
  56. data/lib/ruote/exp/merge.rb +2 -2
  57. data/lib/ruote/exp/ro_attributes.rb +14 -12
  58. data/lib/ruote/exp/ro_filters.rb +136 -0
  59. data/lib/ruote/exp/ro_persist.rb +51 -35
  60. data/lib/ruote/exp/ro_variables.rb +18 -27
  61. data/lib/ruote/fei.rb +73 -33
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
  63. data/lib/ruote/id/wfid_generator.rb +11 -4
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +36 -8
  66. data/lib/ruote/log/storage_history.rb +37 -5
  67. data/lib/ruote/log/test_logger.rb +26 -24
  68. data/lib/ruote/log/wait_logger.rb +5 -3
  69. data/lib/ruote/part/block_participant.rb +22 -11
  70. data/lib/ruote/part/engine_participant.rb +6 -7
  71. data/lib/ruote/part/local_participant.rb +6 -12
  72. data/lib/ruote/part/no_op_participant.rb +4 -4
  73. data/lib/ruote/part/null_participant.rb +4 -4
  74. data/lib/ruote/part/smtp_participant.rb +4 -4
  75. data/lib/ruote/part/storage_participant.rb +40 -20
  76. data/lib/ruote/part/template.rb +4 -4
  77. data/lib/ruote/participant.rb +0 -1
  78. data/lib/ruote/{parser.rb → reader.rb} +30 -25
  79. data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
  80. data/lib/ruote/{parser → reader}/xml.rb +6 -5
  81. data/lib/ruote/receiver/base.rb +35 -13
  82. data/lib/ruote/storage/base.rb +20 -18
  83. data/lib/ruote/storage/composite_storage.rb +10 -10
  84. data/lib/ruote/storage/fs_storage.rb +17 -10
  85. data/lib/ruote/storage/hash_storage.rb +29 -18
  86. data/lib/ruote/svc/dispatch_pool.rb +41 -14
  87. data/lib/ruote/svc/dollar_sub.rb +50 -17
  88. data/lib/ruote/svc/error_handler.rb +19 -11
  89. data/lib/ruote/svc/expression_map.rb +4 -4
  90. data/lib/ruote/svc/participant_list.rb +105 -100
  91. data/lib/ruote/svc/tracker.rb +58 -18
  92. data/lib/ruote/svc/treechecker.rb +51 -24
  93. data/lib/ruote/tree_dot.rb +4 -4
  94. data/lib/ruote/util/filter.rb +440 -0
  95. data/lib/ruote/util/hashdot.rb +4 -4
  96. data/lib/ruote/util/look.rb +2 -6
  97. data/lib/ruote/util/lookup.rb +9 -7
  98. data/lib/ruote/util/misc.rb +40 -8
  99. data/lib/ruote/util/ometa.rb +1 -1
  100. data/lib/ruote/util/serializer.rb +4 -4
  101. data/lib/ruote/util/subprocess.rb +29 -9
  102. data/lib/ruote/util/time.rb +4 -4
  103. data/lib/ruote/util/tree.rb +3 -3
  104. data/lib/ruote/version.rb +2 -2
  105. data/lib/ruote/worker.rb +55 -32
  106. data/lib/ruote/workitem.rb +64 -11
  107. data/ruote.gemspec +31 -302
  108. data/test/bm/launch_bench.rb +37 -0
  109. data/test/functional/base.rb +60 -18
  110. data/test/functional/concurrent_base.rb +2 -2
  111. data/test/functional/ct_0_concurrence.rb +1 -1
  112. data/test/functional/ct_1_iterator.rb +1 -1
  113. data/test/functional/ct_2_cancel.rb +1 -1
  114. data/test/functional/eft_0_process_definition.rb +2 -2
  115. data/test/functional/eft_10_cancel_process.rb +1 -1
  116. data/test/functional/eft_11_wait.rb +19 -11
  117. data/test/functional/eft_12_listen.rb +79 -13
  118. data/test/functional/eft_13_iterator.rb +13 -10
  119. data/test/functional/eft_14_cursor.rb +98 -9
  120. data/test/functional/eft_15_loop.rb +6 -4
  121. data/test/functional/eft_16_if.rb +12 -0
  122. data/test/functional/eft_18_concurrent_iterator.rb +31 -32
  123. data/test/functional/eft_19_reserve.rb +4 -4
  124. data/test/functional/eft_1_echo.rb +9 -0
  125. data/test/functional/eft_20_save.rb +4 -4
  126. data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
  127. data/test/functional/eft_30_ref.rb +17 -2
  128. data/test/functional/eft_31_registerp.rb +130 -0
  129. data/test/functional/eft_32_lose.rb +93 -0
  130. data/test/functional/eft_33_let.rb +31 -0
  131. data/test/functional/eft_34_given.rb +123 -0
  132. data/test/functional/eft_35_filter.rb +269 -0
  133. data/test/functional/eft_3_participant.rb +4 -6
  134. data/test/functional/eft_4_set.rb +16 -2
  135. data/test/functional/eft_5_subprocess.rb +2 -4
  136. data/test/functional/eft_6_concurrence.rb +29 -29
  137. data/test/functional/eft_8_undo.rb +39 -3
  138. data/test/functional/eft_9_redo.rb +94 -2
  139. data/test/functional/ft_10_dollar.rb +81 -2
  140. data/test/functional/ft_11_recursion.rb +13 -17
  141. data/test/functional/ft_12_launchitem.rb +9 -5
  142. data/test/functional/ft_13_variables.rb +7 -9
  143. data/test/functional/ft_14_re_apply.rb +6 -9
  144. data/test/functional/ft_15_timeout.rb +18 -18
  145. data/test/functional/ft_16_participant_params.rb +1 -3
  146. data/test/functional/ft_17_conditional.rb +25 -2
  147. data/test/functional/ft_18_kill.rb +65 -12
  148. data/test/functional/ft_1_process_status.rb +147 -71
  149. data/test/functional/ft_20_storage_participant.rb +0 -1
  150. data/test/functional/ft_21_forget.rb +82 -1
  151. data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
  152. data/test/functional/ft_25_receiver.rb +47 -17
  153. data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
  154. data/test/functional/ft_29_part_template.rb +6 -5
  155. data/test/functional/ft_2_errors.rb +21 -37
  156. data/test/functional/ft_30_smtp_participant.rb +1 -1
  157. data/test/functional/ft_31_part_blocking.rb +8 -6
  158. data/test/functional/ft_34_cursor_rewind.rb +13 -10
  159. data/test/functional/ft_35_add_service.rb +1 -1
  160. data/test/functional/ft_36_storage_history.rb +24 -1
  161. data/test/functional/ft_37_default_history.rb +109 -0
  162. data/test/functional/ft_38_participant_more.rb +10 -10
  163. data/test/functional/ft_39_wait_for.rb +12 -9
  164. data/test/functional/ft_3_participant_registration.rb +111 -32
  165. data/test/functional/ft_40_wait_logger.rb +2 -1
  166. data/test/functional/ft_41_participants.rb +30 -4
  167. data/test/functional/ft_43_participant_on_reply.rb +6 -23
  168. data/test/functional/ft_45_participant_accept.rb +4 -4
  169. data/test/functional/ft_46_launch_single.rb +36 -2
  170. data/test/functional/ft_47_wfid_generator.rb +54 -0
  171. data/test/functional/ft_48_lose.rb +112 -0
  172. data/test/functional/ft_49_engine_on_error.rb +201 -0
  173. data/test/functional/ft_4_cancel.rb +66 -6
  174. data/test/functional/ft_50_engine_config.rb +22 -0
  175. data/test/functional/ft_51_misc.rb +67 -0
  176. data/test/functional/ft_52_case.rb +134 -0
  177. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  178. data/test/functional/ft_54_patterns.rb +104 -0
  179. data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
  180. data/test/functional/ft_56_filter_attribute.rb +259 -0
  181. data/test/functional/ft_5_on_error.rb +77 -30
  182. data/test/functional/ft_6_on_cancel.rb +66 -11
  183. data/test/functional/ft_7_tags.rb +94 -5
  184. data/test/functional/ft_8_participant_consumption.rb +36 -5
  185. data/test/functional/ft_9_subprocesses.rb +10 -10
  186. data/test/functional/rt_1_listen.rb +3 -3
  187. data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
  188. data/test/functional/storage_helper.rb +15 -13
  189. data/test/functional/test.rb +1 -3
  190. data/test/test_helper.rb +0 -8
  191. data/test/unit/storage.rb +154 -10
  192. data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
  193. data/test/unit/ut_11_lookup.rb +7 -0
  194. data/test/unit/ut_13_serializer.rb +1 -1
  195. data/test/unit/ut_15_util.rb +23 -0
  196. data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
  197. data/test/unit/ut_1_fei.rb +57 -10
  198. data/test/unit/ut_20_composite_storage.rb +25 -11
  199. data/test/unit/ut_21_participant_list.rb +47 -0
  200. data/test/unit/ut_22_filter.rb +903 -0
  201. data/test/unit/ut_3_wait_logger.rb +2 -6
  202. data/test/unit/ut_6_condition.rb +164 -17
  203. data/test/unit/ut_7_workitem.rb +28 -0
  204. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  205. data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
  206. metadata +108 -84
  207. data/.gitignore +0 -4
  208. data/examples/barley.rb +0 -391
  209. data/examples/flickr_report.rb +0 -107
  210. data/examples/pong.rb +0 -37
  211. data/examples/ruote_quickstart.rb +0 -43
  212. data/examples/web_first_page.rb +0 -68
  213. data/lib/ruote/part/hash_participant.rb +0 -91
  214. data/test/README.rdoc +0 -15
  215. data/test/functional/crunner.sh +0 -19
  216. data/test/pdef.xml +0 -7
  217. data/test/unit/ut_2_wfidgen.rb +0 -21
data/examples/pong.rb DELETED
@@ -1,37 +0,0 @@
1
-
2
- # http://gist.github.com/596822
3
-
4
- require 'rubygems'
5
- require 'ruote'
6
-
7
- pdef = Ruote.process_definition do
8
- repeat do
9
- ping # mister ping, please shoot first
10
- pong
11
- end
12
- end
13
-
14
- class Opponent
15
- include Ruote::LocalParticipant
16
-
17
- def initialize (options)
18
- @options = options
19
- end
20
-
21
- def consume (workitem)
22
- puts @options['sound']
23
- reply_to_engine(workitem)
24
- end
25
- end
26
-
27
- engine = Ruote::Engine.new(Ruote::Worker.new(Ruote::HashStorage.new))
28
-
29
- engine.register_participant :ping, Opponent, 'sound' => 'ping'
30
- engine.register_participant :pong, Opponent, 'sound' => 'pong'
31
-
32
- wfid = engine.launch(pdef)
33
-
34
- sleep 5 # five seconds of ping pong fun
35
-
36
- engine.cancel_process(wfid) # game over
37
-
@@ -1,43 +0,0 @@
1
-
2
- $:.unshift('lib') # running from ruote/ probably
3
-
4
- require 'rubygems'
5
- require 'ruote'
6
- require 'ruote/storage/fs_storage'
7
-
8
- # preparing the engine
9
-
10
- engine = Ruote::Engine.new(
11
- Ruote::Worker.new(
12
- Ruote::FsStorage.new(
13
- 'ruote_work',
14
- 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])))
15
-
16
- # registering participants
17
-
18
- engine.register_participant :alpha do |workitem|
19
- workitem.fields['message'] = { 'text' => 'hello !', 'author' => 'Alice' }
20
- end
21
-
22
- engine.register_participant :bravo do |workitem|
23
- puts "I received a message from #{workitem.fields['message']['author']}"
24
- end
25
-
26
- # defining a process
27
-
28
- pdef = Ruote.process_definition :name => 'test' do
29
- sequence do
30
- participant :alpha
31
- participant :bravo
32
- end
33
- end
34
-
35
- # launching, creating a process instance
36
-
37
- wfid = engine.launch(pdef)
38
-
39
- engine.wait_for(wfid)
40
- # blocks current thread until our process instance terminates
41
-
42
- # => 'I received a message from Alice'
43
-
@@ -1,68 +0,0 @@
1
-
2
- #
3
- # This is not a runnable example, it's just a ruby source file that contains
4
- # the samples found at
5
- #
6
- # http://ruote.rubyforge.org/index.html
7
- #
8
- # NOTE : this example need some rework. The use of block participants will
9
- # probably be avoided
10
- #
11
-
12
- require 'rubygems'
13
- require 'ruote'
14
-
15
- pdef = Ruote.process_definition :name => 'work' do
16
- cursor do
17
- concurrence do
18
- reviewer1
19
- reviewer2
20
- end
21
- editor
22
- rewind :if => '${not_ok}' # back to the reviewers if editor not happy
23
- publish # the document
24
- end
25
- end
26
-
27
- # engine
28
-
29
- require 'ruote/storage/fs_storage'
30
-
31
- engine = Ruote::Engine.new(Ruote::Worker.new(Ruote::FsStorage.new('work')))
32
-
33
- # participants
34
-
35
- engine.register_participant 'reviewer.+' do |workitem|
36
- puts "reviewing document #{workitem.fields['doc_url']}"
37
- print "approve ?"
38
- workitem.fields["#{workitem.participant_name}_reply"] = gets
39
- end
40
-
41
- engine.register_participant 'editor' do |workitem|
42
- puts "doc : #{workitem.fields['doc_url']}"
43
- puts "reviewers approval :"
44
- workitem.fields.entries.each do |k, v|
45
- puts "#{k} : #{v}" if k.match(/\_reply$/)
46
- end
47
- print "should we publish ?"
48
- workitem.fields['not_ok'] = (gets.strip == 'no')
49
- end
50
-
51
- engine.register_participant 'publish' do |workitem|
52
- PublicationService.post(workitem.fields['doc_url'])
53
- end
54
-
55
- wfid0 = engine.launch(pdef, 'doc_url' => 'http://en.wikipedia.org/wiki/File:Bundesbrief.jpg')
56
- wfid1 = engine.launch(pdef, 'doc_url' => 'http://en.wikipedia.org/wiki/File:Constitution_Pg1of4_AC.jpg')
57
-
58
- # querying
59
-
60
- [ wfid0, wfid1 ].each do |wfid|
61
- ps = engine.process(wfid)
62
- puts "errors for #{wfid} ? #{ps.errors.size > 0}"
63
- end
64
-
65
- # cancelling a process instance
66
-
67
- engine.cancel_process(wfid1)
68
-
@@ -1,91 +0,0 @@
1
- #--
2
- # Copyright (c) 2005-2010, John Mettraux, jmettraux@gmail.com
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining a copy
5
- # of this software and associated documentation files (the "Software"), to deal
6
- # in the Software without restriction, including without limitation the rights
7
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- # copies of the Software, and to permit persons to whom the Software is
9
- # furnished to do so, subject to the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be included in
12
- # all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
- # THE SOFTWARE.
21
- #
22
- # Made in Japan.
23
- #++
24
-
25
- require 'ruote/part/local_participant'
26
-
27
-
28
- module Ruote
29
-
30
- #
31
- # Storing workitems in-memory. Mainly used for testing purposes, but could
32
- # prove useful for a transient ruote engine.
33
- #
34
- class HashParticipant
35
-
36
- include LocalParticipant
37
- include Enumerable
38
-
39
- def initialize (opts=nil)
40
-
41
- @items = {}
42
- end
43
-
44
- # No need for a separate thread when delivering to this participant.
45
- #
46
- def do_not_thread; true; end
47
-
48
- def consume (workitem)
49
-
50
- @items[workitem.fei.to_storage_id] = workitem
51
- end
52
-
53
- # Makes sure to remove the workitem from the in-memory hash.
54
- #
55
- def cancel (fei, flavour)
56
-
57
- @items.delete(fei.to_storage_id)
58
- end
59
-
60
- # Removes the workitem from the in-memory hash and replies to the engine.
61
- #
62
- def reply (workitem)
63
-
64
- @items.delete(workitem.fei.to_storage_id)
65
- reply_to_engine(workitem)
66
- end
67
-
68
- # Returns the count of workitems stored in this participant.
69
- #
70
- def size
71
-
72
- @items.size
73
- end
74
-
75
- # Iterates over the workitems stored in here.
76
- #
77
- def each (&block)
78
-
79
- @items.each { |i| block.call(i) }
80
- end
81
-
82
- # A convenience method (especially when testing), returns the first
83
- # (only ?) workitem in the participant.
84
- #
85
- def first
86
-
87
- @items.values.first
88
- end
89
- end
90
- end
91
-
data/test/README.rdoc DELETED
@@ -1,15 +0,0 @@
1
-
2
- = ruote testing
3
-
4
- running all the tests
5
-
6
- $ ruby test/test.rb
7
-
8
- running a specific test
9
-
10
- $ ruby test/functional/ft_1_process_status.rb
11
-
12
- running a test with file persistence :
13
-
14
- $ ruby test/functional/eft_2_sequence.rb -- --fs
15
-
@@ -1,19 +0,0 @@
1
- #!/bin/bash
2
-
3
- TEST="test/functional/ct_0_concurrence.rb"
4
- if [ $1 = "1" ]; then
5
- TEST="test/functional/ct_1_iterator.rb"
6
- fi
7
- if [ $1 = "2" ]; then
8
- TEST="test/functional/ct_2_cancel.rb"
9
- fi
10
-
11
- COUNT=0
12
-
13
- while [ $? == 0 ]
14
- do
15
- echo " *** $COUNT"
16
- ((COUNT=$COUNT + 1))
17
- time ruby -I. $TEST $*
18
- done
19
-
data/test/pdef.xml DELETED
@@ -1,7 +0,0 @@
1
- <!-- testing local process definitions -->
2
- <process-definition name="test">
3
- <sequence>
4
- <echo>a</echo>
5
- <echo>b</echo>
6
- </sequence>
7
- </process-definition>
@@ -1,21 +0,0 @@
1
-
2
- #
3
- # testing ruote
4
- #
5
- # Tue May 19 17:58:51 JST 2009
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
9
-
10
- require 'ruote/id/wfid_generator'
11
- require 'ruote/id/mnemo_wfid_generator'
12
-
13
-
14
- class UtWfidGenTest < Test::Unit::TestCase
15
-
16
- def test_zero
17
-
18
- assert true
19
- end
20
- end
21
-