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,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -25,8 +25,6 @@
25
25
 
26
26
  module Ruote::Exp
27
27
 
28
- #
29
- # (Since ruote 2.1.12)
30
28
  #
31
29
  # This expressions lets one register participants directly from a process
32
30
  # definition.
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -56,6 +56,7 @@ module Ruote::Exp
56
56
  class RestoreExpression < FlowExpression
57
57
 
58
58
  include MergeMixin
59
+ # still have to implement something about merge...
59
60
 
60
61
  names :restore, :set_fields
61
62
 
@@ -66,9 +67,8 @@ module Ruote::Exp
66
67
  has_attribute(*%w[ f fld field ].map { |k| "from_#{k}" }) ||
67
68
  has_attribute(*%w[ val value ])
68
69
 
69
- to =
70
- has_attribute(*%w[ f fld field ].map { |k| "to_#{k}" }) ||
71
- has_attribute('to')
70
+ _, to_f = determine_tos
71
+ # note : to_v is discarded (the underscore)
72
72
 
73
73
  from = 'from_var' if from == 'from_v'
74
74
 
@@ -82,8 +82,8 @@ module Ruote::Exp
82
82
  afrom
83
83
  end
84
84
 
85
- if to
86
- Ruote.set(h.applied_workitem['fields'], attribute(to), fields)
85
+ if to_f
86
+ Ruote.set(h.applied_workitem['fields'], to_f, fields)
87
87
  else
88
88
  h.applied_workitem['fields'] = fields
89
89
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -23,18 +23,21 @@
23
23
  #++
24
24
 
25
25
 
26
-
27
26
  module Ruote::Exp
28
27
 
29
28
  #
30
29
  # Saves the current workitem fields into a variable or into a field.
31
30
  #
32
31
  # save :to_field => 'old_workitem'
32
+ # # or
33
+ # save :to => 'f:old_workitem'
33
34
  # #
34
35
  # # saves a copy of the fields of the current workitem into itself,
35
36
  # # in the field named 'old_workitem'
36
37
  #
37
38
  # save :to_variable => '/wix'
39
+ # # or
40
+ # save :to => 'v:/wix'
38
41
  # #
39
42
  # # saves a copy of the current workitem in the varialbe 'wix' at
40
43
  # # the root of the process
@@ -47,24 +50,14 @@ module Ruote::Exp
47
50
 
48
51
  def apply
49
52
 
50
- tk =
51
- has_attribute(*%w[ v var variable ].map { |k| "to_#{k}" }) ||
52
- has_attribute(*%w[ f fld field ].map { |k| "to_#{k}" })
53
-
54
- return reply_to_parent(h.applied_workitem) unless tk
55
-
56
- key = attribute(tk)
57
-
58
- if tk.match(/^to_v/)
59
-
60
- set_variable(key, h.applied_workitem['fields'])
61
-
62
- elsif tk.match(/^to_f/)
53
+ to_v, to_f = determine_tos
63
54
 
64
- Ruote.set(
65
- h.applied_workitem['fields'],
66
- key,
67
- Ruote.fulldup(h.applied_workitem['fields']))
55
+ if to_v
56
+ set_variable(to_v, h.applied_workitem['fields'])
57
+ elsif to_f
58
+ set_f(to_f, Ruote.fulldup(h.applied_workitem['fields']))
59
+ #else
60
+ # do nothing
68
61
  end
69
62
 
70
63
  reply_to_parent(h.applied_workitem)
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -34,12 +34,48 @@ module Ruote::Exp
34
34
  # participant 'charly'
35
35
  # end
36
36
  #
37
+ #
38
+ # == using 'let'
39
+ #
40
+ # 'let' behaves like a sequence, but the children have their own variable
41
+ # scope.
42
+ #
43
+ # pdef = Ruote.process_definition do
44
+ # set 'v:var' => 'val'
45
+ # echo "out:${v:var}"
46
+ # let do
47
+ # set 'v:var' => 'val1'
48
+ # echo "in:${v:var}"
49
+ # end
50
+ # echo "out:${v:var}"
51
+ # end
52
+ #
53
+ # # => out:val, in:val1, out:val
54
+ #
55
+ #
56
+ # == as a 'case' statement
57
+ #
58
+ # let do
59
+ # define 'published' do
60
+ # do_this
61
+ # end
62
+ # define 'reviewed' do
63
+ # do_that
64
+ # end
65
+ # subprocess '${case}'
66
+ # end
67
+ #
68
+ # Subprocesses 'published' and 'reviewed' are bound in a local scope,
69
+ # that gets discarded when the let exits.
70
+ #
37
71
  class SequenceExpression < FlowExpression
38
72
 
39
- names :sequence
73
+ names :sequence, :let
40
74
 
41
75
  def apply
42
76
 
77
+ h.variables ||= {} if name == 'let'
78
+
43
79
  reply(h.applied_workitem)
44
80
  end
45
81
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -22,6 +22,8 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
+ require 'ruote/exp/fe_sequence'
26
+
25
27
 
