
Streakable is a Ruby gem to track consecutive day streaks :calendar: on your Rails/ActiveRecord models. Hard fork of has_streak by Garrett Martin with a different include interface and more features. Requires Ruby >= 2.1 and ActiveRecord >= 3.2.22.
Installation
Add this line to your application’s Gemfile:
gem 'streakable'
And then execute:
$ bundle
Or install it directly with:
$ gem install streakable
Usage
Let’s say I have a User that has_many posts:
class User < ActiveRecord::Base
has_many :posts
end
I want to track how many days in a row that each user wrote a post. I just have to include streakable in the model:
class User < ActiveRecord::Base
include Streakable
end
Now I can display the user’s streak:
user.streak(:posts) # => number of days in a row that this user wrote a post (as determined by the created_at column, by default)
The streak instance method can be called with any association:
user.streak(:other_association)
And you can change the column the streak is calculated on:
user.streak(:posts, :updated_at)
Don’t penalize the current day being absent when determining streaks (the User could write another Post before the day ends):
user.streak(:posts, except_today: true)
Find the longest streak, not just the current one:
user.streak(:posts, longest: true)
To get all of the streaks, not just the current one:
user.streaks(:posts)
TODO
- Add class methods/scopes for calculating streaks on records not in memory
Specs
To run the specs for the currently running Ruby version, run bundle install and then bundle exec rspec. To run specs for every supported version of ActionPack, run bundle exec appraisal install and then bundle exec appraisal rspec.
Gem release
Make sure the specs pass, bump the version number in streakable.gemspec, build the gem with gem build streakable.gemspec. Commit your changes and push to Github, then tag the commit with the current release number using Github’s Releases interface (use the format vx.x.x, where x is the semantic version number). You can pull the latest tags to your local repo with git pull --tags. Finally, push the gem with gem push streakable-version-number-here.gem.
Contributing
- Fork it
- Create your feature branch (
git checkout -b feature/my-new-feature) or bugfix branch (git checkout -b bugfix/my-helpful-bugfix) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin feature/my-new-feature) - Make sure specs are passing (
bundle exec rspec) - Create new Pull Request
License
See the LICENSE file.