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
@@ -6,23 +6,25 @@
6
6
  #
7
7
 
8
8
  require 'ruote/storage/hash_storage'
9
- require 'ruote/storage/fs_storage'
10
9
 
11
10
 
12
- def locate_storage_impl (arg)
11
+ def locate_storage_impl(pers)
13
12
 
14
- pers = arg[2..-1]
13
+ glob = File.expand_path("../../../../ruote-#{pers}*", __FILE__)
15
14
 
16
- path = Dir[File.expand_path(
17
- File.join(File.dirname(__FILE__), %w[ .. .. .. ], "ruote-#{pers}*"))].first
15
+ path = Dir[glob].first
18
16
 
19
- File.directory?(path) ? [ pers, path ] : nil
17
+ if path
18
+ File.directory?(path) ? [ pers, path ] : nil
19
+ elsif glob.split('/').include?('bundler')
20
+ glob.match(/^(.+\/ruote-#{pers}\/).+/) ? [ pers, $~[1] ] : nil
21
+ end
20
22
  end
21
23
 
24
+ # Returns an instance of the storage to use (the ARGV determines which
25
+ # storage to use).
22
26
  #
23
- # Returns the class of the engine to use, based on the ARGV
24
- #
25
- def determine_storage (opts)
27
+ def determine_storage(opts)
26
28
 
27
29
  if ARGV.include?('--help')
28
30
  puts %{
@@ -39,58 +41,69 @@ else uses the in-memory Ruote::Engine (fastest, but no persistence at all)
39
41
 
40
42
  ps = ARGV.select { |a| a.match(/^--[a-z]/) }
41
43
  ps.delete('--split')
44
+ ps = ps.collect { |s| m = s.match(/^--(.+)$/); m ? m[1] : s }
45
+
46
+ ps = [ ENV['RUOTE_STORAGE'] ].compact if ps.empty?
47
+
48
+ ps = [] if ps == [ 'hash' ] || ps == [ 'memory' ]
42
49
 
43
50
  persistent = opts.delete(:persistent)
44
51
 
45
- if ps.include?('--fs')
52
+ if ps.include?('fs')
46
53
 
47
- begin
48
- require 'yajl'
49
- rescue LoadError
50
- require 'json'
51
- end
54
+ require 'ruote/storage/fs_storage'
55
+
56
+ require_json
52
57
  Rufus::Json.detect_backend
53
58
 
54
59
  Ruote::FsStorage.new('work', opts)
55
60
 
56
61
  elsif not ps.empty?
57
62
 
58
- pers = nil
59
- ps.find { |a| pers = locate_storage_impl(a) }
63
+ pers = ps.inject(nil) { |r, a| r ? r : locate_storage_impl(a) }
60
64
 
61
65
  raise "no persistence found (#{ps.inspect})" unless pers
62
66
 
63
67
  lib, path = pers
64
68
  $:.unshift(File.join(path, 'lib'))
65
69
 
66
- begin
67
- load 'test/functional_connection.rb'
68
- rescue LoadError => le
70
+ load_errors = []
71
+
72
+ [ '.', path ].product(%w[
73
+ connection functional_connection integration_connection
74
+ ]).each do |pa, f|
75
+
76
+ paf = "#{File.join(pa, 'test', f)}.rb"
69
77
  begin
70
- load File.join(path, %w[ test functional_connection.rb ])
71
- rescue LoadError => lee
72
- begin
73
- load File.join(path, %w[ test integration_connection.rb ])
74
- rescue LoadError => leee
75
- p le
76
- p lee
77
- p leee
78
- raise leee
79
- end
78
+ load(paf)
79
+ load_errors = nil
80
+ break
81
+ rescue LoadError => le
82
+ load_errors << [ paf, le ]
83
+ end
84
+ end
85
+
86
+ if load_errors
87
+ puts "=" * 80
88
+ puts "** failed to load connection"
89
+ load_errors.each do |paf, le|
90
+ puts
91
+ puts paf
92
+ p le
80
93
  end
94
+ puts "=" * 80
95
+ exit(1)
81
96
  end
82
97
 
83
98
  new_storage(opts)
84
99
 
85
100
  elsif persistent
86
101
 
87
- begin
88
- require 'yajl'
89
- rescue LoadError
90
- require 'json'
91
- end
102
+ require_json
92
103
  Rufus::Json.detect_backend
93
104
 
105
+ require 'ruote/storage/fs_storage'
106
+
94
107
  Ruote::FsStorage.new('work', opts)
95
108
 
96
109
  else
@@ -5,9 +5,9 @@
5
5
  # since Mon Oct 9 22:19:44 JST 2006
6
6
  #
7
7
 
8
- def l (t)
8
+ def l(t)
9
9
 
10
- if ARGV.include?('--split')
10
+ if ENV['RUOTE_TEST_SPLIT'].to_s == 'true'
11
11
 
12
12
  puts
13
13
  puts "=== #{t} :"
@@ -17,7 +17,9 @@ def l (t)
17
17
  es = es.nil? ? 66 : es.to_s.to_i
18
18
 
19
19
  exit(es) if es != 0
20
+
20
21
  else
22
+
21
23
  load(t)
22
24
  end
23
25
  end
@@ -33,6 +35,8 @@ unless RUBY_PLATFORM.match(/mswin|mingw/)
33
35
  # concurrence/collision tests, tests about 2+ instances of ruote colliding
34
36
  end
35
37
 
38
+ l(File.expand_path('../storage.rb', __FILE__))
39
+
36
40
  Dir.glob(File.join(File.dirname(__FILE__), 'ft_*.rb')).sort.each { |t| l(t) }
37
41
  # functional tests targetting features rather than expressions
38
42
 
@@ -0,0 +1,21 @@
1
+
2
+ #
3
+ # test/idle.rb
4
+ #
5
+ # Thu Jul 26 20:34:53 JST 2012
6
+ #
7
+ # used when observing ruote's idle behaviour (checking it's not polling too
8
+ # much)
9
+ #
10
+
11
+ require 'rufus-json/automatic'
12
+ require 'ruote'
13
+ require File.expand_path('../../functional/storage_helper', __FILE__)
14
+
15
+ sto = determine_storage({})
16
+
17
+ dboard = Ruote::Dashboard.new(Ruote::Worker.new(sto))
18
+ #dboard.noisy = ENV['NOISY'].to_s == 'true'
19
+
20
+ dboard.join
21
+
@@ -0,0 +1,29 @@
1
+
2
+ #
3
+ # test/idle.rb
4
+ #
5
+ # Thu Jul 26 20:34:53 JST 2012
6
+ #
7
+ # light load, for a few hours
8
+ #
9
+
10
+ require 'rufus-json/automatic'
11
+ require 'ruote'
12
+ require File.expand_path('../../functional/storage_helper', __FILE__)
13
+
14
+ sto = determine_storage({})
15
+
16
+ dboard = Ruote::Dashboard.new(Ruote::Worker.new(sto))
17
+ dboard.noisy = ENV['NOISY'].to_s == 'true'
18
+
19
+ dboard.register 'alpha' do |workitem|
20
+ sleep(60.0 * rand)
21
+ end
22
+
23
+ loop do
24
+ dboard.launch(Ruote.define do
25
+ 21.times { alpha }
26
+ end)
27
+ sleep(60.0 * 10 * rand)
28
+ end
29
+
@@ -10,6 +10,6 @@
10
10
  puts `ruby -v`
11
11
  puts Time.now.to_s
12
12
 
13
- ruotelib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ ruotelib = File.expand_path('../../lib', __FILE__)
14
14
  $:.unshift(ruotelib) unless $:.include?(ruotelib)
15
15
 
@@ -5,9 +5,6 @@
5
5
  # since Mon Oct 9 22:19:44 JST 2006
6
6
  #
7
7
 
8
- load File.dirname(__FILE__) + '/unit/test.rb'
9
- load File.dirname(__FILE__) + '/functional/test.rb'
10
-
11
- #load File.dirname(__FILE__) + '/extras/test.rb'
12
- # special tests that require external stuff
8
+ load File.expand_path('../unit/test.rb', __FILE__)
9
+ load File.expand_path('../functional/test.rb', __FILE__)
13
10
 
@@ -7,15 +7,28 @@
7
7
 
8
8
  require File.join(File.dirname(__FILE__), 'path_helper')
9
9
 
10
+ require 'pp'
10
11
  require 'test/unit'
11
12
  require 'rubygems'
12
13
 
14
+ # Fail fast, especially when testing
15
+ #
16
+ Thread.abort_on_exception = true
13
17
 
18
+ # A helper method
19
+ #
14
20
  def require_json
21
+
22
+ return if $json_lib_loaded
23
+
15
24
  begin
16
25
  require 'yajl'
26
+ require 'yajl/version'
27
+ puts "using yajl #{Yajl::VERSION}"
17
28
  rescue LoadError
18
29
  require 'json'
30
+ puts "using json #{JSON::VERSION}"
19
31
  end
32
+ $json_lib_loaded = true
20
33
  end
21
34
 
@@ -5,7 +5,7 @@
5
5
  # since Mon Oct 9 22:19:44 JST 2006
6
6
  #
7
7
 
8
- def l (t)
8
+ def l(t)
9
9
 
10
10
  if ARGV.include?('--split')
11
11
 
@@ -21,8 +21,5 @@ def l (t)
21
21
  end
22
22
  end
23
23
 
24
- load File.join(File.dirname(__FILE__), 'storage.rb')
25
-
26
24
  Dir.glob(File.join(File.dirname(__FILE__), 'ut_*.rb')).sort.each { |t| l(t) }
27
- Dir.glob(File.join(File.dirname(__FILE__), 'hut_*.rb')).sort.each { |t| l(t) }
28
25
 
@@ -5,7 +5,7 @@
5
5
  # Tue May 12 15:31:26 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
8
+ require File.expand_path('../../test_helper', __FILE__)
9
9
 
10
10
  require 'ruote/reader'
11
11
 
@@ -130,33 +130,33 @@ class UtRubyReaderTest < Test::Unit::TestCase
130
130
  Ruote::Reader.read %{ Ruote.define { alpha } }
131
131
  #end
132
132
 
133
- assert_raise ArgumentError do
133
+ assert_raise Ruote::Reader::Error do
134
134
  Ruote::Reader.read %{ Ruote.define { abort } }
135
135
  end
136
- assert_raise ArgumentError do
136
+ assert_raise Ruote::Reader::Error do
137
137
  Ruote::Reader.read %{ Ruote.define { exit } }
138
138
  end
139
- assert_raise ArgumentError do
139
+ assert_raise Ruote::Reader::Error do
140
140
  Ruote::Reader.read %{ Ruote.define { exit! } }
141
141
  end
142
142
 
143
- assert_raise ArgumentError do
143
+ assert_raise Ruote::Reader::Error do
144
144
  Ruote::Reader.read %{ Ruote.define { x = Kernel } }
145
145
  end
146
146
 
147
- assert_raise ArgumentError do
147
+ assert_raise Ruote::Reader::Error do
148
148
  Ruote::Reader.read %{ Ruote.define { module Nada; end } }
149
149
  end
150
150
 
151
- assert_raise ArgumentError do
151
+ assert_raise Ruote::Reader::Error do
152
152
  Ruote::Reader.read %{ Ruote.define { File.read('stuff') } }
153
153
  end
154
154
 
155
- assert_raise ArgumentError do
155
+ assert_raise Ruote::Reader::Error do
156
156
  Ruote::Reader.read %{ Ruote.define { at_exit { } } }
157
157
  end
158
158
 
159
- assert_raise ArgumentError do
159
+ assert_raise Ruote::Reader::Error do
160
160
  Ruote::Reader.read %{ Ruote.define { def nada; end } }
161
161
  end
162
162
  end
@@ -203,5 +203,21 @@ class UtRubyReaderTest < Test::Unit::TestCase
203
203
  ] ],
204
204
  tree)
