rake 0.9.2.2 → 0.9.4

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 (50) hide show
  1. data/CHANGES +4 -0
  2. data/README.rdoc +10 -20
  3. data/Rakefile +6 -1
  4. data/TODO +1 -0
  5. data/bin/rake +4 -0
  6. data/doc/command_line_usage.rdoc +61 -12
  7. data/doc/release_notes/rake-0.9.2.2.rdoc +55 -0
  8. data/doc/release_notes/rake-0.9.3.rdoc +102 -0
  9. data/install.rb +1 -1
  10. data/lib/rake/application.rb +245 -140
  11. data/lib/rake/backtrace.rb +18 -0
  12. data/lib/rake/clean.rb +1 -1
  13. data/lib/rake/cloneable.rb +7 -16
  14. data/lib/rake/contrib/ftptools.rb +2 -1
  15. data/lib/rake/contrib/sys.rb +7 -6
  16. data/lib/rake/dsl_definition.rb +13 -7
  17. data/lib/rake/ext/module.rb +1 -1
  18. data/lib/rake/ext/string.rb +2 -1
  19. data/lib/rake/ext/time.rb +2 -1
  20. data/lib/rake/file_list.rb +9 -2
  21. data/lib/rake/file_utils_ext.rb +4 -3
  22. data/lib/rake/multi_task.rb +2 -5
  23. data/lib/rake/phony.rb +15 -0
  24. data/lib/rake/private_reader.rb +20 -0
  25. data/lib/rake/promise.rb +99 -0
  26. data/lib/rake/rake_module.rb +8 -0
  27. data/lib/rake/rdoctask.rb +1 -1
  28. data/lib/rake/runtest.rb +2 -1
  29. data/lib/rake/task.rb +29 -7
  30. data/lib/rake/task_arguments.rb +1 -1
  31. data/lib/rake/task_manager.rb +1 -1
  32. data/lib/rake/testtask.rb +8 -1
  33. data/lib/rake/thread_history_display.rb +48 -0
  34. data/lib/rake/thread_pool.rb +155 -0
  35. data/lib/rake/version.rb +6 -4
  36. data/lib/rake.rb +1 -0
  37. data/test/helper.rb +57 -0
  38. data/test/test_private_reader.rb +42 -0
  39. data/test/test_rake_application.rb +12 -1
  40. data/test/test_rake_application_options.rb +114 -4
  41. data/test/test_rake_backtrace.rb +81 -0
  42. data/test/test_rake_directory_task.rb +16 -5
  43. data/test/test_rake_file_task.rb +21 -1
  44. data/test/test_rake_functional.rb +40 -1
  45. data/test/test_rake_multi_task.rb +8 -0
  46. data/test/test_rake_reduce_compat.rb +65 -0
  47. data/test/test_rake_task.rb +50 -1
  48. data/test/test_rake_thread_pool.rb +123 -0
  49. data/test/test_thread_history_display.rb +91 -0
  50. metadata +50 -34
@@ -104,10 +104,12 @@ class TestRakeTask < Rake::TestCase
104
104
  end
105
105
 
106
106
  def test_clear
107
+ desc "a task"
107
108
  t = task("t" => "a") { }
108
109
  t.clear
109
110
  assert t.prerequisites.empty?, "prerequisites should be empty"
110
111
  assert t.actions.empty?, "actions should be empty"
112
+ assert_nil t.comment, "comments should be empty"
111
113
  end
112
114
 
113
115
  def test_clear_prerequisites
@@ -123,6 +125,22 @@ class TestRakeTask < Rake::TestCase
123
125
  assert t.actions.empty?, "actions should be empty"
124
126
  end
125
127
 
128
+ def test_clear_comments
129
+ desc "the original foo"
130
+ task :foo => [:x] do
131
+ # Dummy action
132
+ end
133
+
134
+ task(:foo).clear_comments
135
+
136
+ desc "a slightly different foo"
137
+ task :foo
138
+
139
+ assert_equal "a slightly different foo", task(:foo).comment
140
+ assert_equal ["x"], task(:foo).prerequisites
141
+ assert_equal 1, task(:foo).actions.size
142
+ end
143
+
126
144
  def test_find
