taskinator 0.0.15 → 0.0.16

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +77 -0
  3. data/Gemfile.lock +2 -1
  4. data/README.md +1 -1
  5. data/lib/taskinator/api.rb +3 -1
  6. data/lib/taskinator/create_process_worker.rb +60 -0
  7. data/lib/taskinator/definition.rb +47 -8
  8. data/lib/taskinator/job_worker.rb +2 -2
  9. data/lib/taskinator/logger.rb +13 -75
  10. data/lib/taskinator/persistence.rb +48 -40
  11. data/lib/taskinator/process.rb +13 -6
  12. data/lib/taskinator/process_worker.rb +3 -1
  13. data/lib/taskinator/queues/delayed_job.rb +12 -5
  14. data/lib/taskinator/queues/resque.rb +16 -5
  15. data/lib/taskinator/queues/sidekiq.rb +14 -5
  16. data/lib/taskinator/queues.rb +12 -0
  17. data/lib/taskinator/task.rb +21 -8
  18. data/lib/taskinator/task_worker.rb +3 -1
  19. data/lib/taskinator/tasks.rb +1 -1
  20. data/lib/taskinator/version.rb +1 -1
  21. data/lib/taskinator.rb +20 -1
  22. data/spec/examples/queue_adapter_examples.rb +10 -0
  23. data/spec/spec_helper.rb +11 -0
  24. data/spec/support/mock_definition.rb +22 -0
  25. data/spec/support/spec_support.rb +3 -1
  26. data/spec/support/test_definition.rb +3 -0
  27. data/spec/support/test_process.rb +2 -0
  28. data/spec/support/test_queue.rb +7 -1
  29. data/spec/support/test_task.rb +2 -0
  30. data/spec/taskinator/api_spec.rb +2 -2
  31. data/spec/taskinator/create_process_worker_spec.rb +44 -0
  32. data/spec/taskinator/definition/builder_spec.rb +5 -5
  33. data/spec/taskinator/definition_spec.rb +103 -6
  34. data/spec/taskinator/executor_spec.rb +1 -1
  35. data/spec/taskinator/job_worker_spec.rb +3 -3
  36. data/spec/taskinator/persistence_spec.rb +12 -19
  37. data/spec/taskinator/process_spec.rb +29 -5
  38. data/spec/taskinator/process_worker_spec.rb +3 -3
  39. data/spec/taskinator/queues/delayed_job_spec.rb +23 -6
  40. data/spec/taskinator/queues/resque_spec.rb +27 -6
  41. data/spec/taskinator/queues/sidekiq_spec.rb +28 -10
  42. data/spec/taskinator/task_spec.rb +80 -7
  43. data/spec/taskinator/task_worker_spec.rb +3 -3
  44. data/spec/taskinator/{intermodal_spec.rb → taskinator_spec.rb} +35 -1
  45. data/spec/taskinator/tasks_spec.rb +1 -2
  46. data/taskinator.gemspec +17 -15
  47. metadata +30 -4
@@ -2,21 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe Taskinator::Persistence, :redis => true do
4
4
 
5
- module TestDefinition
6
- extend Taskinator::Definition
7
- end
8
-
9
5
  let(:definition) { TestDefinition }
10
6
 
11
- class TestProcess < Taskinator::Process
12
- end
13
-
14
- class TestTask < Taskinator::Task
15
- end
16
-
17
7
  describe "class methods" do
18
8
  subject {
19
- Class.new() do
9
+ Class.new do
20
10
  include Taskinator::Persistence
21
11
  end
22
12
  }
@@ -99,7 +89,7 @@ describe Taskinator::Persistence, :redis => true do
99
89
 
100
90
  describe "instance methods" do
101
91
  subject {
102
- klass = Class.new() do
92
+ klass = Class.new do
103
93
  include Taskinator::Persistence
104
94
 
105
95
  def self.base_key
@@ -112,7 +102,7 @@ describe Taskinator::Persistence, :redis => true do
112
102
  @uuid = SecureRandom.uuid
113
103
  end
114
104
  end
115
- klass.new()
105
+ klass.new
116
106
  }
117
107
 
118
108
  describe "#key" do
@@ -122,7 +112,7 @@ describe Taskinator::Persistence, :redis => true do
122
112
  end
123
113
 
124
114
  describe "#save" do
125
- pending
115
+ pending __FILE__
126
116
  end
