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
@@ -5,7 +5,7 @@
5
5
  # Thu Mar 4 10:24:30 JST 2010
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_json
11
11
  require 'ruote/context'
@@ -5,8 +5,9 @@
5
5
  # Fri May 15 10:08:51 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
+ require 'ostruct'
10
11
  require 'ruote'
11
12
 
12
13
 
@@ -159,7 +160,15 @@ class UtFeiTest < Test::Unit::TestCase
159
160
 
160
161
  ids = n.times.collect { Ruote.generate_subid(h) }
161
162
 
162
- assert_equal n, ids.uniq.size, "subid generation seems weak"
163
+ assert_equal n, ids.uniq.size, '/!\ subid generation seems weak'
164
+ end
165
+
166
+ def test_extract_wfid
167
+
168
+ assert_equal 'i', Ruote.extract_wfid('i')
169
+ assert_equal 'i', Ruote.extract_wfid({ 'wfid' => 'i' })
170
+ assert_equal 'i', Ruote.extract_wfid({ 'fei' => { 'wfid' => 'i' } })
171
+ assert_equal 'i', Ruote.extract_wfid(OpenStruct.new('wfid' => 'i'))
163
172
  end
164
173
  end
165
174
 
@@ -5,7 +5,7 @@
5
5
  # Sun Mar 14 21:25:52 JST 2010
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'
11
11
  require 'ruote/storage/composite_storage'
@@ -44,5 +44,31 @@ class UtCompositeStorageTest < Test::Unit::TestCase
44
44
  assert_nil r
45
45
  assert_equal 0, @default.h['msgs'].size
46
46
  end
47
+
48
+ class TracingStorage
49
+ attr_reader :trace
50
+ def initialize
51
+ @trace = []
52
+ end
53
+ def method_missing(m, *args)
54
+ @trace << [ m, *args ]
55
+ end
56
+ end
57
+
58
+ def test_special_methods
59
+
60
+ default = TracingStorage.new
61
+
62
+ cs = Ruote::CompositeStorage.new(default, {})
63
+
64
+ cs.delete_schedule('x') # schedule id
65
+ cs.reserve('type' => 'schedules', '_id' => 'nada')
66
+
67
+ assert_equal([
68
+ [ :delete_schedule, 'x' ],
69
+ [ :reserve, { 'type' => 'schedules', '_id' => 'nada' } ]
70
+ ],
71
+ default.trace)
72
+ end
47
73
  end
48
74
 
@@ -5,15 +5,14 @@
5
5
  # Wed Jan 26 09:21:06 JST 2011
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
9
- #require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
8
+ require File.expand_path('../../test_helper', __FILE__)
10
9
 
11
10
  require 'ostruct'
12
11
  require 'ruote'
13
12
  require 'ruote/svc/participant_list'
14
13
 
15
14
 
16
- class UtEngineTest < Test::Unit::TestCase
15
+ class UtSvcParticipantListTest < Test::Unit::TestCase
17
16
 
18
17
  class FakeStorage
19
18
  def initialize
@@ -5,7 +5,7 @@
5
5
  # Sun Jan 30 21:08:14 JST 2011
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_json
11
11
  require 'rufus/json'
@@ -31,9 +31,12 @@ class UtFilterTest < Test::Unit::TestCase
31
31
  #
32
32
  # transformations
33
33
 
34
- def assert_filter(result, filter, hash)
34
+ def assert_filter(result, filter, hash, double_tilde=nil)
35
35
 
36
- assert_equal(result, Ruote.filter(Rufus::Json.dup(filter), hash))
36
+ assert_equal(
37
+ result,
38
+ Ruote.filter(
39
+ Rufus::Json.dup(filter), hash, :double_tilde => double_tilde))
37
40
  end
38
41
 
39
42
  def test_remove
@@ -428,16 +431,57 @@ class UtFilterTest < Test::Unit::TestCase
428
431
  { 'x' => %w[ a b c ] })
429
432
  end
430
433
 
434
+ def test_take
435
+
436
+ assert_filter(
437
+ { 'x' => 'a', 'z' => 'b' },
438
+ [ { 'field' => 'x', 'take' => 'true' } ],
439
+ { 'x' => 'a', 'y' => 'a' },
440
+ { 'z' => 'b' }) # ~~
441
+ end
442
+
443
+ def test_discard
444
+
445
+ assert_filter(
446
+ { 'y' => 'a', 'z' => 'b' },
447
+ [ { 'field' => 'x', 'discard' => 'true' } ],
448
+ { 'x' => 'a', 'y' => 'a' },
449
+ { 'z' => 'b' }) # ~~
450
+ end
451
+
452
+ def test_discard_multiple
453
+
454
+ assert_filter(
455
+ { 'z' => 'a', '1' => 'b' },
456
+ [ { 'field' => 'x|y', 'discard' => 'true' } ],
457
+ { 'x' => 'a', 'y' => 'a', 'z' => 'a' },
458
+ { '1' => 'b' }) # ~~
459
+ end
460
+
431
461
  #
