rbbt-util 5.13.5 → 5.13.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 419096bee8e448dd3c606c3c9770d76f347ede9b
4
- data.tar.gz: 85c4317ea460338198ee814424988f0a12026dd3
3
+ metadata.gz: 4cb8cbb3f115088d3b7a4fbe8fb9aa75cf4f4805
4
+ data.tar.gz: f61c90e38a18f4227f434260c83b6cf2ea48542a
5
5
  SHA512:
6
- metadata.gz: 3b9cb44704148225709dc3ba2e8aaac7b586829849700347d7152e78ecc3bc2d55f73eb44429eb24038495109ea49a65154050a33f427245352de6feee9513c6
7
- data.tar.gz: 9baaffb5b6eacc7781b503969098ff53bbfa4052deb846f2fbc4f592fc69e3932cc6290f39f754fd15a95f083883aaf80c5f8280c70cdcbd172bc4abbadb9101
6
+ metadata.gz: 25ac9c560885c7fb66acee8f693a6276f85f74fcaef12bfcc57c3ec59c3562bd3a1a8e25706dce34374c84f7186acaf9c2e901471e0c6002352182a5ecd7534b
7
+ data.tar.gz: b83ebb5dcdd346679f8a3299fa72ef9dd414590bf5775bcf574639b30be77844dea1bda0a7d6e4b74865992567fae452ed6943fdaaa8be76b503d96d80b37ef9
data/lib/rbbt/persist.rb CHANGED
@@ -396,7 +396,7 @@ module Persist
396
396
 
397
397
  return (persist_options[:repo] || Persist::MEMORY)[persist_options[:file]] ||= yield if type ==:memory and persist_options[:file] and persist_options[:persist] and persist_options[:persist] != :update
398
398
 
399
- if FalseClass == persist_options[:persist]
399
+ if FalseClass === persist_options[:persist]
400
400
  yield
401
401
  else
402
402
  other_options = Misc.process_options persist_options, :other
@@ -1,243 +1,49 @@
1
1
  require 'rbbt/util/log'
2
+ require 'rbbt/util/log/progress/util'
3
+ require 'rbbt/util/log/progress/report'
2
4
  module Log
3
5
  class ProgressBar
4
6
 
5
- attr_accessor :depth, :num_reports, :desc, :io, :severity, :history, :max
6
-
7
- # Creates a new instance. Max is the total number of iterations of the
8
- # loop. The depth represents how many other loops are above this one,
9
- # this information is used to find the place to print the progress
10
- # report.
11
- def initialize(max, options = {})
7
+ attr_accessor :max, :ticks, :frequency, :depth, :desc
8
+ def initialize(max = nil, options = {})
12
9
  options = Misc.add_defaults options, :depth => 0, :num_reports => 100, :desc => "Progress", :io => STDERR, :severity => Log.severity
13
10
  depth, num_reports, desc, io, severity = Misc.process_options options, :depth, :num_reports, :desc, :io, :severity
14
11
 
15
12
  @max = max
16
- @max = 1 if @max and @max < 1
17
- @current = 0
18
- @time = Time.now
19
- @last_report = -1
20
- @num_reports = num_reports
21
- @severity = severity
13
+ @ticks = 0
14
+ @frequency = 2
15
+ @last_time = nil
16
+ @last_count = nil
17
+ @last_percent = nil
22
18
  @depth = depth
23
19
  @desc = desc
24
20
  end
25
21
 
26
- # Used to register a new completed loop iteration.
27
- def tick(step = nil)
28
- return if ENV["RBBT_NO_PROGRESS"] == 'true'
29
-
30
- if step.nil?
31
- @current += 1
32
- else
33
- @current = step
34
- end
35
-
36
- if @max
37
- if percent - @last_report > 1.to_f/@num_reports.to_f
38
- report
39
- @last_report=percent
40
- end
41
- else
42
- if @last_report == -1 or Time.now - @last_report >= 1.0
43
- throughput
44
- end
45
- end
46
-
47
- nil
48
- end
49
-
50
- def progress
51
- @current.to_f/ @max
52
- end
53
-
54
22
  def percent