127
117
 
128
118
  describe "#load_workflow_state" do
@@ -141,14 +131,16 @@ describe Taskinator::Persistence, :redis => true do
141
131
  describe "#fail" do
142
132
  it "persists error information" do
143
133
  begin
144
- raise StandardError, 'a error'
145
- rescue Exception => e
134
+ # raise this error in a block, so there is a backtrace!
135
+ raise StandardError.new('a error')
136
+ rescue => e
146
137
  subject.fail(e)
147
138
  end
148
139
 
149
140
  Taskinator.redis do |conn|
150
141
  expect(conn.hget(subject.key, :error_type)).to eq('StandardError')
151
142
  expect(conn.hget(subject.key, :error_message)).to eq('a error')
143
+ expect(conn.hget(subject.key, :error_backtrace)).to_not be_empty
152
144
  end
153
145
  end
154
146
  end
@@ -157,10 +149,11 @@ describe Taskinator::Persistence, :redis => true do
157
149
  it "retrieves error information" do
158
150
  error = nil
159
151
  begin
160
- raise StandardError, 'a error'
161
- rescue Exception => e
152
+ # raise this error in a block, so there is a backtrace!
153
+ raise StandardError.new('a error')
154
+ rescue => e
162
155
  error = e
163
- subject.fail(e)
156
+ subject.fail(error)
164
157
  end
165
158
 
166
159
  expect(subject.error).to eq([error.class.name, error.message, error.backtrace])
@@ -2,11 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Taskinator::Process do
4
4
 
5
- let(:definition) do
6
- Module.new() do
7
- extend Taskinator::Definition
8
- end
9
- end
5
+ let(:definition) { TestDefinition }
10
6
 
11
7
  describe "Base" do
12
8
 
@@ -39,6 +35,17 @@ describe Taskinator::Process do
39
35
  it { expect(subject.to_s).to match(/#{subject.uuid}/) }
40
36
  end
41
37
 
38
+ describe "#queue" do
39
+ it {
40
+ expect(subject.queue).to be_nil
41
+ }
42
+
43
+ it {
44
+ process = Class.new(Taskinator::Process).new(definition, :queue => :foo)
45
+ expect(process.queue).to eq(:foo)
46
+ }
47
+ end
48
+
42
49
  describe "#current_state" do
43
50
  it { expect(subject).to be_a(::Workflow) }
44
51
  it { expect(subject.current_state).to_not be_nil }
@@ -189,10 +196,15 @@ describe Taskinator::Process do
189
196
  expect(visitor).to receive(:visit_args).with(:options)
190
197
  expect(visitor).to receive(:visit_task_reference).with(:parent)
191
198
  expect(visitor).to receive(:visit_tasks)
199
+ expect(visitor).to receive(:visit_attribute).with(:queue)
192
200
 
193
201
  subject.accept(visitor)
194
202
  }
195
203
  end
204
+
205
+ describe "#reload" do
206
+ it { expect(subject.reload).to_not be }
207
+ end
196
208
  end
197
209
 
198
210
  describe Taskinator::Process::Sequential do
@@ -222,6 +234,11 @@ describe Taskinator::Process do
222
234
  Taskinator::Process.define_sequential_process_for(Object)
223
235
  }.to raise_error(ArgumentError)
224
236
  end
237
+
238
+ it "sets the queue to use" do
239
+ process = Taskinator::Process.define_sequential_process_for(definition, :queue => :foo)
240
+ expect(process.queue).to eq(:foo)
241
+ end
225
242
  end
226
243
 
227
244
  describe "#start!" do
@@ -296,6 +313,7 @@ describe Taskinator::Process do
296
313
  expect(visitor).to receive(:visit_args).with(:options)
297
314
  expect(visitor).to receive(:visit_task_reference).with(:parent)
298
315
  expect(visitor).to receive(:visit_tasks)
316
+ expect(visitor).to receive(:visit_attribute).with(:queue)
299
317
 
300
318
  subject.accept(visitor)
301
319
  }
@@ -330,6 +348,11 @@ describe Taskinator::Process do
330
348
  Taskinator::Process.define_concurrent_process_for(Object)
331
349
  }.to raise_error(ArgumentError)
332
350
  end
351
+
352
+ it "sets the queue to use" do
353
+ process = Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::First, :queue => :foo)
354
+ expect(process.queue).to eq(:foo)
355
+ end
333
356
  end
