diff --git a/lib/generators/suspenders/install/web_generator.rb b/lib/generators/suspenders/install/web_generator.rb index c6e08f23e..971a17b47 100644 --- a/lib/generators/suspenders/install/web_generator.rb +++ b/lib/generators/suspenders/install/web_generator.rb @@ -5,6 +5,7 @@ class WebGenerator < Rails::Generators::Base include Suspenders::Generators::APIAppUnsupported include Suspenders::Generators::DatabaseUnsupported include Suspenders::Generators::NodeNotInstalled + include Suspenders::Generators::NodeVersionUnsupported source_root File.expand_path("../../../templates/install/web", __FILE__) desc <<~MARKDOWN diff --git a/lib/generators/suspenders/prerequisites_generator.rb b/lib/generators/suspenders/prerequisites_generator.rb index 91f1ca6e0..fd0e064df 100644 --- a/lib/generators/suspenders/prerequisites_generator.rb +++ b/lib/generators/suspenders/prerequisites_generator.rb @@ -3,6 +3,7 @@ module Generators class PrerequisitesGenerator < Rails::Generators::Base include Suspenders::Generators::Helpers include Suspenders::Generators::NodeNotInstalled + include Suspenders::Generators::NodeVersionUnsupported source_root File.expand_path("../../templates/prerequisites", __FILE__) diff --git a/lib/install/web.rb b/lib/install/web.rb index fb28332ee..6c13f5488 100644 --- a/lib/install/web.rb +++ b/lib/install/web.rb @@ -1,4 +1,17 @@ +extend Suspenders::Generators::Helpers + def apply_template! + if node_not_installed? || node_version_unsupported? + message = <<~ERROR + + + === Node version unsupported === + + Suspenders requires Node >= #{Suspenders::MINIMUM_NODE_VERSION} + ERROR + + fail Rails::Generators::Error, message + end if options[:database] == "postgresql" && options[:skip_test] after_bundle do gem_group :development, :test do diff --git a/lib/suspenders/generators.rb b/lib/suspenders/generators.rb index 1588d42e8..9d3426044 100644 --- a/lib/suspenders/generators.rb +++ b/lib/suspenders/generators.rb @@ -22,6 +22,14 @@ def rspec_test_helper_present? def node_version ENV["NODE_VERSION"] || `node --version`[/\d+\.\d+\.\d+/] end + + def node_not_installed? + !node_version.present? + end + + def node_version_unsupported? + node_version < Suspenders::MINIMUM_NODE_VERSION + end end module APIAppUnsupported @@ -81,6 +89,9 @@ def database_unsupported? module NodeNotInstalled class Error < StandardError + def message + "This generator requires Node" + end end extend ActiveSupport::Concern @@ -92,11 +103,23 @@ def raise_if_node_not_installed end end end + end - private + module NodeVersionUnsupported + class Error < StandardError + def message + "This generator requires Node >= #{Suspenders::MINIMUM_NODE_VERSION}" + end + end - def node_not_installed? - !node_version.present? + extend ActiveSupport::Concern + + included do + def raise_if_node_version_unsupported + if node_version_unsupported? + raise Suspenders::Generators::NodeVersionUnsupported::Error + end + end end end end diff --git a/lib/suspenders/version.rb b/lib/suspenders/version.rb index 8f46d901c..8f4f377d0 100644 --- a/lib/suspenders/version.rb +++ b/lib/suspenders/version.rb @@ -2,4 +2,5 @@ module Suspenders VERSION = "3.0.0".freeze RAILS_VERSION = "~> 7.0".freeze MINIMUM_RUBY_VERSION = ">= 3.1".freeze + MINIMUM_NODE_VERSION = "20.0.0".freeze end diff --git a/test/generators/suspenders/install/web_generator_test.rb b/test/generators/suspenders/install/web_generator_test.rb index b5c777448..b27407329 100644 --- a/test/generators/suspenders/install/web_generator_test.rb +++ b/test/generators/suspenders/install/web_generator_test.rb @@ -38,6 +38,16 @@ class WebGeneratorTest < Rails::Generators::TestCase end end + test "raises if Node is unsupported" do + Object.any_instance.stubs(:`).returns("v19.9.9\n") + + with_database "postgresql" do + assert_raises Suspenders::Generators::NodeVersionUnsupported::Error do + run_generator + end + end + end + private def prepare_destination diff --git a/test/generators/suspenders/prerequisites_generator_test.rb b/test/generators/suspenders/prerequisites_generator_test.rb index 99910867b..1c0bd4958 100644 --- a/test/generators/suspenders/prerequisites_generator_test.rb +++ b/test/generators/suspenders/prerequisites_generator_test.rb @@ -12,22 +12,22 @@ class PrerequisitesGeneratorTest < Rails::Generators::TestCase teardown :restore_destination test "generates .node-version file (from ENV)" do - ClimateControl.modify NODE_VERSION: "1.2.3" do + ClimateControl.modify NODE_VERSION: "20.0.0" do run_generator assert_file app_root(".node-version") do |file| - assert_match(/1\.2\.3/, file) + assert_match(/20\.0\.0/, file) end end end test "generates .node-version file (from system)" do - Object.any_instance.stubs(:`).returns("v1.2.3\n") + Object.any_instance.stubs(:`).returns("v20.0.0\n") run_generator assert_file app_root(".node-version") do |file| - assert_match(/1\.2\.3/, file) + assert_match(/20\.0\.0/, file) end end @@ -41,6 +41,16 @@ class PrerequisitesGeneratorTest < Rails::Generators::TestCase assert_no_file app_root(".node-version") end + test "raises if Node is unsupported" do + Object.any_instance.stubs(:`).returns("v19.9.9\n") + + assert_raises Suspenders::Generators::NodeVersionUnsupported::Error do + run_generator + end + + assert_no_file app_root(".node-version") + end + private def restore_destination diff --git a/test/suspenders/cleanup/generate_readme_test.rb b/test/suspenders/cleanup/generate_readme_test.rb index 1dc8899a8..adad61ce1 100644 --- a/test/suspenders/cleanup/generate_readme_test.rb +++ b/test/suspenders/cleanup/generate_readme_test.rb @@ -6,7 +6,7 @@ module Suspenders module Cleanup class GenerateReadmeTest < ActiveSupport::TestCase test "generates README using generator descriptions" do - Object.any_instance.stubs(:`).returns("v1.2.3\n") + Object.any_instance.stubs(:`).returns("v20.0.0\n") Tempfile.create "README.md" do |readme| path = readme.path @@ -20,7 +20,7 @@ class GenerateReadmeTest < ActiveSupport::TestCase assert_match "## Prerequisites", readme assert_match Suspenders::MINIMUM_RUBY_VERSION, readme - assert_match "Node: `1.2.3`", readme + assert_match "Node: `20.0.0`", readme assert_match "## Configuration", readme assert_match "### Test", readme diff --git a/test/suspenders/generators_test.rb b/test/suspenders/generators_test.rb index 5c2f56320..07cbf71c4 100644 --- a/test/suspenders/generators_test.rb +++ b/test/suspenders/generators_test.rb @@ -1,7 +1,7 @@ require "test_helper" class Suspenders::GeneratorsTest < ActiveSupport::TestCase - class APIAppUnsupportedTest < Suspenders::GeneratorsTest + class APIAppUnsupportedTest < ActiveSupport::TestCase test "message returns a custom message" do expected = "This generator cannot be used on API only applications." @@ -9,11 +9,27 @@ class APIAppUnsupportedTest < Suspenders::GeneratorsTest end end - class DatabaseUnsupportedTest < Suspenders::GeneratorsTest + class DatabaseUnsupportedTest < ActiveSupport::TestCase test "message returns a custom message" do expected = "This generator requires PostgreSQL" assert_equal expected, Suspenders::Generators::DatabaseUnsupported::Error.new.message end end + + class NodeNotInstalledTest< ActiveSupport::TestCase + test "message returns a custom message" do + expected = "This generator requires Node" + + assert_equal expected, Suspenders::Generators::NodeNotInstalled::Error.new.message + end + end + + class NodeVersionUnsupportedTest < ActiveSupport::TestCase + test "message returns a custom message" do + expected = "This generator requires Node >= #{Suspenders::MINIMUM_NODE_VERSION}" + + assert_equal expected, Suspenders::Generators::NodeVersionUnsupported::Error.new.message + end + end end diff --git a/test/suspenders_test.rb b/test/suspenders_test.rb index 948ef5022..580ffde15 100644 --- a/test/suspenders_test.rb +++ b/test/suspenders_test.rb @@ -12,4 +12,8 @@ class SuspendersTest < ActiveSupport::TestCase test "it has a Minimum Ruby version number" do assert Suspenders::MINIMUM_RUBY_VERSION end + + test "it has a Minimum Node version number" do + assert Suspenders::MINIMUM_NODE_VERSION + end end