55
- (self.progress * 100).to_i
56
- end
57
-
58
- def eta
59
- (Time.now - @time)/progress * (1-progress)
60
- end
61
-
62
- def used
63
- (Time.now - @time).to_i
64
- end
65
-
66
-
67
- def up_lines(depth)
68
- "\033[#{depth + 1}F\033[2K"
69
- end
70
-
71
- def down_lines(depth)
72
- "\n\033[#{depth + 2}E"
73
- end
74
-
75
- def report_msg
76
- progress = self.progress
77
- percent = self.percent
78
-
79
- indicator = Log.color(:magenta, @desc) << " "
80
- 10.times{|i|
81
- if i < progress * 10 then
82
- indicator << Log.color(:yellow, ".")
83
- else
84
- indicator << " "
85
- end
86
- }
87
- done = progress == 1
88
-
89
- used = self.used
90
- used = [used/3600, used/60 % 60, used % 60].map{|t| "%02i" % t }.join(':')
91
-
92
- if progress == 1
93
- indicator << Log.color(:green, " done")
94
- indicator << Log.color(:blue, " #{used}")
95
- else
96
- indicator << " #{Log.color(:blue, percent.to_s << "%")}"
97
-
98
- eta = self.eta
99
- eta = [eta/3600, eta/60 % 60, eta % 60].map{|t| "%02i" % t }.join(':')
100
-
101
- indicator << " #{Log.color :yellow, used} used #{Log.color :yellow, eta} left"
102
- end
103
-
23
+ (@ticks * 100) / @max
104
24
  end
105
25
 
106
- def thr
107
- if @last_report == -1
108
- @last_report = Time.now
109
- return thr
110
- end
111
- time = Time.now - @last_report
112
- time = 0.000001 if time == 0
113
- thr = (@current / time).to_i
26
+ def tick
27
+ @ticks += 1
114
28
 
115
- if @history.nil?
116
- @history ||= []
117
- else
118
- @history << thr
119
- @history.shift if @history.length > 10
29
+ time = Time.now
30
+ if @last_time.nil?
31
+ @last_time = time
32
+ @last_count = @ticks
33
+ @start = time
34
+ return
120
35
  end
121
36
 
122
- thr
123
- end
37
+ diff = time - @last_time
38
+ report and return if diff > @frequency
39
+ return unless max
124
40
 