334
357
 
335
358
  describe "#start!" do
@@ -435,6 +458,7 @@ describe Taskinator::Process do
435
458
  expect(visitor).to receive(:visit_args).with(:options)
436
459
  expect(visitor).to receive(:visit_task_reference).with(:parent)
437
460
  expect(visitor).to receive(:visit_tasks)
461
+ expect(visitor).to receive(:visit_attribute).with(:queue)
438
462
 
439
463
  subject.accept(visitor)
440
464
  }
@@ -41,11 +41,11 @@ describe Taskinator::ProcessWorker do
41
41
  it "should fail if process raises an error" do
42
42
  process = mock_process
43
43
  allow(Taskinator::Process).to receive(:fetch).with(uuid) { process }
44
- allow(process).to receive(:start!) { raise NotImplementedError }
45
- expect(process).to receive(:fail!).with(NotImplementedError)
44
+ allow(process).to receive(:start!) { raise StandardError }
45
+ expect(process).to receive(:fail!).with(StandardError)
46
46
  expect {
47
47
  subject.perform
48
- }.to raise_error(NotImplementedError)
48
+ }.to raise_error(StandardError)
49
49
  end
50
50
 
51
51
  end
@@ -7,7 +7,28 @@ describe Taskinator::Queues::DelayedJobAdapter, :delayed_job do
7
7
  let(:adapter) { Taskinator::Queues::DelayedJobAdapter }
8
8
  let(:uuid) { SecureRandom.uuid }
9
9
 
10
- subject { adapter.new() }
10
+ subject { adapter.new }
11
+
12
+ describe "CreateProcessWorker" do
13
+ let(:args) { Taskinator::Persistence.serialize(:foo => :bar) }
14
+
15
+ it "enqueues" do
16
+ expect {
17
+ subject.enqueue_create_process(MockDefinition.create, uuid, :foo => :bar)
18
+ }.to change(Delayed::Job.queue, :size).by(1)
19
+ end
20
+
21
+ it "enqueues to specified queue" do
22
+ definition = MockDefinition.create(:other)
23
+ subject.enqueue_create_process(definition, uuid, :foo => :bar)
24
+ expect(Delayed::Job.contains?(adapter::CreateProcessWorker, [definition.name, uuid, args], :other)).to be
25
+ end
26
+
27
+ it "calls worker" do
28
+ expect_any_instance_of(Taskinator::CreateProcessWorker).to receive(:perform)
29
+ adapter::CreateProcessWorker.new(MockDefinition.create.name, uuid, args).perform
30
+ end
31
+ end
11
32
 
12
33
  describe "ProcessWorker" do
13
34
  it "enqueues processes" do
@@ -68,11 +89,7 @@ describe Taskinator::Queues::DelayedJobAdapter, :delayed_job do
68
89
  adapter::JobWorker.new(uuid).perform
69
90
  end
70
91
 
71
- let(:definition) do
72
- Module.new() do
73
- extend Taskinator::Definition
74
- end
75
- end
92
+ let(:definition) { TestDefinition }
76
93
 
77
94
  it "performs invocation on job" do
78
95
  args = {:a => 1}
@@ -7,7 +7,32 @@ describe Taskinator::Queues::ResqueAdapter, :resque do
7
7
  let(:adapter) { Taskinator::Queues::ResqueAdapter }
8
8
  let(:uuid) { SecureRandom.uuid }
9
9
 
10
- subject { adapter.new() }
10
+ subject { adapter.new }
11
+
12
+ describe "CreateProcessWorker" do
13
+ let(:args) { Taskinator::Persistence.serialize(:foo => :bar) }
14
+
15
+ it "enqueues" do
16
+ worker = adapter::CreateProcessWorker
17
+ definition = MockDefinition.create
18
+ subject.enqueue_create_process(definition, uuid, :foo => :bar)
19
+
20
+ expect(worker).to have_queued(definition.name, uuid, args)
21
+ end
22
+
23
+ it "enqueues to specified queue" do
24
+ worker = adapter::CreateProcessWorker
25
+ definition = MockDefinition.create(:other)
26
+ subject.enqueue_create_process(definition, uuid, :foo => :bar)
27
+
28
+ expect(worker).to have_queued(definition.name, uuid, args).in(:other)
29
+ end
30
+
31
+ it "calls worker" do
32
+ expect_any_instance_of(Taskinator::CreateProcessWorker).to receive(:perform)
33
+ adapter::CreateProcessWorker.perform(MockDefinition.create.name, uuid, args)
34
+ end
35
+ end
11
36
 
