taskinator 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ff47c5ba6191572ca259138c60f044e730a3a0a
4
- data.tar.gz: 1f99e1305ad76fdb20e607effd127cd47bb52580
3
+ metadata.gz: d0f77cfa37c2c81aeafdfc15dc008d1189a85e14
4
+ data.tar.gz: 0a297360345128af32a48ce6ff4ffdac386aba01
5
5
  SHA512:
6
- metadata.gz: ad2dfc3e17c739644a8142150424af3fbd7c5138fe8d07d276592e34360ee969add8ad1c6cbfcf4cf2ab76bb08206bc45374a443c8d0e9ad7cca348431367269
7
- data.tar.gz: ac28863f5a8e0a244d2121eb1507dd68189657f35ec36ea9661f461254003a947551974b7dc758d021d05f5b93b6f94d1079dd164785bee73f670aecefd2e2ba
6
+ metadata.gz: a65f2d17d83e86d083e3c1343972a46e13a68e693af433290251f2d3aba340a80c13620c8184bd5f644a0d7399435a327ff064afb3e0f0403edef84c8d0611bf
7
+ data.tar.gz: 132c02957ff6e96fe6ae620685f2168569595bc9becda49e26ed0665403598e0cb08927a962c7a689bea87ab908d72f83ad7d8b45cd677e10a35a103d3a6da71
data/Gemfile.lock CHANGED
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- taskinator (0.0.1)
11
+ taskinator (0.0.2)
12
12
  connection_pool (>= 2.0.0)
13
13
  json (>= 1.8.1)
14
14
  redis (>= 3.0.6)
data/README.md CHANGED
@@ -77,8 +77,8 @@ module MyProcess
77
77
  extend Taskinator::Definition
78
78
 
79
79
  define_process do
80
- task 'Step A', :first_work_step
81
- task 'Step B', :second_work_step
80
+ task :first_work_step
81
+ task :second_work_step
82
82
  end
83
83
 
84
84
  def first_work_step
@@ -100,14 +100,14 @@ module MyProcess
100
100
  define_process do
101
101
  concurrent do
102
102
  # these tasks will be executed concurrently
103
- task 'Step A1', :work_step_1
104
- task 'Step A2', :work_step_2
103
+ task :work_step_1
104
+ task :work_step_2
105
105
  end
106
106
 
107
107
  sequential do
108
108
  # thes tasks will be executed sequentially
109
- task 'Step B1', :work_step_3
110
- task 'Step B2', :work_step_4
109
+ task :work_step_3
110
+ task :work_step_4
111
111
  end
112
112
  end
113
113
 
@@ -134,7 +134,7 @@ module MyProcess
134
134
 
135
135
  define_process do
136
136
  for_each :yield_data_elements do
137
- task 'Data Element Step', :work_step
137
+ task :work_step
138
138
  end
139
139
  end
140
140
 
@@ -164,8 +164,8 @@ module MyProcess
164
164
  extend Taskinator::Definition
165
165
 
166
166
  define_process do
167
- sub_process 'Process A', MySubProcessA
168
- sub_process 'Process B', MySubProcessB
167
+ sub_process MySubProcessA
168
+ sub_process MySubProcessB
169
169
  end
170
170
  end
171
171
  ```
@@ -178,27 +178,28 @@ module MyProcess
178
178
 
179
179
  define_process do
180
180
  for_each :data_elements do
181
- task '...', :work_step_begin
181
+ task :work_step_begin
182
182
 
183
183
  concurrent do
184
184
  for_each :sub_data_elements do
185
- task '...', :work_step_all_at_once
185
+ task :work_step_all_at_once
186
186
  end
187
187
  end
188
188
 
189
- sub_process '...', MySubProcess
189
+ sub_process MySubProcess
190
190
 
191
191
  sequential do
192
192
  for_each :sub_data_elements do
193
- task '...', :work_step_one_by_one
193
+ task :work_step_one_by_one
194
194
  end
195
195
  end
196
196
 
197
- task '...', :work_step_end
197
+ task :work_step_end
198
198
  end
199
199
  end
200
200
 
201
201
  # "task" and "iterator" methods omitted for brevity
202
+
202
203
  end
203
204
  ```
204
205
 
@@ -215,6 +216,10 @@ process = MyProcess.create_process
215
216
  process.enqueue!
216
217
  ```
217
218
 
219
+ #### Arguments
220
+
221
+ _TBD_
222
+
218
223
  ### Monitoring
219
224
 
220
225
  To monitor the state of the processes, use the `Taskinator::Api::Processes` class. This is still a work in progress.
@@ -224,11 +229,6 @@ processes = Taskinator::Api::Processes.new()
224
229
  processes.each do |process|
225
230
  # => output the unique process identifier and current state
226
231
  puts [:process, process.uuid, process.current_state.name]
227
-
228
- process.tasks.each do |task|
229
- # => output the task name and current state
230
- puts [:task, task.name, task.current_state.name]
231
- end
232
232
  end
233
233
  ```
