nextgen 0.23.0 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccbe3efa90a32fceeb62ba7b8ccfb7b138a43d3c301e6491763a4103bc142991
4
- data.tar.gz: b2845c59c5170a82b81b1e55ec836a342bb51d32ab031575db051987d62d6424
3
+ metadata.gz: 66f2bcb15ce61690a13798ae3f202563dd87fd85f978bc066483693f338a0a2f
4
+ data.tar.gz: c7c555bad90c6a8a90bc09e03dd1fa7b7a56e4c1947e33ad5048984428062b6e
5
5
  SHA512:
6
- metadata.gz: b3dea1fc75cbf2df5e483efc6bbd025dd8994f273b078351182aacceb66a69ade48a186cce0f4ce4a6e4fa1206f9fcf7bd53efe448cdb3be8e8bad808cd12707
7
- data.tar.gz: 86bed37b89d18353da4d09a1004b6a9267c2a82f56f0ca398a3f6c5935a3639260722a325f7b699fab60cf5d86a41f7c205ea885cbdc0f017a9cc3865357110f
6
+ metadata.gz: 884b6395cb194ea3d9bc998fae5c977adda15441f6a95c782017145ba38106bc19e97289c26c4cf894903aafb31a2bd7b80d253a66a1f8da0967852928c29217
7
+ data.tar.gz: cf166eb6fd55aa50f69d191308ca9eda222fe205029ee5f8c7169a8c4ea9771c500d472b98f4a60b6a328031f73b2915cbd154a457caf8b26a7b69d76217bbf4
@@ -122,7 +122,9 @@ shoulda:
122
122
  sidekiq:
123
123
  prompt: "Sidekiq"
124
124
  description: "Install sidekiq gem to use in production"
125
- requires: active_job
125
+ requires:
126
+ - active_job
127
+ - skip_solid
126
128
 
127
129
  staging:
128
130
  prompt: "Staging environment"
@@ -141,6 +143,7 @@ thor:
141
143
  tomo:
142
144
  prompt: "Tomo"
143
145
  description: "Install tomo gem for SSH-based deployment"
146
+ requires: skip_kamal
144
147
 
145
148
  vcr:
146
149
  prompt: "VCR"
@@ -0,0 +1,56 @@
1
+ current: &current
2
+ args: []
3
+ label: "%%CURRENT_VERSION%%"
4
+ asset_pipelines:
5
+ sprockets: Sprockets (default)
6
+ propshaft: Propshaft
7
+ databases:
8
+ sqlite3: SQLite3 (default)
9
+ postgresql: PostgreSQL (recommended)
10
+ mysql: MySQL
11
+ trilogy: Trilogy
12
+ oracle: Oracle
13
+ sqlserver: SQLServer
14
+ jdbcmysql: JDBCMySQL
15
+ jdbcsqlite3: JDBCSQLite3
16
+ jdbcpostgresql: JDBCPostgreSQL
17
+ jdbc: JDBC
18
+ default_features:
19
+ brakeman: Brakeman
20
+ ci: GitHub Actions CI
21
+ rubocop: RuboCop
22
+ optional_features:
23
+ devcontainer: devcontainer files
24
+
25
+ edge:
26
+ <<: *current
27
+ args: ["--edge"]
28
+ label: "edge (7-2-stable)"
29
+
30
+ main:
31
+ args: ["--main"]
32
+ label: "main (%%MAIN_VERSION%%)"
33
+ asset_pipelines:
34
+ propshaft: Propshaft (default)
35
+ databases:
36
+ sqlite3: SQLite3 (default)
37
+ postgresql: PostgreSQL (recommended)
38
+ mysql: MySQL
39
+ trilogy: Trilogy
40
+ oracle: Oracle
41
+ sqlserver: SQLServer
42
+ jdbcmysql: JDBCMySQL
43
+ jdbcsqlite3: JDBCSQLite3
44
+ jdbcpostgresql: JDBCPostgreSQL
45
+ jdbc: JDBC
46
+ mariadb-mysql: MariaDB-MySQL
47
+ mariadb-trilogy: MariaDB-Trilogy
48
+ default_features:
49
+ brakeman: Brakeman
50
+ ci: GitHub Actions CI
51
+ kamal: Kamal
52
+ rubocop: RuboCop
53
+ solid: Solid Cache+Queue
54
+ thruster: Thruster
55
+ optional_features:
56
+ devcontainer: devcontainer files
@@ -21,7 +21,6 @@ module Nextgen
21
21
  def initialize(app_path, _options)