26
28
  module Ruote::Exp
27
29
 
@@ -58,6 +60,33 @@ module Ruote::Exp
58
60
  #
59
61
  # set :f => 'my_field', :value => 'oh and ${whatever}', :escape => true
60
62
  #
63
+ # == :override / :over
64
+ #
65
+ # (attribute introduced in ruote 2.3.0)
66
+ #
67
+ # When setting a variable with no slash prefix, the target will always be the
68
+ # most local scope. When one wants to purposely override/overwrite an already
69
+ # set variable, the attribute :override can be set to true.
70
+ #
71
+ # In this example, although the second 'set' happens in its own scope, the
72
+ # variable v0, will be set to 'b' in the initial (top) scope:
73
+ #
74
+ # pdef = Ruote.define do
75
+ # set 'v:v0' => 'a'
76
+ # sequence :scope => true do
77
+ # set 'v:v0' => 'b', :over => true
78
+ # end
79
+ # end
80
+ #
81
+ # :over(ride) tells the 'set' expression to locate where the var is set
82
+ # and change the value there.
83
+ #
84
+ # :over is ignored for process (/) and engine (//) variables. It has no
85
+ # meaning for workitem fields.
86
+ #
87
+ # When :over is set to 'sub' (or :sub), the :over => true behaviour is
88
+ # followed, but it doesn't cross into the parent subprocess.
89
+ #
61
90
  # == ruote 2.0's shorter form
62
91
  #
63
92
  # Ruote 2.0 introduces a shorter form for the 'set' expression :
@@ -85,6 +114,29 @@ module Ruote::Exp
85
114
  # set 'f_${v:v}' => 'val2'
86
115
  # end
87
116
  #
117
+ # === shorter form and non-string values
118
+ #
119
+ # Dollar substitutions like '${a}' will always squash the field or the
120
+ # variable into a string. It's useful, especially when one is doing
121
+ # 'user-${name}', but when the field (or variable) is an array or an hash
122
+ #
123
+ # set 'f' => '${array}'
124
+ #
125
+ # will put the string representation of array into the field 'f', not
126
+ # a copy of the array itself.
127
+ #
128
+ # This will copy the array into the field 'f':
129
+ #
130
+ # set 'f' => '$f:array'
131
+ #
132
+ # Note the mandatory 'f:'. There is a thing to be aware of: if the field
133
+ # array is missing, it will resolve into "$f:array" (no substitution at all).
134
+ #
135
+ # There is always the old-style fallback:
136
+ #
137
+ # set :field => 'f', :field_value => 'array'
138
+ #
139
+ #
88
140
  # == set and rset
89
141
  #
90
142
  # Some gems (Sinatra) for example may provide a set method that hides calls
@@ -94,75 +146,126 @@ module Ruote::Exp
94
146
  #
95
147
  # rset 'customer' => 'Jeff'
96
148
  #
97
- class SetExpression < FlowExpression
149
+ #
150
+ # == unset
151
+ #
152
+ # 'unset' is the counterpart to 'set', it removes a field (or a variable)
153
+ #
154
+ # unset :field => 'customer_name'
155
+ # unset :f => 'customer_name'
156
+ # unset :variable => 'vx'
157
+ # unset :var => 'vx'
158
+ # unset :v => 'vx'
159
+ #
160
+ # or simply
161
+ #
162
+ # unset 'f:customer_name'
163
+ # unset 'customer_name' # yes, it's field by default
164
+ # unset 'v:vx'
165
+ #
166
+ #
167
+ # == using set with a block
168
+ #
169
+ # (not a very common usage, introduced by ruote 2.3.0)
170
+ #
171
+ # 'set' can be used with a block. It then behaves like a 'sequence' and
172
+ # picks its value in the workitem field named '__result__'.
173
+ #
174
+ # set 'customer_name' do
175
+ # participant 'alice'
176
+ # participant 'bob'
177
+ # end
178
+ #
179
+ # Here, alice or bob may set the field '__result__' to some value,
180
+ # that will get picked as the value of the field 'customer_name'.
181
+ #
182
+ # Note that inside the set, a blank variable scope will be used (like in
183
+ # a 'let).
184
+ #
185
+ #
186
+ # == __result__
187
+ #
188
+ # 'set' and 'unset' place the [un]set value in the field named __result__.
189
+ #
190
+ # sequence do
191
+ # set 'f0' => 2
192
+ # participant 'x${__result__}''
193
+ # end
194
+ #
195
+ # will route a workitem to the participant named 'x2'.
196
+ #
197
+ class SetExpression < SequenceExpression
98
198
 
99
199
  names :rset, :set, :unset
100
200
 
101
201
  def apply
102
202
 
103
- opts = { :escape => attribute(:escape) }
203
+ h.variables ||= {} # ensures a local scope
104
204
 
105
- value = lookup_val(opts)
106
- # a nil value is totally OK
205
+ reply(h.applied_workitem)
206
+ end
107
207
 