432
462
  # validations
433
463
 
434
464
  def assert_valid(filter, hash)
435
465
 
436
- Ruote.filter(Rufus::Json.dup(filter), hash)
437
- assert true
466
+ begin
467
+ Ruote.filter(Rufus::Json.dup(filter), hash)
468
+ assert true
469
+ rescue Ruote::ValidationError => ve
470
+ puts
471
+ puts
472
+ p ve
473
+ p ve.deviations
474
+ puts
475
+ puts 'hash:'
476
+ p hash
477
+ puts 'filter:'
478
+ filter.each { |l| p l }
479
+ puts
480
+ assert false
481
+ end
438
482
  end
439
483
 
440
- def assert_not_valid(filter, hash, deviations=1)
484
+ def assert_not_valid(filter, hash, opts={ :deviations => 1 })
441
485
 
442
486
  error = nil
443
487
 
@@ -446,14 +490,46 @@ class UtFilterTest < Test::Unit::TestCase
446
490
  rescue => error
447
491
  end
448
492
 
493
+ p error.deviations if opts[:verbose]
494
+
449
495
  assert_not_nil(
450
496
  error, "ValidationError was not raised")
451
497
  assert_equal(
452
- deviations, error.deviations.size, "deviation count doesn't match")
498
+ opts[:deviations], error.deviations.size, "deviation count doesn't match")
453
499
 
454
500
  @deviations = error.deviations
455
501
  end
456
502
 
503
+ def test_presence
504
+
505
+ assert_valid(
506
+ [ { 'field' => 'x' } ], { 'x' => 'deux' })
507
+ assert_not_valid(
508
+ [ { 'field' => 'x' } ], { 'y' => 'trois' })
509
+
510
+ assert_valid(
511
+ [ { 'field' => '/x|y/' } ], { 'x' => 'deux' })
512
+ assert_not_valid(
513
+ [ { 'field' => '/x|y/' } ], { 'z' => 'quatre' })
514
+ end
515
+
516
+ def test_this_or_that_field
517
+
518
+ assert_valid(
519
+ [ { 'field' => 'x|y', 'type' => 'string' } ], { 'x' => 'deux' })
520
+ assert_valid(
521
+ [ { 'field' => 'x|y', 'type' => 'string' } ], { 'y' => 'trois' })
522
+
523
+
524
+ assert_valid(
525
+ [ { 'field' => 'x|y'} ], { 'x' => 'deux' })
526
+
527
+ assert_not_valid(
528
+ [ { 'field' => 'x|y', 'type' => 'string' } ], { 'z' => 'quatre' })
529
+ assert_not_valid(
530
+ [ { 'field' => 'x|y' } ], { 'z' => 'quatre' })
531
+ end
532
+
457
533
  def test_type
458
534
 
459
535
  assert_valid(
@@ -507,6 +583,9 @@ class UtFilterTest < Test::Unit::TestCase
507
583
  [ { 'field' => 'x', 'type' => 'null' } ], { 'x' => false })
508
584
  assert_not_valid(
509
585
  [ { 'field' => 'x', 'type' => 'null' } ], { 'x' => 1 })
586
+
587
+ assert_not_valid(
588
+ [ { 'field' => 'x', 'type' => 'string' } ], {})
510
589
  end
511
590
 
512
591
  def test_type_deep
@@ -598,7 +677,7 @@ class UtFilterTest < Test::Unit::TestCase
598
677
  assert_not_valid(
599
678
  [ { 'field' => '/./', 'type' => 'string' } ],
600
679
  { 'x' => 1, 'z' => 1 },
601
- 2)
680
+ :deviations => 2)
602
681
  end
603
682
 
604
683
  def test_match
@@ -635,6 +714,26 @@ class UtFilterTest < Test::Unit::TestCase
635
714
  { 'x' => 2.0 })
636
715
  end
637
716
 
717
+ def test_is
718
+
719
+ assert_valid(
720
+ [ { 'field' => 'x', 'is' => true } ],
721
+ { 'x' => true })
722
+ assert_valid(
723
+ [ { 'field' => 'x', 'is' => (1..3).to_a } ],
724
+ { 'x' => [ 1, 2, 3 ] })
725
+
726
+ assert_not_valid(
727
+ [ { 'field' => 'x', 'is' => false } ],
728
+ { 'x' => true })
729
+ assert_not_valid(
730
+ [ { 'field' => 'x', 'is' => true } ],
731
+ { 'x' => 1 })
732
+ assert_not_valid(
733
+ [ { 'field' => 'x', 'is' => (1..3).to_a } ],
734
+ { 'x' => [ 3, 2, 1 ] })
735
+ end
736
+
638
737
  def test_size