22
22
  @app_path = File.expand_path(app_path)
23
23
  @app_name = File.basename(@app_path).gsub(/\W/, "_").squeeze("_").camelize
24
- @rails_opts = RailsOptions.new
25
24
  end
26
25
 
27
26
  def run # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
@@ -39,13 +38,15 @@ module Nextgen
39
38
 
40
39
  continue_if "Ready to start?"
41
40
 
42
- ask_rails_version
41
+ rails_version = ask_rails_version
42
+ @rails_opts = RailsOptions.new(version: rails_version)
43
+
43
44
  ask_database
44
45
  ask_full_stack_or_api
45
46
  ask_frontend_management unless rails_opts.api?
46
47
  ask_css unless rails_opts.api? || rails_opts.skip_asset_pipeline?
47
48
  ask_javascript unless rails_opts.api? || rails_opts.skip_asset_pipeline?
48
- ask_rails_tools
49
+ ask_rails_features
49
50
  ask_rails_frameworks
50
51
  ask_test_framework
51
52
  ask_system_testing if rails_opts.frontend? && rails_opts.test_framework?
@@ -78,9 +79,9 @@ module Nextgen
78
79
 
79
80
  create_initial_commit_message
80
81
  copy_package_json if node?
81
- Nextgen::Rails.run "new", *rails_new_args
82
+ Nextgen::RailsCommand.run "new", *rails_new_args
82
83
  Dir.chdir(app_path) do
83
- Nextgen::Rails.run "app:template", "LOCATION=#{write_generators_script}"
84
+ Nextgen::RailsCommand.run "app:template", "LOCATION=#{write_generators_script}"
84
85
  end
85
86
 
86
87
  say <<~DONE.gsub(/^/, " ")
@@ -88,7 +89,7 @@ module Nextgen
88
89
 
89
90
  #{green("Done!")}
90
91
 
91
- A Rails #{rails_version} app was generated in #{cyan(app_path)}.
92
+ A Rails #{rails_opts.version_label} app was generated in #{cyan(app_path)}.
92
93
  Run #{yellow("bin/setup")} in that directory to get started.
93
94
 
94
95
 
@@ -118,31 +119,17 @@ module Nextgen
118
119
  )
119
120
  end
120
121
 
121
- def rails_version
122
- rails_opts.edge? ? "edge (#{Rails.edge_branch} branch)" : Rails.version
123
- end
124
-
125
122
  def ask_rails_version
126
- selected = prompt.select(
127
- "What version of Rails will you use?",
128
- Rails.version => :current,
129
- "edge (#{Rails.edge_branch} branch)" => :edge
130
- )
131
- rails_opts.edge! if selected == :edge
123
+ options = %i[current edge main].to_h do |key|
124
+ version = RailsVersion.public_send(key)
125
+ [version.label, version]
126
+ end
127
+ prompt.select("What version of Rails will you use?", options)
132
128
  end
133
129
 
134
130
  def ask_database