125
- def mean
126
- @mean_max ||= 0
127
- if @history.length > 3
128
- mean = Misc.mean(@history)
129
- @mean_max = mean if mean > @mean_max
130
- end
131
- mean
132
- end
133
-
134
- def throughput_msg
135
- thr = self.thr
136
-
137
- mean = self.mean
138
-
139
- indicator = Log.color(:magenta, @desc)
140
- indicator << " #{ Log.color :blue, thr } per second"
141
-
142
- indicator << " #{ Log.color :yellow, mean.to_i } avg. #{ Log.color :yellow, @mean_max.to_i} max." if mean
143
-
144
- indicator
145
- end
146
-
147
- def msg
148
- @max ? report_msg : throughput_msg
149
- end
150
-
151
- def print(io, str)
152
- LOG_MUTEX.synchronize do
153
- STDERR.print str
154
- Log.logfile.puts str unless Log.logfile.nil?
155
- Log::LAST.replace "progress"
156
- end
157
- end
158
- # Prints de progress report. It backs up as many lines as the meters
159
- # depth. Prints the progress as a line of dots, a percentage, time
160
- # spent, and time left. And then goes moves the cursor back to its
161
- # original line. Everything is printed to stderr.
162
- def report(io = STDERR)
163
- if Log::LAST != "progress"
164
- Log::LAST.replace "progress"
165
- length = Log::ProgressBar.cleanup_bars
166
- length.times{print(io, "\n")}
167
- else
168
- print(io, "\n") if @last_report == -1
169
- end
170
- print(io, up_lines(@depth) << report_msg << down_lines(@depth)) if severity >= Log.severity
171
- @last_report = Time.now if @last_report == -1
172
- end
173
-
174
- def throughput(io = STDERR)
175
- if Log::LAST != "progress"
176
- Log::LAST.replace "progress"
177
- length = Log::ProgressBar.cleanup_bars
178
- length.times{print(io, "\n")}
179
- else
180
- print(io, "\n") if @last_report == -1
181
- end
182
- print(io, up_lines(@depth) << throughput_msg << down_lines(@depth)) if severity >= Log.severity
183
- @last_report = Time.now
184
- @current = 0
185
- end
186
-
187
- def done
188
- if Log::LAST != "progress"
189
- Log::LAST.replace "progress"
190
- length = Log::ProgressBar.cleanup_bars
191
- length.times{print(io, "\n")}
192
- end
193
- print(io, up_lines(@depth) << Log.color(:magenta, @desc) << Log.color(:green, " DONE") << down_lines(@depth)) if severity >= Log.severity
194
- end
195
-
196
- BAR_MUTEX = Mutex.new
197
- BARS = []
198
- REMOVE = []
199
- def self.new_bar(max, options = {})
200
- cleanup_bars
201
- BAR_MUTEX.synchronize do
202
- options = Misc.add_defaults options, :depth => BARS.length
203
- BARS << (bar = ProgressBar.new(max, options))
204
- bar
205
- end
206
- end
207
-
208
- def self.cleanup_bars
209
- BAR_MUTEX.synchronize do
210
- REMOVE.each do |bar|
211
- index = BARS.index bar
212
- if index
213
- BARS.delete_at index
214
- BARS.each_with_index do |bar,i|
215
- bar.depth = i
216
- end
217
- end
218
- end
219
- REMOVE.clear
220
- BARS.length
221
- end
222
- end
223
-
224
- def self.remove_bar(bar)
225
- bar.done unless bar.max or ENV["RBBT_NO_PROGRESS"] == 'true'
226
- BAR_MUTEX.synchronize do
227
- REMOVE << bar
228
- end
229
- end
230
-
231
- def self.with_bar(max, options = {})
232
- bar = new_bar(max, options)
233
- begin
234
- yield bar
235
- keep = false
236
- rescue KeepBar
237
- keep = true
238
- ensure
239
- remove_bar(bar) if bar
41
+ percent = self.percent
42
+ if @last_percent.nil?
43
+ @last_percent = percent
44
+ return
240
45
  end
46
+ report and return if percent > @last_percent and diff > 0.3
241
47
  end
242
48
  end
243
49
  end
