progress 1.1.1 → 1.1.2
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.
- data/README.rdoc +18 -6
- data/VERSION +1 -1
- data/lib/progress.rb +77 -78
- data/lib/progress/active_record.rb +2 -0
- data/lib/progress/enumerable.rb +8 -8
- data/lib/progress/integer.rb +2 -3
- data/progress.gemspec +2 -2
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -65,18 +65,26 @@ or just
|
|
65
65
|
Note - you will get WRONG progress if you use something like this:
|
66
66
|
|
67
67
|
10.times_with_progress('A') do |time|
|
68
|
-
10.times_with_progress('B')
|
69
|
-
|
68
|
+
10.times_with_progress('B') do
|
69
|
+
# code
|
70
|
+
end
|
71
|
+
10.times_with_progress('C') do
|
72
|
+
# code
|
73
|
+
end
|
70
74
|
end
|
71
75
|
|
72
76
|
But you can use this:
|
73
77
|
|
74
78
|
10.times_with_progress('A') do |time|
|
75
79
|
Progress.step 1, 2 do
|
76
|
-
10.times_with_progress('B')
|
80
|
+
10.times_with_progress('B') do
|
81
|
+
# code
|
82
|
+
end
|
77
83
|
end
|
78
84
|
Progress.step 1, 2 do
|
79
|
-
10.times_with_progress('C')
|
85
|
+
10.times_with_progress('C') do
|
86
|
+
# code
|
87
|
+
end
|
80
88
|
end
|
81
89
|
end
|
82
90
|
|
@@ -84,10 +92,14 @@ Or if you know that B runs 10 times faster than C:
|
|
84
92
|
|
85
93
|
10.times_with_progress('A') do |time|
|
86
94
|
Progress.step 1, 11 do
|
87
|
-
10.times_with_progress('B')
|
95
|
+
10.times_with_progress('B') do
|
96
|
+
# code
|
97
|
+
end
|
88
98
|
end
|
89
99
|
Progress.step 10, 11 do
|
90
|
-
10.times_with_progress('C')
|
100
|
+
10.times_with_progress('C') do
|
101
|
+
# code
|
102
|
+
end
|
91
103
|
end
|
92
104
|
end
|
93
105
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.2
|
data/lib/progress.rb
CHANGED
@@ -1,81 +1,74 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
|
+
# ==== Procedural example
|
4
|
+
# Progress.start('Test', 1000)
|
5
|
+
# 1000.times{ Progress.step }
|
6
|
+
# Progress.stop
|
7
|
+
# ==== Block example
|
8
|
+
# Progress.start('Test', 1000) do
|
9
|
+
# 1000.times{ Progress.step }
|
10
|
+
# end
|
11
|
+
# ==== Step must not always be one
|
12
|
+
# symbols = []
|
13
|
+
# Progress.start('Input 100 symbols', 100) do
|
14
|
+
# while symbols.length < 100
|
15
|
+
# input = gets.scan(/\S/)
|
16
|
+
# symbols += input
|
17
|
+
# Progress.step input.length
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# ==== Enclosed block example
|
21
|
+
# [1, 2, 3].each_with_progress('1 2 3') do |one_of_1_2_3|
|
22
|
+
# 10.times_with_progress('10') do |one_of_10|
|
23
|
+
# sleep(0.001)
|
24
|
+
# end
|
25
|
+
# end
|
3
26
|
class Progress
|
4
27
|
include Singleton
|
5
28
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
29
|
+
attr_accessor :title, :current, :total, :note
|
30
|
+
attr_reader :current_step
|
31
|
+
def initialize(title, total)
|
32
|
+
if title.is_a?(Numeric) && total.nil?
|
33
|
+
title, total = nil, title
|
34
|
+
elsif total.nil?
|
35
|
+
total = 1
|
36
|
+
end
|
37
|
+
@title = title
|
38
|
+
@current = 0.0
|
39
|
+
@total = total == 0.0 ? 1.0 : Float(total)
|
40
|
+
end
|
19
41
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
42
|
+
def step_if_blank
|
43
|
+
if current == 0.0 && total == 1.0
|
44
|
+
self.current = 1.0
|
24
45
|
end
|
46
|
+
end
|
25
47
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
(current + inner) / total
|
48
|
+
def to_f(inner)
|
49
|
+
inner = [inner, 1.0].min
|
50
|
+
if current_step
|
51
|
+
inner *= current_step
|
32
52
|
end
|
53
|
+
(current + inner) / total
|
54
|
+
end
|
33
55
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
56
|
+
def step(steps)
|
57
|
+
@current_step = steps
|
58
|
+
yield
|
59
|
+
ensure
|
60
|
+
@current_step = nil
|
40
61
|
end
|
41
|
-
include InstanceMethods
|
42
62
|
|
43
63
|
class << self
|
44
64
|
# start progress indication
|
45
|
-
# ==== Procedural example
|
46
|
-
# Progress.start('Test', 1000)
|
47
|
-
# 1000.times{ Progress.step }
|
48
|
-
# Progress.stop
|
49
|
-
# ==== Block example
|
50
|
-
# Progress.start('Test', 1000) do
|
51
|
-
# 1000.times{ Progress.step }
|
52
|
-
# end
|
53
|
-
# ==== Step must not always be one
|
54
|
-
# symbols = []
|
55
|
-
# Progress.start('Input 100 symbols', 100) do
|
56
|
-
# while symbols.length < 100
|
57
|
-
# input = gets.scan(/\S/)
|
58
|
-
# symbols += input
|
59
|
-
# Progress.step input.length
|
60
|
-
# end
|
61
|
-
# end
|
62
|
-
# ==== Enclosed block example
|
63
|
-
# [1, 2, 3].each_with_progress('1 2 3') do |one_of_1_2_3|
|
64
|
-
# 10.times_with_progress('10') do |one_of_10|
|
65
|
-
# sleep(0.001)
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
# ==== To output progress as lines (not trying to stay on line)
|
69
|
-
# Progress.lines = true
|
70
|
-
# ==== To force highlight
|
71
|
-
# Progress.highlight = true
|
72
65
|
def start(title = nil, total = nil)
|
73
66
|
if levels.empty?
|
74
67
|
@started_at = Time.now
|
75
68
|
@eta = nil
|
76
69
|
end
|
77
70
|
levels << new(title, total)
|
78
|
-
print_message
|
71
|
+
print_message true
|
79
72
|
if block_given?
|
80
73
|
begin
|
81
74
|
yield
|
@@ -85,6 +78,7 @@ class Progress
|
|
85
78
|
end
|
86
79
|
end
|
87
80
|
|
81
|
+
# step current progress by `num / den`
|
88
82
|
def step(num = 1, den = 1, &block)
|
89
83
|
if levels.last
|
90
84
|
set(levels.last.current + Float(num) / den, &block)
|
@@ -93,6 +87,7 @@ class Progress
|
|
93
87
|
end
|
94
88
|
end
|
95
89
|
|
90
|
+
# set current progress to `value`
|
96
91
|
def set(value, &block)
|
97
92
|
if levels.last
|
98
93
|
ret = if block
|
@@ -109,11 +104,12 @@ class Progress
|
|
109
104
|
end
|
110
105
|
end
|
111
106
|
|
107
|
+
# stop progress
|
112
108
|
def stop
|
113
109
|
if levels.last
|
114
110
|
if levels.last.step_if_blank || levels.length == 1
|
115
|
-
print_message
|
116
|
-
set_title
|
111
|
+
print_message true
|
112
|
+
set_title nil
|
117
113
|
end
|
118
114
|
levels.pop
|
119
115
|
if levels.empty?
|
@@ -122,13 +118,20 @@ class Progress
|
|
122
118
|
end
|
123
119
|
end
|
124
120
|
|
121
|
+
# set note (will be shown after progress message)
|
125
122
|
def note=(s)
|
126
123
|
if levels.last
|
127
124
|
levels.last.note = s
|
128
125
|
end
|
129
126
|
end
|
130
127
|
|
131
|
-
|
128
|
+
# output progress as lines (not trying to stay on line)
|
129
|
+
# Progress.lines = true
|
130
|
+
attr_writer :lines
|
131
|
+
|
132
|
+
# force highlight
|
133
|
+
# Progress.highlight = true
|
134
|
+
attr_writer :highlight
|
132
135
|
|
133
136
|
private
|
134
137
|
|
@@ -187,26 +190,23 @@ class Progress
|
|
187
190
|
|
188
191
|
def set_title(title)
|
189
192
|
if io_tty?
|
190
|
-
io.print
|
193
|
+
io.print "\e]0;#{title}\a"
|
191
194
|
end
|
192
195
|
end
|
193
196
|
|
194
197
|
def print_message(force = false)
|
195
198
|
if force || time_to_print?
|
196
199
|
inner = 0
|
197
|
-
parts = []
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
title = l.title ? "#{l.title}: " : ''
|
205
|
-
highlighted = "\e[1m#{value}\e[0m"
|
200
|
+
parts, parts_cl = [], []
|
201
|
+
levels.reverse.each do |level|
|
202
|
+
inner = current = level.to_f(inner)
|
203
|
+
value = current.zero? ? '......' : "#{'%5.1f' % (current * 100.0)}%"
|
204
|
+
|
205
|
+
title = level.title ? "#{level.title}: " : nil
|
206
206
|
if !highlight? || value == '100.0%'
|
207
207
|
parts << "#{title}#{value}"
|
208
208
|
else
|
209
|
-
parts << "#{title}#{
|
209
|
+
parts << "#{title}\e[1m#{value}\e[0m"
|
210
210
|
end
|
211
211
|
parts_cl << "#{title}#{value}"
|
212
212
|
end
|
@@ -220,14 +220,13 @@ class Progress
|
|
220
220
|
message_cl << " - #{note}"
|
221
221
|
end
|
222
222
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
message << "
|
223
|
+
if lines?
|
224
|
+
io.puts message
|
225
|
+
else
|
226
|
+
io << message << "\e[K\r"
|
227
227
|
end
|
228
228
|
|
229
|
-
|
230
|
-
set_title(message_cl)
|
229
|
+
set_title message_cl
|
231
230
|
end
|
232
231
|
end
|
233
232
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
if defined?(ActiveRecord::Base)
|
2
2
|
module ActiveRecord
|
3
3
|
module BatchesWithProgress
|
4
|
+
# run `find_each` with progress
|
4
5
|
def find_each_with_progress(options = {})
|
5
6
|
Progress.start(name.tableize, count(options)) do
|
6
7
|
find_each do |model|
|
@@ -11,6 +12,7 @@ if defined?(ActiveRecord::Base)
|
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
15
|
+
# run `find_in_batches` with progress
|
14
16
|
def find_in_batches_with_progress(options = {})
|
15
17
|
Progress.start(name.tableize, count(options)) do
|
16
18
|
find_in_batches do |batch|
|
data/lib/progress/enumerable.rb
CHANGED
@@ -2,32 +2,32 @@ require 'enumerator'
|
|
2
2
|
require 'progress/with_progress'
|
3
3
|
|
4
4
|
module Enumerable
|
5
|
-
#
|
6
|
-
#
|
5
|
+
# run any Enumerable method with progress
|
6
|
+
# methods which don't necessarily go through all items (like find, any? or all?) will not show 100%
|
7
7
|
# ==== Example
|
8
8
|
# [1, 2, 3].with_progress('Numbers').each do |number|
|
9
|
-
#
|
9
|
+
# # code
|
10
10
|
# end
|
11
11
|
# [1, 2, 3].with_progress('Numbers').each_cons(2) do |numbers|
|
12
|
-
#
|
12
|
+
# # code
|
13
13
|
# end
|
14
14
|
def with_progress(title = nil)
|
15
15
|
Progress::WithProgress.new(self, title)
|
16
16
|
end
|
17
17
|
|
18
|
-
#
|
18
|
+
# run `each` with progress
|
19
19
|
# ==== Example
|
20
20
|
# [1, 2, 3].each_with_progress('Numbers') do |number|
|
21
|
-
#
|
21
|
+
# # code
|
22
22
|
# end
|
23
23
|
def each_with_progress(title = nil, &block)
|
24
24
|
with_progress(title).each(&block)
|
25
25
|
end
|
26
26
|
|
27
|
-
#
|
27
|
+
# run `each_with_index` with progress
|
28
28
|
# ==== Example
|
29
29
|
# [1, 2, 3].each_with_index_and_progress('Numbers') do |number, index|
|
30
|
-
#
|
30
|
+
# # code
|
31
31
|
# end
|
32
32
|
def each_with_index_and_progress(title = nil, &block)
|
33
33
|
with_progress(title).each_with_index(&block)
|
data/lib/progress/integer.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
class Integer
|
2
|
-
#
|
3
|
-
# ==== Example
|
2
|
+
# run `times` with progress
|
4
3
|
# 100.times_with_progress('Numbers') do |number|
|
5
|
-
#
|
4
|
+
# # code
|
6
5
|
# end
|
7
6
|
def times_with_progress(title = nil)
|
8
7
|
Progress.start(title, self) do
|
data/progress.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{progress}
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Boba Fat"]
|
12
|
-
s.date = %q{2010-12-
|
12
|
+
s.date = %q{2010-12-09}
|
13
13
|
s.extra_rdoc_files = [
|
14
14
|
"README.rdoc"
|
15
15
|
]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: progress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 2
|
10
|
+
version: 1.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Boba Fat
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-09 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|