135
- common_databases = {
136
- "SQLite3 (default)" => "sqlite3",
137
- "PostgreSQL (recommended)" => "postgresql",
138
- "MySQL" => "mysql"
139
- }
140
- all_databases = common_databases.merge(
141
- %w[MySQL Trilogy Oracle SQLServer JDBCMySQL JDBCSQLite3 JDBCPostgreSQL JDBC].to_h do |name|
142
- [name, name.downcase]
143
- end,
144
- "None (disable Active Record)" => nil
145
- )
131
+ common_databases = rails_opts.databases.slice(:sqlite3, :postgresql, :mysql).invert
132
+ all_databases = rails_opts.databases.invert.merge("None (disable Active Record)" => nil)
146
133
  rails_opts.database =
147
134
  prompt_select("Which database?", common_databases.merge("More options..." => false)) ||
148
135
  prompt_select("Which database?", all_databases)
@@ -158,12 +145,8 @@ module Nextgen
158
145
  end
159
146
 
160
147
  def ask_frontend_management
161
- frontend = prompt_select(
162
- "How will you manage frontend assets?",
163
- "Sprockets (default)" => "sprockets",
164
- "Propshaft" => "propshaft",
165
- "Vite" => :vite
166
- )
148
+ options = rails_opts.asset_pipelines.invert.merge("Vite" => :vite)
149
+ frontend = prompt_select("How will you manage frontend assets?", options)
167
150
 
168
151
  if frontend == :vite
169
152
  rails_opts.vite!
@@ -196,15 +179,9 @@ module Nextgen
196
179
  )
197
180
  end
198
181
 
199
- def ask_rails_tools
200
- opt_out = {
201
- "Brakeman" => "brakeman",
202
- "GitHub Actions CI" => "ci",
203
- "RuboCop" => "rubocop"
204
- }
205
- opt_in = {
206
- "devcontainer files" => "devcontainer"
207
- }
182
+ def ask_rails_features
183
+ opt_out = rails_opts.default_features.invert
184
+ opt_in = rails_opts.optional_features.invert
208
185
 
209
186
  answers = prompt.multi_select(
210
187
  "Rails can preinstall the following. Which do you need?",
@@ -212,27 +189,27 @@ module Nextgen
212
189
  default: opt_out.keys.reverse
213
190
  )
214
191
 
215
- rails_opts.devcontainer! if answers.delete("devcontainer")
216
- (opt_out.values - answers).each { rails_opts.skip_optional_feature!(_1) }
192
+ (opt_out.values - answers).each { rails_opts.skip_default_feature!(_1) }
193
+ (opt_in.values & answers).each { rails_opts.enable_optional_feature!(_1) }
217
194
  end
218
195
 
219
196
  def ask_rails_frameworks
220
197
  frameworks = {
221
- "JBuilder" => "jbuilder",
222
- "Action Mailer" => "action_mailer",
223
- "Active Job" => "active_job",
224
- "Action Cable" => "action_cable"
198
+ "JBuilder" => :jbuilder,
199
+ "Action Mailer" => :action_mailer,
200
+ "Active Job" => :active_job,
201
+ "Action Cable" => :action_cable
225
202
  }
226
203
 
227
204
  unless rails_opts.api? || rails_opts.skip_javascript?
228
- frameworks = {"Hotwire" => "hotwire"}.merge(frameworks)
205
+ frameworks = {"Hotwire" => :hotwire}.merge(frameworks)
229
206
  end
230
207
 
231
208
  unless rails_opts.skip_active_record?
232
209
  frameworks.merge!(
233
- "Active Storage" => "active_storage",
234
- "Action Text" => "action_text",
235
- "Action Mailbox" => "action_mailbox"
210
+ "Active Storage" => :active_storage,
211
+ "Action Text" => :action_text,
212
+ "Action Mailbox" => :action_mailbox
236
213
  )
237
214
  end
238
215
 
@@ -242,14 +219,14 @@ module Nextgen
242
219
  default: frameworks.keys.reverse
243
220
  )
244
221
 
245
- (frameworks.values - answers).each { rails_opts.skip_optional_feature!(_1) }
222
+ (frameworks.values - answers).each { rails_opts.skip_default_feature!(_1) }
246
223
  end