205
205
  end
206
+
207
+ def test_proc
208
+
209
+ tree = Ruote.define do
210
+ set 'v:v' => "lambda { |wi| p wi }\n"
211
+ set 'v:v' => lambda { |wi| p wi }
212
+ set 'v:v' => { 'on_workitem' => lambda { |wi| p wi } }
213
+ end
214
+
215
+ assert_equal(
216
+ [ 'define', {}, [
217
+ [ 'set', { 'v:v' => "lambda { |wi| p wi }\n" }, [] ],
218
+ [ 'set', { 'v:v' => "proc { |wi| p wi }\n" }, [] ],
219
+ [ 'set', { 'v:v' => { 'on_workitem' => "proc { |wi| p wi }\n" } }, [] ] ] ],
220
+ tree)
221
+ end
206
222
  end
207
223
 
@@ -0,0 +1,47 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Wed Jun 29 12:05:41 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../../test_helper', __FILE__)
9
+
10
+ require 'ruote/workitem'
11
+ require 'ruote/part/local_participant'
12
+
13
+
14
+ class UtParticipantsTest < Test::Unit::TestCase
15
+
16
+ class OldParticipant
17
+ include Ruote::LocalParticipant
18
+ def consume(workitem)
19
+ $result = workitem.fields['test']
20
+ end
21
+ end
22
+
23
+ class NewParticipant
24
+ include Ruote::LocalParticipant
25
+ def on_workitem
26
+ $result = workitem.fields['test']
27
+ end
28
+ end
29
+
30
+ def new_workitem(fields)
31
+ Ruote::Workitem.new('fields' => fields)
32
+ end
33
+
34
+ def test_consume
35
+
36
+ OldParticipant.new._consume(new_workitem('test' => 'zero'))
37
+ assert_equal 'zero', $result
38
+ OldParticipant.new._on_workitem(new_workitem('test' => 'zero'))
39
+ assert_equal 'zero', $result
40
+
41
+ NewParticipant.new._consume(new_workitem('test' => 'one'))
42
+ assert_equal 'one', $result
43
+ NewParticipant.new._on_workitem(new_workitem('test' => 'one'))
44
+ assert_equal 'one', $result
45
+ end
46
+ end
47
+
@@ -5,7 +5,7 @@
5
5
  # Mon Aug 3 19:19:58 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
