pwrake 0.9.6 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pwrake/file_utils.rb +1 -0
- data/lib/pwrake/locality_aware_queue.rb +5 -2
- data/lib/pwrake/master.rb +7 -1
- data/lib/pwrake/option.rb +34 -14
- data/lib/pwrake/profiler.rb +2 -1
- data/lib/pwrake/report/parallelism.rb +2 -3
- data/lib/pwrake/shell.rb +20 -1
- data/lib/pwrake/task_algorithm.rb +41 -17
- data/lib/pwrake/task_queue.rb +7 -2
- data/lib/pwrake/version.rb +1 -1
- data/pwrake.gemspec +1 -0
- data/spec/pwrake_spec.rb +3 -3
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8936d0357e38b7b50bee817594555714412fb763
|
4
|
+
data.tar.gz: 1aca5697a842735520300b7c8c81355c08b31240
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4204a54c3920365eaaf4b430a0217b7e63cbe19a4878594dbd7c6381d21e8fceb0e8f3a4a31e238ec8b2dbc4b1d2ca95b914199e1e0c973565540db1c740654
|
7
|
+
data.tar.gz: f2c433d66cb1ecd7eb5340394e1b93d13530238b055d481d5b28c16f48f61402d69c1350a02b5389eaab1af39670db4e108346e70e33afdcaf4236909224df73
|
data/lib/pwrake/file_utils.rb
CHANGED
@@ -143,7 +143,9 @@ module Pwrake
|
|
143
143
|
@enable_steal = !Pwrake.application.pwrake_options['DISABLE_STEAL']
|
144
144
|
@steal_wait = (Pwrake.application.pwrake_options['STEAL_WAIT'] || 0).to_i
|
145
145
|
@steal_wait_max = (Pwrake.application.pwrake_options['STEAL_WAIT_MAX'] || 10).to_i
|
146
|
-
|
146
|
+
@steal_wait_after_enq = (Pwrake.application.pwrake_options['STEAL_WAIT_AFTER_ENQ'] || 0.1).to_f
|
147
|
+
@last_enq_time = Time.now
|
148
|
+
Log.info("-- @enable_steal=#{@enable_steal.inspect} @steal_wait=#{@steal_wait} @steal_wait_max=#{@steal_wait_max} @steal_wait_after_enq={@steal_wait_after_enq}")
|
147
149
|
end
|
148
150
|
|
149
151
|
attr_reader :size
|
@@ -166,6 +168,7 @@ module Pwrake
|
|
166
168
|
@q_remote.push(t)
|
167
169
|
end
|
168
170
|
end
|
171
|
+
@last_enq_time = Time.now
|
169
172
|
@size += 1
|
170
173
|
end
|
171
174
|
|
@@ -191,7 +194,7 @@ module Pwrake
|
|
191
194
|
return t
|
192
195
|
end
|
193
196
|
|
194
|
-
if @enable_steal && n > 0
|
197
|
+
if @enable_steal && n > 0 && Time.now-@last_enq_time > @steal_wait_after_enq
|
195
198
|
if t = deq_steal(host)
|
196
199
|
Log.info "-- deq_steal n=#{n} task=#{t.name} host=#{host}"
|
197
200
|
Log.debug "--- deq_impl\n#{inspect_q}"
|
data/lib/pwrake/master.rb
CHANGED
@@ -34,7 +34,6 @@ module Pwrake
|
|
34
34
|
timer = Timer.new("start_worker")
|
35
35
|
@finish_queue = Queue.new
|
36
36
|
@task_queue = @queue_class.new(@core_list)
|
37
|
-
@task_queue.enable_steal = !Rake.application.options.disable_steal
|
38
37
|
@shell_set = []
|
39
38
|
@core_list.each_with_index do |h,i|
|
40
39
|
@shell_set << @shell_class.new(h,@shell_opt)
|
@@ -54,10 +53,15 @@ module Pwrake
|
|
54
53
|
def start_threads
|
55
54
|
Thread.abort_on_exception = true
|
56
55
|
@threads = []
|
56
|
+
t_intvl = Pwrake.application.pwrake_options['THREAD_CREATE_INTERVAL']
|
57
57
|
@shell_set.each do |c|
|
58
|
+
tc0 = Time.now
|
58
59
|
@threads << Thread.new(c) do |conn|
|
59
60
|
Pwrake.current_shell = conn
|
61
|
+
t0 = Time.now
|
60
62
|
conn.start
|
63
|
+
t = Time.now - t0
|
64
|
+
Log.info "-- worker[#{conn.id}] connect to #{conn.host}: %.3f sec" % t
|
61
65
|
begin
|
62
66
|
thread_loop(conn)
|
63
67
|
ensure
|
@@ -65,6 +69,8 @@ module Pwrake
|
|
65
69
|
conn.finish
|
66
70
|
end
|
67
71
|
end
|
72
|
+
t_sleep = t_intvl - (Time.now - tc0)
|
73
|
+
sleep t_sleep if t_sleep > 0
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
data/lib/pwrake/option.rb
CHANGED
@@ -41,6 +41,7 @@ module Pwrake
|
|
41
41
|
'DEBUG',
|
42
42
|
'PLOT_PARALLELISM',
|
43
43
|
'HALT_QUEUE_WHILE_SEARCH',
|
44
|
+
'THREAD_CREATE_INTERVAL',
|
44
45
|
'SHOW_CONF',
|
45
46
|
'FAILED_TARGET', # rename(default), delete, leave
|
46
47
|
'QUEUE_PRIORITY', # DFS(default), FIFO,
|
@@ -77,6 +78,15 @@ module Pwrake
|
|
77
78
|
format_time_pid(v)
|
78
79
|
end
|
79
80
|
}],
|
81
|
+
['GC_PROFILE',
|
82
|
+
proc{|v|
|
83
|
+
if v
|
84
|
+
if v == "" || !v.kind_of?(String)
|
85
|
+
v = "Pwrake%Y%m%d-%H%M%S_%$.gcprof"
|
86
|
+
end
|
87
|
+
format_time_pid(v)
|
88
|
+
end
|
89
|
+
}],
|
80
90
|
['NUM_THREADS', proc{|v| v && v.to_i}],
|
81
91
|
['DISABLE_AFFINITY', proc{|v| v || ENV['AFFINITY']=='off'}],
|
82
92
|
['DISABLE_STEAL', proc{|v| v || ENV['STEAL']=='off'}],
|
@@ -108,6 +118,9 @@ module Pwrake
|
|
108
118
|
YAML.dump(@opts,$stdout)
|
109
119
|
exit
|
110
120
|
end
|
121
|
+
if @opts['GC_PROFILE']
|
122
|
+
GC::Profiler.enable
|
123
|
+
end
|
111
124
|
@counter = Counter.new
|
112
125
|
end
|
113
126
|
|
@@ -142,7 +155,9 @@ module Pwrake
|
|
142
155
|
@yaml = open(@pwrake_conf){|f| YAML.load(f) }
|
143
156
|
end
|
144
157
|
|
145
|
-
@opts = {'PWRAKE_CONF' => @pwrake_conf
|
158
|
+
@opts = {'PWRAKE_CONF' => @pwrake_conf,
|
159
|
+
'THREAD_CREATE_INTERVAL' => 0.006,
|
160
|
+
}
|
146
161
|
|
147
162
|
option_data.each do |a|
|
148
163
|
prc = nil
|
@@ -178,7 +193,6 @@ module Pwrake
|
|
178
193
|
'SILENT',
|
179
194
|
'TRACE',
|
180
195
|
'TRACE_RULES']
|
181
|
-
Rake.verbose(true) if Rake.application.options.trace
|
182
196
|
Rake.verbose(false) if Rake.application.options.silent
|
183
197
|
end
|
184
198
|
|
@@ -260,7 +274,7 @@ module Pwrake
|
|
260
274
|
def init_logger
|
261
275
|
if Rake.application.options.debug
|
262
276
|
Log.level = Log::DEBUG
|
263
|
-
elsif Rake.
|
277
|
+
elsif Rake.application.options.trace
|
264
278
|
Log.level = Log::INFO
|
265
279
|
else
|
266
280
|
Log.level = Log::WARN
|
@@ -272,8 +286,6 @@ module Pwrake
|
|
272
286
|
mkdir_p logdir
|
273
287
|
end
|
274
288
|
Log.open(@logfile)
|
275
|
-
# turn trace option on
|
276
|
-
#Rake.application.options.trace = true
|
277
289
|
else
|
278
290
|
Log.open($stdout)
|
279
291
|
end
|
@@ -303,20 +315,28 @@ module Pwrake
|
|
303
315
|
require "socket"
|
304
316
|
tmplist = []
|
305
317
|
File.open(@hostfile) do |f|
|
318
|
+
re = /\[\[([\w\d]+)-([\w\d]+)\]\]/o
|
306
319
|
while l = f.gets
|
307
320
|
l = $1 if /^([^#]*)#/ =~ l
|
308
321
|
host, ncore, group = l.split
|
309
322
|
if host
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
323
|
+
if re =~ host
|
324
|
+
hosts = ($1..$2).map{|i| host.sub(re,i)}
|
325
|
+
else
|
326
|
+
hosts = [host]
|
327
|
+
end
|
328
|
+
hosts.each do |host|
|
329
|
+
begin
|
330
|
+
host = Socket.gethostbyname(host)[0]
|
331
|
+
rescue
|
332
|
+
Log.info "-- FQDN not resoved : #{host}"
|
333
|
+
end
|
334
|
+
ncore = (ncore || 1).to_i
|
335
|
+
group = (group || 0).to_i
|
336
|
+
tmplist << ([host] * ncore.to_i)
|
337
|
+
@host_group[group] ||= []
|
338
|
+
@host_group[group] << host
|
314
339
|
end
|
315
|
-
ncore = (ncore || 1).to_i
|
316
|
-
group = (group || 0).to_i
|
317
|
-
tmplist << ([host] * ncore.to_i)
|
318
|
-
@host_group[group] ||= []
|
319
|
-
@host_group[group] << host
|
320
340
|
end
|
321
341
|
end
|
322
342
|
end
|
data/lib/pwrake/profiler.rb
CHANGED
@@ -85,7 +85,8 @@ module Pwrake
|
|
85
85
|
t.strftime("%F %T.%L")
|
86
86
|
end
|
87
87
|
|
88
|
-
def profile(task, cmd, start_time, end_time, host="", status=
|
88
|
+
def profile(task, cmd, start_time, end_time, host="", status=nil)
|
89
|
+
status = "" if status.nil?
|
89
90
|
id = @lock.synchronize do
|
90
91
|
id = @id
|
91
92
|
@id += 1
|
@@ -212,7 +212,7 @@ plot '#{fpara}' w l axis x1y1 title 'parallelism', '#{fdens}' w l axis x1y2 titl
|
|
212
212
|
def plot_parallelizm_by_host(csvtable,base)
|
213
213
|
fpng = base+"_para_host.png"
|
214
214
|
data = read_time_by_host_from_csv(csvtable)
|
215
|
-
|
215
|
+
return fpng if data.size == 0
|
216
216
|
|
217
217
|
grid = []
|
218
218
|
hosts = data.keys.sort
|
@@ -249,12 +249,11 @@ set format y ''
|
|
249
249
|
f.printf "\n"
|
250
250
|
end
|
251
251
|
j = grid.size
|
252
|
-
grid
|
252
|
+
grid.last.each do |x|
|
253
253
|
f.printf "%g %g %d\n", j, x[0], x[1]
|
254
254
|
end
|
255
255
|
f.printf "e\n"
|
256
256
|
end
|
257
|
-
#puts "Parallelism by host: "+fpng
|
258
257
|
fpng
|
259
258
|
end
|
260
259
|
|
data/lib/pwrake/shell.rb
CHANGED
@@ -19,6 +19,9 @@ module Pwrake
|
|
19
19
|
@@current_id = 0
|
20
20
|
@@profiler = Profiler.new
|
21
21
|
|
22
|
+
# @@global_lock = Mutex.new
|
23
|
+
# @@last_exec_time = Time.now
|
24
|
+
|
22
25
|
def self.profiler
|
23
26
|
@@profiler
|
24
27
|
end
|
@@ -32,6 +35,7 @@ module Pwrake
|
|
32
35
|
@work_dir = @option[:work_dir] || Dir.pwd
|
33
36
|
@pass_env = @option[:pass_env]
|
34
37
|
@ssh_opt = @option[:ssh_opt]
|
38
|
+
# @ssh_min_exec_interval = Pwrake.application.pwrake_options['SHELL_MIN_EXEC_INTERVAL'].to_f
|
35
39
|
@terminator = ""
|
36
40
|
TLEN.times{ @terminator << CHARS[rand(CHARS.length)] }
|
37
41
|
end
|
@@ -126,8 +130,9 @@ module Pwrake
|
|
126
130
|
raise "@io is closed" if @io.closed?
|
127
131
|
@lock.synchronize do
|
128
132
|
@io.puts(cmd+"\necho '#{@terminator}':$? ")
|
133
|
+
@io.flush
|
129
134
|
status = io_read_loop{}
|
130
|
-
Integer(status) == 0
|
135
|
+
Integer(status||1) == 0
|
131
136
|
end
|
132
137
|
end
|
133
138
|
|
@@ -146,6 +151,20 @@ module Pwrake
|
|
146
151
|
@cmd = cmd
|
147
152
|
raise "@io is closed" if @io.closed?
|
148
153
|
status = nil
|
154
|
+
|
155
|
+
# t0 = Time.now
|
156
|
+
# @@global_lock.synchronize do
|
157
|
+
# t = Time.now - @@last_exec_time
|
158
|
+
# if t < @ssh_min_exec_interval
|
159
|
+
# sleep @ssh_min_exec_interval-t
|
160
|
+
# end
|
161
|
+
# @@last_exec_time = Time.now
|
162
|
+
# end
|
163
|
+
# t = Time.now-t0
|
164
|
+
# #if t>0.001
|
165
|
+
# Log.info "-- locktime %.6f"%t
|
166
|
+
# #end
|
167
|
+
|
149
168
|
start_time = Time.now
|
150
169
|
begin
|
151
170
|
@io.puts @@profiler.command(cmd,@terminator)
|
@@ -28,15 +28,30 @@ module Pwrake
|
|
28
28
|
pw_search_tasks(args)
|
29
29
|
th = nil
|
30
30
|
end
|
31
|
+
Log.info "-- ps:\n"+`ps xwv|egrep 'PID|ruby'`
|
31
32
|
|
32
33
|
if conn = Pwrake.current_shell
|
33
34
|
application.thread_loop(conn,self)
|
34
35
|
else
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
if fname = application.pwrake_options['GC_PROFILE']
|
37
|
+
File.open(fname,"w") do |f|
|
38
|
+
gc_count = 0
|
39
|
+
while true
|
40
|
+
t = application.finish_queue.deq
|
41
|
+
if GC.count > gc_count
|
42
|
+
f.write Log.fmt_time(Time.now)+" "
|
43
|
+
f.write(GC::Profiler.result)
|
44
|
+
GC::Profiler.clear
|
45
|
+
gc_count = GC.count
|
46
|
+
end
|
47
|
+
break if t==self
|
48
|
+
end
|
49
|
+
end
|
50
|
+
else
|
51
|
+
while true
|
52
|
+
t = application.finish_queue.deq
|
53
|
+
break if t==self
|
54
|
+
end
|
40
55
|
end
|
41
56
|
end
|
42
57
|
|
@@ -57,8 +72,6 @@ module Pwrake
|
|
57
72
|
time_start = Time.now
|
58
73
|
if shell = Pwrake.current_shell
|
59
74
|
shell.current_task = self
|
60
|
-
#host = shell.host
|
61
|
-
#log_host(host)
|
62
75
|
end
|
63
76
|
|
64
77
|
@lock.synchronize do
|
@@ -68,29 +81,41 @@ module Pwrake
|
|
68
81
|
pw_execute(@arg_data) if needed?
|
69
82
|
if kind_of?(Rake::FileTask)
|
70
83
|
application.postprocess(self) # <---------
|
71
|
-
|
84
|
+
if File.exist?(name)
|
85
|
+
@file_stat = File::Stat.new(name)
|
86
|
+
end
|
72
87
|
end
|
73
88
|
log_task(time_start)
|
89
|
+
t = Time.now
|
74
90
|
application.finish_queue.enq(self)
|
75
91
|
shell.current_task = nil if shell
|
76
92
|
pw_enq_subsequents # <---------
|
93
|
+
Log.debug "--- pw_invoke (#{name}) postprocess time=#{Time.now-t} sec"
|
77
94
|
end
|
78
95
|
|
79
96
|
def log_task(time_start)
|
80
|
-
return if !application.task_logger
|
81
97
|
time_end = Time.now
|
98
|
+
|
99
|
+
loc = suggest_location()
|
100
|
+
shell = Pwrake.current_shell
|
101
|
+
|
102
|
+
if loc && !loc.empty? && shell && !@actions.empty?
|
103
|
+
Pwrake.application.count( loc, shell.host )
|
104
|
+
end
|
105
|
+
return if !application.task_logger
|
106
|
+
|
82
107
|
row = [ @task_id, name,
|
83
108
|
time_start, time_end, time_end-time_start,
|
84
109
|
@prerequisites.join('|')
|
85
110
|
]
|
86
111
|
|
87
|
-
if loc
|
112
|
+
if loc
|
88
113
|
row << loc.join('|')
|
89
114
|
else
|
90
115
|
row << ''
|
91
116
|
end
|
92
117
|
|
93
|
-
if shell
|
118
|
+
if shell
|
94
119
|
row.concat [shell.host, shell.id]
|
95
120
|
else
|
96
121
|
row.concat ['','']
|
@@ -99,10 +124,6 @@ module Pwrake
|
|
99
124
|
row << ((@actions.empty?) ? 0 : 1)
|
100
125
|
row << ((@executed) ? 1 : 0)
|
101
126
|
|
102
|
-
if loc && !loc.empty? && shell && !@actions.empty?
|
103
|
-
Pwrake.application.count( loc, shell.host )
|
104
|
-
end
|
105
|
-
|
106
127
|
if @file_stat
|
107
128
|
row.concat [@file_stat.size, @file_stat.mtime, self.location.join('|')]
|
108
129
|
else
|
@@ -143,7 +164,7 @@ module Pwrake
|
|
143
164
|
act.call(self)
|
144
165
|
else
|
145
166
|
act.call(self, args)
|
146
|
-
|
167
|
+
end
|
147
168
|
end
|
148
169
|
rescue Exception=>e
|
149
170
|
if kind_of?(Rake::FileTask) && File.exist?(name)
|
@@ -168,12 +189,14 @@ module Pwrake
|
|
168
189
|
|
169
190
|
def pw_enq_subsequents
|
170
191
|
@lock.synchronize do
|
192
|
+
t = Time.now
|
171
193
|
@subsequents.each do |t| # <<--- competition !!!
|
172
194
|
if t && t.check_prereq_finished(self.name)
|
173
195
|
application.task_queue.enq(t)
|
174
196
|
end
|
175
197
|
end
|
176
198
|
@already_finished = true # <<--- competition !!!
|
199
|
+
Log.debug "--- pw_enq_subseq (#{name}) time=#{Time.now-t} sec"
|
177
200
|
end
|
178
201
|
end
|
179
202
|
|
@@ -219,7 +242,8 @@ module Pwrake
|
|
219
242
|
|
220
243
|
# Search all the prerequisites of a task.
|
221
244
|
def search_prerequisites(task_args, invocation_chain) # :nodoc:
|
222
|
-
@unfinished_prereq =
|
245
|
+
@unfinished_prereq = {}
|
246
|
+
@prerequisites.each{|t| @unfinished_prereq[t]=true}
|
223
247
|
prerequisite_tasks.each { |prereq|
|
224
248
|
#prereq_args = task_args.new_scope(prereq.arg_names) # in vain
|
225
249
|
if prereq.search_with_call_chain(self, task_args, invocation_chain)
|
data/lib/pwrake/task_queue.rb
CHANGED
@@ -75,12 +75,13 @@ module Pwrake
|
|
75
75
|
when /dfs/i
|
76
76
|
@array_class = PriorityQueueArray
|
77
77
|
when /fifo/i
|
78
|
-
@array_class = Array
|
78
|
+
@array_class = Array # Fifo
|
79
79
|
when /lifo/i
|
80
80
|
@array_class = LifoQueueArray
|
81
81
|
else
|
82
82
|
raise RuntimeError,"unknown option for QUEUE_PRIORITY"
|
83
83
|
end
|
84
|
+
Log.debug "--- TQ#initialize @array_class=#{@array_class.inspect}"
|
84
85
|
init_queue(*args)
|
85
86
|
end
|
86
87
|
|
@@ -135,6 +136,7 @@ module Pwrake
|
|
135
136
|
# enq
|
136
137
|
def enq(item)
|
137
138
|
Log.debug "--- TQ#enq #{item.name}"
|
139
|
+
t0 = Time.now
|
138
140
|
if @halt
|
139
141
|
enq_body(item)
|
140
142
|
else
|
@@ -147,6 +149,7 @@ module Pwrake
|
|
147
149
|
Log.debug "--- run #{th}";
|
148
150
|
th.run
|
149
151
|
}
|
152
|
+
Log.debug "--- TQ#enq #{item.name} enq_time=#{Time.now-t0}"
|
150
153
|
end
|
151
154
|
|
152
155
|
def enq_body(item)
|
@@ -171,6 +174,7 @@ module Pwrake
|
|
171
174
|
n = 0
|
172
175
|
loop do
|
173
176
|
@mutex.synchronize do
|
177
|
+
t0 = Time.now
|
174
178
|
if @th_end.first == Thread.current
|
175
179
|
@th_end.shift
|
176
180
|
return false
|
@@ -196,7 +200,8 @@ module Pwrake
|
|
196
200
|
|
197
201
|
else
|
198
202
|
if t = deq_impl(hint,n)
|
199
|
-
|
203
|
+
t_inspect = t.inspect[0..1000]
|
204
|
+
Log.debug "--- TQ#deq #{t_inspect} deq_time=#{Time.now-t0}"
|
200
205
|
return t
|
201
206
|
end
|
202
207
|
#@cv.signal([hint])
|
data/lib/pwrake/version.rb
CHANGED
data/pwrake.gemspec
CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.description = %q{Parallel workflow extension for Rake}
|
12
12
|
gem.summary = %q{Adding Parallel and Distributed feature to Rake}
|
13
13
|
gem.homepage = "http://masa16.github.com/pwrake"
|
14
|
+
gem.license = 'MIT'
|
14
15
|
|
15
16
|
gem.files = `git ls-files`.split($/)
|
16
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/spec/pwrake_spec.rb
CHANGED
@@ -51,7 +51,7 @@ describe Helper do
|
|
51
51
|
context "dir=005 --hostfile" do
|
52
52
|
subject { Helper.new("005","-q -F ../hosts").run }
|
53
53
|
it { should be_success }
|
54
|
-
its("output_lines.sort") { should eq Helper.read_hosts($hosts,true).sort }
|
54
|
+
#its("output_lines.sort") { should eq Helper.read_hosts($hosts,true).sort }
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -86,13 +86,13 @@ describe Helper do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
context "dir=011 FAILD_TARGET=delete" do
|
89
|
-
subject { Helper.new("011","FAILED_TARGET=delete").run }
|
89
|
+
subject { Helper.new("011","FAILED_TARGET=delete").clean.run }
|
90
90
|
it { should_not be_success }
|
91
91
|
its(:n_files) { should eq 2 }
|
92
92
|
end
|
93
93
|
|
94
94
|
context "dir=011 FAILD_TARGET=rename" do
|
95
|
-
subject { Helper.new("011","FAILED_TARGET=rename").run }
|
95
|
+
subject { Helper.new("011","FAILED_TARGET=rename").clean.run }
|
96
96
|
it { should_not be_success }
|
97
97
|
its(:n_files) { should eq 3 }
|
98
98
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwrake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masahiro TANAKA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Parallel workflow extension for Rake
|
14
14
|
email:
|
@@ -66,7 +66,8 @@ files:
|
|
66
66
|
- spec/hosts
|
67
67
|
- spec/pwrake_spec.rb
|
68
68
|
homepage: http://masa16.github.com/pwrake
|
69
|
-
licenses:
|
69
|
+
licenses:
|
70
|
+
- MIT
|
70
71
|
metadata: {}
|
71
72
|
post_install_message:
|
72
73
|
rdoc_options: []
|