taskinator 0.3.5 → 0.3.6
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +9 -11
- data/lib/taskinator/instrumentation.rb +3 -4
- data/lib/taskinator/persistence.rb +37 -12
- data/lib/taskinator/version.rb +1 -1
- data/spec/taskinator/instrumentation_spec.rb +1 -2
- data/spec/taskinator/persistence_spec.rb +60 -0
- data/spec/taskinator/process_spec.rb +2 -0
- data/spec/taskinator/process_worker_spec.rb +5 -0
- data/spec/taskinator/test_flows_spec.rb +1 -1
- data/spec/taskinator/xml_visitor_spec.rb +5 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3646429986b5ac67608dfa8559660acb89b42fe7
|
4
|
+
data.tar.gz: 65421c84b806625c2373d7f09250d55835f5dc5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a36b04b8b6a957afd3054ccc47f9849b2b14f0c18d99f2b90e77564949bb48716697f968b4ec6d4cf1d369392d938a9448dafc377fb768677cce9aa3faa5994
|
7
|
+
data.tar.gz: 8a00ace5324b642eaddde723b351cecfa1cf139953de51ecd10972c9f0266057a372ca8ea7907c31895ca19c82d7b2b016d1c3efa5f3d0676564dedd19a98efc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v0.3.6 - 11 Nov 2015
|
2
|
+
---
|
3
|
+
Added visitor for performing clean up of completed processes/tasks.
|
4
|
+
Performance improvement to instrumentation payload; removed references to task/process and use intrinsic types.
|
5
|
+
Clean up of keys, via `cleanup` method use key expiry.
|
6
|
+
|
1
7
|
v0.3.5 - 02 Nov 2015
|
2
8
|
---
|
3
9
|
Updated the keys used when persisting processes and tasks in Redis, so they fall in the same key space.
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
GIT
|
2
2
|
remote: git://github.com/mperham/sidekiq.git
|
3
|
-
revision:
|
3
|
+
revision: 8cac86b47d294044bc7a277e4dd0b44faf34f624
|
4
4
|
specs:
|
5
5
|
sidekiq (4.0.0.pre2)
|
6
|
-
concurrent-ruby (
|
6
|
+
concurrent-ruby (~> 1.0.0.pre5)
|
7
7
|
connection_pool (~> 2.2, >= 2.2.0)
|
8
8
|
json (~> 1.0)
|
9
9
|
redis (~> 3.2, >= 3.2.1)
|
@@ -12,7 +12,7 @@ GIT
|
|
12
12
|
PATH
|
13
13
|
remote: .
|
14
14
|
specs:
|
15
|
-
taskinator (0.3.
|
15
|
+
taskinator (0.3.6)
|
16
16
|
builder (>= 3.2.2)
|
17
17
|
connection_pool (>= 2.2.0)
|
18
18
|
json (>= 1.8.2)
|
@@ -30,13 +30,11 @@ GEM
|
|
30
30
|
thread_safe (~> 0.3, >= 0.3.4)
|
31
31
|
tzinfo (~> 1.1)
|
32
32
|
builder (3.2.2)
|
33
|
-
byebug (
|
34
|
-
columnize (= 0.9.0)
|
33
|
+
byebug (8.1.0)
|
35
34
|
coderay (1.1.0)
|
36
|
-
|
37
|
-
concurrent-ruby (1.0.0.pre4)
|
35
|
+
concurrent-ruby (1.0.0.pre5)
|
38
36
|
connection_pool (2.2.0)
|
39
|
-
coveralls (0.8.
|
37
|
+
coveralls (0.8.5)
|
40
38
|
json (~> 1.8)
|
41
39
|
rest-client (>= 1.6.8, < 2)
|
42
40
|
simplecov (~> 0.10.0)
|
@@ -62,8 +60,8 @@ GEM
|
|
62
60
|
coderay (~> 1.1.0)
|
63
61
|
method_source (~> 0.8.1)
|
64
62
|
slop (~> 3.4)
|
65
|
-
pry-byebug (3.
|
66
|
-
byebug (~>
|
63
|
+
pry-byebug (3.3.0)
|
64
|
+
byebug (~> 8.0)
|
67
65
|
pry (~> 0.10)
|
68
66
|
rack (1.6.4)
|
69
67
|
rack-protection (1.5.3)
|
@@ -120,7 +118,7 @@ GEM
|
|
120
118
|
thor (0.19.1)
|
121
119
|
thread_safe (0.3.5)
|
122
120
|
tilt (2.0.1)
|
123
|
-
tins (1.
|
121
|
+
tins (1.7.0)
|
124
122
|
tzinfo (1.2.2)
|
125
123
|
thread_safe (~> 0.1)
|
126
124
|
unf (0.1.4)
|
@@ -57,17 +57,16 @@ module Taskinator
|
|
57
57
|
|
58
58
|
return OpenStruct.new(
|
59
59
|
{
|
60
|
-
:type => self.class,
|
60
|
+
:type => self.class.name,
|
61
61
|
:process_uuid => process_uuid,
|
62
|
-
:process_options => process_options,
|
62
|
+
:process_options => process_options.dup,
|
63
63
|
:uuid => uuid,
|
64
|
-
:options => options,
|
64
|
+
:options => options.dup,
|
65
65
|
:state => state,
|
66
66
|
:percentage_failed => (tasks_count > 0) ? (failed_count.to_i / tasks_count) * 100.0 : 0.0,
|
67
67
|
:percentage_cancelled => (tasks_count > 0) ? (cancelled_count.to_i / tasks_count) * 100.0 : 0.0,
|
68
68
|
:percentage_processing => (tasks_count > 0) ? (processing_count.to_i / tasks_count) * 100.0 : 0.0,
|
69
69
|
:percentage_completed => (tasks_count > 0) ? (completed_count.to_i / tasks_count) * 100.0 : 0.0,
|
70
|
-
:instance => self
|
71
70
|
}.merge(additional)
|
72
71
|
).freeze
|
73
72
|
|
@@ -194,28 +194,23 @@ module Taskinator
|
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
|
-
|
198
|
-
Taskinator.redis do |conn|
|
199
|
-
|
200
|
-
process_key = self.process_key
|
197
|
+
EXPIRE_IN = 10 * 60 # 10 minutes
|
201
198
|
|
202
|
-
|
203
|
-
|
204
|
-
conn.del(key)
|
205
|
-
end
|
199
|
+
def cleanup(expire_at=Time.now+EXPIRE_IN)
|
200
|
+
Taskinator.redis do |conn|
|
206
201
|
|
207
|
-
#
|
208
|
-
conn.
|
202
|
+
# use the "clean up" visitor
|
203
|
+
RedisCleanupVisitor.new(conn, self, expire_at).visit
|
209
204
|
|
210
205
|
# remove from the list
|
211
|
-
conn.srem
|
206
|
+
conn.srem(Persistence.processes_list_key(scope), uuid)
|
212
207
|
|
213
208
|
end
|
214
209
|
end
|
215
210
|
|
216
211
|
end
|
217
212
|
|
218
|
-
class RedisSerializationVisitor < Visitor::Base
|
213
|
+
class RedisSerializationVisitor < Taskinator::Visitor::Base
|
219
214
|
|
220
215
|
#
|
221
216
|
# the redis connection is passed in since it is
|
@@ -454,6 +449,36 @@ module Taskinator
|
|
454
449
|
end
|
455
450
|
end
|
456
451
|
|
452
|
+
class RedisCleanupVisitor < Taskinator::Visitor::Base
|
453
|
+
|
454
|
+
attr_reader :instance
|
455
|
+
attr_reader :expire_at
|
456
|
+
|
457
|
+
def initialize(conn, instance, expire_at)
|
458
|
+
@conn = conn
|
459
|
+
@instance = instance
|
460
|
+
@expire_at = expire_at.utc
|
461
|
+
@key = instance.key
|
462
|
+
end
|
463
|
+
|
464
|
+
def visit
|
465
|
+
@instance.accept(self)
|
466
|
+
@conn.expireat(@key, expire_at.to_i)
|
467
|
+
end
|
468
|
+
|
469
|
+
def visit_process(attribute)
|
470
|
+
process = @instance.send(attribute)
|
471
|
+
RedisCleanupVisitor.new(@conn, process, expire_at).visit if process
|
472
|
+
end
|
473
|
+
|
474
|
+
def visit_tasks(tasks)
|
475
|
+
tasks.each do |task|
|
476
|
+
RedisCleanupVisitor.new(@conn, task, expire_at).visit
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
end
|
481
|
+
|
457
482
|
# lazily loads the object specified by the type and uuid
|
458
483
|
class LazyLoader < Delegator
|
459
484
|
|
data/lib/taskinator/version.rb
CHANGED
@@ -74,7 +74,7 @@ describe Taskinator::Instrumentation, :redis => true do
|
|
74
74
|
|
75
75
|
expect(subject.completed_payload(:baz => :qux)).to eq(
|
76
76
|
OpenStruct.new({
|
77
|
-
:type => subject.class,
|
77
|
+
:type => subject.class.name,
|
78
78
|
:process_uuid => subject.uuid,
|
79
79
|
:process_options => {:foo => :bar},
|
80
80
|
:uuid => subject.uuid,
|
@@ -84,7 +84,6 @@ describe Taskinator::Instrumentation, :redis => true do
|
|
84
84
|
:percentage_completed => 2.0,
|
85
85
|
:percentage_cancelled => 3.0,
|
86
86
|
:percentage_failed => 4.0,
|
87
|
-
:instance => subject,
|
88
87
|
:baz => :qux
|
89
88
|
})
|
90
89
|
)
|
@@ -347,5 +347,65 @@ describe Taskinator::Persistence, :redis => true do
|
|
347
347
|
}
|
348
348
|
end
|
349
349
|
|
350
|
+
describe "#cleanup" do
|
351
|
+
|
352
|
+
[
|
353
|
+
TestFlows::Task,
|
354
|
+
TestFlows::Job,
|
355
|
+
TestFlows::SubProcess,
|
356
|
+
TestFlows::Sequential,
|
357
|
+
TestFlows::Concurrent
|
358
|
+
].each do |definition|
|
359
|
+
|
360
|
+
describe "#{definition.name} expire immediately" do
|
361
|
+
it {
|
362
|
+
process = definition.create_process(1)
|
363
|
+
|
364
|
+
Taskinator.redis do |conn|
|
365
|
+
expect(conn.hget(process.key, :uuid)).to eq(process.uuid)
|
366
|
+
|
367
|
+
process.cleanup(Time.now)
|
368
|
+
|
369
|
+
expect(conn.hget(process.key, :uuid)).to be_nil
|
370
|
+
|
371
|
+
recursively_enumerate_tasks(process.tasks) do |task|
|
372
|
+
expect(conn.hget(task.key, :uuid)).to be_nil
|
373
|
+
end
|
374
|
+
|
375
|
+
end
|
376
|
+
}
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
|
381
|
+
describe "expires in future" do
|
382
|
+
it {
|
383
|
+
process = TestFlows::Task.create_process(1)
|
384
|
+
|
385
|
+
Taskinator.redis do |conn|
|
386
|
+
expect(conn.hget(process.key, :uuid)).to eq(process.uuid)
|
387
|
+
|
388
|
+
process.cleanup(Time.now + 1)
|
389
|
+
|
390
|
+
# still available...
|
391
|
+
expect(conn.hget(process.key, :uuid)).to_not be_nil
|
392
|
+
recursively_enumerate_tasks(process.tasks) do |task|
|
393
|
+
expect(conn.hget(task.key, :uuid)).to_not be_nil
|
394
|
+
end
|
395
|
+
|
396
|
+
sleep 2
|
397
|
+
|
398
|
+
# gone!
|
399
|
+
expect(conn.hget(process.key, :uuid)).to be_nil
|
400
|
+
recursively_enumerate_tasks(process.tasks) do |task|
|
401
|
+
expect(conn.hget(task.key, :uuid)).to be_nil
|
402
|
+
end
|
403
|
+
|
404
|
+
end
|
405
|
+
}
|
406
|
+
end
|
407
|
+
|
408
|
+
end
|
409
|
+
|
350
410
|
end
|
351
411
|
end
|
@@ -422,6 +422,7 @@ describe Taskinator::Process do
|
|
422
422
|
allow_any_instance_of(Taskinator::Task).to receive(:completed?) { true }
|
423
423
|
|
424
424
|
process = Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::First)
|
425
|
+
|
425
426
|
tasks.each {|t| process.tasks << t }
|
426
427
|
|
427
428
|
expect(process).to receive(:complete!).and_call_original
|
@@ -438,6 +439,7 @@ describe Taskinator::Process do
|
|
438
439
|
allow_any_instance_of(Taskinator::Task).to receive(:completed?) { true }
|
439
440
|
|
440
441
|
process = Taskinator::Process.define_concurrent_process_for(definition, Taskinator::CompleteOn::Last)
|
442
|
+
|
441
443
|
tasks.each {|t| process.tasks << t }
|
442
444
|
|
443
445
|
expect(process).to receive(:complete!).and_call_original
|
@@ -360,7 +360,7 @@ describe TestFlows do
|
|
360
360
|
if name =~ /taskinator.task.processing/
|
361
361
|
expect(payload[:percentage_completed]).to eq( (invoke_count / task_count.to_f) * 100.0 )
|
362
362
|
elsif name =~ /taskinator.task.completed/
|
363
|
-
unless payload.type >= Taskinator::Task::SubProcess
|
363
|
+
unless payload.type.constantize >= Taskinator::Task::SubProcess
|
364
364
|
invoke_count += 1
|
365
365
|
expect(payload[:percentage_completed]).to eq( (invoke_count / task_count.to_f) * 100.0 )
|
366
366
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taskinator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Stefano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- spec/taskinator/instrumentation_spec.rb
|
171
171
|
- spec/taskinator/persistence_spec.rb
|
172
172
|
- spec/taskinator/process_spec.rb
|
173
|
+
- spec/taskinator/process_worker_spec.rb
|
173
174
|
- spec/taskinator/queues/delayed_job_spec.rb
|
174
175
|
- spec/taskinator/queues/resque_spec.rb
|
175
176
|
- spec/taskinator/queues/sidekiq_spec.rb
|
@@ -180,6 +181,7 @@ files:
|
|
180
181
|
- spec/taskinator/tasks_spec.rb
|
181
182
|
- spec/taskinator/test_flows_spec.rb
|
182
183
|
- spec/taskinator/visitor_spec.rb
|
184
|
+
- spec/taskinator/xml_visitor_spec.rb
|
183
185
|
- taskinator.gemspec
|
184
186
|
- tasks_workflow.png
|
185
187
|
homepage: https://github.com/virtualstaticvoid/taskinator
|
@@ -235,6 +237,7 @@ test_files:
|
|
235
237
|
- spec/taskinator/instrumentation_spec.rb
|
236
238
|
- spec/taskinator/persistence_spec.rb
|
237
239
|
- spec/taskinator/process_spec.rb
|
240
|
+
- spec/taskinator/process_worker_spec.rb
|
238
241
|
- spec/taskinator/queues/delayed_job_spec.rb
|
239
242
|
- spec/taskinator/queues/resque_spec.rb
|
240
243
|
- spec/taskinator/queues/sidekiq_spec.rb
|
@@ -245,3 +248,4 @@ test_files:
|
|
245
248
|
- spec/taskinator/tasks_spec.rb
|
246
249
|
- spec/taskinator/test_flows_spec.rb
|
247
250
|
- spec/taskinator/visitor_spec.rb
|
251
|
+
- spec/taskinator/xml_visitor_spec.rb
|