639
738
 
640
739
  assert_valid(
@@ -706,6 +805,9 @@ class UtFilterTest < Test::Unit::TestCase
706
805
  assert_valid(
707
806
  [ { 'field' => 'x', 'empty' => true } ],
708
807
  { 'x' => '' })
808
+ assert_valid(
809
+ [ { 'field' => 'x', 'empty' => false } ],
810
+ { 'x' => [ 1 ] })
709
811
 
710
812
  assert_not_valid(
711
813
  [ { 'field' => 'x', 'empty' => true } ],
@@ -716,6 +818,23 @@ class UtFilterTest < Test::Unit::TestCase
716
818
  assert_not_valid(
717
819
  [ { 'field' => 'x', 'empty' => true } ],
718
820
  { 'x' => { 'a' => 'b' } })
821
+ assert_not_valid(
822
+ [ { 'field' => 'x', 'empty' => false } ],
823
+ { 'x' => {} })
824
+ end
825
+
826
+ def test_string_and_empty
827
+
828
+ assert_valid(
829
+ [ { 'field' => 'x', 'empty' => true, 'type' => 'string' } ],
830
+ { 'x' => '' })
831
+ assert_valid(
832
+ [ { 'field' => 'x', 'empty' => false, 'type' => 'string' } ],
833
+ { 'x' => 'yyy' })
834
+
835
+ assert_not_valid(
836
+ [ { 'field' => 'x', 'empty' => true, 'type' => 'string' } ],
837
+ { 'x' => {} })
719
838
  end
720
839
 
721
840
  def test_in
@@ -726,6 +845,9 @@ class UtFilterTest < Test::Unit::TestCase
726
845
  assert_valid(
727
846
  [ { 'field' => 'x', 'in' => "alpha, bravo" } ],
728
847
  { 'x' => 'alpha' })
848
+ assert_valid(
849
+ [ { 'field' => 'x', 'in' => [ true ] } ],
850
+ { 'x' => true })
729
851
 
730
852
  assert_not_valid(
731
853
  [ { 'field' => 'x', 'in' => %w[ alpha bravo ] } ],
@@ -733,6 +855,9 @@ class UtFilterTest < Test::Unit::TestCase
733
855
  assert_not_valid(
734
856
  [ { 'field' => 'x', 'in' => "alpha, bravo" } ],
735
857
  { 'x' => 'charly' })
858
+ assert_not_valid(
859
+ [ { 'field' => 'x', 'in' => [ false ] } ],
860
+ { 'x' => true })
736
861
  end
737
862
 
738
863
  def test_has__keys
@@ -787,6 +912,31 @@ class UtFilterTest < Test::Unit::TestCase
787
912
  { 'x' => %w[ a b c ] })
788
913
  end
789
914
 
915
+ def test_includes
916
+
917
+ assert_valid(
918
+ [ { 'field' => 'x', 'includes' => 'a' } ],
919
+ { 'x' => %w[ a b c ] })
920
+
921
+ assert_not_valid(
922
+ [ { 'field' => 'x', 'includes' => 'z' } ],
923
+ { 'x' => %w[ a b c ] })
924
+ assert_not_valid(
925
+ [ { 'field' => 'x', 'includes' => 'z' } ],
926
+ { 'x' => 'abcz' })
927
+ end
928
+
929
+ def test_includes__value
930
+
931
+ assert_valid(
932
+ [ { 'field' => 'x', 'includes' => 1 } ],
933
+ { 'x' => { 'a' => 1 } })
934
+
935
+ assert_not_valid(
936
+ [ { 'field' => 'x', 'includes' => '1' } ],
937
+ { 'x' => { 'a' => 1 } })
938
+ end
939
+
790
940
  def test_valid
791
941
 
792
942
  # 'valid' can be used in conjunction with the dollar notation
@@ -833,7 +983,7 @@ class UtFilterTest < Test::Unit::TestCase
833
983
  'x' => %w[ a b c ],
834
984
  'y' => true
835
985
  },
836
- 2)
986
+ :deviations => 2)
837
987
 
838
988
  assert_equal [
839
989
  [ { "has" => 1, "field" => "x", "t" => "array"}, "x", [ "a", "b", "c" ] ],
@@ -853,7 +1003,22 @@ class UtFilterTest < Test::Unit::TestCase
853
1003
  :no_raise => true)
854
1004
 