12
37
  describe "ProcessWorker" do
13
38
  it "enqueues processes" do
@@ -87,11 +112,7 @@ describe Taskinator::Queues::ResqueAdapter, :resque do
87
112
  adapter::JobWorker.perform(uuid)
88
113
  end
89
114
 
90
- let(:definition) do
91
- Module.new() do
92
- extend Taskinator::Definition
93
- end
94
- end
115
+ let(:definition) { TestDefinition }
95
116
 
96
117
  it "performs invocation on job" do
97
118
  args = {:a => 1}
@@ -9,7 +9,29 @@ describe Taskinator::Queues::SidekiqAdapter, :sidekiq do
9
9
  let(:adapter) { Taskinator::Queues::SidekiqAdapter }
10
10
  let(:uuid) { SecureRandom.uuid }
11
11
 
12
- subject { adapter.new() }
12
+ subject { adapter.new }
13
+
14
+ describe "CreateProcessWorker" do
15
+ let(:args) { Taskinator::Persistence.serialize(:foo => :bar) }
16
+
17
+ it "enqueues" do
18
+ worker = adapter::CreateProcessWorker
19
+ definition = MockDefinition.create
20
+ subject.enqueue_create_process(definition, uuid, :foo => :bar)
21
+ expect(worker).to have_enqueued_job(definition.name, uuid, args)
22
+ end
23
+
24
+ it "enqueues to specified queue" do
25
+ subject.enqueue_create_process(MockDefinition.create(:other), uuid, :foo => :bar)
26
+ expect(adapter::CreateProcessWorker).to be_processed_in_x(:other)
27
+ end
28
+
29
+ it "calls worker" do
30
+ definition = MockDefinition.create
31
+ expect_any_instance_of(Taskinator::CreateProcessWorker).to receive(:perform)
32
+ adapter::CreateProcessWorker.new.perform(definition.name, uuid, args)
33
+ end
34
+ end
13
35
 
14
36
  describe "ProcessWorker" do
15
37
  it "enqueues processes" do
@@ -26,7 +48,7 @@ describe Taskinator::Queues::SidekiqAdapter, :sidekiq do
26
48
 
27
49
  it "calls process worker" do
28
50
  expect_any_instance_of(Taskinator::ProcessWorker).to receive(:perform)
29
- adapter::ProcessWorker.new().perform(uuid)
51
+ adapter::ProcessWorker.new.perform(uuid)
30
52
  end
31
53
  end
32
54
 
@@ -45,7 +67,7 @@ describe Taskinator::Queues::SidekiqAdapter, :sidekiq do
45
67
 
46
68
  it "calls task worker" do
47
69
  expect_any_instance_of(Taskinator::TaskWorker).to receive(:perform)
48
- adapter::TaskWorker.new().perform(uuid)
70
+ adapter::TaskWorker.new.perform(uuid)
49
71
  end
50
72
  end
51
73
 
@@ -78,14 +100,10 @@ describe Taskinator::Queues::SidekiqAdapter, :sidekiq do
78
100
 
79
101
  it "calls job worker" do
80
102
  expect_any_instance_of(Taskinator::JobWorker).to receive(:perform)
81
- adapter::JobWorker.new().perform(uuid)
103
+ adapter::JobWorker.new.perform(uuid)
82
104
  end
83
105
 
84
- let(:definition) do
85
- Module.new() do
86
- extend Taskinator::Definition
87
- end
88
- end
106
+ let(:definition) { TestDefinition }
89
107
 
90
108
  it "performs invocation on job" do
91
109
  args = {:a => 1}
@@ -100,7 +118,7 @@ describe Taskinator::Queues::SidekiqAdapter, :sidekiq do
100
118
 
101
119
  allow(Taskinator::Task).to receive(:fetch).with(uuid) { job_task }
102
120
 
103
- adapter::JobWorker.new().perform(uuid)
121
+ adapter::JobWorker.new.perform(uuid)
104
122
  end
105
123
  end
106
124
  end
@@ -2,11 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Taskinator::Task do
4
4
 
