resque_jobs_tree 0.3.4 → 0.4.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.
@@ -5,12 +5,12 @@ class ResourcesSerializerTest < MiniTest::Unit::TestCase
5
5
  def test_serialization_deserialization
6
6
  model = Model.new 42
7
7
  input = [model, :pdf, [1,2]]
8
- serialized_input = ResqueJobsTree::ResourcesSerializer.to_args(input)
9
- result = [['Model', model.id], :pdf, [1,2]]
10
- assert_equal serialized_input, result
11
- deserialized = ResqueJobsTree::ResourcesSerializer.
12
- to_resources(serialized_input)
13
- assert_equal deserialized, [Model.new(42), :pdf, [1,2]]
8
+ serialized_input = ResqueJobsTree::ResourcesSerializer.argumentize(input)
9
+
10
+ assert_equal [['Model', model.id], :pdf, [1,2]], serialized_input
11
+
12
+ assert_equal [Model.new(42), :pdf, [1,2]],
13
+ ResqueJobsTree::ResourcesSerializer.instancize(serialized_input)
14
14
  end
15
15
 
16
16
  end
@@ -0,0 +1,117 @@
1
+ require 'test_helper'
2
+
3
+ class StorageNodeTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ create_tree
7
+ @resources = [1, 2, 3]
8
+ @root = @tree_definition.find(:job1).spawn @resources
9
+ @leaf = @tree_definition.find(:job2).spawn @resources, @root
10
+ end
11
+
12
+ def test_serialize
13
+ assert_equal '["tree1","job2",1,2,3]', @leaf.send(:serialize)
14
+ end
15
+
16
+ def test_storing
17
+ @leaf.store
18
+ assert_parent_key(
19
+ 'ResqueJobsTree:Node:["tree1","job2",1,2,3]' => 'ResqueJobsTree:Node:["tree1","job1",1,2,3]')
20
+ assert_equal ['ResqueJobsTree:Node:["tree1","job2",1,2,3]'], redis.smembers(@root.childs_key)
21
+ @leaf.unstore
22
+ assert_parent_key({})
23
+ assert_equal [], redis.smembers(@root.childs_key)
24
+ end
25
+
26
+ def test_cleanup_for_root
27
+ create_3_nodes
28
+ @spawn1.cleanup
29
+ assert_equal [], redis.keys
30
+ end
31
+
32
+ def test_cleanup_for_leaf
33
+ create_3_nodes
34
+ @spawn3.cleanup
35
+ assert_equal [ 'ResqueJobsTree:Tree:Launched',
36
+ 'ResqueJobsTree:Node:Parents',
37
+ 'ResqueJobsTree:Node:["tree1","job1",1]:childs',
38
+ 'ResqueJobsTree:Node:["tree1","job2"]:childs'], redis.keys
39
+ assert_parent_key( 'ResqueJobsTree:Node:["tree1","job2"]' => 'ResqueJobsTree:Node:["tree1","job1",1]',
40
+ 'ResqueJobsTree:Node:["tree1","job3",2]' => 'ResqueJobsTree:Node:["tree1","job2"]')
41
+ assert_trees_key ['ResqueJobsTree:Tree:["tree1",1]']
42
+ end
43
+
44
+ def test_cleanup_for_not_root_nor_leaf
45
+ create_3_nodes
46
+ @spawn2.cleanup
47
+ assert_equal [ 'ResqueJobsTree:Tree:Launched',
48
+ 'ResqueJobsTree:Node:["tree1","job1",1]:childs'], redis.keys
49
+ assert_parent_key({})
50
+ assert_trees_key ['ResqueJobsTree:Tree:["tree1",1]']
51
+ end
52
+
53
+ def test_parent
54
+ @leaf.store
55
+ @leaf.instance_variable_set :@parent, nil
56
+ assert_equal @root.name, @leaf.parent.name
57
+ assert_equal @root.resources, @leaf.parent.resources
58
+ end
59
+
60
+ def test_only_stored_child
61
+ assert @leaf.only_stored_child?
62
+ @leaf.store
63
+ assert @leaf.only_stored_child?
64
+ resources2 = [4,5,6]
65
+ leaf2 = @tree_definition.find(:job2).spawn resources2, @root
66
+ leaf2.store
67
+ assert !@leaf.only_stored_child?
68
+ end
69
+
70
+ def test_stored_childs
71
+ @leaf.store
72
+ resources2 = [4,5,6]
73
+ leaf2 = @tree_definition.find(:job2).spawn resources2, @root
74
+ leaf2.store
75
+ assert_equal %w(job2 job2), @root.stored_childs.map(&:name)
76
+ assert_equal [[4,5,6],[1,2,3]], @root.stored_childs.map(&:resources)
77
+ end
78
+
79
+ def test_node_info_from_key
80
+ key = %Q{ResqueJobsTree:Node:["tree1","job1",1,2,3]}
81
+ result = ['job1', [1, 2, 3]]
82
+ assert_equal result, @root.send(:node_info_from_key, key)
83
+ end
84
+
85
+ private
86
+
87
+ def assert_parent_key expected
88
+ assert_equal expected, redis.hgetall(ResqueJobsTree::Storage::PARENTS_KEY)
89
+ end
90
+
91
+ def assert_trees_key expected
92
+ assert_equal expected, redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
93
+ end
94
+
95
+ def create_3_nodes
96
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
97
+ root :job1 do
98
+ perform {}
99
+ childs { [[:job2]] }
100
+ node :job2 do
101
+ perform {}
102
+ childs { [[:job3, 1],[:job3, 2]] }
103
+ node :job3 do
104
+ perform {|n|}
105
+ end
106
+ end
107
+ end
108
+ end
109
+ @tree = @tree_definition.spawn [1]
110
+ @spawn1 = @tree_definition.root.spawn [1]
111
+ @spawn2 = @tree_definition.find(:job2).spawn [], @spawn1
112
+ @spawn3 = @tree_definition.find(:job3).spawn [1], @spawn2
113
+ @spawn4 = @tree_definition.find(:job3).spawn [2], @spawn2
114
+ [@tree, @spawn2, @spawn3, @spawn4].each &:store
115
+ end
116
+
117
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class StorageTreeTest < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ create_tree
7
+ @resources = [Model.new(42), 2, 3]
8
+ @tree = @tree_definition.spawn @resources
9
+ end
10
+
11
+ def test_serialize
12
+ assert_equal '["tree1",["Model",42],2,3]', @tree.send(:serialize)
13
+ end
14
+
15
+ def test_key
16
+ assert_equal 'ResqueJobsTree:Tree:["tree1",["Model",42],2,3]', @tree.key
17
+ end
18
+
19
+ def test_storing
20
+ @tree.store
21
+ assert_equal ["ResqueJobsTree:Tree:[\"tree1\",[\"Model\",42],2,3]"],
22
+ redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
23
+ @tree.unstore
24
+ assert_equal [], redis.smembers(ResqueJobsTree::Storage::LAUNCHED_TREES)
25
+ end
26
+
27
+ end
data/test/test_helper.rb CHANGED
@@ -12,8 +12,6 @@ $TESTING = true
12
12
  require 'mock_redis'
