1- ##
2- # Invokes the template as a user would, not as CI does via the build-and-test script.
3- # Automatically removes old DB before generating the app if required
4- #
1+ require "rubygems"
2+
53class Builder
64 def initialize ( config :)
75 @config = config
6+ @rails_cmd_version = build_rails_cmd_version ( target_rails_major_minor : config . target_rails_major_minor )
87 end
98
109 def build
11- verify_rails_cmd_is_expected_version!
12-
1310 Dir . chdir ( @config . build_path ) do
1411 delete_any_previous_build
1512 drop_dbs_from_previous_build
1613
17- # TODO: how to handle errors? raise? or log and continue? or rename the app dir with a .failed suffix?
18- # TODO: how to handle output? redirect to a file? or sep files for stdout and stderr?
19-
2014 if @config . vanilla?
15+ Terminal . puts_header ( "Building vanilla Rails app" )
2116 system ( build_vanilla_cmd_env , build_vanilla_cmd )
2217 else
18+ Terminal . puts_header ( "Building Rails app" )
2319 system ( build_cmd_env , build_cmd )
2420 end
2521 end
@@ -29,20 +25,33 @@ def build
2925
3026 def base_cmd_parts
3127 [
32- "rails new #{ @config . app_name } " ,
28+ "rails _ #{ @rails_cmd_version } _ new #{ @config . app_name } " ,
3329 "-d postgresql" ,
3430 "--skip-javascript" ,
3531 "--skip-kamal" ,
3632 "--skip-solid"
3733 ]
3834 end
3935
40- def verify_rails_cmd_is_expected_version!
41- actual_rails_version = `rails -v` . strip . sub ( "Rails " , "" )
36+ def build_rails_cmd_version ( target_rails_major_minor :)
37+ specs = Gem ::Specification . find_all_by_name ( "rails" )
38+
39+ raise "No versions of gem '#{ gem_name } ' are installed" if specs . empty?
4240
43- return if actual_rails_version . start_with? ( @config . target_rails_major_minor )
41+ version = specs
42+ . map { _1 . version . to_s }
43+ . sort
44+ . reverse
45+ . find { |v | v . start_with? ( target_rails_major_minor ) }
46+ test_cmd = "rails _#{ version } _ -v"
47+ expected_test_output = "Rails #{ version } "
48+ actual_test_output = `#{ test_cmd } ` . strip
4449
45- raise "Expected Rails version #{ @config . target_rails_major_minor } , but got #{ actual_rails_version } "
50+ raise "Command failed: #{ test_cmd } . Actual: #{ actual_test_output } " unless expected_test_output == actual_test_output
51+
52+ Terminal . puts_header ( "Using Rails version #{ version } " )
53+
54+ version
4655 end
4756
4857 def delete_any_previous_build
@@ -84,17 +93,10 @@ def build_vanilla_cmd
8493 base_cmd_parts . join ( " " )
8594 end
8695
87- def print_separator
88- puts ""
89- puts "*" * 80
90- puts ""
91- end
92-
9396 def drop_dbs_from_previous_build
94- print_separator
97+ Terminal . puts_header ( "Dropping databases from previous build" )
9598 system "psql -c 'DROP DATABASE IF EXISTS #{ @config . app_name } _test;'"
9699 system "psql -c 'DROP DATABASE IF EXISTS #{ @config . app_name } _development;'"
97100 system "psql -c 'DROP DATABASE IF EXISTS #{ @config . app_name } _test;'"
98- print_separator
99101 end
100102end
0 commit comments