ruote 2.2.0 → 2.3.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 (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -1,204 +0,0 @@
1
- #--
2
- # Copyright (c) 2005-2011, 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/log/pretty'
26
-
27
-
28
- module Ruote
29
-
30
- class TestLogger
31
-
32
- include PrettyLogging
33
-
34
- attr_reader :seen
35
- attr_reader :log
36
-
37
- attr_accessor :noisy
38
-
39
- def initialize(context)
40
-
41
- @context = context
42
-
43
- if @context.worker
44
- #
45
- # this is a worker context, DO log
46
- #
47
- @context.worker.subscribe(:all, self)
48
- #else
49
- #
50
- # this is not a worker context, DO NOT log, but be ready to
51
- # be queried
52
- #
53
- end
54
-
55
- @seen = []
56
- @log = []
57
- @waiting = []
58
-
59
- @count = -1
60
- @color = 33
61
- @noisy = false
62
- end
63
-
64
- def notify(msg)
65
-
66
- puts(pretty_print(msg)) if @noisy
67
-
68
- @seen << msg
69
- @log << msg
70
-
71
- check_waiting
72
- end
73
-
74
- # Blocks until one or more interests are satisfied.
75
- #
76
- # interests must be an array of interests. Please refer to
77
- # Engine#wait_for documentation for allowed values of each interest.
78
- #
79
- # If multiple interests are given, wait_for blocks until
80
- # all of the interests are satisfied.
81
- #
82
- # wait_for may only be used by one thread at a time. If one
83
- # thread calls wait_for and later another thread calls wait_for
84
- # while the first thread is waiting, the first thread's
85
- # interests are lost and the first thread will never wake up.
86
- #
87
- def wait_for(interests)
88
-
89
- @waiting << [ Thread.current, interests ]
90
-
91
- check_waiting
92
-
93
- Thread.stop if @waiting.find { |w| w.first == Thread.current }
94
-
95
- # and when this thread gets woken up, go on and return __result__
96
-
97
- Thread.current['__result__']
98
- end
99
-
100
- # Debug only : dumps all the seen events to STDOUTS
101
- #
102
- def dump
103
-
104
- @seen.collect { |msg| pretty_print(msg) }.join("\n")
105
- end
106
-
107
- def color=(c)
108
-
109
- @color = c
110
- end
111
-
112
- def self.pp(msg)
113
-
114
- @logger ||= TestLogger.new(nil)
115
- puts @logger.send(:pretty_print, msg)
116
- end
117
-
118
- protected
119
-
120
- def check_waiting
121
-
122
- return if @waiting.size < 1
123
-
124
- while msg = @seen.shift
125
- check_msg(msg)
126
- end
127
- end
128
-
129
- def check_msg(msg)
130
-
131
- wakeup = []
132
-
133
- @waiting.each do |thread, interests|
134
-
135
- wakeup << thread if matches(interests, msg)
136
- end
137
-
138
- @waiting.delete_if { |t, i| i.size < 1 }
139
-
140
- wakeup.each do |thread|
141
-
142
- thread['__result__'] = msg
143
- thread.wakeup
144
- end
145
- end
146
-
147
- FINAL_ACTIONS = %w[ terminated ceased error_intercepted ]
148
-
149
- # Checks whether message msg matches any of interests being waited for.
150
- #
151
- # Some interests look for actions on particular workflows (e.g.,
152
- # waiting for some workflow to finish). Other interests are not
153
- # attached to any particular workflow (e.g., :inactive waits until
154
- # the engine finishes processing all active and pending workflows)
155
- # but are still satisfied when actions happen on workflows (e.g.,
156
- # the last workflow being run finishes).
157
- #
158
- # Returns true if all interests being waited for have been satisfied,
159
- # false otherwise.
160
- #
161
- def matches(interests, msg)
162
-
163
- action = msg['action']
164
-
165
- interests.each do |interest|
166
-
167
- satisfied = case interest
168
-
169
- when :inactive
170
-
171
- (FINAL_ACTIONS.include?(action) && @context.worker.inactive?)
172
-
173
- when :empty
174
-
175
- (action == 'terminated' && @context.storage.empty?('expressions'))
176
-
177
- when Symbol
178
-
179
- (action == 'dispatch' && msg['participant_name'] == interest.to_s)
180
-
181
- when Fixnum
182
-
183
- interests.delete(interest)
184
-
185
- if (interest > 1)
186
- interests << (interest - 1)
187
- false
188
- else
189
- true
190
- end
191
-
192
- else # wfid
193
-
194
- (FINAL_ACTIONS.include?(action) && msg['wfid'] == interest)
195
- end
196
-
197
- interests.delete(interest) if satisfied
198
- end
199
-
200
- interests.size < 1
201
- end
202
- end
203
- end
204
-
@@ -1,103 +0,0 @@
1
- #--
2
- # Copyright (c) 2005-2011, 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
-
26
- module Ruote
27
-
28
- #
29
- # To get a YAML serializer :
30
- #
31
- # serializer = Serializer.new(:yaml)
32
- #
33
- # A marshal + base64 one :
34
- #
35
- # serializer = Serializer.new(:marshal64)
36
- #
37
- # A marshal only one :
38
- #
39
- # serializer = Serializer.new(:marshal)
40
- #
41
- # For the rest, it's the classical :
42
- #
43
- # data = serializer.encode(object)
44
- #
45
- # object = serializer.decode(data)
46
- #
47
- class Serializer
48
-
49
- #--
50
- # prepare / encode / decode lambda pairs
51
- #++
52
-
53
- # plain marshal serialization
54
- #
55
- MARSHAL = [
56
- lambda { },
57
- lambda { |o| Marshal.dump(o) },
58
- lambda { |s| Marshal.load(s) }
59
- ]
60
-
61
- # marshal serialization with base64 encoding
62
- #
63
- MARSHAL64 = [
64
- lambda { require 'base64' },
65
- lambda { |o| Base64.encode64(Marshal.dump(o)) },
66
- lambda { |s| Marshal.load(Base64.decode64(s)) }
67
- ]
68
-
69
- # YAML serialization
70
- #
71
- YAML = [
72
- lambda { require 'yaml' },
73
- lambda { |o| ::YAML.dump(o) },
74
- lambda { |s| ::YAML.load(s) }
75
- ]
76
-
77
- #JASH = ...
78
-
79
- # The flavour map
80
- #
81
- FLAVOURS = {
82
- :marshal => MARSHAL, :marshal64 => MARSHAL64, :yaml => YAML
83
- }
84
-
85
- def initialize(flavour)
86
-
87
- @flavour = FLAVOURS[flavour] || MARSHAL64
88
-
89
- @flavour[0].call # initializes the flavour
90
- end
91
-
92
- def encode(o)
93
-
94
- @flavour[1].call(o)
95
- end
96
-
97
- def decode(s)
98
-
99
- @flavour[2].call(s)
100
- end
101
- end
102
- end
103
-
data/phil.txt DELETED
@@ -1,14 +0,0 @@
1
-
2
- persist then dispatch
3
-
4
- ==
5
-
6
- concurrence (and concurrent-iterator) :
7
-
8
- persist, then fire all children
9
- prepare all children then fire them !!!
10
-
11
- ==
12
-
13
- it can't be perfect, but there can be tools for fixing the consequences of those flaws.
14
-
@@ -1,31 +0,0 @@
1
-
2
- #
3
- # testing ruote
4
- #
5
- # Fri Dec 24 15:35:17 JST 2010
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), 'base')
9
-
10
-
11
- class EftLetTest < Test::Unit::TestCase
12
- include FunctionalBase
13
-
14
- def test_let
15
-
16
- pdef = Ruote.process_definition do
17
- set 'v:var' => 'val'
18
- echo "out:${v:var}"
19
- let do
20
- set 'v:var' => 'val1'
21
- echo "in:${v:var}"
22
- end
23
- echo "out:${v:var}"
24
- end
25
-
26
- #noisy
27
-
28
- assert_trace %w[ out:val in:val1 out:val ], pdef
29
- end
30
- end
31
-
@@ -1,33 +0,0 @@
1
-
2
- #
3
- # testing ruote
4
- #
5
- # Thu Jul 16 16:11:57 JST 2009
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), 'base')
9
-
10
-
11
- class FtAliasTest < Test::Unit::TestCase
12
- include FunctionalBase
13
-
14
- def test_var_alias
15
-
16
- pdef = Ruote.process_definition :name => 'def0' do
17
- set :v => 'alpha', :val => 'bravo'
18
- sequence do
19
- alpha
20
- bravo
21
- end
22
- end
23
-
24
- alpha = @engine.register_participant :bravo do |workitem|
25
- @tracer << "b:#{workitem.fields['params']['original_ref']}\n"
26
- end
27
-
28
- #noisy
29
-
30
- assert_trace(%w[ b:alpha b: ], pdef)
31
- end
32
- end
33
-
@@ -1,54 +0,0 @@
1
-
2
- #
3
- # testing ruote
4
- #
5
- # Sat Oct 23 14:22:15 JST 2010
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), 'base')
9
-
10
-
11
- class FtWfidGeneratorTest < Test::Unit::TestCase
12
- include FunctionalBase
13
-
14
- # an old test, brought back
15
- #
16
- def test_generate_unique_ids
17
-
18
- n = 147
19
-
20
- wfids = []
21
- n.times { wfids << @engine.context.wfidgen.generate }
22
-
23
- assert_equal n, wfids.uniq.size
24
- end
25
-
26
- # making a purge! doesn't incapacitate wfid generation
27
- # (had a false alert when working with @hassox)
28
- #
29
- def test_generate_even_after_a_purge
30
-
31
- assert_not_nil @engine.context.wfidgen.generate
32
-
33
- @engine.storage.purge!
34
- #@engine.context.wfidgen.instance_eval { @last = nil }
35
-
36
- assert_not_nil @engine.context.wfidgen.generate
37
- end
38
-
39
- def test_generate_after_a_put_failed
40
-
41
- assert_not_nil @engine.context.wfidgen.generate
42
-
43
- @engine.context.wfidgen.instance_eval do
44
- if @last['_rev'].is_a?(String)
45
- @last['_rev'] = '1-cc9bc774f00b65ee28a6c0e4f26474de'
46
- else # integer
47
- @last['_rev'] = 123456789
48
- end
49
- end
50
-
51
- assert_not_nil @engine.context.wfidgen.generate
52
- end
53
- end
54
-
@@ -1,403 +0,0 @@
1
-
2
- #
3
- # testing ruote
4
- #
5
- # Mon Dec 14 15:03:13 JST 2009
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
9
-
10
- require_json
11
-
12
- require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
13
-
14
- require 'ruote/fei'
15
- require 'ruote/participant'
16
-
17
-
18
- #
19
- # note : using the 'errors' type, but this test is about generic storage, not
20
- # about errors per se.
21
- #
22
-
23
- class UtStorage < Test::Unit::TestCase
24
-
25
- def setup
26
-
27
- @s = determine_storage({})
28
-
29
- #@s.add_type('errors')
30
-
31
- @s.purge_type!('errors')
32
- @s.purge_type!('expressions')
33
- @s.purge_type!('msgs')
34
- @s.purge_type!('workitems')
35
-
36
- @s.put(
37
- '_id' => 'toto',
38
- 'type' => 'errors',
39
- 'message' => 'testing')
40
- end
41
-
42
- def teardown
43
-
44
- @s.purge_type!('errors')
45
- @s.purge_type!('expressions')
46
- @s.purge_type!('msgs')
47
- @s.purge_type!('workitems')
48
-
49
- @s.shutdown
50
- end
51
-
52
- def test_get_configuration
53
-
54
- assert_not_nil @s.get_configuration('engine')
55
- end
56
-
57
- def test_get
58
-
59
- h = @s.get('errors', 'toto')
60
-
61
- assert_not_nil h['_rev']
62
-
63
- h = @s.get('errors', 'nada')
64
-
65
- assert_nil h
66
- end
67
-
68
- def test_put
69
-
70
- doc = {
71
- '_id' => 'test_put', 'type' => 'errors', 'message' => 'testing (2)' }
72
-
73
- @s.put(doc)
74
-
75
- assert_nil doc['_rev']
76
-
77
- h = @s.get('errors', 'test_put')
78
-
79
- assert_not_nil h['_rev']
80
- assert_not_nil h['put_at']
81
- end
82
-
83
- def test_put_fail
84
-
85
- r = @s.put('_id' => 'toto', 'type' => 'errors', 'message' => 'more')
86
-
87
- assert_equal 'toto', r['_id']
88
- assert_not_nil r['_rev']
89
- end
90
-
91
- def test_put_update_rev
92
-
93
- doc = { '_id' => 'tpur', 'type' => 'errors', 'message' => 'more' }
94
-
95
- r = @s.put(doc, :update_rev => true)
96
-
97
- assert_not_nil doc['_rev']
98
- end
99
-
100
- def test_put_put_and_put
101
-
102
- doc = { '_id' => 'whiskas', 'type' => 'errors', 'message' => 'miam' }
103
-
104
- r = @s.put(doc)
105
- doc = @s.get('errors', 'whiskas')
106
-
107
- r = @s.put(doc)
108
- assert_nil r
109
-
110
- doc = @s.get('errors', 'whiskas')
111
-
112
- assert_not_nil doc['put_at']
113
-
114
- r = @s.put(doc)
115
- assert_nil r
116
- end
117
-
118
- def test_put_update_rev_twice
119
-
120
- doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
121
-
122
- r = @s.put(doc, :update_rev => true)
123
- assert_nil r
124
-
125
- doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
126
-
127
- r = @s.put(doc, :update_rev => true)
128
- assert_not_nil r
129
- end
130
-
131
- def test_delete_fail
132
-
133
- # missing _rev
134
-
135
- assert_raise(ArgumentError) do
136
- @s.delete('_id' => 'toto')
137
- end
138
- end
139
-
140
- def test_delete
141
-
142
- doc = @s.get('errors', 'toto')
143
-
144
- r = @s.delete(doc)
145
-
146
- assert_nil r
147
- end
148
-
149
- def test_delete_missing
150
-
151
- r = @s.delete('_id' => 'x', '_rev' => '12-13231123132', 'type' => 'errors')
152
-
153
- assert_equal true, r
154
- end
155
-
156
- def test_keys_should_be_string
157
-
158
- doc = { '_id' => 'h0', 'type' => 'errors', :m0 => :z, :m1 => [ :a, :b ] }
159
-
160
- @s.put(doc)
161
-
162
- doc = @s.get('errors', 'h0')
163
-
164
- assert_equal 'z', doc['m0']
165
- assert_equal %w[ a b ], doc['m1']
166
- end
167
-
168
- # Updating a gone document must result in a 'true' reply.
169
- #
170
- def test_put_gone
171
-
172
- h = @s.get('errors', 'toto')
173
-
174
- assert_nil @s.delete(h)
175
-
176
- h['colour'] = 'blue'
177
-
178
- assert_equal true, @s.put(h)
179
- end
180
-
181
- def test_purge_type
182
-
183
- @s.purge_type!('errors')
184
-
185
- assert_equal 0, @s.get_many('errors').size
186
- end
187
-
188
- def test_clear
189
-
190
- @s.clear
191
-
192
- assert_equal 0, @s.get_many('errors').size
193
- end
194
-
195
- #def test_purge
196
- # @s.purge!
197
- # assert_equal 0, @s.get_many('errors').size
198
- #end
199
-
200
- def test_ids
201
-
202
- @s.put('_id' => 't_ids0', 'type' => 'errors', 'message' => 'testing')
203
- @s.put('_id' => 't_ids1', 'type' => 'errors', 'message' => 'testing')
204
- @s.put('_id' => 't_ids2', 'type' => 'errors', 'message' => 'testing')
205
-
206
- assert_equal %w[ t_ids0 t_ids1 t_ids2 toto ], @s.ids('errors').sort
207
- end
208
-
209
- def test_get_many
210
-
211
- 30.times do |i|
212
- @s.put(
213
- '_id' => "xx!#{i}",
214
- 'type' => 'errors',
215
- 'wfid' => i.to_s,
216
- 'msg' => "whatever #{i}")
217
- end
218
-
219
- assert_equal 31, @s.get_many('errors').size
220
- assert_equal 1, @s.get_many('errors', '7').size
221
- assert_equal 1, @s.get_many('errors', /!7$/).size
222
- assert_equal 30, @s.get_many('errors', /^xx!/).size
223
- assert_equal 30, @s.get_many('errors', /x/).size
224
- assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
225
- end
226
-
227
- def test_get_many_options
228
-
229
- load_30_errors
230
-
231
- # limit
232
-
233
- assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
234
-
235
- # count
236
-
237
- assert_equal 31, @s.get_many('errors', nil, :count => true)
238
-
239
- # skip and limit
240
-
241
- assert_equal(
242
- %w[ toto yy!00 yy!01 yy!02 ],
243
- @s.get_many(
244
- 'errors', nil, :skip => 0, :limit => 4
245
- ).collect { |d| d['_id'] })
246
- assert_equal(
247
- %w[ yy!02 yy!03 yy!04 ],
248
- @s.get_many(
249
- 'errors', nil, :skip => 3, :limit => 3
250
- ).collect { |d| d['_id'] })
251
-
252
- # skip, limit and reverse
253
-
254
- assert_equal(
255
- %w[ yy!29 yy!28 yy!27 ],
256
- @s.get_many(
257
- 'errors', nil, :skip => 0, :limit => 3, :descending => true
258
- ).collect { |d| d['_id'] })
259
- assert_equal(
260
- %w[ yy!29 yy!28 yy!27 ],
261
- @s.get_many(
262
- 'errors', nil, :skip => 0, :limit => 3, :descending => true
263
- ).collect { |d| d['_id'] })
264
- end
265
-
266
- def test_dump
267
-
268
- load_30_errors
269
-
270
- assert @s.dump('errors').length > 0
271
- end
272
-
273
- def test_ids_and_errors
274
-
275
- load_30_errors
276
-
277
- assert_equal 31, @s.ids('errors').length
278
- end
279
-
280
- def test_ids_are_sorted
281
-
282
- load_30_errors
283
-
284
- assert_equal @s.ids('errors').sort, @s.ids('errors')
285
- end
286
-
287
- def test_reserve
288
-
289
- taoe = Thread.abort_on_exception
290
- Thread.abort_on_exception = true
291
-
292
- reserved = []
293
- threads = []
294
-
295
- threads << Thread.new do
296
- i = 0
297
- loop do
298
- @s.put_msg('launch', 'tree' => i)
299
- i = i + 1
300
- end
301
- end
302
-
303
- 2.times do
304
-
305
- threads << Thread.new do
306
- loop do
307
- msgs = @s.get_msgs
308
- msgs[0, 100].each do |msg|
309
- next if msg['tree'].nil?
310
- next unless @s.reserve(msg)
311
- if reserved.include?(msg['tree'])
312
- puts "=" * 80
313
- p [ :dbl, :r, msg['_rev'], :t, msg['tree'] ]
314
- end
315
- reserved << msg['tree']
316
- sleep(rand * 0.01)
317
- end
318
- end
319
- end
320
- end
321
-
322
- sleep 7
323
-
324
- threads.each { |t| t.terminate }
325
-
326
- Thread.abort_on_exception = taoe
327
-
328
- assert_equal false, reserved.empty?
329
- assert_equal reserved.size, reserved.uniq.size
330
- end
331
-
332
- def test_by_field
333
-
334
- return unless @s.respond_to?(:by_field)
335
-
336
- load_workitems
337
-
338
- assert_equal 3, @s.by_field('workitems', 'place', 'kyouto').size
339
- assert_equal 1, @s.by_field('workitems', 'place', 'sendai').size
340
- assert_equal Hash, @s.by_field('workitems', 'place', 'sendai').first.class
341
- end
342
-
343
- def test_by_participant
344
-
345
- return unless @s.respond_to?(:by_participant)
346
-
347
- load_workitems
348
-
349
- assert_equal 2, @s.by_participant('workitems', 'fujiwara', {}).size
350
- assert_equal 1, @s.by_participant('workitems', 'shingen', {}).size
351
- assert_equal Hash, @s.by_participant('workitems', 'shingen', {}).first.class
352
- end
353
-
354
- def test_query_workitems
355
-
356
- return unless @s.respond_to?(:query_workitems)
357
-
358
- load_workitems
359
-
360
- assert_equal 3, @s.query_workitems('place' => 'kyouto').size
361
- assert_equal 1, @s.query_workitems('place' => 'kyouto', 'at' => 'kamo').size
362
-
363
- assert_equal(
364
- Ruote::Workitem, @s.query_workitems('place' => 'kyouto').first.class)
365
- end
366
-
367
- protected
368
-
369
- def load_30_errors
370
-
371
- 30.times do |i|
372
- @s.put(
373
- '_id' => sprintf("yy!%0.2d", i),
374
- 'type' => 'errors',
375
- 'msg' => "whatever #{i}")
376
- end
377
- end
378
-
379
- def put_workitem(wfid, participant_name, fields)
380
-
381
- @s.put(
382
- 'type' => 'workitems',
383
- '_id' => "wi!0_0!12ff!#{wfid}",
384
- 'participant_name' => participant_name,
385
- 'wfid' => wfid,
386
- 'fields' => fields)
387
- end
388
-
389
- def load_workitems
390
-
391
- put_workitem(
392
- '20110218-nadanada', 'fujiwara', 'place' => 'kyouto')
393
- put_workitem(
394
- '20110218-nedenada', 'fujiwara', 'place' => 'kyouto', 'at' => 'kamo')
395
- put_workitem(
396
- '20110218-nadanodo', 'taira', 'place' => 'kyouto')
397
- put_workitem(
398
- '20110218-nodonada', 'date', 'place' => 'sendai')
399
- put_workitem(
400
- '20110218-nadanudu', 'shingen', 'place' => 'nagoya')
401
- end
402
- end
403
-