13
13
  Resque.redis = MockRedis.new
14
14
 
15
- Resque.inline = true
16
-
17
15
  #
18
16
  # Fixtures
19
17
  #
@@ -36,12 +34,22 @@ class ExpectedException < Exception ; end
36
34
 
37
35
  class MiniTest::Unit::TestCase
38
36
 
37
+ def setup
38
+ Resque.inline = true
39
+ end
40
+
41
+ private
42
+
39
43
  def teardown
40
44
  redis.keys.each{ |key| redis.del key }
41
45
  end
42
46
 
47
+ def redis
48
+ Resque.redis
49
+ end
50
+
43
51
  def create_tree
44
- @tree = ResqueJobsTree::Factory.create :tree1 do
52
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
45
53
  root :job1 do
46
54
  perform do |*args|
47
55
  Resque.redis.rpush 'history', 'tree1 job1'
@@ -62,12 +70,8 @@ class MiniTest::Unit::TestCase
62
70
  end
63
71
  end
64
72
 
65
- def redis
66
- Resque.redis
67
- end
68
-
69
73
  def create_nested_tree
70
- @tree = ResqueJobsTree::Factory.create :tree1 do
74
+ @tree_definition = ResqueJobsTree::Factory.create :tree1 do
71
75
  root :job1 do