127
145
  task :tfind
128
146
  assert_equal "tfind", Task[:tfind].name
@@ -223,6 +241,38 @@ class TestRakeTask < Rake::TestCase
223
241
  assert_in_delta now + 10, a.timestamp, 0.1, 'computer too slow?'
224
242
  end
225
243
 
244
+ def test_always_multitask
245
+ mx = Mutex.new
246
+ result = []
247
+
248
+ t_a = task(:a) do |t|
249
+ sleep 0.02
250
+ mx.synchronize{ result << t.name }
251
+ end
252
+
253
+ t_b = task(:b) do |t|
254
+ mx.synchronize{ result << t.name }
255
+ end
256
+
257
+ t_c = task(:c => [:a,:b]) do |t|
258
+ mx.synchronize{ result << t.name }
259
+ end
260
+
261
+ t_c.invoke
262
+
263
+ # task should always run in order
264
+ assert_equal ['a', 'b', 'c'], result
265
+
266
+ [t_a, t_b, t_c].each { |t| t.reenable }
267
+ result.clear
268
+
269
+ Rake.application.options.always_multitask = true
270
+ t_c.invoke
271
+
272
+ # with multitask, task 'b' should grab the mutex first
273
+ assert_equal ['b', 'a', 'c'], result
274
+ end
275
+
226
276
  def test_investigation_output
227
277
  t1 = task(:t1 => [:t2, :t3]) { |t| runlist << t.name; 3321 }
228
278
  task(:t2)
@@ -264,4 +314,3 @@ class TestRakeTask < Rake::TestCase
264
314
  assert_equal "HI", t.comment
265
315
  end
266
316
  end
