ruote 2.1.1 → 2.1.2

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.
@@ -1,8 +1,14 @@
1
1
 
2
- = ruote (OpenWFEru) - CHANGELOG.txt
2
+ = ruote - CHANGELOG.txt
3
3
 
4
- == ruote - 2.0.0 not yet released
4
+
5
+ == ruote - 2.1.2 released 2010/01/03
6
+
7
+ - fixed issue when initializing engine without worker. Thanks Matt Nichols.
8
+
9
+
10
+ == ruote - 2.1.1 released 2009/12/31
5
11
 
6
12
  == OpenWFEru - 0.9.2 released 2007/01/26
7
- == openwfe-ruby - 1.7.0 released 2006-05-08
13
+ == openwfe-ruby - 1.7.0 released 2006/05/08
8
14
 
@@ -15,6 +15,7 @@ Kenneth Kalmer http://www.opensourcery.co.za
15
15
  Contributors
16
16
  ------------
17
17
 
18
+ Matt Nichols - http://github.com/mattnichols
18
19
  Nicholas Faiz - http://github.com/biv
19
20
  Chris Beer - http://github.com/cbeer
20
21
  Enrico Bianco - http://github.com/enricob
data/Rakefile CHANGED
@@ -23,9 +23,9 @@ ruote is an open source ruby workflow engine.
23
23
  gem.rubyforge_project = 'ruote'
24
24
  gem.test_file = 'test/test.rb'
25
25
 
26
- gem.add_dependency 'rufus-cloche', '>= 0.1.6'
27
- gem.add_dependency 'rufus-dollar'
28
26
  gem.add_dependency 'rufus-json'
27
+ gem.add_dependency 'rufus-cloche', '>= 0.1.10'
28
+ gem.add_dependency 'rufus-dollar'
29
29
  gem.add_dependency 'rufus-lru'
30
30
  gem.add_dependency 'rufus-mnemo', '>= 1.1.0'
31
31
  gem.add_dependency 'rufus-scheduler', '>= 2.0.3'
data/TODO.txt CHANGED
@@ -285,3 +285,6 @@
285
285
  concurrence terminated (got removed) meanwhile ?
286
286
  the reply returns true...
287
287
 
288
+ [ ] shell ? irb ? Shell.new(storage)
289
+ [ ] focus on fulldup or json.dup (via fulldup ?)
290
+
@@ -50,7 +50,7 @@ module Ruote
50
50
 
51
51
  @worker = nil
52
52
  @storage = worker_or_storage
53
- @context = Ruote::Context.new(self)
53
+ @context = Ruote::Context.new(@storage, self)
54
54
  end
55
55
 
56
56
  @variables = EngineVariables.new(@storage)
@@ -62,13 +62,6 @@ module Ruote::Exp
62
62
 
63
63
  # never called
64
64
  end
65
-
66
- def cancel (flavour)
67
-
68
- # has to let the workitem rebound for the whole process to get cancelled
69
-
70
- reply_to_parent(h.applied_workitem)
71
- end
72
65
  end
73
66
  end
74
67
 
@@ -135,13 +135,6 @@ module Ruote::Exp
135
135
  reply_to_parent(h.applied_workitem) unless ancestor
136
136
  end
137
137
 
138
- # Necessary in case of 'pass_command_directly'
139
- #
140
- def cancel (flavour)
141
-
142
- reply_to_parent(h.applied_workitem)
143
- end
144
-
145
138
  protected
146
139
 
147
140
  # Walks up the expression tree (process instance and returns the first
@@ -77,14 +77,6 @@ module Ruote::Exp
77
77
 
78
78
  raise(Ruote::ForcedError.new(msg))
79
79
  end
80
-
81
- def cancel (flavour)
82
-
83
- # TODO : should the error get removed from the process status ?
84
- # it's currently done when the exp gets 'unpersisted'
85
-
86
- reply_to_parent(h.applied_workitem)
87
- end
88
80
  end
89
81
  end
90
82
 
@@ -179,11 +179,6 @@ module Ruote::Exp
179
179
  end