234
234
 
@@ -14,24 +14,24 @@ module Taskinator
14
14
  end
15
15
 
16
16
  # defines a sub process of tasks which are executed sequentially
17
- def sequential(name, options={}, &block)
17
+ def sequential(options={}, &block)
18
18
  raise ArgumentError, 'block' unless block_given?
19
19
 
20
- sub_process = Process.define_sequential_process_for(name, @definition, options)
21
- Builder.new(define_sub_process_task(name, @process, sub_process, options), @definition, @args).instance_eval(&block)
20
+ sub_process = Process.define_sequential_process_for(@definition, options)
21
+ Builder.new(define_sub_process_task(@process, sub_process, options), @definition, @args).instance_eval(&block)
22
22
  end
23
23
 
24
24
  # defines a sub process of tasks which are executed concurrently
25
- def concurrent(name, complete_on=CompleteOn::Default, options={}, &block)
25
+ def concurrent(complete_on=CompleteOn::Default, options={}, &block)
26
26
  raise ArgumentError, 'block' unless block_given?
27
27
 
28
- sub_process = Process.define_concurrent_process_for(name, @definition, complete_on, options)
29
- Builder.new(define_sub_process_task(name, @process, sub_process, options), @definition, @args).instance_eval(&block)
28
+ sub_process = Process.define_concurrent_process_for(@definition, complete_on, options)
29
+ Builder.new(define_sub_process_task(@process, sub_process, options), @definition, @args).instance_eval(&block)
30
30
  end
31
31
 
32
32
  # dynamically defines tasks, using the given @iterator method
33
33
  # the definition will be evaluated for each yielded item
34
- def for_each(name, iterator_method, options={}, &block)
34
+ def for_each(iterator_method, options={}, &block)
35
35
  raise ArgumentError, 'iterator_method' if iterator_method.nil?
36
36
  raise NoMethodError, iterator_method unless @executor.respond_to?(iterator_method)
37
37
  raise ArgumentError, 'block' unless block_given?
@@ -42,37 +42,37 @@ module Taskinator
42
42
  end
43
43
 
44
44
  # defines a task which executes the given @method
45
- def task(name, method, options={})
45
+ def task(method, options={})
46
46
  raise ArgumentError, 'method' if method.nil?
47
47
  raise NoMethodError, method unless @executor.respond_to?(method)
48
48
 
49
- define_step_task(name, @process, method, @args, options)
49
+ define_step_task(@process, method, @args, options)
50
50
  end
51
51
 
52
52
  # defines a sub process task, for the given @definition
53
53
  # the definition specified must have input compatible arguments
54
54
  # to the current definition
55
- def sub_process(name, definition, options={})
55
+ def sub_process(definition, options={})
56
56
  raise ArgumentError, 'definition' if definition.nil?
57
57
  raise ArgumentError, "#{definition.name} does not extend the #{Definition.name} module" unless definition.kind_of?(Definition)
58
58
 
59
59
  # TODO: decide whether the sub process to dynamically receive arguments
60
60
 
61
61
  sub_process = definition.create_process(*@args)
62
- Builder.new(define_sub_process_task(name, @process, sub_process, options), definition, @args)
62
+ Builder.new(define_sub_process_task(@process, sub_process, options), definition, @args)
63
63
  end
64
64
 
65
65
  private
66
66
 
67
- def define_step_task(name, process, method, args, options={})
67
+ def define_step_task(process, method, args, options={})
68
68
  define_task(process) {
69
- Task.define_step_task(name, process, method, args, options)
69
+ Task.define_step_task(process, method, args, options)
70
70
  }
71
71
  end
72
72
 
73
- def define_sub_process_task(name, process, sub_process, options={})
73
+ def define_sub_process_task(process, sub_process, options={})
74
74
  define_task(process) {
75
- Task.define_sub_process_task(name, process, sub_process, options)
75
+ Task.define_sub_process_task(process, sub_process, options)
76
76
  }
77
77
  sub_process
78
78
  end
@@ -3,9 +3,9 @@ module Taskinator
3
3
  class UndefinedProcessError < RuntimeError; end
4
4
 
5
5
  # defines a process
6
- def define_process(name=self.name, &block)
6
+ def define_process(&block)
7
7
  define_singleton_method :_create_process_ do |*args|
8
- process = Process.define_sequential_process_for(name, self)
8
+ process = Process.define_sequential_process_for(self)
9
9
  Builder.new(process, self, args).instance_eval(&block)
10
10
  process.save
11
11
  process
@@ -4,12 +4,12 @@ module Taskinator
4
4
  include ::Workflow
5
5
 
6
6
  class << self
7
- def define_sequential_process_for(name, definition, options={})
8
- Process::Sequential.new(name, definition, options)
7
+ def define_sequential_process_for(definition, options={})
8
+ Process::Sequential.new(definition, options)
9
9
  end
10
10
 