267
-
@@ -0,0 +1,123 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+ require 'rake/thread_pool'
3
+ require 'test/unit/assertions'
4
+
5
+ class TestRakeTestThreadPool < Rake::TestCase
6
+ include Rake
7
+
8
+ def test_pool_executes_in_current_thread_for_zero_threads
9
+ pool = ThreadPool.new(0)
10
+ f = pool.future{Thread.current}
11
+ pool.join
12
+ assert_equal Thread.current, f.value
13
+ end
14
+
15
+ def test_pool_executes_in_other_thread_for_pool_of_size_one
16
+ pool = ThreadPool.new(1)
17
+ f = pool.future{Thread.current}
18
+ pool.join
19
+ refute_equal Thread.current, f.value
20
+ end
21
+
22
+ def test_pool_executes_in_two_other_threads_for_pool_of_size_two
23
+ pool = ThreadPool.new(2)
24
+ threads = 2.times.collect{ pool.future{ sleep 0.1; Thread.current } }.each{|f|f.value}
25
+
26
+ refute_equal threads[0], threads[1]
27
+ refute_equal Thread.current, threads[0]
28
+ refute_equal Thread.current, threads[1]
29
+ end
30
+
31
+ def test_pool_creates_the_correct_number_of_threads
32
+ pool = ThreadPool.new(2)
33
+ threads = Set.new
34
+ t_mutex = Mutex.new
35
+ 10.times.each do
36
+ pool.future do
37
+ sleep 0.02
38
+ t_mutex.synchronize{ threads << Thread.current }
39
+ end
40
+ end
41
+ pool.join
42
+ assert_equal 2, threads.count
43
+ end
44
+
45
+ def test_pool_future_captures_arguments
46
+ pool = ThreadPool.new(2)
47
+ a = 'a'
48
+ b = 'b'
49
+ c = 5 # 5 throws an execption with 5.dup. It should be ignored
50
+ pool.future(a,c){ |a_var,ignore| a_var.capitalize!; b.capitalize! }
51
+ pool.join
52
+ assert_equal 'a', a
53
+ assert_equal 'b'.capitalize, b
54
+ end
55
+
56
+ def test_pool_join_empties_queue
57
+ pool = ThreadPool.new(2)
58
+ repeat = 25
59
+ repeat.times {
60
+ pool.future do
61
+ repeat.times {
62
+ pool.future do
63
+ repeat.times {
64
+ pool.future do end
65
+ }
66
+ end
67
+ }
68
+ end
69
+ }
70
+
71
+ pool.join
72
+ assert_equal true, pool.__send__(:__queue__).empty?, "queue should be empty"
73
+ end
74
+
75
+ # test that throwing an exception way down in the blocks propagates
76
+ # to the top
77
+ def test_exceptions
78
+ pool = ThreadPool.new(10)
79
+
80
+ deep_exception_block = lambda do |count|
81
+ next raise Exception.new if ( count < 1 )
82
+ pool.future(count-1, &deep_exception_block).value
83
+ end
84
+
85
+ assert_raises(Exception) do
86
+ pool.future(2, &deep_exception_block).value
87
+ end
88
+
89
+ end
90
+
91
+ def test_pool_prevents_deadlock
92
+ pool = ThreadPool.new(5)
93
+
94
+ common_dependency_a = pool.future { sleep 0.2 }
95
+ futures_a = 10.times.collect { pool.future{ common_dependency_a.value; sleep(rand() * 0.01) } }
96
+
97
+ common_dependency_b = pool.future { futures_a.each { |f| f.value } }
98
+ futures_b = 10.times.collect { pool.future{ common_dependency_b.value; sleep(rand() * 0.01) } }
99
+
100
+ futures_b.each{|f|f.value}
101
+ pool.join
102
+ end
103
+
104
+ def test_pool_reports_correct_results
105
+ pool = ThreadPool.new(7)
106
+
107
+ a = 18
108
+ b = 5
109
+ c = 3
110
+
111
+ result = a.times.collect do
112
+ pool.future do
113
+ b.times.collect do
114
+ pool.future { sleep rand * 0.001; c }
115
+ end.inject(0) { |m,f| m+f.value }
116
+ end
117
+ end.inject(0) { |m,f| m+f.value }
118
+
119
+ assert_equal( (a*b*c), result )
120
+ pool.join
121
+ end
122
+
123
+ end
@@ -0,0 +1,91 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ require 'rake/thread_history_display'
4
+
5
+ class TestThreadHistoryDisplay < Rake::TestCase
6
+ def setup
7
+ super
8
+ @time = 1000000
9
+ @stats = []
10
+ @display = Rake::ThreadHistoryDisplay.new(@stats)
11
+ end
12
+
13
+ def test_banner
14
+ out, _ = capture_io do
15
+ @display.show
16
+ end
17
+ assert_match(/Job History/i, out)
18
+ end
19
+
20
+ def test_item_queued
21
+ @stats << event(:item_queued, :item_id => 123)
22
+ out, _ = capture_io do
23
+ @display.show
24
+ end
25
+ assert_match(/^ *1000000 +A +item_queued +item_id:1$/, out)
26
+ end
27
+
28
+ def test_item_dequeued
29
+ @stats << event(:item_dequeued, :item_id => 123)
30
+ out, _ = capture_io do
31
+ @display.show
32
+ end
33
+ assert_match(/^ *1000000 +A +item_dequeued +item_id:1$/, out)
34
+ end
35
+
36
+ def test_multiple_items
37
+ @stats << event(:item_queued, :item_id => 123)
38
+ @stats << event(:item_queued, :item_id => 124)
39
+ out, _ = capture_io do
40
+ @display.show
41
+ end
42
+ assert_match(/^ *1000000 +A +item_queued +item_id:1$/, out)
43
+ assert_match(/^ *1000001 +A +item_queued +item_id:2$/, out)
44
+ end
45
+
46
+ def test_waiting
47
+ @stats << event(:waiting, :item_id => 123)
48
+ out, _ = capture_io do
49
+ @display.show
50
+ end
51
+ assert_match(/^ *1000000 +A +waiting +item_id:1$/, out)
52
+ end
53
+
54
+ def test_continue
55
+ @stats << event(:continue, :item_id => 123)
56
+ out, _ = capture_io do
57
+ @display.show
58
+ end
59
+ assert_match(/^ *1000000 +A +continue +item_id:1$/, out)
60
+ end
61
+
62
+ def test_thread_deleted
63
+ @stats << event(:thread_deleted, :deleted_thread => 123456, :thread_count => 12)
64
+ out, _ = capture_io do
65
+ @display.show
66
+ end
67
+ assert_match(/^ *1000000 +A +thread_deleted( +deleted_thread:B| +thread_count:12){2}$/, out)
68
+ end
69
+
70
+ def test_thread_created
71
+ @stats << event(:thread_created, :new_thread => 123456, :thread_count => 13)
72
+ out, _ = capture_io do
73
+ @display.show
74
+ end
75
+ assert_match(/^ *1000000 +A +thread_created( +new_thread:B| +thread_count:13){2}$/, out)
76
+ end
77
+
78
+ private
79
+
80
+ def event(type, data={})
81
+ result = {
82
+ :event => type,
83
+ :time => @time / 1_000_000.0,
84
+ :data => data,
85
+ :thread => Thread.current.object_id
86
+ }
87
+ @time += 1
88
+ result
89
+ end
90
+
91
+ end
metadata CHANGED
@@ -1,35 +1,39 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rake
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.4
4
5
  prerelease:
5
- version: 0.9.2.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Jim Weirich
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-10-22 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-11-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: minitest
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "2.1"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.1'
24
22
  type: :development
25
- version_requirements: *id001
26
- description: Rake is a Make-like program implemented in Ruby. Tasks and dependencies arespecified in standard Ruby syntax.
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.1'
30
+ description: Rake is a Make-like program implemented in Ruby. Tasks and dependencies
31
+ arespecified in standard Ruby syntax.
27
32
  email: jim@weirichhouse.org
28
- executables:
33
+ executables:
29
34
  - rake
30
35
  extensions: []
31
-
32
- extra_rdoc_files:
36
+ extra_rdoc_files:
33
37
  - README.rdoc
34
38
  - MIT-LICENSE
35
39
  - TODO
@@ -58,18 +62,21 @@ extra_rdoc_files:
58
62
  - doc/release_notes/rake-0.8.7.rdoc
59
63
  - doc/release_notes/rake-0.9.0.rdoc
60
64
  - doc/release_notes/rake-0.9.1.rdoc
65
+ - doc/release_notes/rake-0.9.2.2.rdoc
61
66
  - doc/release_notes/rake-0.9.2.rdoc
62
- files:
67
+ - doc/release_notes/rake-0.9.3.rdoc
68
+ files:
63
69
  - .gemtest
64
70
  - install.rb
65
71
  - CHANGES
66
72
  - MIT-LICENSE
67
- - Rakefile
68
73
  - README.rdoc
74
+ - Rakefile
69
75
  - TODO
70
76
  - bin/rake
71
77
  - lib/rake/alt_system.rb
72
78
  - lib/rake/application.rb
79
+ - lib/rake/backtrace.rb
73
80
  - lib/rake/classic_namespace.rb
74
81
  - lib/rake/clean.rb
75
82
  - lib/rake/cloneable.rb
@@ -99,6 +106,9 @@ files:
99
106
  - lib/rake/name_space.rb
100
107
  - lib/rake/packagetask.rb
101
108
  - lib/rake/pathmap.rb
109
+ - lib/rake/phony.rb
110
+ - lib/rake/private_reader.rb
111
+ - lib/rake/promise.rb
102
112
  - lib/rake/pseudo_status.rb