@@ -0,0 +1,108 @@
1
+ module Log
2
+ class ProgressBar
3
+ def up_lines(depth)
4
+ "\033[#{depth + 1}F\033[2K"
5
+ end
6
+
7
+ def down_lines(depth)
8
+ "\n\033[#{depth + 2}E"
9
+ end
10
+
11
+ def print(io, str)
12
+ LOG_MUTEX.synchronize do
13
+ STDERR.print str
14
+ Log.logfile.puts str unless Log.logfile.nil?
15
+ Log::LAST.replace "progress"
16
+ end
17
+ end
18
+
19
+ attr_accessor :history, :mean_max
20
+ def thr
21
+ count = @ticks - @last_count
22
+ seconds = Time.now - @last_time
23
+ thr = count / seconds
24
+ end
25
+
26
+ def thr_msg
27
+ thr = self.thr
28
+ if @history.nil?
29
+ @history ||= []
30
+ else
31
+ @history << thr
32
+ @history.shift if @history.length > 10
33
+ end
34
+
35
+ @mean_max ||= 0
36
+ if @history.length > 3
37
+ mean = Misc.mean(@history)
38
+ @mean_max = mean if mean > @mean_max
39
+ end
40
+
41
+ str = "#{ Log.color :blue, thr.to_i.to_s } per sec."
42
+ str << " #{ Log.color :yellow, mean.to_i.to_s } avg. #{Log.color :yellow, @mean_max.to_i.to_s} max." if @mean_max > 0
43
+ str
44
+ end
45
+
46
+ def eta_msg
47
+ percent = self.percent
48
+ time = Time.now
49
+
50
+ indicator = ""
51
+ 10.times{|i|
52
+ if i < percent / 10 then
53
+ indicator << Log.color(:yellow, ".")
54
+ else
55
+ indicator << " "
56
+ end
57
+ }
58
+
59
+ indicator << " #{Log.color(:blue, percent.to_s << "%")}"
60
+
61
+ used = time - @start
62
+ if @mean_max and @mean_max > 0
63
+ eta = (@max - @ticks) / @mean_max
64
+ else
65
+ eta = (@max - @ticks) / (@ticks/used)
66
+ end
67
+
68
+ used = [used/3600, used/60 % 60, used % 60].map{|t| "%02i" % t }.join(':')
69
+ eta = [eta/3600, eta/60 % 60, eta % 60].map{|t| "%02i" % t }.join(':')
70
+
71
+ indicator << " #{Log.color :yellow, used} used #{Log.color :yellow, eta} left"
72
+
73
+ indicator
74
+ end
75
+
76
+ def report_msg
77
+ str = Log.color :magenta, desc
78
+ return str << " " << Log.color(:yellow, "waiting") if @ticks == 0
79
+ str << " " << thr_msg
80
+ str << Log.color(:blue, " -- ") << eta_msg if max
81
+ str
82
+ end
83
+
84
+ def report(io = STDERR)
85
+ if Log::LAST != "progress"
86
+ length = Log::ProgressBar.cleanup_bars
87
+ print(io, Log.color(:yellow, "--Progress\n"))
88
+ bars = BARS
89
+ bars.sort_by{|b| b.depth }.reverse.each do |bar|
90
+ print(io, Log.color(:yellow ,bar.report_msg) << "\n")
91
+ end
92
+ end
93
+ print(io, up_lines(@depth) << report_msg << down_lines(@depth))
94
+ @last_time = Time.now
95
+ @last_count = ticks
96
+ @last_percent = percent if max
97
+ end
98
+
99
+ def done(io = STDERR)
100
+ done_msg = Log.color(:magenta, desc) << " " << Log.color(:green, "done")
101
+ done_msg << " " << Log.color(:yellow, (@ticks).to_s) << " in " << Log.color(:blue, (Time.now - @start).to_i.to_s) << " sec."
102
+ @last_count = 0
103
+ @last_time = @start
104
+ done_msg << " (" << thr_msg << ")"
105
+ print(io, up_lines(@depth) << done_msg << down_lines(@depth))
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,53 @@
1
+ module Log
2
+ class ProgressBar
3
+ BAR_MUTEX = Mutex.new
4
+ BARS = []
5
+ REMOVE = []
6
+
7
+ def self.new_bar(max, options = {})
8
+ cleanup_bars
9
+ BAR_MUTEX.synchronize do
10
+ Log::LAST.replace "new_bar" if Log::LAST == "progress"
11
+ options = Misc.add_defaults options, :depth => BARS.length
12
+ BARS << (bar = ProgressBar.new(max, options))
13
+ bar
14
+ end
15
+ end
16
+
17
+ def self.cleanup_bars
18
+ BAR_MUTEX.synchronize do
19
+ REMOVE.each do |bar|
20
+ index = BARS.index bar
21
+ if index
22
+ BARS.delete_at index
23
+ BARS.each_with_index do |bar,i|
24
+ bar.depth = i
25
+ end
26
+ end
27
+ end
28
+ REMOVE.clear
29
+ BARS.length
30
+ end
31
+ end
32
+
33
+ def self.remove_bar(bar)
34
+ bar.done
35
+ BAR_MUTEX.synchronize do
36
+ REMOVE << bar
37
+ end
38
+ end
39
+
40
+ def self.with_bar(max, options = {})
41
+ bar = new_bar(max, options)
42
+ begin
43
+ yield bar
44
+ keep = false
45
+ rescue KeepBar
46
+ keep = true
47
+ ensure
48
+ remove_bar(bar) if bar
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -85,6 +85,20 @@ class Step
85
85
  end