11
- def define_concurrent_process_for(name, definition, complete_on=CompleteOn::Default, options={})
12
- Process::Concurrent.new(name, definition, complete_on, options)
11
+ def define_concurrent_process_for(definition, complete_on=CompleteOn::Default, options={})
12
+ Process::Concurrent.new(definition, complete_on, options)
13
13
  end
14
14
 
15
15
  def base_key
@@ -18,19 +18,17 @@ module Taskinator
18
18
  end
19
19
 
20
20
  attr_reader :uuid
21
- attr_reader :name
22
21
  attr_reader :definition
23
22
  attr_reader :options
24
23
 
25
24
  # in the case of sub process tasks, the containing task
26
25
  attr_accessor :parent
27
26
 
28
- def initialize(name, definition, options={})
27
+ def initialize(definition, options={})
29
28
  raise ArgumentError, 'definition' if definition.nil?
30
29
  raise ArgumentError, "#{definition.name} does not extend the #{Definition.name} module" unless definition.kind_of?(Definition)
31
30
 
32
31
  @uuid = SecureRandom.uuid
33
- @name = name
34
32
  @definition = definition
35
33
  @options = options
36
34
  end
@@ -42,7 +40,6 @@ module Taskinator
42
40
  def accept(visitor)
43
41
  visitor.visit_attribute(:uuid)
44
42
  visitor.visit_task_reference(:parent)
45
- visitor.visit_attribute(:name)
46
43
  visitor.visit_type(:definition)
47
44
  visitor.visit_tasks(tasks)
48
45
  visitor.visit_args(:options)
@@ -53,7 +50,7 @@ module Taskinator
53
50
  end
54
51
 
55
52
  def to_s
56
- "#<#{self.class.name}:#{uuid} @name=\"#{name}>\">"
53
+ "#<#{self.class.name}:#{uuid}>"
57
54
  end
58
55
 
59
56
  workflow do
@@ -84,11 +81,11 @@ module Taskinator
84
81
  state :failed
85
82
 
86
83
  on_transition do |from, to, event, *args|
87
- Taskinator.logger.debug("PROCESS: #{self.class.name}:#{uuid} (#{name}) :: #{from} => #{to}")
84
+ Taskinator.logger.debug("PROCESS: #{self.class.name}:#{uuid} :: #{from} => #{to}")
88
85
  end
89
86
 
90
87
  on_error do |error, from, to, event, *args|
91
- Taskinator.logger.error("PROCESS: #{self.class.name}:#{uuid} (#{name}) :: #{error.message}")
88
+ Taskinator.logger.error("PROCESS: #{self.class.name}:#{uuid} :: #{error.message}")
92
89
  fail!(error)
93
90
  end
94
91
  end
@@ -142,8 +139,8 @@ module Taskinator
142
139
  class Concurrent < Process
143
140
  attr_reader :complete_on
144
141
 
145
- def initialize(name, definition, complete_on=CompleteOn::Default, options={})
146
- super(name, definition, options)
142
+ def initialize(definition, complete_on=CompleteOn::Default, options={})
143
+ super(definition, options)
147
144
  @complete_on = complete_on
148
145
  end
149
146
 
@@ -4,12 +4,12 @@ module Taskinator
4
4
  include ::Workflow
5
5
 
6
6
  class << self
7
- def define_step_task(name, process, method, args, options={})
8
- Step.new(name, process, method, args, options)
7
+ def define_step_task(process, method, args, options={})
8
+ Step.new(process, method, args, options)
9
9
  end
10
10
 
11
- def define_sub_process_task(name, process, sub_process, options={})
12
- SubProcess.new(name, process, sub_process, options)
11
+ def define_sub_process_task(process, sub_process, options={})
12
+ SubProcess.new(process, sub_process, options)
13
13
  end
14
14
 
15
15
  def base_key
@@ -19,25 +19,22 @@ module Taskinator
19
19
 
20
20
  attr_reader :process
21
21
  attr_reader :uuid
22
- attr_reader :name
23
22
  attr_reader :options
24
23
 
25
24
  # the next task in the sequence
26
25
  attr_accessor :next
27
26
 
28
- def initialize(name, process, options={})
27
+ def initialize(process, options={})
29
28
  raise ArgumentError, 'process' if process.nil? || !process.is_a?(Process)
30
29
 
31
30
  @uuid = SecureRandom.uuid
32
31
  @process = process
33
- @name = name
34
32
  @options = options
35
33
  end
36
34
 
37
35
  def accept(visitor)
38
36
  visitor.visit_attribute(:uuid)
39
37
  visitor.visit_process_reference(:process)
40
- visitor.visit_attribute(:name)
41
38
  visitor.visit_task_reference(:next)
42
39
  visitor.visit_args(:options)
43
40
  end
@@ -47,7 +44,7 @@ module Taskinator
47
44
  end
48
45
 
49
46
  def to_s