5
- let(:definition) do
6
- Module.new() do
7
- extend Taskinator::Definition
8
- end
9
- end
5
+ let(:definition) { TestDefinition }
10
6
 
11
7
  describe "Base" do
12
8
 
@@ -36,6 +32,17 @@ describe Taskinator::Task do
36
32
  it { expect(subject.to_s).to match(/#{subject.uuid}/) }
37
33
  end
38
34
 
35
+ describe "#queue" do
36
+ it {
37
+ expect(subject.queue).to be_nil
38
+ }
39
+
40
+ it {
41
+ task = Class.new(Taskinator::Task).new(process, :queue => :foo)
42
+ expect(task.queue).to eq(:foo)
43
+ }
44
+ end
45
+
39
46
  describe "#current_state" do
40
47
  it { expect(subject).to be_a(::Workflow) }
41
48
  it { expect(subject.current_state).to_not be_nil }
@@ -145,10 +152,15 @@ describe Taskinator::Task do
145
152
  expect(visitor).to receive(:visit_process_reference).with(:process)
146
153
  expect(visitor).to receive(:visit_task_reference).with(:next)
147
154
  expect(visitor).to receive(:visit_args).with(:options)
155
+ expect(visitor).to receive(:visit_attribute).with(:queue)
148
156
 
149
157
  subject.accept(visitor)
150
158
  }
151
159
  end
160
+
161
+ describe "#reload" do
162
+ it { expect(subject.reload).to_not be }
163
+ end
152
164
  end
153
165
 
154
166
  describe Taskinator::Task::Step do
@@ -160,6 +172,13 @@ describe Taskinator::Task do
160
172
  let(:process) { Class.new(Taskinator::Process).new(definition) }
161
173
  subject { Taskinator::Task.define_step_task(process, :method, {:a => 1, :b => 2}) }
162
174
 
175
+ describe ".define_step_task" do
176
+ it "sets the queue to use" do
177
+ task = Taskinator::Task.define_step_task(process, :method, {:a => 1, :b => 2}, :queue => :foo)
178
+ expect(task.queue).to eq(:foo)
179
+ end
180
+ end
181
+
163
182
  describe "#executor" do
164
183
  it { expect(subject.executor).to_not be_nil }
165
184
  it { expect(subject.executor).to be_a(definition) }
@@ -177,6 +196,18 @@ describe Taskinator::Task do
177
196
  expect(subject).to receive(:fail!).with(error)
178
197
  subject.start!
179
198
  end
199
+
200
+ it "is instrumented" do
201
+ allow(subject.executor).to receive(subject.method)
202
+
203
+ instrumentation_block = SpecSupport::Block.new
204
+ expect(instrumentation_block).to receive(:call)
205
+
206
+ # temporary subscription
207
+ ActiveSupport::Notifications.subscribed(instrumentation_block, /execute_step_task/) do
208
+ subject.start!
209
+ end
210
+ end
180
211
  end
181
212
 
182
213
  describe "#can_complete_task?" do
@@ -203,6 +234,7 @@ describe Taskinator::Task do
203
234
  expect(visitor).to receive(:visit_args).with(:options)
204
235
  expect(visitor).to receive(:visit_attribute).with(:method)
205
236
  expect(visitor).to receive(:visit_args).with(:args)
237
+ expect(visitor).to receive(:visit_attribute).with(:queue)
206
238
 
207
239
  subject.accept(visitor)
208
240
  }
@@ -224,6 +256,13 @@ describe Taskinator::Task do
224
256
  let(:process) { Class.new(Taskinator::Process).new(definition) }
225
257
  subject { Taskinator::Task.define_job_task(process, TestJob, {:a => 1, :b => 2}) }
226
258
 
259
+ describe ".define_job_task" do
260
+ it "sets the queue to use" do
261
+ task = Taskinator::Task.define_job_task(process, TestJob, {:a => 1, :b => 2}, :queue => :foo)
262
+ expect(task.queue).to eq(:foo)
263
+ end
264
+ end
265
+
227
266
  describe "#enqueue!" do
