Skip to content

Commit

Permalink
Introduce suspenders:rake generator
Browse files Browse the repository at this point in the history
Closes #1138
Closes #1143

Consolidates logic from the existing [advisories][] and [lint][]
generators to create a default Rake task that audits and lints the
codebase.

We do this because it's simpler to bundle this configuration together,
rather than have two separate generators compete to modify the default
Rake task, since those generators can be run independently.

[advisories]: https://github.com/thoughtbot/suspenders/blob/main/lib/suspenders/generators/advisories_generator.rb
[lint]: https://github.com/thoughtbot/suspenders/blob/main/lib/suspenders/generators/lint_generator.rb
  • Loading branch information
stevepolitodesign committed Nov 11, 2023
1 parent 5ff19c5 commit cece45a
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 2 deletions.
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ Unreleased
* Remove `suspenders` system executable
* Introduce `suspenders:accessibility` generator
* Introduce `Suspenders::Generators::APIAppUnsupported` module and concern
* Introduce `suspenders:rake` generator

20230113.0 (January, 13, 2023)

Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ Installs [capybara_accessibility_audit] and [capybara_accessible_selectors]
[capybara_accessibility_audit]: https://github.com/thoughtbot/capybara_accessibility_audit
[capybara_accessible_selectors]: https://github.com/citizensadvice/capybara_accessible_selectors

### Rake

Configures the default Rake task to audit and lint the codebase with
[bundler-audit][] and [standard][].

`/bin/rails g suspenders:rake`

[bundler-audit]: https://github.com/rubysec/bundler-audit
[standard]: https://github.com/standardrb/standard

## Contributing

See the [CONTRIBUTING] document.
Expand Down
25 changes: 25 additions & 0 deletions lib/generators/suspenders/rake_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Suspenders
module Generators
class RakeGenerator < Rails::Generators::Base
source_root File.expand_path("../../templates/rake", __FILE__)
desc(<<~TEXT)
Configures the default Rake task to audit and lint the codebase with `bundler-audit` and `standard`.
TEXT

def add_bundler_audit_and_standard
gem_group :development, :test do
gem "bundler-audit", ">= 0.7.0", require: false
gem "standard"
end
Bundler.with_unbundled_env { run "bundle install" }
end

def configurea_rake_task
copy_file "bundler_audit.rake", "lib/tasks/bundler_audit.rake"

insert_into_file "Rakefile", "\nrequire \"standard/rake\"", after: "require_relative \"config/application\""
append_file "Rakefile", %(\ntask default: %i[bundle:audit standard]\n)
end
end
end
end
4 changes: 4 additions & 0 deletions lib/generators/templates/rake/bundler_audit.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
if Rails.env.development? || Rails.env.test?
require "bundler/audit/task"
Bundler::Audit::Task.new
end
99 changes: 99 additions & 0 deletions test/generators/suspenders/rake_generator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
require "test_helper"
require "generators/suspenders/rake_generator"

module Suspenders
module Generators
class RakeGeneratorTest < Rails::Generators::TestCase
include Suspenders::TestHelpers

tests Suspenders::Generators::RakeGenerator
destination Rails.root
setup :prepare_destination
teardown :restore_destination

test "adds gems to Gemfile" do
expected_output = <<~RUBY
group :development, :test do
gem "bundler-audit", ">= 0.7.0", require: false
gem "standard"
end
RUBY

run_generator

assert_file app_root("Gemfile") do |file|
assert_match(expected_output, file)
end
end

test "installs gems with Bundler" do
Bundler.stubs(:with_unbundled_env).yields
generator.expects(:run).with("bundle install").once

capture(:stdout) do
generator.add_bundler_audit_and_standard
end
end

test "creates custom Rake task" do
expected_rake_task = <<~RUBY
if Rails.env.development? || Rails.env.test?
require "bundler/audit/task"
Bundler::Audit::Task.new
end
RUBY

run_generator

assert_file app_root("lib/tasks/bundler_audit.rake") do |file|
assert_match expected_rake_task, file
end
end

test "modifies existing Rakefile" do
rakefile = <<~RUBY
require_relative "config/application"
Rails.application.load_tasks
RUBY
File.open(app_root("Rakefile"), "w") { _1.write rakefile }

expected_rakefile = <<~RUBY
require_relative "config/application"
require "standard/rake"
Rails.application.load_tasks
task default: %i[bundle:audit standard]
RUBY

run_generator

assert_file app_root("Rakefile") do |file|
assert_equal expected_rakefile, file
end
end

test "generator has a description" do
description = <<~TEXT
Configures the default Rake task to audit and lint the codebase with `bundler-audit` and `standard`.
TEXT

assert_equal description, generator_class.desc
end

private

def prepare_destination
touch "Gemfile"
backup_file "Rakefile"
end

def restore_destination
remove_file_if_exists "Gemfile"
remove_file_if_exists "lib/tasks/bundler_audit.rake"
restore_file "Rakefile"
end
end
end
end
2 changes: 0 additions & 2 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ class Application < Rails::Application
restore_file "config/application.rb"
end

private

def backup_file(file)
FileUtils.mv app_root(file), app_root("#{file}.bak")
touch file
Expand Down

0 comments on commit cece45a

Please sign in to comment.