72
76
  perform { raise ExpectedException, 'job1' }
73
77
  childs { [ [:job2] ] }
data/test/tree_test.rb CHANGED
@@ -7,130 +7,35 @@ class TreeTest < MiniTest::Unit::TestCase
7
7
  end
8
8
 
9
9
  def test_name
10
- assert_equal @tree.name, 'tree1'
10
+ assert_equal @tree_definition.name, 'tree1'
11
11
  end
12
12
 
13
- def test_jobs
14
- assert_equal @tree.jobs, []
13
+ def test_leaves
14
+ assert_equal @tree_definition.spawn([]).leaves, []
15
15
  end
16
16
 
17
17
  def test_root
18
- assert @tree.root.kind_of? ResqueJobsTree::Node
18
+ assert @tree_definition.root.kind_of? ResqueJobsTree::Definitions::Node
19
19
  end
20
20
 
21
- def test_enqueue
22
- job_args = [:job4, ['Model', 1], 123]
23
- @tree.enqueue *job_args
24
- assert_equal @tree.jobs.first, ['tree1', :job4, ['Model', 1], 123]
21
+ def test_register_a_leaf
22
+ leaf = 'leaf'
23
+ tree = @tree_definition.spawn []
24
+ tree.register_a_leaf leaf
25
+ assert_equal tree.leaves, [leaf]
25
26
  end
26
27
 
27
- def test_find_node_by_name
28
- assert_equal 'job2', @tree.find_node_by_name('job2').name
29
- create_nested_tree
30
- assert_equal 'job4', @tree.find_node_by_name('job4').name
31
- end
32
-
33
- def test_launch
34
- resources = [1, 2, 3]
35
- @tree.launch *resources
36
- history = ['tree1 job2']*3+['tree1 job1']
37
- assert_equal history, redis.lrange('history', 0, -1)
38
- end
39
-
40
- def test_launch_with_no_resources
41
- @tree.launch
28
+ def test_find
29
+ assert_equal 'job2', @tree_definition.find(:job2).name
30
+ tree_definition = create_nested_tree
31
+ assert_equal 'job4', tree_definition.find(:job4).name
42
32
  end
43
33
 
44
34
  def test_should_have_root
45
- assert_raises ResqueJobsTree::TreeInvalid do
35
+ assert_raises ResqueJobsTree::TreeDefinitionInvalid do
46
36
  ResqueJobsTree::Factory.create :tree1 do
47
37
  end
48
38
  end
49
39
  end
50
40
 
51
- def test_on_failure
52
- create_tree_with_on_failure_hook
53
- assert_raises ExpectedException do
54
- @tree.launch
55
- end
56
- end
57
-
58
- def test_tree_with_resource
59
- create_tree_with_resources
60
- @tree.launch Model.new(1)
61
- end
62
-
63
- def test_nested_tree
64
- create_nested_tree
65
- assert_raises RuntimeError do # job4 error !
66
- @tree.launch
67
- end
68
- assert_raises NoMethodError do # job3 error !
69
- Resque.enqueue_to 'tree1', ResqueJobsTree::Job, 'tree1', 'job3'
70
- end
71
- end
72
-
73
- def test_async_tree
74
- tree = ResqueJobsTree::Factory.create :tree1 do
75
- root :job1 do
76
- perform { raise 'should not arrive here' }
77
- childs { [ [:job2], [:job3] ] }
78
- node :job2, async: true do
79
- perform {}
80
- end
81
- node :job3 do
82
- perform {}
83
- end
84
- end
85
- end
86
- tree.launch
87
- assert_equal ["ResqueJobsTree:Node:[\"tree1\",\"job2\"]"],
88
- Resque.redis.smembers("ResqueJobsTree:Node:[\"tree1\",\"job1\"]:childs")
89
- parents_hash = { 'ResqueJobsTree:Node:["tree1","job2"]'=>'ResqueJobsTree:Node:["tree1","job1"]' }
90
- assert_equal parents_hash, Resque.redis.hgetall(ResqueJobsTree::Storage::PARENTS_KEY)
91
- end
92
-
93
- def test_async_tree_with_fail
94
- tree = ResqueJobsTree::Factory.create :tree1 do
95
- root :job1 do
96
- perform { raise 'should not arrive here' }
97
- childs { [ [:job2], [:job3] ] }
98
- node :job2, async: true do
99
- perform {}
100
- end
101
- node :job3, continue_on_failure: true do
102
- perform { raise ExpectedException, 'an expected failure' }
103
- end
104
- end
105
- end
106
- assert_raises ExpectedException do
107
- tree.launch
108
- end
109
- assert_equal ["ResqueJobsTree:Node:[\"tree1\",\"job2\"]"],
110
- Resque.redis.smembers("ResqueJobsTree:Node:[\"tree1\",\"job1\"]:childs")
111
- end
112
-
113
- private
114
-
115
- def create_tree_with_on_failure_hook
116
- @tree = ResqueJobsTree::Factory.create :tree1 do
117
- root :job1 do
118
- perform { raise ExpectedException, 'job1' }
119
- end
120
- on_failure do
121
- raise ExpectedException, 'called from on_failure block'
122
- end
123
- end
124
- end
125
-
126
- def create_tree_with_resources
127
- @tree = ResqueJobsTree::Factory.create :tree1 do
128
- root :job1 do
129
- perform do |resources|
130
- raise 'unknown resource' unless resources.first.kind_of?(Model)
131
- end
132
- end
133
- end
134
- end
135
-
136
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque_jobs_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-11 00:00:00.000000000 Z
12
+ date: 2013-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -105,19 +105,26 @@ files:
105
105
  - README.md