50
- "#<#{self.class.name}:#{uuid} @name=\"#{name}\">"
47
+ "#<#{self.class.name}:#{uuid}>"
51
48
  end
52
49
 
53
50
  workflow do
@@ -69,16 +66,16 @@ module Taskinator
69
66
  state :failed
70
67
 
71
68
  on_transition do |from, to, event, *args|
72
- Taskinator.logger.debug("TASK: #{self.class.name}:#{uuid} (#{name}) :: #{from} => #{to}")
69
+ Taskinator.logger.debug("TASK: #{self.class.name}:#{uuid} :: #{from} => #{to}")
73
70
  end
74
71
 
75
72
  on_error do |error, from, to, event, *args|
76
- Taskinator.logger.error("TASK: #{self.class.name}:#{uuid} (#{name}) :: #{error.message}")
73
+ Taskinator.logger.error("TASK: #{self.class.name}:#{uuid} :: #{error.message}")
77
74
  fail!(error)
78
75
  end
79
76
  end
80
77
 
81
- def can_complete_task?
78
+ def can_complete_task?(*args)
82
79
  # subclasses must implement this method
83
80
  raise NotImplementedError
84
81
  end
@@ -115,8 +112,8 @@ module Taskinator
115
112
  attr_reader :method
116
113
  attr_reader :args
117
114
 
118
- def initialize(name, process, method, args, options={})
119
- super(name, process, options)
115
+ def initialize(process, method, args, options={})
116
+ super(process, options)
120
117
  @definition = process.definition # for convenience
121
118
 
122
119
  raise ArgumentError, 'method' if method.nil?
@@ -153,8 +150,8 @@ module Taskinator
153
150
  class SubProcess < Task
154
151
  attr_reader :sub_process
155
152
 
156
- def initialize(name, process, sub_process, options={})
157
- super(name, process, options)
153
+ def initialize(process, sub_process, options={})
154
+ super(process, options)
158
155
  raise ArgumentError, 'sub_process' if sub_process.nil? || !sub_process.is_a?(Process)
159
156
 
160
157
  @sub_process = sub_process
@@ -1,3 +1,3 @@
1
1
  module Taskinator
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/taskinator.rb CHANGED
@@ -32,7 +32,6 @@ module Taskinator
32
32
  LICENSE = 'See LICENSE.txt for licensing details.'
33
33
 
34
34
  DEFAULTS = {
35
- :environment => nil
36
35
  }
37
36
 
38
37
  class << self
@@ -9,7 +9,6 @@ shared_examples_for "a process" do |process_type|
9
9
 
10
10
  it { expect(process.definition).to eq(definition) }
11
11
  it { expect(process.uuid).to_not be_nil }