228
267
  it {
229
268
  expect {
@@ -234,11 +273,24 @@ describe Taskinator::Task do
234
273
 
235
274
  describe "#perform" do
236
275
  it {
237
- block = SpecSupport::Block.new()
276
+ block = SpecSupport::Block.new
238
277
  expect(block).to receive(:call).with(TestJob, {:a => 1, :b => 2})
239
278
 
240
- subject.perform &block
279
+ subject.perform(&block)
241
280
  }
281
+
282
+ it "is instrumented" do
283
+ block = SpecSupport::Block.new
284
+ allow(block).to receive(:call)
285
+
286
+ instrumentation_block = SpecSupport::Block.new
287
+ expect(instrumentation_block).to receive(:call)
288
+
289
+ # temporary subscription
290
+ ActiveSupport::Notifications.subscribed(instrumentation_block, /execute_job_task/) do
291
+ subject.perform(&block)
292
+ end
293
+ end
242
294
  end
243
295
 
244
296
  describe "#accept" do
@@ -256,6 +308,7 @@ describe Taskinator::Task do
256
308
  expect(visitor).to receive(:visit_args).with(:options)
257
309
  expect(visitor).to receive(:visit_type).with(:job)
258
310
  expect(visitor).to receive(:visit_args).with(:args)
311
+ expect(visitor).to receive(:visit_attribute).with(:queue)
259
312
 
260
313
  subject.accept(visitor)
261
314
  }
@@ -273,6 +326,13 @@ describe Taskinator::Task do
273
326
  let(:sub_process) { Class.new(Taskinator::Process).new(definition) }
274
327
  subject { Taskinator::Task.define_sub_process_task(process, sub_process) }
275
328
 
329
+ describe ".define_sub_process_task" do
330
+ it "sets the queue to use" do
331
+ task = Taskinator::Task.define_sub_process_task(process, sub_process, :queue => :foo)
332
+ expect(task.queue).to eq(:foo)
333
+ end
334
+ end
335
+
276
336
  describe "#start!" do
277
337
  it "delegates to sub process" do
278
338
  expect(sub_process).to receive(:start)
@@ -285,6 +345,18 @@ describe Taskinator::Task do
285
345
  expect(subject).to receive(:fail!).with(error)
286
346
  subject.start!
287
347
  end
348
+
349
+ it "is instrumented" do
350
+ allow(sub_process).to receive(:start)
351
+
352
+ instrumentation_block = SpecSupport::Block.new
353
+ expect(instrumentation_block).to receive(:call)
354
+
355
+ # temporary subscription
356
+ ActiveSupport::Notifications.subscribed(instrumentation_block, /execute_subprocess/) do
357
+ subject.start!
358
+ end
359
+ end
288
360
  end
289
361
 
290
362
  describe "#can_complete_task?" do
@@ -307,6 +379,7 @@ describe Taskinator::Task do
307
379
  expect(visitor).to receive(:visit_task_reference).with(:next)
308
380
  expect(visitor).to receive(:visit_args).with(:options)
309
381
  expect(visitor).to receive(:visit_process).with(:sub_process)
382
+ expect(visitor).to receive(:visit_attribute).with(:queue)
310
383
 
311
384
  subject.accept(visitor)
312
385
  }
@@ -57,11 +57,11 @@ describe Taskinator::TaskWorker do
57
57
  it "should fail if task raises an error" do
58
58
  task = mock_task
59
59
  allow(Taskinator::Task).to receive(:fetch).with(uuid) { task }
60
- allow(task).to receive(:start!) { raise NotImplementedError }
61
- expect(task).to receive(:fail!).with(NotImplementedError)
60
+ allow(task).to receive(:start!) { raise StandardError }
61
+ expect(task).to receive(:fail!).with(StandardError)
62
62
  expect {
63
63
  subject.perform
64
- }.to raise_error(NotImplementedError)
64
+ }.to raise_error(StandardError)
65
65
  end
66
66
 
67
67
  end
@@ -48,10 +48,44 @@ describe Taskinator do
48
48
  describe "#logger" do
49
49
  it { expect(subject.logger).to_not be_nil }
50
50
  it {
51
- logger = Logger.new(STDOUT)
51
+ logger = Logger.new(File::NULL)
52
52
  subject.logger = logger
53
53
  expect(subject.logger).to eq(logger)
54
54
  subject.logger = nil
55
55
  }
56
56
  end
