diff --git a/NEWS.md b/NEWS.md index 06df84db3..b9d879e86 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,7 @@ Unreleased * Introduce `suspenders:rake` generator * Introduce `suspenders:views` generator * Introduce `suspenders:setup` generator +* Introduce `suspenders:tasks` generator 20230113.0 (January, 13, 2023) diff --git a/README.md b/README.md index 721bc8ab7..c32f3554b 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,14 @@ A holistic setup script. bin/setup ``` +### Tasks + +Creates local Rake tasks for development + +```sh +bin/rails dev:prime +``` + ## Contributing See the [CONTRIBUTING] document. diff --git a/lib/generators/suspenders/tasks_generator.rb b/lib/generators/suspenders/tasks_generator.rb new file mode 100644 index 000000000..2057e6603 --- /dev/null +++ b/lib/generators/suspenders/tasks_generator.rb @@ -0,0 +1,20 @@ +module Suspenders + module Generators + class TasksGenerator < Rails::Generators::Base + source_root File.expand_path("../../templates/tasks", __FILE__) + desc <<~TEXT + Creates local Rake tasks for development + + bin/rails dev:prime # Sample data for local development environment + TEXT + + def create_dev_rake + if Bundler.rubygems.find_name("factory_bot").any? + copy_file "dev.rake", "lib/tasks/dev.rake" + else + say "This generator requires Factory Bot" + end + end + end + end +end diff --git a/lib/generators/templates/tasks/dev.rake b/lib/generators/templates/tasks/dev.rake new file mode 100644 index 000000000..7a94175f1 --- /dev/null +++ b/lib/generators/templates/tasks/dev.rake @@ -0,0 +1,12 @@ +if Rails.env.development? || Rails.env.test? + require "factory_bot" + + namespace :dev do + desc "Sample data for local development environment" + task prime: "db:setup" do + include FactoryBot::Syntax::Methods + + # create(:user, email: "user@example.com", password: "password") + end + end +end diff --git a/test/generators/suspenders/tasks_generator_test.rb b/test/generators/suspenders/tasks_generator_test.rb new file mode 100644 index 000000000..8d9a16193 --- /dev/null +++ b/test/generators/suspenders/tasks_generator_test.rb @@ -0,0 +1,47 @@ +require "test_helper" +require "generators/suspenders/tasks_generator" + +module Suspenders + module Generators + class TasksGeneratorTest < Rails::Generators::TestCase + include Suspenders::TestHelpers + + tests Suspenders::Generators::TasksGenerator + destination Rails.root + teardown :restore_destination + + test "creates dev.rake file" do + Bundler.rubygems.stubs(:find_name).with("factory_bot").returns([true]) + + expected = dev_rake + + run_generator + + assert_file app_root("lib/tasks/dev.rake") do |file| + assert_equal expected, file + end + end + + test "returns early if factory_bot_rails is not installed" do + output = run_generator + + assert_match /This generator requires Factory Bot/, output + assert_no_file app_root("lib/tasks/dev.rake") + end + + test "has a custom description" do + assert_no_match(/Description:/, generator_class.desc) + end + + private + + def dev_rake + File.read("./lib/generators/templates/tasks/dev.rake") + end + + def restore_destination + remove_file_if_exists "lib/tasks/dev.rake" + end + end + end +end