progressor 0.1.2 → 0.1.3

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
  SHA256:
3
- metadata.gz: 54e39588afa295d9501f32e4a183834d030b536cb902fbc133be2e61d2b97745
4
- data.tar.gz: 5732a7f82cd05f0ced057785595d2d4724264ddef570c69fca086823b76318fd
3
+ metadata.gz: e8b8a4cb127259a4f539935a5c3d33dde51918c5f06e2a6c0bfba817b13a44ab
4
+ data.tar.gz: 489755d94b178dfc2c98d75b12ee7839a652d47948b09c39fc1e4a8476b9897b
5
5
  SHA512:
6
- metadata.gz: e9339fc8632bdd3b0d1c0ab47d5c95d987e6db3f5383f59541511341735c105ebce68a6544eed20a0614f8ee12974d91f9fc65dfe58f4d5e662d96a02746092a
7
- data.tar.gz: 5b58b596f4596bccccb352ec2c8ec6949573ad898677b228fcd43073e8b141d561c397b428d5f16dfe53dd7134e2fdb430f2be51c1a0013a1537e95f98d724ae
6
+ metadata.gz: e074b0f2820dbc2a898258f7f89a36fc9a2f1867b13fd134b02cfe432589cb30beb6355facf0d80b0cb36a6deb562c7a36409382a1ab61bcee6aaaa6ec2306de
7
+ data.tar.gz: c8ebbad12c98156313ef2a16c55ff148f27f54bc1f8a3fa76371e714d4346847db7756e406db07e0a1c9d3acd4a1eb60e5bf8e3bbb090dfead4be93f59884bee
data/README.md CHANGED
@@ -100,6 +100,26 @@ The format is:
100
100
  <current>, t: <time from start>, t/i: <time per iteration>
101
101
  ```
102
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
+
103
123
  ## Configuration
104
124
 
105
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
@@ -1,3 +1,3 @@
1
1
  class Progressor
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
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
 
@@ -99,4 +100,12 @@ class Progressor
99
100
  def skip(n)
100
101
  @sequence.skip(n)
101
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
102
111
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progressor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Radev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-03 00:00:00.000000000 Z
11
+ date: 2022-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -67,6 +67,7 @@ files:
67
67
  - lib/progressor.rb
68
68
  - lib/progressor/error.rb
69
69
  - lib/progressor/formatting.rb
70
+ - lib/progressor/iteration.rb
70
71
  - lib/progressor/limited_sequence.rb
71
72
  - lib/progressor/unlimited_sequence.rb
72
73
  - lib/progressor/version.rb