180
180
  end
181
181
 
182
- def cancel (flavour)
183
-
184
- reply_to_parent(h.applied_workitem)
185
- end
186
-
187
182
  protected
188
183
 
189
184
  def reply_to_parent (workitem)
@@ -73,11 +73,6 @@ module Ruote::Exp
73
73
 
74
74
  # never called
75
75
  end
76
-
77
- def cancel (flavour)
78
-
79
- reply_to_parent(h.applied_workitem)
80
- end
81
76
  end
82
77
  end
83
78
 
@@ -251,6 +251,7 @@ module Ruote::Exp
251
251
  end
252
252
 
253
253
  h.children.delete(fei)
254
+ # accept without any check ?
254
255
 
255
256
  if h.state != nil # failing or timing out ...
256
257
 
@@ -260,7 +261,7 @@ module Ruote::Exp
260
261
  persist_or_raise # for the updated h.children
261
262
  end
262
263
 
263
- else
264
+ else # vanilla reply
264
265
 
265
266
  reply(workitem)
266
267
  end
@@ -282,14 +283,14 @@ module Ruote::Exp
282
283
  #
283
284
  def do_cancel (msg)
284
285
 
285
- @msg = Ruote.fulldup(msg)
286
-
287
286
  return if h.state == 'cancelling'
288
287
  # cancel on cancel gets discarded
289
288
 
289
+ @msg = Ruote.fulldup(msg)
290
+
290
291
  flavour = msg['flavour']
291
292
 
292
- return if h.state == 'failed' and flavour == 'timeout'
293
+ return if h.state == 'failed' && flavour == 'timeout'
293
294
  # do not timeout expressions that are "in error" (failed)
294
295
 
295
296
  h.state = case flavour
@@ -318,6 +319,9 @@ module Ruote::Exp
318
319
  #
319
320
  def cancel (flavour)
320
321
 
322
+ return reply_to_parent(h.applied_workitem) \
323
+ unless h.children.find { |cfei| Ruote::FlowExpression.fetch(cfei) }
324
+
321
325
  do_persist || return
322
326
  # before firing the cancel message to the children
323
327
 
@@ -39,10 +39,6 @@ module Ruote::Exp
39
39
  def reply (workitem)
40
40
  raise "can't apply or reply [to] raw expression"
41
41
  end
42
-
43
- def cancel (flavour)
44
- reply_to_parent(h.applied_workitem)
45
- end
46
42
  end
47
43
  end
48
44
 
@@ -55,7 +55,7 @@ module Ruote::Exp
55
55
  r = @context.storage.put(@h)
56
56
 
57
57
  #puts "+ per #{h.fei['expid']} #{tree.first} #{h._rev} --> #{r.class}"
58
- #Ruote.p_caller('+ per') if r != nil
58
+ #Ruote.p_caller('+ per') if r != nil || h.fei['expid'] == '0_0'
59
59
 
60
60
  r
61
61
  end
@@ -65,7 +65,7 @@ module Ruote::Exp
65
65
  r = @context.storage.delete(@h)
66
66
 
67
67
  #puts "- unp #{h.fei['expid']} #{tree.first} #{h._rev} --> #{r.class}"
68
- #Ruote.p_caller('- unp') if r != nil
68
+ #Ruote.p_caller('- unp') if r != nil || h.fei['expid'] == '0_0'
69
69
 
70
70
  return r if r
71
71
 
@@ -123,15 +123,13 @@ module Ruote::Exp
123
123
 
124
124
  case r = self.send("try_#{pers}")
125
125
  when true
126
- (pers == :unpersist)
127
- # persist FALSE : gone... return false "please don't go on"
128
- # unpersist TRUE : already gone, should be OK
126
+ false # don't go on
129
127
  when Hash
130
128
  self.h = r
131
129
  self.send("do_#{@msg['action']}", @msg)
132
- false
130
+ false # don't go on
133
131
  else
134
- true
132
+ true # success, please go on
135
133
  end
136
134
  end
137
135
  end