12
- it { expect(process.name).to eq('name') }
13
12
  it { expect(process.to_s).to match(/#{process.uuid}/) }
14
13
  it { expect(process.options).to_not be_nil }
15
14
  it { expect(process.tasks).to_not be_nil }
@@ -9,7 +9,6 @@ shared_examples_for "a task" do |task_type|
9
9
 
10
10
  it { expect(task.process).to eq(process) }
11
11
  it { expect(task.uuid).to_not be_nil }
12
- it { expect(task.name).to eq('name') }
13
12
  it { expect(task.to_s).to match(/#{task.uuid}/) }
14
13
  it { expect(task.options).to_not be_nil }
15
14
 
@@ -2,33 +2,33 @@ module TestFlow
2
2
  extend Taskinator::Definition
3
3
 
4
4
  define_process do
5
- task '~', :error_task, :continue_on_error => true
5
+ task :error_task, :continue_on_error => true
6
6
 
7
- task 'A', :the_task
7
+ task :the_task
8
8
 
9
- for_each 'Items', :iterator do
10
- task 'B', :the_task
9
+ for_each :iterator do
10
+ task :the_task
11
11
  end
12
12
 
13
- sequential 'C' do
14
- task 'C1', :the_task
15
- task 'C2', :the_task
16
- task 'C3', :the_task
13
+ sequential do
14
+ task :the_task
15
+ task :the_task
16
+ task :the_task
17
17
  end
18
18
 
19
- task 'D', :the_task
19
+ task :the_task
20
20
 
21
- concurrent 'E' do
21
+ concurrent do
22
22
  20.times do |i|
23
- task "E#{i+1}", :the_task
23
+ task :the_task
24
24
  end
25
- task 'Ennnn', :the_task
25
+ task :the_task
26
26
  end
27
27
 
28
- task 'F', :the_task
28
+ task :the_task
29
29
 
30
30
  # invoke the specified sub process
31
- sub_process 'G', TestSubFlow
31
+ sub_process TestSubFlow
32
32
  end
33
33
 
34
34
  def error_task(*args)
@@ -53,9 +53,9 @@ module TestFlow
53
53
  extend Taskinator::Definition
54
54
 
55
55
  define_process do
56
- task 'SubA', :the_task
57
- task 'SubB', :the_task
58
- task 'SubC', :the_task
56
+ task :the_task
57
+ task :the_task
58
+ task :the_task
59
59
  end
60
60
 
61
61
  def the_task(*args)
@@ -7,7 +7,6 @@ describe TestFlow, :redis => true do
7
7
  processB = Taskinator::Process.fetch(processA.uuid)
8
8
 
9
9
  expect(processB.uuid).to eq(processA.uuid)
10
- expect(processB.name).to eq(processA.name)
11
10
  expect(processB.definition).to eq(processA.definition)
12
11
  expect(processB.options).to eq(processA.options)
13
12
 
@@ -18,7 +17,6 @@ describe TestFlow, :redis => true do
18
17
  tasks.each do |(taskB, taskA)|
19
18
  expect(taskA.process).to eq(taskB.process)
20
19
  expect(taskA.uuid).to eq(taskB.uuid)
21
- expect(taskA.name).to eq(taskB.name)
22
20
  expect(taskA.options).to eq(taskB.options)
23
21
  end
24
22
  end
@@ -12,7 +12,7 @@ describe Taskinator::Definition::Builder do
12
12
  end
13
13
 
14
14
  let(:process) {
15
- Class.new(Taskinator::Process).new('name', definition)
15
+ Class.new(Taskinator::Process).new(definition)
16
16
  }
17
17
 
18
18
  let(:args) { [:arg1, :arg2] }
@@ -35,18 +35,18 @@ describe Taskinator::Definition::Builder do
35
35
  describe "#sequential" do
36
36
  it "invokes supplied block" do
37
37
  expect(block).to receive(:call)
38
- subject.sequential('name', &define_block)
38
+ subject.sequential(&define_block)
39
39
  end
40
40
 
41
41
  it "creates a sequential process" do
42
42
  allow(block).to receive(:call)
43
- expect(Taskinator::Process).to receive(:define_sequential_process_for).with('name', definition, {}).and_call_original
44
- subject.sequential('name', &define_block)
43
+ expect(Taskinator::Process).to receive(:define_sequential_process_for).with(definition, {}).and_call_original
44
+ subject.sequential(&define_block)
45
45
  end
46
46
 
47
47
  it "fails if block isn't given" do
48
48
  expect {
49
- subject.sequential('name')
49
+ subject.sequential()
50
50
  }.to raise_error(ArgumentError)
51
51
  end
52
52
  end
@@ -54,18 +54,18 @@ describe Taskinator::Definition::Builder do
54
54
  describe "#concurrent" do
55
55
  it "invokes supplied block" do
56
56
  expect(block).to receive(:call)
57
- subject.concurrent('name', &define_block)
57
+ subject.concurrent(&define_block)
58
58
  end
59
59
 
60
60
  it "creates a concurrent process" do
61
61
  allow(block).to receive(:call)
62
- expect(Taskinator::Process).to receive(:define_concurrent_process_for).with('name', definition, Taskinator::CompleteOn::First, {}).and_call_original
63
- subject.concurrent('name', Taskinator::CompleteOn::First, &define_block)
62
+ expect(Taskinator::Process).to receive(:define_concurrent_process_for).with(definition, Taskinator::CompleteOn::First, {}).and_call_original
63
+ subject.concurrent(Taskinator::CompleteOn::First, &define_block)
64
64
  end
65
65
 
66
66
  it "fails if block isn't given" do
67
67
  expect {
68
- subject.concurrent('name')
68
+ subject.concurrent()
69
69
  }.to raise_error(ArgumentError)
70
70
  end
71
71
  end
@@ -87,43 +87,43 @@ describe Taskinator::Definition::Builder do
87
87
 
88
88
  expect(block).to receive(:call).exactly(3).times
89
89
 
90
- subject.for_each('name', :iterator_method, &define_block)
90
+ subject.for_each(:iterator_method, &define_block)
91
91
  end
92
92
 
93
93
  it "fails if iterator method is nil" do
94
94
  expect {
95
- subject.for_each('name', nil, &define_block)
95
+ subject.for_each(nil, &define_block)
96
96
  }.to raise_error(ArgumentError)
97
97
  end
98
98
 
99
99
  it "fails if iterator method is not defined" do
100
100
  expect {
101
- subject.for_each('name', :undefined_iterator, &define_block)
101
+ subject.for_each(:undefined_iterator, &define_block)
102
102
  }.to raise_error(NoMethodError)
103
103
  end
104
104
 
105
105
  it "fails if block isn't given" do
106
106
  expect {
107
- subject.for_each('name', nil)
107
+ subject.for_each(nil)
108
108
  }.to raise_error(ArgumentError)
109
109
  end
110
110
  end
111
111
 
112
112
  describe "#task" do
113
113
  it "creates a task" do
114
- expect(Taskinator::Task).to receive(:define_step_task).with('name', process, :task_method, args, {})
115
- subject.task('name', :task_method)
114
+ expect(Taskinator::Task).to receive(:define_step_task).with(process, :task_method, args, {})
115
+ subject.task(:task_method)
116
116
  end
117
117
 
118
118
  it "fails if task method is nil" do
119
119
  expect {
120
- subject.task('name', nil)
120
+ subject.task(nil)
121
121
  }.to raise_error(ArgumentError)
122
122
  end
123
123
 
124
124
  it "fails if task method is not defined" do
125
125
  expect {
126
- subject.task('name', :undefined_method)
126
+ subject.task(:undefined_method)
127
127
  }.to raise_error(NoMethodError)
128
128
  end
129
129
  end
@@ -139,14 +139,14 @@ describe Taskinator::Definition::Builder do
139
139
 
140
140
  it "creates a sub process" do
141
141
  expect(sub_definition).to receive(:create_process).with(*args).and_call_original
142
- subject.sub_process('name', sub_definition)
142
+ subject.sub_process(sub_definition)
143
143
  end
144
144
 
145
145
  it "creates a sub process task" do
146
146
  sub_process = sub_definition.create_process(:argX, :argY)
147
147
  allow(sub_definition).to receive(:create_process) { sub_process }
148
- expect(Taskinator::Task).to receive(:define_sub_process_task).with('name', process, sub_process, {})
149
- subject.sub_process('name', sub_definition)
148
+ expect(Taskinator::Task).to receive(:define_sub_process_task).with(process, sub_process, {})
149
+ subject.sub_process(sub_definition)
150
150
  end
151
151
  end
152
152
 
@@ -75,7 +75,7 @@ describe Taskinator::Persistence, :redis => true do
75
75
  end
76
76
 
77
77
  describe "for processes" do
78
- let(:process) { TestProcess.new('name', definition) }
78
+ let(:process) { TestProcess.new(definition) }
79
79
 
80
80
  it {
81
81
  process.save
@@ -84,8 +84,8 @@ describe Taskinator::Persistence, :redis => true do
84
84
  end
85
85
 
86
86
  describe "for tasks" do
87
- let(:process) { TestProcess.new('name', definition) }
88
- let(:task) { TestTask.new('name', process) }
87
+ let(:process) { TestProcess.new(definition) }
88
+ let(:task) { TestTask.new(process) }
89
89
 
90
90
  it {
91
91
  process.tasks << task
@@ -10,11 +10,10 @@ describe Taskinator::Process do
10
10
 
11
11
  describe "Base" do
12
12
 
13
- subject { Class.new(Taskinator::Process).new('name', definition) }
13
+ subject { Class.new(Taskinator::Process).new(definition) }
14
14
 
15
15
  describe "#initialize" do
16
16
  it { expect(subject.uuid).to_not be_nil }
17
- it { expect(subject.name).to_not be_nil }
18
17
  it { expect(subject.definition).to_not be_nil }
19
18
  it { expect(subject.definition).to eq(definition) }
20
19
  it { expect(subject.options).to_not be_nil }
@@ -46,6 +45,14 @@ describe Taskinator::Process do
46
45
  it { expect(subject.current_state.name).to eq(:initial) }
47
46
  end
48
47
 
48
+ describe "#tasks_completed?" do
49
+ it {
50
+ expect {
51
+ subject.tasks_completed?
52
+ }.to raise_error(NotImplementedError)
53
+ }
54
+ end
55
+
49
56
  describe "workflow" do
50
57
  describe "#enqueue!" do
51
58
  it { expect(subject).to respond_to(:enqueue!) }
@@ -166,7 +173,6 @@ describe Taskinator::Process do
166
173
  visitor = double('visitor')
167
174
  expect(visitor).to receive(:visit_type).with(:definition)
168
175
  expect(visitor).to receive(:visit_attribute).with(:uuid)
169
- expect(visitor).to receive(:visit_attribute).with(:name)
170
176
  expect(visitor).to receive(:visit_args).with(:options)
171
177
  expect(visitor).to receive(:visit_task_reference).with(:parent)
172
178
  expect(visitor).to receive(:visit_tasks)
@@ -179,28 +185,28 @@ describe Taskinator::Process do
179
185
  describe Taskinator::Process::Sequential do
180
186
 
181
187
  it_should_behave_like "a process", Taskinator::Process::Sequential do
182
- let(:process) { Taskinator::Process.define_sequential_process_for('name', definition) }
188
+ let(:process) { Taskinator::Process.define_sequential_process_for(definition) }
183
189
  end
184
190
 
185
- subject { Taskinator::Process.define_sequential_process_for('name', definition) }
191
+ subject { Taskinator::Process.define_sequential_process_for(definition) }
186
192
 
187
193
  let(:tasks) {
188
194
  [
189
- Class.new(Taskinator::Task).new('task1', subject),
190
- Class.new(Taskinator::Task).new('task2', subject)
195
+ Class.new(Taskinator::Task).new(subject),
196
+ Class.new(Taskinator::Task).new(subject)
191
197
  ]
192
198
  }
193
199
 
194
200
  describe ".define_sequential_process_for" do
195
201
  it "raise error for nil definition" do
196
202
  expect {
197
- Taskinator::Process.define_sequential_process_for('name', nil)
203
+ Taskinator::Process.define_sequential_process_for(nil)
198
204
  }.to raise_error(ArgumentError)
199
205
  end
200
206
 
201
207
  it "raise error for invalid definition" do
202
208
  expect {
203
- Taskinator::Process.define_sequential_process_for('name', Object)
209
+ Taskinator::Process.define_sequential_process_for(Object)
204
210
  }.to raise_error(ArgumentError)
205
211
  end
206
212
  end
@@ -274,7 +280,6 @@ describe Taskinator::Process do
274
280
  visitor = double('visitor')
275
281
  expect(visitor).to receive(:visit_type).with(:definition)
276
282
  expect(visitor).to receive(:visit_attribute).with(:uuid)
277
- expect(visitor).to receive(:visit_attribute).with(:name)
278
283
  expect(visitor).to receive(:visit_args).with(:options)
279
284
  expect(visitor).to receive(:visit_task_reference).with(:parent)
280
285
  expect(visitor).to receive(:visit_tasks)
@@ -286,30 +291,30 @@ describe Taskinator::Process do
286
291
 
287
292
  describe Taskinator::Process::Concurrent do
288
293
  it_should_behave_like "a process", Taskinator::Process::Concurrent do
289
- let(:process) { Taskinator::Process.define_concurrent_process_for('name', definition, Taskinator::CompleteOn::First) }
294
+ let(:process) { Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::First) }
290
295
 
291
296
  it { expect(process.complete_on).to eq(Taskinator::CompleteOn::First) }
292
297
  end
293
298
 
294
- subject { Taskinator::Process.define_concurrent_process_for('name', definition) }
299
+ subject { Taskinator::Process.define_concurrent_process_for(definition) }
295
300
 
296
301
  let(:tasks) {
297
302
  [
298
- Class.new(Taskinator::Task).new('task1', subject),
299
- Class.new(Taskinator::Task).new('task2', subject)
303
+ Class.new(Taskinator::Task).new(subject),
304
+ Class.new(Taskinator::Task).new(subject)
300
305
  ]
301
306
  }
302
307
 
303
308
  describe ".define_concurrent_process_for" do
304
309
  it "raise error for nil definition" do
305
310
  expect {
306
- Taskinator::Process.define_concurrent_process_for('name', nil)
311
+ Taskinator::Process.define_concurrent_process_for(nil)
307
312
  }.to raise_error(ArgumentError)
308
313
  end
309
314
 
310
315
  it "raise error for invalid definition" do
311
316
  expect {
312
- Taskinator::Process.define_concurrent_process_for('name', Object)
317
+ Taskinator::Process.define_concurrent_process_for(Object)
313
318
  }.to raise_error(ArgumentError)
314
319
  end
315
320
  end
@@ -344,7 +349,7 @@ describe Taskinator::Process do
344
349
  describe "#tasks_completed?" do
345
350
 
346
351
  describe "complete on first" do
347
- let(:process) { Taskinator::Process.define_concurrent_process_for('name', definition, Taskinator::CompleteOn::First) }
352
+ let(:process) { Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::First) }
348
353
 
349
354
  it "yields false when no tasks have completed" do
350
355
  tasks.each {|t| process.tasks << t }
@@ -363,7 +368,7 @@ describe Taskinator::Process do
363
368
  end
364
369
 
365
370
  describe "complete on last" do
366
- let(:process) { Taskinator::Process.define_concurrent_process_for('name', definition, Taskinator::CompleteOn::Last) }
371
+ let(:process) { Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::Last) }
367
372
 
368
373
  it "yields false when no tasks have completed" do
369
374
  tasks.each {|t| process.tasks << t }
@@ -401,7 +406,6 @@ describe Taskinator::Process do
401
406
  visitor = double('visitor')
402
407
  expect(visitor).to receive(:visit_type).with(:definition)
403
408
  expect(visitor).to receive(:visit_attribute).with(:uuid)
404
- expect(visitor).to receive(:visit_attribute).with(:name)
405
409
  expect(visitor).to receive(:visit_attribute).with(:complete_on)
406
410
  expect(visitor).to receive(:visit_args).with(:options)
407
411
  expect(visitor).to receive(:visit_task_reference).with(:parent)
@@ -10,14 +10,13 @@ describe Taskinator::Task do
10
10
 
11
11
  describe "Base" do
12
12
 
13
- let(:process) { Class.new(Taskinator::Process).new('name', definition) }
14
- subject { Class.new(Taskinator::Task).new('name', process) }
13
+ let(:process) { Class.new(Taskinator::Process).new(definition) }
14
+ subject { Class.new(Taskinator::Task).new(process) }
15
15
 
16
16
  describe "#initialize" do
17
17
  it { expect(subject.process).to_not be_nil }
18
18
  it { expect(subject.process).to eq(process) }
19
19
  it { expect(subject.uuid).to_not be_nil }
20
- it { expect(subject.name).to_not be_nil }
21
20
  it { expect(subject.options).to_not be_nil }
22
21
  end
23
22
 
@@ -43,6 +42,14 @@ describe Taskinator::Task do
43
42
  it { expect(subject.current_state.name).to eq(:initial) }
44
43
  end
45
44
 
45
+ describe "#can_complete_task?" do
46
+ it {
47
+ expect {
48
+ subject.can_complete_task?
49
+ }.to raise_error(NotImplementedError)
50
+ }
51
+ end
52
+
46
53
  describe "workflow" do
47
54
  describe "#enqueue!" do
48
55
  it { expect(subject).to respond_to(:enqueue!) }
@@ -128,7 +135,6 @@ describe Taskinator::Task do
128
135
  it {
129
136
  visitor = double('visitor')
130
137
  expect(visitor).to receive(:visit_attribute).with(:uuid)
131
- expect(visitor).to receive(:visit_attribute).with(:name)
132
138
  expect(visitor).to receive(:visit_process_reference).with(:process)
133
139
  expect(visitor).to receive(:visit_task_reference).with(:next)
134
140
  expect(visitor).to receive(:visit_args).with(:options)
@@ -140,12 +146,12 @@ describe Taskinator::Task do
140
146
 
141
147
  describe Taskinator::Task::Step do
142
148
  it_should_behave_like "a task", Taskinator::Task::Step do
143
- let(:process) { Class.new(Taskinator::Process).new('process', definition) }
144
- let(:task) { Taskinator::Task.define_step_task('name', process, :method, {:a => 1, :b => 2}) }
149
+ let(:process) { Class.new(Taskinator::Process).new(definition) }
150
+ let(:task) { Taskinator::Task.define_step_task(process, :method, {:a => 1, :b => 2}) }
145
151
  end
146
152
 
147
- let(:process) { Class.new(Taskinator::Process).new('process', definition) }
148
- subject { Taskinator::Task.define_step_task('name', process, :method, {:a => 1, :b => 2}) }
153
+ let(:process) { Class.new(Taskinator::Process).new(definition) }
154
+ subject { Taskinator::Task.define_step_task(process, :method, {:a => 1, :b => 2}) }
149
155
 
150
156
  describe "#executor" do
151
157
  it { expect(subject.executor).to_not be_nil }
@@ -184,7 +190,6 @@ describe Taskinator::Task do
184
190
  visitor = double('visitor')
185
191
  expect(visitor).to receive(:visit_type).with(:definition)
186
192
  expect(visitor).to receive(:visit_attribute).with(:uuid)
187
- expect(visitor).to receive(:visit_attribute).with(:name)
188
193
  expect(visitor).to receive(:visit_process_reference).with(:process)
189
194
  expect(visitor).to receive(:visit_task_reference).with(:next)
190
195
  expect(visitor).to receive(:visit_args).with(:options)
@@ -198,14 +203,14 @@ describe Taskinator::Task do
198
203
 
199
204
  describe Taskinator::Task::SubProcess do
200
205
  it_should_behave_like "a task", Taskinator::Task::SubProcess do
201
- let(:process) { Class.new(Taskinator::Process).new('process', definition) }
202
- let(:sub_process) { Class.new(Taskinator::Process).new('sub_process', definition) }
203
- let(:task) { Taskinator::Task.define_sub_process_task('name', process, sub_process) }
206
+ let(:process) { Class.new(Taskinator::Process).new(definition) }
207
+ let(:sub_process) { Class.new(Taskinator::Process).new(definition) }
208
+ let(:task) { Taskinator::Task.define_sub_process_task(process, sub_process) }
204
209
  end
205
210
 
206
- let(:process) { Class.new(Taskinator::Process).new('process', definition) }
207
- let(:sub_process) { Class.new(Taskinator::Process).new('sub_process', definition) }
208
- subject { Taskinator::Task.define_sub_process_task('name', process, sub_process) }
211
+ let(:process) { Class.new(Taskinator::Process).new(definition) }
212
+ let(:sub_process) { Class.new(Taskinator::Process).new(definition) }
213
+ subject { Taskinator::Task.define_sub_process_task(process, sub_process) }
209
214
 
210
215
  describe "#start!" do
211
216
  it "delegates to sub process" do
@@ -236,7 +241,6 @@ describe Taskinator::Task do
236
241
  it {
237
242
  visitor = double('visitor')
238
243
  expect(visitor).to receive(:visit_attribute).with(:uuid)
239
- expect(visitor).to receive(:visit_attribute).with(:name)
240
244
  expect(visitor).to receive(:visit_process_reference).with(:process)
241
245
  expect(visitor).to receive(:visit_task_reference).with(:next)
242
246
  expect(visitor).to receive(:visit_args).with(:options)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taskinator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Stefano