103
113
  - lib/rake/rake_module.rb
104
114
  - lib/rake/rake_test_loader.rb
@@ -112,14 +122,18 @@ files:
112
122
  - lib/rake/task_manager.rb
113
123
  - lib/rake/tasklib.rb
114
124
  - lib/rake/testtask.rb
125
+ - lib/rake/thread_history_display.rb
126
+ - lib/rake/thread_pool.rb
115
127
  - lib/rake/version.rb
116
128
  - lib/rake/win32.rb
117
129
  - lib/rake.rb
118
130
  - test/file_creation.rb
119
131
  - test/helper.rb
132
+ - test/test_private_reader.rb
120
133
  - test/test_rake.rb
121
134
  - test/test_rake_application.rb
122
135
  - test/test_rake_application_options.rb
136
+ - test/test_rake_backtrace.rb
123
137
  - test/test_rake_clean.rb
124
138
  - test/test_rake_definitions.rb
125
139
  - test/test_rake_directory_task.rb
@@ -144,6 +158,7 @@ files:
144
158
  - test/test_rake_pseudo_status.rb
145
159
  - test/test_rake_rake_test_loader.rb
146
160
  - test/test_rake_rdoc_task.rb
161
+ - test/test_rake_reduce_compat.rb
147
162
  - test/test_rake_require.rb
148
163
  - test/test_rake_rules.rb
149
164
  - test/test_rake_task.rb
@@ -154,9 +169,11 @@ files:
154
169
  - test/test_rake_task_manager_argument_resolution.rb
155
170
  - test/test_rake_task_with_arguments.rb
156
171
  - test/test_rake_test_task.rb
172
+ - test/test_rake_thread_pool.rb
157
173
  - test/test_rake_top_level_functions.rb
158
174
  - test/test_rake_win32.rb
159
175
  - test/test_sys.rb
176
+ - test/test_thread_history_display.rb
160
177
  - doc/command_line_usage.rdoc
161
178
  - doc/example/a.c
162
179
  - doc/example/b.c
@@ -188,38 +205,37 @@ files:
188
205
  - doc/release_notes/rake-0.8.7.rdoc
189
206
  - doc/release_notes/rake-0.9.0.rdoc
190
207
  - doc/release_notes/rake-0.9.1.rdoc
208
+ - doc/release_notes/rake-0.9.2.2.rdoc
191
209
  - doc/release_notes/rake-0.9.2.rdoc
210
+ - doc/release_notes/rake-0.9.3.rdoc
192
211
  homepage: http://rake.rubyforge.org
193
212
  licenses: []
194
-
195
213
  post_install_message:
196
- rdoc_options:
214
+ rdoc_options:
197
215
  - --line-numbers
198
216
  - --show-hash
199
217
  - --main
200
218
  - README.rdoc
201
219
  - --title
202
220
  - Rake -- Ruby Make
203
- require_paths:
221
+ require_paths:
204
222
  - lib
205
- required_ruby_version: !ruby/object:Gem::Requirement
223
+ required_ruby_version: !ruby/object:Gem::Requirement
206
224
  none: false
207
- requirements:
208
- - - ">="
209
- - !ruby/object:Gem::Version
225
+ requirements:
226
+ - - ! '>='
227
+ - !ruby/object:Gem::Version
210
228
  version: 1.8.6
211
- required_rubygems_version: !ruby/object:Gem::Requirement
229
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
230
  none: false
213
- requirements:
214
- - - ">="
215
- - !ruby/object:Gem::Version
231
+ requirements:
232
+ - - ! '>='
233
+ - !ruby/object:Gem::Version
216
234
  version: 1.3.2
217
235
  requirements: []
218
-
219
236
  rubyforge_project: rake
220
- rubygems_version: 1.8.11
237
+ rubygems_version: 1.8.24
221
238
  signing_key:
222
239
  specification_version: 3
223
240
  summary: Ruby based make-like utility.
224
241
  test_files: []
225
-