855
1005
  assert_equal(
856
- [ [ { "has" => "a", "field" => "x", "t" => "hash"}, "x", [ "a", "b", "c" ] ] ], r)
1006
+ [ [ { "has" => "a", "field" => "x", "t" => "hash"}, "x", [ "a", "b", "c" ] ] ],
1007
+ r)
1008
+ end
1009
+
1010
+ # Data passes through the filter untouched.
1011
+ #
1012
+ def test_no_raise_empty_result
1013
+
1014
+ r = Ruote.filter(
1015
+ [ { 'field' => 'x', 't' => 'array', 'has' => 'a' } ],
1016
+ { 'x' => %w[ a b c ] },
1017
+ :no_raise => true)
1018
+
1019
+ assert_equal(
1020
+ { 'x' => %w[ a b c ] },
1021
+ r)
857
1022
  end
858
1023
 
859
1024
  #
@@ -899,5 +1064,61 @@ class UtFilterTest < Test::Unit::TestCase
899
1064
  ]
900
1065
  }))
901
1066
  end
1067
+
1068
+ def test_top_level_or
1069
+
1070
+ filter = [
1071
+ { 'field' => 'x', 'type' => 'string' },
1072
+ { 'field' => 'y', 'type' => 'number' },
1073
+ 'or',
1074
+ { 'field' => 'z', 'type' => 'bool' }
1075
+ ]
1076
+
1077
+ assert_valid(filter, { 'x' => 'whatever', 'y' => 1 })
1078
+ assert_valid(filter, { 'z' => true })
1079
+ assert_valid(filter, { 'x' => -9, 'z' => false })
1080
+ assert_valid(filter, { 'x' => 'ah', 'y' => 2 })
1081
+
1082
+ assert_not_valid(filter, { 'x' => 'whatever', 'y' => 'notanumber' })
1083
+ assert_not_valid(filter, { 'z' => 'notabool' })
1084
+ assert_not_valid(filter, { 'x' => 'x', 'z' => 'nada' })
1085
+
1086
+ filter = [
1087
+ [ { 'field' => 'x', 'type' => 'string' },
1088
+ { 'field' => 'y', 'type' => 'number' } ],
1089
+ [ { 'field' => 'z', 'type' => 'bool' } ]
1090
+ ]
1091
+
1092
+ assert_valid(filter, { 'x' => 'whatever', 'y' => 1 })
1093
+ assert_valid(filter, { 'z' => true })
1094
+ assert_valid(filter, { 'x' => -9, 'z' => false })
1095
+ assert_valid(filter, { 'x' => 'ah', 'y' => 2 })
1096
+ end
1097
+
1098
+ def test_top_level_or_and_pipe_field
1099
+
1100
+ filter = [
1101
+ { 'field' => 'x|params.x', 'type' => 'string' },
1102
+ 'or',
1103
+ { 'field' => 'y|params.y', 'type' => 'bool' }
1104
+ ]
1105
+
1106
+ assert_valid(filter, { 'x' => 'out' })
1107
+ assert_valid(filter, { 'params' => { 'x' => 'in' } })
1108
+ assert_valid(filter, { 'y' => true })
1109
+ assert_valid(filter, { 'params' => { 'y' => false } })
1110
+
1111
+ assert_not_valid(filter, { 'y' => 'out' })
1112
+ assert_not_valid(filter, { 'params' => { 'y' => 'in' } })
1113
+ assert_not_valid(filter, {})
1114
+ end
1115
+
1116
+ def test_misc_neutralization
1117
+
1118
+ assert_valid(
1119
+ [ { :field => 'x', :type => :string } ], { 'x' => 'deux' })
1120
+ assert_valid(
1121
+ [ { :field => 'x', 'smatch' => /de/ } ], { 'x' => 'deux' })
1122
+ end
902
1123
  end
903
1124
 
@@ -0,0 +1,48 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Apr 25 12:24:57 JST 2011
6
+ #
7
+ # in Singapore
8
+ #
9
+
10
+ require File.expand_path('../../test_helper', __FILE__)
11
+
12
+ require 'ostruct'
13
+ require 'ruote'
14
+ require 'ruote/svc/tracker'
15
+
16
+
17
+ class UtSvcTrackerTest < Test::Unit::TestCase
18
+
19
+ class FakeStorage
20
+ def initialize
21
+ @count = -1
22
+ end
23
+ def put(doc)
24
+ @count = @count + 1
25
+ return true if @count == 0
26
+ nil
27
+ end
28
+ def get_trackers
29
+ { 'trackers' => {} }
30
+ end
31
+ end
32
+
33
+ # Fighting issue found by Pedro Texeira :
34
+ #
35
+ # http://groups.google.com/group/openwferu-users/browse_thread/thread/cf2546d0b1cebfe8
36
+ #
37
+ def test_add_tracker_fail_and_retry
38
+
39
+ con = OpenStruct.new(:storage => FakeStorage.new)
40
+
41
+ pl = Ruote::Tracker.new(con)
42
+
43
+ pl.add_tracker('some-wfid', 'reply', 'some-id', {}, {})
44
+
45
+ assert true
46
+ end
47
+ end
48
+