8
+ require File.expand_path('../../test_helper', __FILE__)
9
9
 
10
10
  require 'ruote/util/lookup'
11
11
 
@@ -18,6 +18,12 @@ class LookupTest < Test::Unit::TestCase
18
18
  assert_equal('B', Ruote.lookup({ 'h' => %w[ A B C ] }, 'h.1'))
19
19
  end
20
20
 
21
+ def test_hash_lookup_and_number_keys
22
+
23
+ assert_equal('B', Ruote.lookup({ '1' => %w[ A B C ] }, '1.1'))
24
+ assert_equal('B', Ruote.lookup({ 1 => %w[ A B C ] }, '1.1'))
25
+ end
26
+
21
27
  def test_lookup_dot
22
28
 
23
29
  h = { 'a' => 'b' }
@@ -27,11 +33,26 @@ class LookupTest < Test::Unit::TestCase
27
33
 
28
34
  def test_container_lookup
29
35
 
36
+ assert_equal(
37
+ %w[ A B C ],
38
+ Ruote.lookup({ 'h' => { 'hh' => %w[ A B C ]} }, 'h.hh', false))
30
39
  assert_equal(
31
40
  [ 'hh', { 'hh' => %w[ A B C ] } ],
32
41
  Ruote.lookup({ 'h' => { 'hh' => %w[ A B C ]} }, 'h.hh', true))