86
86
  end
87
87
 
88
+ def merge_info(hash)
89
+ return nil if @exec or info_file.nil?
90
+ value = Annotated.purge value if defined? Annotated
91
+ lock_filename = Persist.persistence_path(info_file, {:dir => Step.lock_dir})
92
+ Open.lock(info_file, :refresh => false) do
93
+ i = info
94
+ i.merge! hash
95
+ @info_cache = i
96
+ Open.write(info_file, INFO_SERIALIAZER.dump(i))
97
+ @info_cache_time = Time.now
98
+ value
99
+ end
100
+ end
101
+
88
102
  def status
89
103
  info[:status]
90
104
  end
@@ -185,11 +185,14 @@ class Step
185
185
 
186
186
  Open.rm info_file if Open.exists? info_file
187
187
 
188
- set_info :pid, Process.pid
189
- set_info :issued, Time.now
188
+ log :setup, "#{Log.color :green, "Task"} #{Log.color :yellow, task.name.to_s || ""}"
190
189
 
191
- log(:preparing, "Preparing job: #{Misc.fingerprint dependencies}")
192
- set_info :dependencies, dependencies.collect{|dep| [dep.task_name, dep.name]}
190
+ merge_info({
191
+ :pid => Process.pid,
192
+ :issued => Time.now,
193
+ :name => name,
194
+ :dependencies => dependencies.collect{|dep| [dep.task_name, dep.name, dep.path]},
195
+ })
193
196
 
194
197
  dup_inputs
195
198
  begin
@@ -391,13 +394,12 @@ class Step
391
394
  def abort
392
395
  return if @aborted
393
396
  @aborted = true
394
- return if error?
395
397
  return if done?
396
398
  Log.medium{"#{Log.color :red, "Aborting"} #{Log.color :blue, path}"}
397
399
  begin
400
+ stop_dependencies
398
401
  abort_stream
399
402
  abort_pid
400
- stop_dependencies
401
403
  rescue Aborted
402
404
  Log.medium{"#{Log.color :red, "Aborting ABORTED RETRY"} #{Log.color :blue, path}"}
403
405
  retry
@@ -427,11 +429,9 @@ class Step
427
429
  if stream
428
430
  begin
429
431
  Misc.consume_stream stream
430
- stream.join if stream.respond_to? :join
431
432
  rescue Exception
432
433
  self.abort
433
434
  raise $!
434
- #stream.abort if stream.respond_to? :abort
435
435
  end
436
436
  end
437
437
  end
@@ -8,8 +8,12 @@ cmd, *rest = ARGV
8
8
  aliases ||= Rbbt.etc.cmd_alias.exists? ? Rbbt.etc.cmd_alias.yaml : {}
9
9
 
10
10
  if cmd.nil?
11
- require 'pp'
12
- pp aliases
11
+ aliases.each do |name, parts|
12
+ parts = parts.collect{|p|
13
+ p =~ /^[\w:_\/-]*$/ ? p : "'" << p << "'"
14
+ }
15
+ puts [Log.color(:magenta, name), parts * " "] * ": "
16
+ end
13
17
  exit 0
14
18
  end
