DRG
A suite of rake tasks to help you test and manage your project.
The drg:pin
suite provides enhanced dependency management with Bundler. You can pin Gem versions to the current or the next
available minor, major or patch level version.
The drg:spec
task generates RSpec scaffolding for existing code. This helps bootstrap your tests and guide you in what
[I think] you should be testing.
Requirements
- Bundler 1.10+
Installation
Add this line to your application's Gemfile:
gem 'drg'
Tasks
rake drg:spec
rake drg:pin
rake drg:pin:major
rake drg:pin:minor
rake drg:pin:patch
rake drg:pin:latest
rake drg:pin:patch_latest
rake drg:pin:minor_latest
rake drg:unpin
drg:spec
Generates RSpec scaffolding for existing code. Pass a file or directory and DRG will generate spec files for each:
rake drg:spec[app/controllers]
rake drg:spec[app/models/user.rb]
This task looks at your code's methods and breaks down their conditions into RSpec context
s. For example:
Given this file:
# app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
if user.admin?
can :manage, :all
else
can :read, :all
can :update, User do |u|
u.id == user.id
end
end
end
end
It will generate this spec:
require "spec_helper"
describe Ability do
let(:user) {}
subject { described_class.new user }
describe "#initialize" do
context "when user.luna?" do
before {}
end
context "unless user.luna?" do
before {}
end
end
end
drg:pin
DRG really wants to help you manage your project's gems. But DRG doesn't want to replace Bundler. Instead, we want to build on
it. Pinning ignores gems that are fetched from somewhere other than rubygems. For example, gems listed with :git
, :github
,
or :path
will be ignored. You can "pin" all your versions to the current version listed in the Gemfile.lock:
rake drg:pin
This task will update your Gemfile with the gem's full version. It'll change:
gem 'rails'
gem 'byebug', require: false
gem 'therubyracer', '~> 0.12', platforms: :ruby
gem 'drg' # need this
to:
gem 'rails', '4.2.3'
gem 'byebug', '5.0.0', require: false
gem 'therubyracer', '0.12.2', platforms: :ruby
gem 'drg', '0.4.1' # need this
drg:pin:minor
Want to pin gems at their minor version?
rake drg:pin:minor
This task will update your Gemfile with the approximate gem's minor version. It'll change:
gem 'rails', '4.2.3'
to:
gem 'rails', '~> 4.2'
drg:pin:patch
Want to pin gems at their patch version?
rake drg:pin:minor
This task will update your Gemfile with the approximate gem's patch version. It'll change:
gem 'rails', '4.2.3'
to
gem 'rails', '~> 4.2.3'
This can be combined with bundle update
to quickly update all gems to the latest version.
drg:pin:major
Pins your gems at the major level:
rake drg:pin:major
drg:pin:latest
Updates each outdated gem to the latest available version:
rake drg:pin:latest #=> updates all gems in the Gemfile
rake drg:pin:latest[<gem>] #=> updates only the specified <gem>
drg:pin:patch_latest
Updates the patch version for each outdated gem to the latest version:
rake drg:pin:patch_latest #=> updates all gems in the Gemfile
rake drg:pin:patch_latest[<gem>] #=> updates only the specified <gem>
drg:pin:minor_latest
Same as patch_latest
except it updates the minor version to the latest
rake drg:pin:minor_latest #=> updates all gems in the Gemfile
rake drg:pin:minor_latest[<gem>] #=> updates only the specified <gem>
drg:unpin
Remove the versions from your Gemfile. A clean start!
rake drg:unpin
Skipping gems
You can tell drg to ignore gems by adding an inline comment with @drg (skip|ignore|frozen)
gem 'name' # @drg skip
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake
to run the tests.
You can also run bin/console
for an interactive prompt that will allow you to experiment.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ridiculous/drg.