247
224
 
248
225
  def ask_test_framework
249
226
  rails_opts.test_framework = prompt_select(
250
227
  "Which test framework will you use?",
251
- "Minitest (default)" => "minitest",
252
- "RSpec" => "rspec",
228
+ "Minitest (default)" => :minitest,
229
+ "RSpec" => :rspec,
253
230
  "None" => nil
254
231
  )
255
232
  end
@@ -277,7 +254,7 @@ module Nextgen
277
254
  path = File.join(app_path, "tmp", "initial_nextgen_commit")
278
255
  FileUtils.mkdir_p(File.dirname(path))
279
256
  File.write(path, <<~COMMIT)
280
- Init project with `rails new` (#{Nextgen::Rails.version})
257
+ Init project with `rails new` (#{rails_opts.version_label})
281
258
 
282
259
  Nextgen generated this project with the following `rails new` options:
283
260
 
@@ -289,10 +266,10 @@ module Nextgen
289
266
 
290
267
  def rails_new_args
291
268
  [app_path, "--no-rc", *rails_opts.to_args].tap do |args|
292
- # Work around a Rails bug where --edge causes --no-rc to get ignored.
269
+ # Work around a Rails bug where --edge and --main cause --no-rc to get ignored.
293
270
  # Specifying --rc= with a non-existent file has the same effect as --no-rc.
294
271
  @rc_token ||= SecureRandom.hex(8)
295
- args << "--rc=#{@rc_token}" if rails_opts.edge?
272
+ args << "--rc=#{@rc_token}" if args.intersect?(%w[--edge --main])
296
273
  end
297
274
  end
298
275
 
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- install_gem "dotenv", version: ">= 3.0", group: %i[development test]
3
+ # kamal is incompatible with the latest version of dotenv, so fall back
4
+ # to using the legacy dotenv-rails gem in that case.
5
+ if File.read("Gemfile.lock").match?(/\bkamal\b/)
6
+ install_gem "dotenv-rails", group: %i[development test]
7
+ else
8
+ install_gem "dotenv", version: ">= 3.0", group: %i[development test]
9
+ end
4
10
  copy_file ".env.sample"
5
11
  gitignore "/.env*", "!/.env.sample"
@@ -113,13 +113,12 @@ RUBY
113
113
  say_git "Remove jsbundling-rails"
114
114
  remove_gem "jsbundling-rails"
115
115
 
116
- say_git "Remove sprockets"
116
+ say_git "Remove asset pipeline"
117
117
  remove_file "config/initializers/assets.rb"
118
118
  comment_lines "config/environments/development.rb", /^\s*config\.assets\./
119
119
  comment_lines "config/environments/production.rb", /^\s*config\.assets\./
120
120
  gsub_file "app/views/layouts/application.html.erb", /^.*<%= javascript_include_tag.*\n/, ""
121
121
  gsub_file "app/views/layouts/application.html.erb", /^.*<%= stylesheet_link_tag.*\n/, ""
122
- remove_gem "sprockets-rails"
123
122
 
124
123
  if File.exist?(".github/workflows/ci.yml")
125
124
  say_git "Add Node steps to CI workflow"
@@ -1,22 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rails/version"
4
-
5
3
  module Nextgen
6
- module Rails
4
+ module RailsCommand
7
5
  class << self
8
- def version
9
- ::Rails.version
10
- end
11
-
12
- def edge_branch
13
- if version.match?(/[a-z]/i)
14
- "main"
15
- else
16
- version[/^\d+\.\d+/].tr(".", "-") + "-stable"
17
- end
18
- end
19
-
20
6
  def run(*args, raise_on_error: true)
21
7
  command = "rails", *args
22
8
  say_status :run, *command.join(" ")
@@ -1,52 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "forwardable"
4
+
3
5
  module Nextgen
4
6
  class RailsOptions
5
- DATABASES = %w[
6
- postgresql
7
- mysql
8
- trilogy
9
- sqlite3
10
- oracle
11
- sqlserver
12
- jdbcmysql
13
- jdbcsqlite3
14
- jdbcpostgresql
15
- jdbc
16
- ].freeze
17
-
18
- TEST_FRAMEWORKS = %w[minitest rspec].freeze
7
+ extend Forwardable
19
8
 
20
- ASSET_PIPELINES = %w[sprockets propshaft].freeze
9
+ TEST_FRAMEWORKS = %i[minitest rspec].freeze
21
10
 
22
- OPTIONAL_FEATURES = %w[
11
+ FRAMEWORKS = %i[
23
12
  action_mailer
24
13
  action_mailbox
25
14
  action_text
26
15
  active_job
27
16
  active_storage
28
17
  action_cable
29
- brakeman
30
- ci
31
18
  hotwire
32
19
  jbuilder
33
- rubocop
34
20
  ].freeze
35
21
 
36
22
  attr_reader :asset_pipeline, :css, :javascript, :database, :test_framework
37
23
 
38
- def initialize
24
+ def_delegators :version, :asset_pipelines, :databases, :default_features, :optional_features
25
+
26
+ def initialize(version:)
27
+ @version = version
39
28
  @api = false
40
- @edge = false
41
29
  @vite = false
42
- @devcontainer = nil
30
+ @enable_features = []
43
31
  @skip_features = []
44
32
  @skip_system_test = false
45
- @test_framework = "minitest"
33
+ @test_framework = :minitest
34
+ end
35
+
36
+ def version_label
37
+ version.label
46
38
  end
47
39
 
48
40
  def asset_pipeline=(pipeline)
49
- raise ArgumentError, "Unknown asset pipeline: #{pipeline}" unless [nil, *ASSET_PIPELINES].include?(pipeline)
41
+ raise ArgumentError, "Unknown asset pipeline: #{pipeline}" unless [nil, *asset_pipelines.keys].include?(pipeline)
50
42
 
51
43
  @asset_pipeline = pipeline
52
44
  end
@@ -80,7 +72,7 @@ module Nextgen
80
72
  end
81
73
 
82
74
  def database=(db)
83
- raise ArgumentError, "Unknown database: #{db}" unless [nil, *DATABASES].include?(db)
75
+ raise ArgumentError, "Unknown database: #{db}" unless [nil, *databases.keys].include?(db)
84
76
 
85
77
  @database = db
86
78
  end
@@ -99,14 +91,6 @@ module Nextgen
99
91
  !!@test_framework
100
92
  end
101
93
 
102
- def edge!
103
- @edge = true
104
- end
105
-
106
- def edge?
107
- @edge
108
- end
109
-
110
94
  def devcontainer!
111
95
  @devcontainer = true
112
96
  end
@@ -131,15 +115,15 @@ module Nextgen
131
115
  end
132
116
 
133
117
  def minitest?
134
- @test_framework == "minitest"
118
+ @test_framework == :minitest
135
119
  end
136
120
 
137
121
  def rspec?
138
- @test_framework == "rspec"
122
+ @test_framework == :rspec
139
123
  end
140
124
 
141
125
  def rubocop?
142
- !skip_optional_feature?("rubocop")
126
+ !skip_default_feature?(:rubocop)
143
127
  end
144
128
 
145
129
  def active_record?
@@ -163,7 +147,7 @@ module Nextgen
163
147
  end
164
148
 
165
149
  def skip_test?
166
- defined?(@test_framework) && [nil, "rspec"].include?(@test_framework)
150
+ defined?(@test_framework) && [nil, :rspec].include?(@test_framework)
167
151
  end
168
152
 
169
153
  def system_testing?
@@ -171,45 +155,64 @@ module Nextgen
171
155
  end
172
156
 
173
157
  def action_mailer?
174
- !skip_optional_feature?("action_mailer")
158
+ !skip_default_feature?(:action_mailer)
175
159
  end
176
160
 
177
161
  def active_job?
178
- !skip_optional_feature?("active_job")
162
+ !skip_default_feature?(:active_job)
179
163
  end
180
164
 
181
- def skip_optional_feature!(feature)
182
- raise ArgumentError, "Unknown feature: #{feature}" unless OPTIONAL_FEATURES.include?(feature)
165
+ def skip_kamal?
166
+ # Depending on the Rails version, kamal may not exist, in which case we can consider it "skipped".
167
+ !skippable_features.include?(:kamal) || skip_default_feature?(:kamal)
168
+ end
169
+
170
+ def skip_solid?
171
+ !skippable_features.include?(:solid) || skip_default_feature?(:solid)
172
+ end
173
+
174
+ def enable_optional_feature!(feature)
175
+ raise ArgumentError, "Unknown feature: #{feature}" unless optional_features.include?(feature)
176
+
177
+ enable_features << feature
178
+ end
179
+
180
+ def skip_default_feature!(feature)
181
+ raise ArgumentError, "Unknown feature: #{feature}" unless skippable_features.include?(feature)
183
182
 
184
183
  skip_features << feature
185
184
  end
186
185
 
187
- def skip_optional_feature?(feature)
188
- raise ArgumentError, "Unknown feature: #{feature}" unless OPTIONAL_FEATURES.include?(feature)
186
+ def skip_default_feature?(feature)
187
+ raise ArgumentError, "Unknown feature: #{feature}" unless skippable_features.include?(feature)
189
188
 
190
189
  skip_features.include?(feature)
191
190
  end
192
191
 
193
192
  def to_args # rubocop:disable Metrics/PerceivedComplexity
194
193
  [].tap do |args|
195
- args << "--edge" if edge?
194
+ args.push(*version.args)
196
195
  args << "--api" if api?
197
196
  args << "--skip-active-record" if skip_active_record?
198
197
  args << "--skip-asset-pipeline" if skip_asset_pipeline?
199
198
  args << "--skip-javascript" if skip_javascript?
200
199
  args << "--skip-test" if skip_test?
201
200
  args << "--skip-system-test" if skip_system_test?
202
- args << "--asset-pipeline=#{asset_pipeline}" if asset_pipeline
201
+ args << "--asset-pipeline=#{asset_pipeline}" if asset_pipeline && asset_pipeline != asset_pipelines.keys.first
203
202
  args << "--database=#{database}" if database
204
203
  args << "--css=#{css}" if css
205
204
  args << "--javascript=#{javascript}" if javascript
206
- args << "--devcontainer" if @devcontainer
207
- args.push(*skip_features.map { "--skip-#{_1.tr("_", "-")}" })
205
+ args.push(*enable_features.map { "--#{_1.to_s.tr("_", "-")}" })
206
+ args.push(*skip_features.map { "--skip-#{_1.to_s.tr("_", "-")}" })
208
207
  end
209
208
  end
210
209
 
211
210
  private
212
211
 
213
- attr_reader :skip_features
212
+ attr_reader :enable_features, :skip_features, :version
213
+
214
+ def skippable_features
215
+ FRAMEWORKS + default_features.keys
216
+ end
214
217
  end
215
218
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open-uri"
4
+ require "rails/version"
5
+ require "yaml"
6
+
7
+ module Nextgen
8
+ RailsVersion = Struct.new(
9
+ :args,
10
+ :label,
11
+ :asset_pipelines,
12
+ :databases,
13
+ :default_features,
14
+ :optional_features,
15
+ keyword_init: true
16
+ )
17
+
18
+ class << RailsVersion
19
+ def current
20
+ from_yaml(:current) do |version|
21
+ version.label.sub!("%%CURRENT_VERSION%%") { ::Rails.version }
22
+ end
23
+ end
24
+
25
+ def edge
26
+ from_yaml(:edge)
27
+ end
28
+
29
+ def main
30
+ from_yaml(:main) do |version|
31
+ version.label.sub!("%%MAIN_VERSION%%") { main_version }
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def from_yaml(key)
38
+ @yaml ||= begin
39
+ yaml_path = File.expand_path("../../config/rails_versions.yml", __dir__)
40
+ YAML.load_file(yaml_path, aliases: true, symbolize_names: true)
41
+ end
42
+ new(**@yaml.fetch(key)).tap do |version|
43
+ yield(version) if block_given?
44
+ end.freeze
45
+ end
46
+
47
+ def main_version
48
+ @main_version ||= begin
49
+ version_rb = URI.open("https://raw.githubusercontent.com/rails/rails/main/version.rb").read
50
+ version_pattern = /\s+MAJOR\s+= (\d+)\n\s*MINOR\s+= (\d+)\n\s*TINY\s+= (\d+)\n\s*PRE\s+= "(\w+)"/
51
+ version_rb.match(version_pattern)&.captures&.join(".")
52
+ rescue OpenURI::HTTPError
53
+ "unknown"
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nextgen
4
- VERSION = "0.23.0"
4
+ VERSION = "0.25.0"
5
5
  end
@@ -68,6 +68,8 @@ PreCommit:
68
68
  enabled: true
69
69
  required_executable: npx
70
70
  command: ["npx", "--no-install", "stylelint"]
71
+ env:
72
+ NODE_OPTIONS: --no-deprecation
71
73
  include:
72
74
  - app/assets/**/*.css
73
75
  - app/components/**/*.css
data/template/bin/setup CHANGED
@@ -11,7 +11,7 @@ def setup!
11
11
  run "bin/rails db:prepare" if database_present?
12
12
  run "yarn install --check-files" if yarn_needed?
13
13
  run "bin/rails tmp:create" if tmp_missing?
14
- run "bin/rails restart"
14
+ run "bin/rails restart" if pid_present?
15
15
 
16
16
  if git_safe_needed?
17
17
  say_status :notice,
@@ -56,6 +56,10 @@ def tmp_missing?
56
56
  !Dir.exist?("tmp/pids")
57
57
  end
58
58
 
59
+ def pid_present?
60
+ Dir["tmp/pids/*.pid"].any?
61
+ end
62
+
59
63
  def git_safe_needed?
60
64
  ENV["PATH"].include?(".git/safe/../../bin") && !Dir.exist?(".git/safe")
61
65
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nextgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.0
4
+ version: 0.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Brictson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-16 00:00:00.000000000 Z
11
+ date: 2024-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -92,6 +92,7 @@ files:
92
92
  - LICENSE.txt
93
93
  - README.md
94
94
  - config/generators.yml
95
+ - config/rails_versions.yml
95
96
  - exe/nextgen
96
97
  - lib/nextgen.rb
97
98
  - lib/nextgen/actions.rb
@@ -139,8 +140,9 @@ files:
139
140
  - lib/nextgen/generators/tomo.rb
140
141
  - lib/nextgen/generators/vcr.rb
141
142
  - lib/nextgen/generators/vite.rb
142
- - lib/nextgen/rails.rb
143
+ - lib/nextgen/rails_command.rb
143
144
  - lib/nextgen/rails_options.rb
145
+ - lib/nextgen/rails_version.rb
144
146
  - lib/nextgen/thor_extensions.rb
145
147
  - lib/nextgen/tidy_gemfile.rb
146
148
  - lib/nextgen/version.rb
@@ -224,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
226
  - !ruby/object:Gem::Version
225
227
  version: '0'
226
228
  requirements: []
227
- rubygems_version: 3.5.16
229
+ rubygems_version: 3.5.19
228
230
  signing_key:
229
231
  specification_version: 4
230
232
  summary: Generate your next Rails app interactively!