nextgen 0.22.0 → 0.24.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: ab42df3afedd51d12bad9ba602f2cc8d6f1ab94af01305c6c7beac8ed6430f42
4
- data.tar.gz: 3c1956f80e9780ce64813080ee27e377821f28fdecc8ab54d1a92610ef7ad9a7
3
+ metadata.gz: 5e8c4dd4b29b2e8afac9f923b72b56daf86a73e5bae75285b2af1b604ccc45c0
4
+ data.tar.gz: 8fafac6254aa48ccc290f303e02012d906de34e947f2c32e4f9245e8d34e76d9
5
5
  SHA512:
6
- metadata.gz: 20a0a482b9c6abc27a2394573a70ebdf40f68222718afdf3a0605769af67c3718168da5a288520334219c4ebeb2ea9231e478ff4d55e9f157e8a9e771af71f64
7
- data.tar.gz: 5a9d0e288814f314093cacf5919e683c531083baa16f511ef35d9ba6d18e1daf0134201dae8b98587a75adb3e923653cdf21e35e01aeff9851d0bab2aa4e5199
6
+ metadata.gz: 2ee5135257dfcb2096400b1ab15ce501108817606ee30b00bcfb42505106a49a3e0a8fe3fcbbe4543c3d5a01873dada585b3a40861788248b35f44bcf0cabe82
7
+ data.tar.gz: 0c9ed43018047dabb368c64190fe65136675a622c49735b1b8f156d21915cf977e3449ab57cf89c19ed67f14592a7ac82f4d5743e803f9cc73a081f9a71e634c
@@ -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,57 @@
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
+ sprockets: Sprockets
36
+ databases:
37
+ sqlite3: SQLite3 (default)
38
+ postgresql: PostgreSQL (recommended)
39
+ mysql: MySQL
40
+ trilogy: Trilogy
41
+ oracle: Oracle
42
+ sqlserver: SQLServer
43
+ jdbcmysql: JDBCMySQL
44
+ jdbcsqlite3: JDBCSQLite3
45
+ jdbcpostgresql: JDBCPostgreSQL
46
+ jdbc: JDBC
47
+ mariadb-mysql: MariaDB-MySQL
48
+ mariadb-trilogy: MariaDB-Trilogy
49
+ default_features:
50
+ brakeman: Brakeman
51
+ ci: GitHub Actions CI
52
+ kamal: Kamal
53
+ rubocop: RuboCop
54
+ solid: Solid Cache+Queue
55
+ thruster: Thruster
56
+ optional_features:
57
+ 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"
@@ -117,7 +117,8 @@ say_git "Remove sprockets"
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
- gsub_file "app/views/layouts/application.html.erb", /^.*<%= stylesheet_link_tag.*$/, ""
120
+ gsub_file "app/views/layouts/application.html.erb", /^.*<%= javascript_include_tag.*\n/, ""
121
+ gsub_file "app/views/layouts/application.html.erb", /^.*<%= stylesheet_link_tag.*\n/, ""
121
122
  remove_gem "sprockets-rails"
122
123
 
123
124
  if File.exist?(".github/workflows/ci.yml")
@@ -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,28 +155,43 @@ 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?
@@ -203,13 +202,17 @@ module Nextgen
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.22.0"
4
+ VERSION = "0.24.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
@@ -8,4 +8,4 @@ These environment variables affect how the app functions when deployed in produc
8
8
  - `RAILS_ENV` **REQUIRED** - "production"
9
9
  - `RAILS_MAX_THREADS` - Number of threads per Puma process (default: 3)
10
10
  - `SECRET_KEY_BASE` **REQUIRED** - Unique, secret key used to encrypt and sign cookies and other sensitive data
11
- - `WEB_CONCURRENCY` - Number of Puma processes (default: number of CPUs)
11
+ - `WEB_CONCURRENCY` - Number of Puma processes (default: 1)
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
@@ -3,4 +3,6 @@
3
3
  return unless Gem.loaded_specs.key?("rubocop")
4
4
 
5
5
  require "rubocop/rake_task"
6
- RuboCop::RakeTask.new
6
+ RuboCop::RakeTask.new(:rubocop) do |task|
7
+ task.options.push "-c", ".rubocop.yml"
8
+ 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.22.0
4
+ version: 0.24.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-07 00:00:00.000000000 Z
11
+ date: 2024-09-17 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