33
42
  end
34
43
 
44
+ def test_deep_container_lookup
45
+
46
+ h = { 'foo' => { 'bar' => { 'baz' => { 'fruit' => 'pineapple' } } } }
47
+
48
+ assert_equal(
49
+ "pineapple",
50
+ Ruote.lookup(h, 'foo.bar.baz.fruit', false))
51
+ assert_equal(
52
+ [ 'fruit', { 'fruit' => 'pineapple' } ],
53
+ Ruote.lookup(h, 'foo.bar.baz.fruit', true))
54
+ end
55
+
35
56
  def test_missing_container_lookup
36
57
 
37
58
  assert_equal(
@@ -39,6 +60,21 @@ class LookupTest < Test::Unit::TestCase
39
60
  Ruote.lookup({ 'h' => { 'hh' => %w[ A B C ]} }, 'nada.nada', true))
40
61
  end
41
62
 
63
+ def test_has_key
64
+
65
+ h = { 'h' => %w[ a b c ] }
66
+
67
+ assert_equal(true, Ruote.has_key?(h, 'h'))
68
+ assert_equal(true, Ruote.has_key?(h, 'h.1'))
69
+
70
+ h = { 'foo' => { 'bar' => { 'baz' => { 'fruit' => 'pineapple' } } } }
71
+
72
+ assert_equal(true, Ruote.has_key?(h, 'foo.bar.baz.fruit'))
73
+ assert_equal(true, Ruote.has_key?(h, 'foo.bar'))
74
+
75
+ assert_equal(false, Ruote.has_key?(h, 'bar'))
76
+ end
77
+
42
78
  def test_set
43
79
 
44
80
  h = { 'customer' => { 'name' => 'alpha' } }
@@ -47,12 +83,33 @@ class LookupTest < Test::Unit::TestCase
47
83
  assert_equal({"customer"=>{"name"=>"bravo"}}, h)
48
84
  end
49
85
 
86
+ # courtesy of Nando Sola
87
+ #
88
+ def test_deep_set
89
+
90
+ h = { 'foo' => { 'bar' => { 'baz' => { 'fruit' => 'pineapple' } } } }
91
+
92
+ Ruote.set(h, 'foo.bar.baz.fruit', 'orange')
93
+
94
+ assert_equal(
95
+ { "foo" => { "bar" => { "baz" => { "fruit" => "orange" } } } },
96
+ h)
97
+ end
98
+
50
99
  def test_set_missing
51
100
 
52
101
  h = {}
53
102
  Ruote.set(h, 'customer.name', 'bravo')
54
103
 
55
- assert_equal({"customer.name"=>"bravo"}, h)
104
+ assert_equal({ 'customer.name' => 'bravo' }, h)
105
+ end
106
+
107
+ def test_set_integer_corner_case
108
+
109
+ h = {}
110
+ Ruote.set(h, '0_0_1', 'charly')
111
+
112
+ assert_equal({ '0_0_1' => 'charly' }, h)
56
113
  end
57
114
 
58
115
  def test_hash_unset