@@ -51,11 +51,13 @@ module Ruote
51
51
  @last = nil
52
52
  @file = nil
53
53
 
54
- if @context.respond_to?(:worker)
54
+ if @context.worker
55
+
56
+ # only care about logging if there is a worker present
57
+
55
58
  @context.worker.subscribe(:all, self)
59
+ rotate_if_necessary
56
60
  end
57
-
58
- rotate_if_necessary
59
61
  end
60
62
 
61
63
  # Makes sure to close the history file.
@@ -38,12 +38,12 @@ module Ruote
38
38
 
39
39
  @context = context
40
40
 
41
- if @context.respond_to?(:worker)
41
+ if @context.worker
42
42
  #
43
43
  # this is a worker context, DO log
44
44
  #
45
45
  @context.worker.subscribe(:all, self)
46
- else
46
+ #else
47
47
  #
48
48
  # this is not a worker context, DO NOT log, but be ready to
49
49
  # be queried
@@ -22,7 +22,11 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
- require 'yajl' rescue require 'json'
25
+ begin
26
+ require 'yajl'
27
+ rescue LoadError
28
+ require 'json'
29
+ end
26
30
  # gem install yajl-ruby OR json OR json_pure OR json-jruby
27
31
 
28
32
  require 'rufus/json'
@@ -50,7 +54,7 @@ module Ruote
50
54
 
51
55
  def put (doc, opts={})
52
56
 
53
- @cloche.put(doc.merge!('put_at' => Ruote.now_to_utc_s))
57
+ @cloche.put(doc.merge!('put_at' => Ruote.now_to_utc_s), opts)
54
58
  end
55
59
 
56
60
  def get (type, key)
@@ -27,7 +27,7 @@ require 'ruote/fei'
27
27
 
28
28
  module Ruote
29
29
 
30
- VERSION = '2.1.1'
30
+ VERSION = '2.1.2'
31
31
 
32
32
  class Worker
33
33
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruote}
8
- s.version = "2.1.1"
8
+ s.version = "2.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Mettraux", "Kenneth Kalmer"]
12
- s.date = %q{2009-12-31}
12
+ s.date = %q{2010-01-03}
13
13
  s.description = %q{
14
14
  ruote is an open source ruby workflow engine.
15
15
  }
@@ -218,6 +218,7 @@ ruote is an open source ruby workflow engine.
218
218
  "test/unit/ut_15_util.rb",
219
219
  "test/unit/ut_16_parser.rb",
220
220
  "test/unit/ut_17_storage.rb",
221
+ "test/unit/ut_18_engine.rb",
221
222
  "test/unit/ut_1_fei.rb",
222
223
  "test/unit/ut_2_wfidgen.rb",
223
224
  "test/unit/ut_3_wait_logger.rb",
@@ -243,9 +244,9 @@ ruote is an open source ruby workflow engine.
243
244
  s.specification_version = 3
244
245
 
245
246
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
246
- s.add_runtime_dependency(%q<rufus-cloche>, [">= 0.1.6"])
247
- s.add_runtime_dependency(%q<rufus-dollar>, [">= 0"])
248
247
  s.add_runtime_dependency(%q<rufus-json>, [">= 0"])
248
+ s.add_runtime_dependency(%q<rufus-cloche>, [">= 0.1.10"])
249
+ s.add_runtime_dependency(%q<rufus-dollar>, [">= 0"])
249
250
  s.add_runtime_dependency(%q<rufus-lru>, [">= 0"])
250
251
  s.add_runtime_dependency(%q<rufus-mnemo>, [">= 1.1.0"])
251
252
  s.add_runtime_dependency(%q<rufus-scheduler>, [">= 2.0.3"])
@@ -253,9 +254,9 @@ ruote is an open source ruby workflow engine.
253
254
  s.add_development_dependency(%q<json>, [">= 0"])
254
255
  s.add_development_dependency(%q<yard>, [">= 0"])
255
256
  else
256
- s.add_dependency(%q<rufus-cloche>, [">= 0.1.6"])
257
- s.add_dependency(%q<rufus-dollar>, [">= 0"])
258
257
  s.add_dependency(%q<rufus-json>, [">= 0"])