106
106
  - Rakefile
107
107
  - lib/resque_jobs_tree.rb
108
+ - lib/resque_jobs_tree/definitions.rb
109
+ - lib/resque_jobs_tree/definitions/node.rb
110
+ - lib/resque_jobs_tree/definitions/tree.rb
108
111
  - lib/resque_jobs_tree/factory.rb
109
112
  - lib/resque_jobs_tree/job.rb
110
113
  - lib/resque_jobs_tree/node.rb
111
114
  - lib/resque_jobs_tree/resources_serializer.rb
112
115
  - lib/resque_jobs_tree/storage.rb
116
+ - lib/resque_jobs_tree/storage/node.rb
117
+ - lib/resque_jobs_tree/storage/tree.rb
113
118
  - lib/resque_jobs_tree/tree.rb
114
119
  - lib/resque_jobs_tree/version.rb
115
120
  - resque_jobs_tree.gemspec
121
+ - test/definitions_test.rb
116
122
  - test/factory_test.rb
117
123
  - test/job_test.rb
118
- - test/node_test.rb
124
+ - test/process_test.rb
119
125
  - test/resources_serializer_test.rb
120
- - test/storage_test.rb
126
+ - test/storage_node_test.rb
127
+ - test/storage_tree_test.rb
121
128
  - test/test_helper.rb
122
129
  - test/tree_test.rb
123
130
  homepage: ''
@@ -146,11 +153,13 @@ signing_key:
146
153
  specification_version: 3
147
154
  summary: Organise Resque jobs as a tree.
148
155
  test_files:
156
+ - test/definitions_test.rb
149
157
  - test/factory_test.rb
150
158
  - test/job_test.rb
151
- - test/node_test.rb
159
+ - test/process_test.rb
152
160
  - test/resources_serializer_test.rb
153
- - test/storage_test.rb
161
+ - test/storage_node_test.rb
162
+ - test/storage_tree_test.rb
154
163
  - test/test_helper.rb
155
164
  - test/tree_test.rb
156
165
  has_rdoc:
data/test/node_test.rb DELETED
@@ -1,188 +0,0 @@
1
- require 'test_helper'
2
-
3
- class NodeTest < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- @tree = ResqueJobsTree::Tree.new :tree1
7
- @root = ResqueJobsTree::Node.new :node1, @tree
8
- @leaf = ResqueJobsTree::Node.new :node2, @tree, @root
9
- end
10
-
11
- def test_ressources
12
- variable = 1
13
- @root.resources do |n|
14
- variable = n
15
- end
16
- @root.resources.call 2
17
- assert_equal variable, 2
18
- end
19
-
20
- def test_perform
21
- variable = 1
22
- @root.perform do |n|
23
- variable = n
24
- end
25
- @root.perform.call 2
26
- assert_equal variable, 2
27
- end
28
-
29
- def test_childs
30
- variable = 1
31
- @leaf.childs do |n|
32
- variable = n
33
- end
34
- @leaf.childs.call 2
35
- assert_equal variable, 2
36
- end
37
-
38
- def test_node
39
- node3 = @root.node :node3
40
- assert_equal @root.find_node_by_name('node3').object_id, node3.object_id
41
- end
42
-
43
- def test_leaf
44
- resources = []
45
- assert @leaf.leaf?(resources)
46
- @root.childs do |resources|
47
- [:node2, resources]
48
- end
49
- assert !@root.leaf?(resources)
50
- end
51
-
52
- def test_root
53
- assert @root.root?
54
- assert !@leaf.root?
55
- end
56
-
57
- def test_siblings
58
- node3 = ResqueJobsTree::Node.new :node3, @tree, @root
59
- assert @leaf.siblings, [node3]
60
- end
61
-
62
- def test_launch
63
- resources = [1, 2, 3]
64
- @leaf.launch resources, resources
65
- assert_equal @tree.jobs.first, ['tree1', 'node2', 1, 2, 3]
66
- end
67
-
68
- def test_childs_validation
69
- assert_raises ResqueJobsTree::NodeInvalid do
70
- ResqueJobsTree::Factory.create :tree1 do
71
- root :job1 do
72
- perform {}
73
- childs {}
74
- end
75
- end
76
- end
77
- ResqueJobsTree::Factory.create :tree1 do
78
- root :job1 do
79
- perform {}
80
- end
81
- end
82
- end
83
-
84
- def test_perform_validation
85
- assert_raises ResqueJobsTree::NodeInvalid do
86
- ResqueJobsTree::Factory.create :tree1 do
87
- root :job1 do
88
- end
89
- end
90
- end
91
- end
92
-
93
- def test_perform_validation
94
- assert_raises ResqueJobsTree::NodeInvalid do
95
- ResqueJobsTree::Factory.create :tree1 do
96
- root :job1 do
97
- perform {}
98
- childs {}
99
- node :job2 do
100
- perform {}
101
- end
102
- node :job2 do
103
- perform {}
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
- def test_options
111
- create_async_tree
112
- options = { async: true }
113
- assert_equal options, @tree.find_node_by_name(:job2).options
114
- end
115
-
116
- def test_launch_async
117
- create_async_tree
118
- resources = [1, 2, 3]
119
- @tree.launch resources
120
- assert @tree.jobs.empty?
121
- end
122
-
123
- def test_launch_continue_on_failure
124
- tree = ResqueJobsTree::Factory.create :tree1 do
125
- root :job1 do
126
- perform { raise ExpectedException, 'an expected failure' }
127
- childs { [:job2] }
128
- node :job2, continue_on_failure: true do
129
- perform { raise 'an expected failure' }
130
- end
131
- end
132
- end
133
- resources = [1, 2, 3]
134
- assert_raises ExpectedException do
135
- tree.launch resources
136
- end
137
- assert_equal [], Resque.keys
138
- end
139
-
140
- def test_leaf_failure
141
- tree = ResqueJobsTree::Factory.create :tree1 do
142
- root :job1 do
143
- perform {}
144
- childs { [:job2] }
145
- node :job2 do
146
- perform { raise ExpectedException, 'an expected exception'}
147
- end
148
- end
149
- end
150
- resources = [1, 2, 3]
151
- assert_raises ExpectedException do
152
- tree.launch *resources
153
- end
154
- assert_equal [], Resque.keys
155
- end
156
-
157
- def test_root_failure
158
- tree = ResqueJobsTree::Factory.create :tree1 do
159
- root :job1 do
160
- perform { raise ExpectedException, 'an expected exception' }
161
- childs { [:job2] }
162
- node :job2 do
163
- perform {}
164
- end
165
- end
166
- end
167
- resources = [1, 2, 3]
168
- assert_raises ExpectedException do
169
- tree.launch resources
170
- end
171
- assert_equal [], Resque.keys
172
- end
173
-
174
- private
175
-
176
- def create_async_tree
177
- @tree = ResqueJobsTree::Factory.create :tree1 do
178
- root :job1 do
179
- perform { raise 'should not arrive here' }
180
- childs { [:job2] }
181
- node :job2, async: true do
182
- perform {}
183
- end
184
- end
185
- end
186
- end
187
-
188
- end