57
+
58
+ describe "#instrumenter" do
59
+ it { expect(subject.instrumenter).to_not be_nil }
60
+
61
+ it {
62
+ orig_instrumenter = subject.instrumenter
63
+
64
+ instrumenter = Class.new().new
65
+ subject.instrumenter = instrumenter
66
+ expect(subject.instrumenter).to eq(instrumenter)
67
+
68
+ subject.instrumenter = orig_instrumenter
69
+ }
70
+
71
+ it "yields to given block" do
72
+ block = SpecSupport::Block.new
73
+ expect(block).to receive(:call)
74
+
75
+ subject.instrumenter.instrument(:foo, :bar => :baz, &block)
76
+ end
77
+
78
+ it "instruments event, when activesupport is referenced" do
79
+ block = SpecSupport::Block.new
80
+ expect(block).to receive(:call)
81
+
82
+ # temporary subscription
83
+ ActiveSupport::Notifications.subscribed(block, /.*/) do
84
+ subject.instrumenter.instrument(:foo, :bar) do
85
+ :baz
86
+ end
87
+ end
88
+ end
89
+
90
+ end
57
91
  end
@@ -17,13 +17,12 @@ describe Taskinator::Tasks do
17
17
 
18
18
  describe "#initialize" do
19
19
  it "starts with nil head" do
20
- first = double()
21
20
  instance = Taskinator::Tasks.new
22
21
  expect(instance.head).to be_nil
23
22
  end
24
23
 
25
24
  it "assigns head to first element" do
26
- first = double()
25
+ first = double
27
26
  instance = Taskinator::Tasks.new(first)
28
27
  expect(instance.head).to eq(first)
29
28
  end
data/taskinator.gemspec CHANGED
@@ -21,27 +21,29 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = '>= 2.0.0'
22
22
 
23
23
  # core
24
- spec.add_dependency 'redis', '>= 3.2.1'
25
- spec.add_dependency 'redis-namespace', '>= 1.5.2'
26
- spec.add_dependency 'connection_pool', '>= 2.2.0'
27
- spec.add_dependency 'json', '>= 1.8.2'
24
+ spec.add_dependency 'redis' , '>= 3.2.1'
25
+ spec.add_dependency 'redis-namespace' , '>= 1.5.2'
26
+ spec.add_dependency 'connection_pool' , '>= 2.2.0'
27
+ spec.add_dependency 'json' , '>= 1.8.2'
28
28
 
29
- # spec.add_dependency 'workflow', '>= 1.3.0' # RubyGems not up to date as of 11 Nov 2014.
29
+ # spec.add_dependency 'workflow' , '>= 1.3.0' # RubyGems not up to date as of 11 Nov 2014.
30
30
 
31
31
  # queues
32
- spec.add_development_dependency 'sidekiq', '>= 3.0.0'
33
- spec.add_development_dependency 'rspec-sidekiq', '>= 2.0.0'
32
+ spec.add_development_dependency 'sidekiq' , '>= 3.0.0'
33
+ spec.add_development_dependency 'rspec-sidekiq' , '>= 2.0.0'
34
34
 
35
- spec.add_development_dependency 'delayed_job', '>= 4.0.0'
35
+ spec.add_development_dependency 'delayed_job' , '>= 4.0.0'
36
36
 
37
- spec.add_development_dependency 'resque', '>= 1.25.2'
38
- spec.add_development_dependency 'resque_spec', '>= 0.16.0'
37
+ spec.add_development_dependency 'resque' , '>= 1.25.2'
38
+ spec.add_development_dependency 'resque_spec' , '>= 0.16.0'
39
39
 
40
40
  # other
41
- spec.add_development_dependency 'bundler', '>= 1.6.0'
42
- spec.add_development_dependency 'rake', '>= 10.3.0'
41
+ spec.add_development_dependency 'bundler' , '>= 1.6.0'
42
+ spec.add_development_dependency 'rake' , '>= 10.3.0'
43
+ spec.add_development_dependency 'activesupport' , '>= 4.0.0'
43
44
  spec.add_development_dependency 'rspec'
44
- spec.add_development_dependency 'coveralls', '>= 0.7.0'
45
- spec.add_development_dependency 'pry', '>= 0.9.0'
46
- spec.add_development_dependency 'pry-byebug', '>= 1.3.0'
45
+ spec.add_development_dependency 'coveralls' , '>= 0.7.0'
46
+ spec.add_development_dependency 'pry' , '>= 0.9.0'
47
+ spec.add_development_dependency 'pry-byebug' , '>= 1.3.0'
48
+
47
49
  end