258
+ s.add_dependency(%q<rufus-cloche>, [">= 0.1.10"])
259
+ s.add_dependency(%q<rufus-dollar>, [">= 0"])
259
260
  s.add_dependency(%q<rufus-lru>, [">= 0"])
260
261
  s.add_dependency(%q<rufus-mnemo>, [">= 1.1.0"])
261
262
  s.add_dependency(%q<rufus-scheduler>, [">= 2.0.3"])
@@ -264,9 +265,9 @@ ruote is an open source ruby workflow engine.
264
265
  s.add_dependency(%q<yard>, [">= 0"])
265
266
  end
266
267
  else
267
- s.add_dependency(%q<rufus-cloche>, [">= 0.1.6"])
268
- s.add_dependency(%q<rufus-dollar>, [">= 0"])
269
268
  s.add_dependency(%q<rufus-json>, [">= 0"])
269
+ s.add_dependency(%q<rufus-cloche>, [">= 0.1.10"])
270
+ s.add_dependency(%q<rufus-dollar>, [">= 0"])
270
271
  s.add_dependency(%q<rufus-lru>, [">= 0"])
271
272
  s.add_dependency(%q<rufus-mnemo>, [">= 1.1.0"])
272
273
  s.add_dependency(%q<rufus-scheduler>, [">= 2.0.3"])
@@ -1,13 +1,16 @@
1
1
 
2
2
  pers = ARGV.find { |a| a.match(/^--/) } || ''
3
+ tnumber = ARGV.find { |a| a.match(/^\d+/) } || 2
3
4
 
4
5
  i = 0
5
6
 
6
7
  loop do
7
8
 
8
- #s = `ruby test/functional/ct_0_concurrence.rb #{pers}`
9
- #s = `ruby test/functional/ct_1_iterator.rb #{pers}`
10
- s = `ruby test/functional/ct_2_cancel.rb #{pers}`
9
+ t = Dir["test/functional/ct_#{tnumber}_*.rb"].first
10
+
11
+ raise "didn't find test..." unless t
12
+
13
+ s = `ruby #{t} #{pers}`
11
14
 
12
15
  if $? != 0
13
16
  puts
@@ -41,7 +41,7 @@ class CtConcurrenceTest < Test::Unit::TestCase
41
41
  msgs = @storage.get_msgs
42
42
  msg = msgs.first
43
43
 
44
- if msgs.size > 1 || (msg['fei'] && msg['fei']['expid'] != '0')
44
+ if msgs.size > 1 || (msg && msg['fei'] && msg['fei']['expid'] != '0')
45
45
 
46
46
  msgs.each do |m|
47
47
 
@@ -45,8 +45,8 @@ class CtCancelTest < Test::Unit::TestCase
45
45
  #msgs.each { |m| p m }
46
46
  #puts
47
47
 
48
- t1 = Thread.new { @engine0.do_step(msgs[1]) }
49
- t0 = Thread.new { @engine1.do_step(msgs[0]) }
48
+ t1 = Thread.new { @engine1.do_step(msgs[1]) }
49
+ t0 = Thread.new { @engine0.do_step(msgs[0]) }
50
50
  t1.join
51
51
  t0.join
52
52
 
@@ -146,7 +146,11 @@ class EftIfTest < Test::Unit::TestCase
146
146
 
147
147
  def test_xml_equals
148
148
 
149
- require 'yajl' rescue require 'json'
149
+ begin
150
+ require 'yajl'
151
+ rescue LoadError
152
+ require 'json'
153
+ end
150
154
  Rufus::Json.detect_backend
151
155
  # making sure JSON dup is available in case of HashStorage
152
156
 
@@ -105,6 +105,8 @@ class FtRecursionTest < Test::Unit::TestCase
105
105
 
106
106
  6.times { wait_for(:alpha) }
107
107
 
108
+ Thread.pass
109
+
108
110
  assert_equal((1..6).to_a.join("\n"), @tracer.to_s)
