Skip to content
This repository has been archived by the owner on Jul 1, 2020. It is now read-only.

Adds progress bars to ActiveRecord iteration methods, such as #each

License

Notifications You must be signed in to change notification settings

deseretbook/activerecord_with_progress

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ActiverecordWithProgress

Similar to other gems that provide progress bars for Enumerable, this gem provides a progress bar for ActiveRecord relations. We use it for Rake tasks, migrations, and console commands. Maybe it's useful to you, too.

Installation

Add this line to your application's Gemfile:

gem 'activerecord_with_progress', github: 'deseretbook/activerecord_with_progress'

And then execute:

$ bundle

Usage

Provides _with_progress wrappers (via method_missing) for several common ActiveRecord iteration methods. They should have, but are not guaranteed to have, the same memory usage, computation requirements, and access patterns as the methods they wrap.

SomeModel.all.each_with_progress do |record|
  # Do something with the record
end

SomeModel.all.find_each_with_progress do |record|
  # ...
end

SomeModel.all.each_with_index_and_progress do |record, index|
  # ...
end

SomeModel.where(condition: true).each_with_index_and_progress do |record, index|
  # ...
end

mapped = SomeModel.all.map_with_progress do |record|
  # ...
end

There's an option to catch errors and return them in a second return value:

# Returns the #each return value, and a Hash mapping failed records to exceptions
_, errors = SomeModel.all.each_with_progress(handle_errors: true) do |record|
  raise 'Handled'
end

# Returns the map with nil for errors, and a Hash with exceptions.
mapped, errors = SomeModel.where(some: 'condition').map_with_progress(handle_errors: true) do |record|
  raise 'Nil in the map'
end

The find_in_batches method is a little bit tricker to work with:

# Need to override :total; I would use #find_each_with_progress instead.
query = SomeModel.where(query: 'parameters')
query.find_in_batches_with_progress(batch_size: 5, total: query.count / 5 + !) do |batch| puts batch.size end

You can change the progress bar format from the colorful default. See the docs for ruby-progressbar for format details.

ActiverecordWithProgress.progress_format = 'a ruby-progressbar format string'

Development

After checking out the repo, run bin/setup to install dependencies. You can also run bin/console for an interactive prompt that will allow you to experiment.

To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/deseretbook/activerecord_with_progress.

License

The gem is available as open source under the terms of the MIT License.

This independent gem is not an official part of or endorsed add-on for ActiveRecord.

About

Adds progress bars to ActiveRecord iteration methods, such as #each

Resources

License

Stars

Watchers

Forks

Packages

No packages published