progressor 0.1.0 → 0.1.3
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.
- checksums.yaml +4 -4
- data/README.md +23 -0
- data/lib/progressor/iteration.rb +54 -0
- data/lib/progressor/limited_sequence.rb +9 -1
- data/lib/progressor/unlimited_sequence.rb +8 -1
- data/lib/progressor/version.rb +1 -1
- data/lib/progressor.rb +13 -2
- metadata +9 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8b8a4cb127259a4f539935a5c3d33dde51918c5f06e2a6c0bfba817b13a44ab
|
4
|
+
data.tar.gz: 489755d94b178dfc2c98d75b12ee7839a652d47948b09c39fc1e4a8476b9897b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e074b0f2820dbc2a898258f7f89a36fc9a2f1867b13fd134b02cfe432589cb30beb6355facf0d80b0cb36a6deb562c7a36409382a1ab61bcee6aaaa6ec2306de
|
7
|
+
data.tar.gz: c8ebbad12c98156313ef2a16c55ff148f27f54bc1f8a3fa76371e714d4346847db7756e406db07e0a1c9d3acd4a1eb60e5bf8e3bbb090dfead4be93f59884bee
|
data/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
[](https://travis-ci.org/AndrewRadev/progressor)
|
2
|
+
[](https://badge.fury.io/rb/progressor)
|
3
|
+
|
1
4
|
Full documentation for the latest released version can be found at: https://www.rubydoc.info/gems/progressor
|
2
5
|
|
3
6
|
## Basic example
|
@@ -97,6 +100,26 @@ The format is:
|
|
97
100
|
<current>, t: <time from start>, t/i: <time per iteration>
|
98
101
|
```
|
99
102
|
|
103
|
+
## Simpler iteration
|
104
|
+
|
105
|
+
For `ActiveRecord` and other iterable collections, it's possible to skip some boilerplate. For example, you might start from this:
|
106
|
+
|
107
|
+
``` ruby
|
108
|
+
Record.not_processed.find_each do |record|
|
109
|
+
record.process
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
In order to add measurements, you could instantiate a `Progressor` etc like in the above example, or you could do this:
|
114
|
+
|
115
|
+
``` ruby
|
116
|
+
Progressor::Iteration.find_each(Record.not_processed) do |record|
|
117
|
+
record.process
|
118
|
+
end
|
119
|
+
```
|
120
|
+
|
121
|
+
And it'll add some default print statements. Check the API documentation or the code for details.
|
122
|
+
|
100
123
|
## Configuration
|
101
124
|
|
102
125
|
Apart from `total_count`, which is optional and affects the kind of sequence that will be stored, you can provide `min_samples` and `max_samples`. You can also provide a custom formatter:
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Progressor::Iteration
|
2
|
+
# Iterate the given collection, assuming it responds to:
|
3
|
+
#
|
4
|
+
# - The given `method` with a block that yields a single item
|
5
|
+
# - optionally, `count` that returns the number of results
|
6
|
+
#
|
7
|
+
# It yields two items -- the item from the collection and a numeric index. It
|
8
|
+
# prints the progress automatically for each loop.
|
9
|
+
#
|
10
|
+
# This is meant to be used as a convenience method for ActiveRecord
|
11
|
+
# collections with `find_each` or `each`, but it could really be used for
|
12
|
+
# anything that works with this interface.
|
13
|
+
#
|
14
|
+
# Inputs:
|
15
|
+
#
|
16
|
+
# - method: the method name to invoke on `collection`
|
17
|
+
# - collection: the iterable object
|
18
|
+
# - format: the method to use for printing each individual record. Defaults to `:to_s`
|
19
|
+
# - options: passed along to `Progressor::new`
|
20
|
+
#
|
21
|
+
def self.iterate(method, collection, format: :to_s, **options, &block)
|
22
|
+
if !collection.respond_to?(method)
|
23
|
+
raise Progressor::Error.new("Given collection doesn't respond to ##{method}")
|
24
|
+
end
|
25
|
+
|
26
|
+
if collection.respond_to?(:count)
|
27
|
+
progressor = Progressor.new(total_count: collection.count, **options)
|
28
|
+
else
|
29
|
+
progressor = Progressor.new(**options)
|
30
|
+
end
|
31
|
+
|
32
|
+
index = 0
|
33
|
+
|
34
|
+
collection.public_send(method) do |item|
|
35
|
+
progressor.run do |progress|
|
36
|
+
Kernel.puts "[#{progress}] Working on #{item.public_send(format)}"
|
37
|
+
block.call(item, index)
|
38
|
+
index += 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Iterates using `.iterate` and the `#find_each` method
|
44
|
+
#
|
45
|
+
def self.find_each(collection, **options, &block)
|
46
|
+
iterate(:find_each, collection, **options, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Iterates using `.iterate` and the `#each` method
|
50
|
+
#
|
51
|
+
def self.each(collection, **options, &block)
|
52
|
+
iterate(:each, collection, **options, &block)
|
53
|
+
end
|
54
|
+
end
|
@@ -61,7 +61,7 @@ class Progressor
|
|
61
61
|
end
|
62
62
|
|
63
63
|
# Outputs a textual representation of the current state of the
|
64
|
-
#
|
64
|
+
# LimitedSequence. Shows:
|
65
65
|
#
|
66
66
|
# - the current number of iterations and the total count
|
67
67
|
# - completion level in percentage
|
@@ -117,6 +117,14 @@ class Progressor
|
|
117
117
|
remaining_time.round(2)
|
118
118
|
end
|
119
119
|
|
120
|
+
# Returns the time since the object was instantiated, formatted like all
|
121
|
+
# the other durations. Useful for a final message to compare initial
|
122
|
+
# estimation to actual elapsed time.
|
123
|
+
#
|
124
|
+
def elapsed_time
|
125
|
+
format_time(Time.now - @start_time)
|
126
|
+
end
|
127
|
+
|
120
128
|
private
|
121
129
|
|
122
130
|
def average(collection)
|
@@ -71,7 +71,7 @@ class Progressor
|
|
71
71
|
|
72
72
|
[
|
73
73
|
"#{@current + 1}",
|
74
|
-
"t: #{
|
74
|
+
"t: #{elapsed_time}",
|
75
75
|
"t/i: #{format_time(per_iteration)}",
|
76
76
|
].join(', ')
|
77
77
|
end
|
@@ -95,6 +95,13 @@ class Progressor
|
|
95
95
|
# No estimation possible
|
96
96
|
end
|
97
97
|
|
98
|
+
# Returns the time since the object was instantiated, formatted like all
|
99
|
+
# the other durations.
|
100
|
+
#
|
101
|
+
def elapsed_time
|
102
|
+
format_time(Time.now - @start_time)
|
103
|
+
end
|
104
|
+
|
98
105
|
private
|
99
106
|
|
100
107
|
def average(collection)
|
data/lib/progressor/version.rb
CHANGED
data/lib/progressor.rb
CHANGED
@@ -3,6 +3,7 @@ require 'progressor/error'
|
|
3
3
|
require 'progressor/formatting'
|
4
4
|
require 'progressor/limited_sequence'
|
5
5
|
require 'progressor/unlimited_sequence'
|
6
|
+
require 'progressor/iteration'
|
6
7
|
|
7
8
|
require 'benchmark'
|
8
9
|
|
@@ -34,7 +35,7 @@ require 'benchmark'
|
|
34
35
|
# ...
|
35
36
|
#
|
36
37
|
class Progressor
|
37
|
-
|
38
|
+
extend Formatting
|
38
39
|
|
39
40
|
# Utility method to print a message with the time it took to run the contents
|
40
41
|
# of the block.
|
@@ -48,8 +49,10 @@ class Progressor
|
|
48
49
|
#
|
49
50
|
def self.puts(message, &block)
|
50
51
|
Kernel.puts "#{message}..."
|
51
|
-
|
52
|
+
result = nil
|
53
|
+
measurement = Benchmark.measure { result = block.call }
|
52
54
|
Kernel.puts "#{message} DONE: #{format_time(measurement.real)}"
|
55
|
+
result
|
53
56
|
end
|
54
57
|
|
55
58
|
# Set up a new Progressor instance. Optional parameters:
|
@@ -97,4 +100,12 @@ class Progressor
|
|
97
100
|
def skip(n)
|
98
101
|
@sequence.skip(n)
|
99
102
|
end
|
103
|
+
|
104
|
+
# Returns the time since the sequence was started, formatted like all the
|
105
|
+
# other durations. Useful for a final message to compare initial estimation
|
106
|
+
# to actual elapsed time.
|
107
|
+
#
|
108
|
+
def elapsed_time
|
109
|
+
@sequence.elapsed_time
|
110
|
+
end
|
100
111
|
end
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: progressor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Radev
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.17'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.17'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rake
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: 12.3.3
|
34
20
|
type: :development
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: 12.3.3
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rspec
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,6 +67,7 @@ files:
|
|
81
67
|
- lib/progressor.rb
|
82
68
|
- lib/progressor/error.rb
|
83
69
|
- lib/progressor/formatting.rb
|
70
|
+
- lib/progressor/iteration.rb
|
84
71
|
- lib/progressor/limited_sequence.rb
|
85
72
|
- lib/progressor/unlimited_sequence.rb
|
86
73
|
- lib/progressor/version.rb
|
@@ -88,7 +75,7 @@ homepage: https://github.com/AndrewRadev/progressor
|
|
88
75
|
licenses:
|
89
76
|
- MIT
|
90
77
|
metadata: {}
|
91
|
-
post_install_message:
|
78
|
+
post_install_message:
|
92
79
|
rdoc_options: []
|
93
80
|
require_paths:
|
94
81
|
- lib
|
@@ -103,8 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
90
|
- !ruby/object:Gem::Version
|
104
91
|
version: '0'
|
105
92
|
requirements: []
|
106
|
-
rubygems_version: 3.
|
107
|
-
signing_key:
|
93
|
+
rubygems_version: 3.1.6
|
94
|
+
signing_key:
|
108
95
|
specification_version: 4
|
109
96
|
summary: Measure iterations in a long-running task
|
110
97
|
test_files: []
|