108
- if var_key = has_attribute(:v, :var, :variable)
208
+ def reply_to_parent(workitem)
109
209
 
110
- set_v(attribute(var_key), value)
210
+ h.applied_workitem['fields'] = workitem['fields']
211
+ # since set_vf and co work on h.applied_workitem...
111
212
 
112
- elsif field_key = has_attribute(:f, :fld, :field)
213
+ opts = { :escape => attribute(:escape) }
214
+ compiled_atts = compile_atts(opts)
113
215
 
114
- set_f(attribute(field_key), value)
216
+ kv = find_kv(compiled_atts)
115
217
 
116
- elsif value == nil && kv = expand_atts(opts).find { |k, v| k != 'escape' }
218
+ over = attribute(:override) || attribute(:over)
219
+ unset = name == 'unset'
117
220
 
118
- set_vf(*kv)
221
+ h.variables = nil
222
+ # the local scope is over,
223
+ # variables set here will be set in the parent scope
119
224
 
225
+ value = if tree_children.empty?
226
+ lookup_val(opts)
120
227
  else
121
-
122
- raise ArgumentError.new(
123
- "missing a variable or field target in #{tree.inspect}")
228
+ h.applied_workitem['fields']['__result__']
124
229
  end
230
+ #
231
+ # a nil value is totally OK
125
232
 
126
- reply_to_parent(h.applied_workitem)
127
- end
233
+ result = if var_key = has_attribute(:v, :var, :variable)
128
234
 
129
- def reply(workitem)
235
+ set_v(attribute(var_key), value, :unset => unset, :override => over)
130
236
 
131
- # never called
132
- end
237
+ elsif field_key = has_attribute(:f, :fld, :field)
133
238
 
134
- protected
239
+ set_f(attribute(field_key), value, :unset => unset)
135
240
 
136
- def set_v(key, value)
241
+ elsif value == nil && kv
137
242
 
138
- if name == 'unset'
139
- unset_variable(key)
140
- else
141
- set_variable(key, value)
142
- end
143
- end
243
+ kv << { :unset => unset, :override => over }
244
+
245
+ set_vf(*kv)
246
+
247
+ elsif kv
144
248
 
145
- def set_f(key, value)
249
+ set_vf(kv.first, value, :unset => unset, :override => over)
146
250
 
147
- if name == 'unset'
148
- h.applied_workitem['fields'].delete(key)
149
251
  else
150
- Ruote.set(h.applied_workitem['fields'], key, value)
252
+
253
+ raise ArgumentError.new(
254
+ "missing a variable or field target in #{tree.inspect}")
151
255
  end
152
- end
153
256
 
154
- PREFIX_REGEX = /^([^:]+):(.+)$/ #unless defined?(PREFIX_REGEX)
257
+ h.applied_workitem['fields']['__result__'] = result
155
258
 
156
- def set_vf(key, value)
259
+ super(h.applied_workitem)
260
+ end
261
+
262
+ protected
157
263
 
158
- field = true
264
+ def find_kv(atts)
159
265
 
160
- if m = PREFIX_REGEX.match(key)
161
- field = m[1][0, 1] == 'f'
162
- key = m[2]
163
- end
266
+ forbidden = COMMON_ATT_KEYS + %w[ escape over override ]
164
267
 
165
- field ? set_f(key, value) : set_v(key, value)
268
+ atts.find { |k, v| ! forbidden.include?(k) }
166
269
  end
167
270
  end
168
271
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -22,53 +22,22 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
- require 'ruote/exp/fe_sequence'
26
-
27
25
 
28
26
  module Ruote::Exp
29
27
 
30
28
  #
31
- # Behaves like a sequence, but the children have their own variable
32
- # scope.
33
- #
34
- # pdef = Ruote.process_definition do
35
- # set 'v:var' => 'val'
36
- # echo "out:${v:var}"
37
- # let do
38
- # set 'v:var' => 'val1'
39
- # echo "in:${v:var}"
40
- # end
41
- # echo "out:${v:var}"
42
- # end
43
- #
44
- # # => out:val, in:val1, out:val
45
- #
29
+ # Stalls the [current branch of the] process. Does it by simply getting
30
+ # applied and not replying.
46
31
  #
47
- # == as a 'case' statement
32
+ # Mostly used for tests.
48
33
  #
49
- # let do
50
- # define 'published' do
51
- # do_this
52
- # end
53
- # define 'reviewed' do
54
- # do_that
55
- # end
56
- # subprocess '${case}'
57
- # end
58
- #
59
- # Subprocesses 'published' and 'reviewed' are bound in a local scope,
60
- # that gets discarded when the let exits.
61
- #
62
- class LetExpression < SequenceExpression
34
+ class StallExpression < FlowExpression
63
35
 
64
- names :let
36
+ names :stall
65
37
 
66
38
  def apply
67
39
 
68
- h.variables = {}
69
- # the blank local scope
70
-
71
- reply(h.applied_workitem)
40
+ # do nothing, stall the [current branch of the] process.
72
41
  end
73
42
  end
74
43
  end