diff --git a/NEWS.md b/NEWS.md index 54f224388..06df84db3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,6 +10,7 @@ Unreleased * Introduce `suspenders:lint` generator * Introduce `suspenders:rake` generator * Introduce `suspenders:views` generator +* Introduce `suspenders:setup` generator 20230113.0 (January, 13, 2023) diff --git a/README.md b/README.md index 9d167c951..721bc8ab7 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,14 @@ document [lang][]. [title]: https://github.com/calebhearth/title [lang]: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang +### Setup + +A holistic setup script. + +```sh +bin/setup +``` + ## Contributing See the [CONTRIBUTING] document. diff --git a/lib/generators/suspenders/setup_generator.rb b/lib/generators/suspenders/setup_generator.rb new file mode 100644 index 000000000..7a9fae116 --- /dev/null +++ b/lib/generators/suspenders/setup_generator.rb @@ -0,0 +1,18 @@ +module Suspenders + module Generators + class SetupGenerator < Rails::Generators::Base + source_root File.expand_path("../../templates/setup", __FILE__) + desc <<~TEXT + A holistic setup script. + + ```sh + bin/setup + ``` + TEXT + + def replace_bin_setup + copy_file "bin_setup.rb", "bin/setup", force: true + end + end + end +end diff --git a/lib/generators/templates/setup/bin_setup.rb b/lib/generators/templates/setup/bin_setup.rb new file mode 100755 index 000000000..ef20fe69e --- /dev/null +++ b/lib/generators/templates/setup/bin_setup.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby +require "fileutils" +require "bundler" + +# path to your application root. +APP_ROOT = File.expand_path("..", __dir__) + +def system!(*args) + system(*args, exception: true) +end + +def using_node? + File.exist? "package.json" +end + +FileUtils.chdir APP_ROOT do + puts "== Installing dependencies ==" + system! "gem install bundler --conservative" + system("bundle check") || system!("bundle install") + system("yarn install --check-files") if using_node? + + puts "\n== Preparing database and adding development seed data ==" + if File.exist? "lib/tasks/dev.rake" + system! "bin/rails dev:prime" + else + system! "bin/rails db:prepare" + end + + if Bundler.rubygems.find_name("sprockets") + puts "\n== Generating assets ==" + system! "bin/rails assets:clobber assets:precompile" + end + + # https://github.com/rails/rails/pull/47719/files + puts "\n== Setup test environment ==" + system! "bin/rails test:prepare" + + puts "\n== Removing old logs and tempfiles ==" + system! "bin/rails log:clear tmp:clear" + + puts "\n== Restarting application server ==" + system! "bin/rails restart" +end diff --git a/lib/generators/templates/setup/dev_prime.rb b/lib/generators/templates/setup/dev_prime.rb new file mode 100644 index 000000000..44da79691 --- /dev/null +++ b/lib/generators/templates/setup/dev_prime.rb @@ -0,0 +1,12 @@ +if Rails.env.development? || Rails.env.test? + require "factory_bot" if Bundler.rubygems.find_name("factory_bot_rails").any? + + namespace :dev do + desc "Sample data for local development environment" + task prime: "db:setup" do + include FactoryBot::Syntax::Methods if Bundler.rubygems.find_name("factory_bot_rails").any? + + # create(:user, email: "user@example.com", password: "password") + end + end +end diff --git a/test/generators/suspenders/setup_generator_test.rb b/test/generators/suspenders/setup_generator_test.rb new file mode 100644 index 000000000..e3396ba2b --- /dev/null +++ b/test/generators/suspenders/setup_generator_test.rb @@ -0,0 +1,45 @@ +require "test_helper" +require "generators/suspenders/setup_generator" + +module Suspenders + module Generators + class SetupGeneratorTest < Rails::Generators::TestCase + include Suspenders::TestHelpers + + tests Suspenders::Generators::SetupGenerator + destination Rails.root + setup :prepare_destination + teardown :restore_destination + + test "modifies bin/setup" do + expected = bin_setup + + run_generator + + assert_file app_root("bin/setup") do |file| + assert_equal expected, file + end + end + + test "has a custom description" do + assert_no_match(/Description:/, generator_class.desc) + end + + private + + def prepare_destination + backup_file "bin/setup" + end + + def restore_destination + remove_file_if_exists "Brewfile" + restore_file "bin/setup" + remove_dir_if_exists "lib/tasks" + end + + def bin_setup + File.read("./lib/generators/templates/setup/bin_setup.rb") + end + end + end +end