15
19
 
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rbbt/workflow'
4
+
5
+ require 'rbbt-util'
6
+ require 'fileutils'
7
+ require 'rbbt/util/simpleopt'
8
+ require 'rbbt/workflow/step'
9
+ require 'rbbt/util/misc'
10
+
11
+ file = ARGV.shift
12
+
13
+ $seen = []
14
+ def get_step(file)
15
+ file = file.sub(/\.(info|files)/,'')
16
+ $seen << file
17
+ Step.new file
18
+ end
19
+
20
+ def status_msg(status)
21
+ color = case status
22
+ when :error, :aborted, :missing
23
+ :red
24
+ when :streaming
25
+ :yellow
26
+ when :done
27
+ :green
28
+ else
29
+ nil
30
+ end
31
+ Log.color(color, status)
32
+ end
33
+
34
+ def report_msg(status, name, path)
35
+
36
+ parts = path.sub(/#{Regexp.quote(name)}$/,'').split "/"
37
+
38
+ task = Log.color(:yellow, parts.pop)
39
+ workflow = Log.color(:magenta, parts.pop)
40
+
41
+ status_msg(status) << " " << [workflow, task, path] * " " << "\n"
42
+ end
43
+
44
+ def report(step, offset = 0)
45
+ info = step.info || {}
46
+ path = step.path
47
+ status = info[:status] || :missing
48
+ name = info[:name] || File.basename(path)
49
+ str = " " * offset
50
+ str << report_msg(status, name, path)
51
+ info[:dependencies].each do |task,name,path|
52
+ new = ! $seen.include?(path)
53
+ dep = get_step path
54
+ if new
55
+ str << report(dep, offset + 1)
56
+ else
57
+ str << Log.color(:blue, Log.uncolor(report(dep, offset+1)))
58
+ end
59
+ end if info[:dependencies]
60
+ str
61
+ end
62
+
63
+ step = get_step file
64
+
65
+ puts report(step).strip
@@ -56,21 +56,31 @@ def print(file, offset = 1)
56
56
  dependencies = info[:dependencies] || []
57
57
  color = case
58
58
  when (not info)
59
- Log::SEVERITY_COLOR[3]
59
+ nil
60
60
  when info[:status] == :error
61
- Log::SEVERITY_COLOR[3]
61
+ :red
62
62
  when info[:status] == :aborted
63
- Log::SEVERITY_COLOR[2]
63
+ :red
64
64
  when (info[:status] != :done and info[:pid] and not running? info)
65
- Log::SEVERITY_COLOR[2]
65
+ :green
66
66
  end
67
67
 
68
- puts (" " * offset * 2) << job_str(step.path, step.info, color)
68
+ puts (" " * offset * 2) << Log.color(color, step.path)
69
69
  $done << file
70
70
  root = File.dirname(File.dirname(file))
71
+ main_parts = step.path.split "/"
71
72
  dependencies.each do |task,new_file|
72
73
  new_file = File.join(root, task.to_s, new_file)
73
- print(new_file, offset+1)
74
+ parts = new_file.split "/"
75
+ common ||= begin
76
+ i = 0
77
+ parts.each do |p|
78
+ break unless main_parts[i] == p
79
+ i += 1
80
+ end
81
+ i
82
+ end
83
+ print(new_file[common-1..-1], offset+1)
74
84
  end
75
85
  end
76
86
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.13.5
4
+ version: 5.13.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-06 00:00:00.000000000 Z
11
+ date: 2014-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -175,6 +175,8 @@ files:
175
175
  - lib/rbbt/util/filecache.rb
176
176
  - lib/rbbt/util/log.rb
177
177
  - lib/rbbt/util/log/progress.rb
178
+ - lib/rbbt/util/log/progress/report.rb
179
+ - lib/rbbt/util/log/progress/util.rb
178
180
  - lib/rbbt/util/misc.rb
179
181
  - lib/rbbt/util/misc/concurrent_stream.rb
180
182
  - lib/rbbt/util/misc/development.rb
@@ -257,6 +259,7 @@ files:
257
259
  - share/rbbt_commands/workflow/jobs
258
260
  - share/rbbt_commands/workflow/list
259
261
  - share/rbbt_commands/workflow/monitor
262
+ - share/rbbt_commands/workflow/prov
260
263
  - share/rbbt_commands/workflow/provenance
261
264
  - share/rbbt_commands/workflow/remote/add
262
265
  - share/rbbt_commands/workflow/remote/list