109
111
  end
110
112
  end
@@ -38,6 +38,14 @@ class FtReceiverTest < Test::Unit::TestCase
38
38
 
39
39
  # no reply to the engine
40
40
  end
41
+
42
+ # do not let the dispatch happen in its own thread, this makes
43
+ # wait_for(:alpha) synchronous.
44
+ #
45
+ def do_not_thread
46
+
47
+ true
48
+ end
41
49
  end
42
50
 
43
51
  class MyReceiver < Ruote::Receiver
@@ -5,8 +5,11 @@
5
5
  # Sun Oct 4 00:14:27 JST 2009
6
6
  #
7
7
 
8
-
9
- require 'yajl' rescue require 'json'
8
+ begin
9
+ require 'yajl'
10
+ rescue LoadError
11
+ require 'json'
12
+ end
10
13
  Rufus::Json.detect_backend rescue nil
11
14
 
12
15
  require File.join(File.dirname(__FILE__), 'base')
@@ -35,7 +38,7 @@ class FtHistoryTest < Test::Unit::TestCase
35
38
  wfid0 = assert_trace(pdef, "done.")
36
39
  wfid1 = assert_trace(pdef, "done.\ndone.")
37
40
 
38
- sleep 0.010
41
+ sleep 0.100
39
42
 
40
43
  lines = File.readlines(Dir['work/log/*'].first)
41
44
 
@@ -79,7 +82,7 @@ class FtHistoryTest < Test::Unit::TestCase
79
82
 
80
83
  wfid0 = assert_trace(pdef, "done.")
81
84
 
82
- sleep 0.010
85
+ sleep 0.100
83
86
 
84
87
  h = @engine.context.history.by_process(wfid0)
85
88
  #h.each { |r| p r }
@@ -104,7 +107,7 @@ class FtHistoryTest < Test::Unit::TestCase
104
107
  wfid = @engine.launch(pdef)
105
108
  wait_for(wfid)
106
109
 
107
- sleep 0.010
110
+ sleep 0.100
108
111
 
109
112
  h = @engine.context.history.by_process(wfid)
110
113
  #h.each { |r| p r }
@@ -134,7 +137,7 @@ class FtHistoryTest < Test::Unit::TestCase
134
137
  @engine.cancel_expression(fei)
135
138
  wait_for(wfid)
136
139
 
137
- sleep 0.010
140
+ sleep 0.100
138
141
 
139
142
  h = @engine.context.history.by_process(wfid)
140
143
  #h.each { |r| p r }
@@ -53,9 +53,10 @@ class RtCronTest < Test::Unit::TestCase
53
53
 
54
54
  @engine.cancel_process(wfid)
55
55
 
56
- msg = wait_for(wfid)
56
+ while msg = wait_for(wfid)
57
+ break if msg['action'] == 'terminated'
58
+ end
57
59
 
58
- assert_equal 'terminated', msg['action']
59
60
  assert_equal 0, @engine.processes.size
60
61
  assert_equal 0, @engine.storage.get_many('schedules').size
61
62
  end
@@ -42,7 +42,11 @@ else uses the in-memory Ruote::Engine (fastest, but no persistence at all)
42
42
 
43
43
  if ps.include?('--fs')
44
44
 
45
- require 'yajl' rescue require 'json'
45
+ begin
46
+ require 'yajl'
47
+ rescue LoadError
48
+ require 'json'
49
+ end
46
50
  Rufus::Json.detect_backend
47
51
 
48
52
  Ruote::FsStorage.new('work', opts)
@@ -66,7 +70,11 @@ else uses the in-memory Ruote::Engine (fastest, but no persistence at all)
66
70
 
67
71
  elsif persistent
68
72
 
69
- require 'yajl' rescue require 'json'
73
+ begin
74
+ require 'yajl'
75
+ rescue LoadError
76
+ require 'json'
77
+ end
70
78
  Rufus::Json.detect_backend
71
79
 
72
80
  Ruote::FsStorage.new('work', opts)
@@ -5,7 +5,11 @@
5
5
  # Mon Dec 14 15:03:13 JST 2009
6
6
  #
7
7
 
8
- require 'yajl' rescue require 'json'
8
+ begin
9
+ require 'yajl'
10
+ rescue LoadError
11
+ require 'json'
12
+ end
9
13
  require 'patron' rescue nil
10
14
 
11
15
  require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
@@ -44,7 +48,11 @@ class UtStorage < Test::Unit::TestCase
44
48
 
45
49
  def test_put
46
50
 
47
- @s.put('_id' => 'nada', 'type' => 'dogfood', 'message' => 'testing again')
51
+ doc = { '_id' => 'nada', 'type' => 'dogfood', 'message' => 'testing (2)' }
52
+
53
+ @s.put(doc)
54
+
55
+ assert_nil doc['_rev']
48
56
 
49
57
  h = @s.get('dogfood', 'nada')
50
58
 
@@ -93,8 +101,12 @@ class UtStorage < Test::Unit::TestCase
93
101
 
94
102
  def test_keys_should_be_string
95
103
 
96
- require 'yajl' rescue require 'json'
97
- Rufus::Json.detect_backend
104
+ #begin
105
+ # require 'yajl'
106
+ #rescue LoadError
107
+ # require 'json'
108
+ #end
109
+ #Rufus::Json.detect_backend
98
110
 
99
111
  doc = { '_id' => 'h0', 'type' => 'dogfood', :m0 => :z, :m1 => [ :a, :b ] }
100
112
 
@@ -108,7 +120,7 @@ class UtStorage < Test::Unit::TestCase
108
120
 
109
121
  # Updating a gone document must result in a 'true' reply.
110
122
  #
111
- def test_put_missing
123
+ def test_put_gone
112
124
 
113
125
  h = @s.get('dogfood', 'toto')
114
126
 
@@ -0,0 +1,34 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sun Jan 3 12:04:07 JST 2010
6
+ #
7
+ # Matt Nichols (http://github.com/mattnichols)
8
+ #
9
+
10
+ require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
11
+ require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
12
+
13
+ require 'ruote'
14
+
15
+
16
+ class UtEngineTest < Test::Unit::TestCase
17
+
18
+ def test_initialize_with_worker
19
+
20
+ storage = determine_storage(
21
+ 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])
22
+ worker = Ruote::Worker.new(storage)
23
+ engine = Ruote::Engine.new(worker, false)
24
+ end
25
+
26
+ def test_initialize_with_storage
27
+
28
+ storage = determine_storage(
29
+ 's_logger' => [ 'ruote/log/test_logger', 'Ruote::TestLogger' ])
30
+
31
+ engine = Ruote::Engine.new(storage)
32
+ end
33
+ end
34
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruote
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
@@ -10,31 +10,31 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-12-31 00:00:00 +09:00
13
+ date: 2010-01-03 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: rufus-cloche
17
+ name: rufus-json
18
18
  type: :runtime
19
19
  version_requirement:
20
20
  version_requirements: !ruby/object:Gem::Requirement
21
21
  requirements:
22
22
  - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 0.1.6
24
+ version: "0"
25
25
  version:
26
26
  - !ruby/object:Gem::Dependency
27
- name: rufus-dollar
27
+ name: rufus-cloche
28
28
  type: :runtime
29
29
  version_requirement:
30
30
  version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: "0"
34
+ version: 0.1.10
35
35
  version:
36
36
  - !ruby/object:Gem::Dependency
37
- name: rufus-json
37
+ name: rufus-dollar
38
38
  type: :runtime
39
39
  version_requirement:
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -313,6 +313,7 @@ files:
313
313
  - test/unit/ut_15_util.rb
314
314
  - test/unit/ut_16_parser.rb
315
315
  - test/unit/ut_17_storage.rb
316
+ - test/unit/ut_18_engine.rb
316
317
  - test/unit/ut_1_fei.rb
317
318
  - test/unit/ut_2_wfidgen.rb
318
319
  - test/unit/ut_3_wait_logger.rb