railties 5.2.8.1 → 6.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +405 -145
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.rdoc +38 -32
  5. data/README.rdoc +3 -3
  6. data/lib/minitest/rails_plugin.rb +7 -11
  7. data/lib/rails/all.rb +4 -0
  8. data/lib/rails/api/generator.rb +2 -1
  9. data/lib/rails/api/task.rb +18 -1
  10. data/lib/rails/app_loader.rb +2 -2
  11. data/lib/rails/app_updater.rb +3 -1
  12. data/lib/rails/application/bootstrap.rb +4 -12
  13. data/lib/rails/application/configuration.rb +118 -13
  14. data/lib/rails/application/default_middleware_stack.rb +4 -2
  15. data/lib/rails/application/dummy_erb_compiler.rb +18 -0
  16. data/lib/rails/application/finisher.rb +54 -0
  17. data/lib/rails/application/routes_reloader.rb +0 -1
  18. data/lib/rails/application.rb +87 -39
  19. data/lib/rails/application_controller.rb +0 -1
  20. data/lib/rails/autoloaders.rb +48 -0
  21. data/lib/rails/backtrace_cleaner.rb +5 -17
  22. data/lib/rails/code_statistics.rb +5 -3
  23. data/lib/rails/command/base.rb +12 -4
  24. data/lib/rails/command/behavior.rb +8 -49
  25. data/lib/rails/command/environment_argument.rb +8 -15
  26. data/lib/rails/command/spellchecker.rb +57 -0
  27. data/lib/rails/command.rb +11 -10
  28. data/lib/rails/commands/console/console_command.rb +6 -0
  29. data/lib/rails/commands/credentials/USAGE +19 -1
  30. data/lib/rails/commands/credentials/credentials_command.rb +52 -19
  31. data/lib/rails/commands/db/system/change/change_command.rb +20 -0
  32. data/lib/rails/commands/dbconsole/dbconsole_command.rb +20 -8
  33. data/lib/rails/commands/dev/dev_command.rb +19 -0
  34. data/lib/rails/commands/encrypted/USAGE +1 -1
  35. data/lib/rails/commands/encrypted/encrypted_command.rb +2 -2
  36. data/lib/rails/commands/help/help_command.rb +1 -1
  37. data/lib/rails/commands/initializers/initializers_command.rb +23 -0
  38. data/lib/rails/commands/new/new_command.rb +2 -2
  39. data/lib/rails/commands/notes/notes_command.rb +39 -0
  40. data/lib/rails/commands/plugin/plugin_command.rb +1 -1
  41. data/lib/rails/commands/routes/routes_command.rb +37 -0
  42. data/lib/rails/commands/runner/runner_command.rb +13 -9
  43. data/lib/rails/commands/secrets/USAGE +3 -3
  44. data/lib/rails/commands/secrets/secrets_command.rb +3 -3
  45. data/lib/rails/commands/server/server_command.rb +113 -50
  46. data/lib/rails/configuration.rb +14 -15
  47. data/lib/rails/engine/configuration.rb +5 -2
  48. data/lib/rails/engine.rb +25 -18
  49. data/lib/rails/gem_version.rb +4 -4
  50. data/lib/rails/generators/actions/create_migration.rb +0 -1
  51. data/lib/rails/generators/actions.rb +52 -40
  52. data/lib/rails/generators/app_base.rb +54 -95
  53. data/lib/rails/generators/app_name.rb +50 -0
  54. data/lib/rails/generators/base.rb +3 -3
  55. data/lib/rails/generators/database.rb +58 -0
  56. data/lib/rails/generators/erb/mailer/mailer_generator.rb +1 -2
  57. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +0 -1
  58. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +6 -3
  59. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +1 -1
  60. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +9 -1
  61. data/lib/rails/generators/erb.rb +0 -1
  62. data/lib/rails/generators/generated_attribute.rb +53 -28
  63. data/lib/rails/generators/migration.rb +1 -2
  64. data/lib/rails/generators/model_helpers.rb +8 -1
  65. data/lib/rails/generators/named_base.rb +2 -6
  66. data/lib/rails/generators/rails/app/app_generator.rb +39 -75
  67. data/lib/rails/generators/rails/app/templates/Gemfile.tt +8 -11
  68. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -3
  69. data/lib/rails/generators/rails/app/templates/app/{assets/javascripts/cable.js.tt → javascript/channels/consumer.js} +2 -9
  70. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +5 -0
  71. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +23 -0
  72. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +5 -0
  73. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +4 -4
  74. data/lib/rails/generators/rails/app/templates/bin/setup.tt +7 -7
  75. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +2 -0
  76. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +1 -1
  77. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +2 -2
  78. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +2 -2
  79. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  80. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  81. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +3 -3
  82. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +1 -1
  83. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +4 -4
  84. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  85. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +6 -6
  86. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +1 -1
  87. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +2 -2
  88. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +5 -2
  89. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +28 -12
  90. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +14 -6
  91. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  92. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +7 -0
  93. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_0.rb.tt +45 -0
  94. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +1 -1
  95. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +4 -3
  96. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +1 -1
  97. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +6 -6
  98. data/lib/rails/generators/rails/app/templates/gitignore.tt +8 -7
  99. data/lib/rails/generators/rails/app/templates/package.json.tt +7 -1
  100. data/lib/rails/generators/rails/app/templates/public/robots.txt +1 -1
  101. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
  102. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +11 -0
  103. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +7 -0
  104. data/lib/rails/generators/rails/assets/USAGE +1 -4
  105. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -1
  106. data/lib/rails/generators/rails/controller/controller_generator.rb +10 -1
  107. data/lib/rails/generators/rails/credentials/credentials_generator.rb +7 -8
  108. data/lib/rails/generators/rails/db/system/change/change_generator.rb +65 -0
  109. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +10 -7
  110. data/lib/rails/generators/rails/generator/generator_generator.rb +0 -1
  111. data/lib/rails/generators/rails/helper/helper_generator.rb +5 -0
  112. data/lib/rails/generators/rails/plugin/plugin_generator.rb +9 -34
  113. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +1 -1
  114. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +1 -1
  115. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +1 -1
  116. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +1 -1
  117. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
  118. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +2 -1
  119. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +1 -1
  120. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +1 -1
  121. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +1 -2
  122. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +13 -0
  123. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -1
  124. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +1 -1
  125. data/lib/rails/generators/resource_helpers.rb +1 -6
  126. data/lib/rails/generators/test_unit/generator/generator_generator.rb +0 -1
  127. data/lib/rails/generators/test_unit/integration/integration_generator.rb +5 -0
  128. data/lib/rails/generators/test_unit/job/job_generator.rb +5 -0
  129. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +1 -1
  130. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
  131. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +8 -4
  132. data/lib/rails/generators/test_unit/system/system_generator.rb +5 -0
  133. data/lib/rails/generators/testing/behaviour.rb +3 -1
  134. data/lib/rails/generators.rb +11 -11
  135. data/lib/rails/info.rb +3 -3
  136. data/lib/rails/info_controller.rb +1 -2
  137. data/lib/rails/mailers_controller.rb +7 -4
  138. data/lib/rails/paths.rb +18 -10
  139. data/lib/rails/rack/logger.rb +1 -2
  140. data/lib/rails/railtie/configurable.rb +0 -1
  141. data/lib/rails/railtie/configuration.rb +0 -1
  142. data/lib/rails/railtie.rb +2 -3
  143. data/lib/rails/ruby_version_check.rb +3 -3
  144. data/lib/rails/secrets.rb +0 -1
  145. data/lib/rails/source_annotation_extractor.rb +138 -117
  146. data/lib/rails/tasks/annotations.rake +9 -9
  147. data/lib/rails/tasks/dev.rake +5 -4
  148. data/lib/rails/tasks/framework.rake +6 -2
  149. data/lib/rails/tasks/initializers.rake +5 -4
  150. data/lib/rails/tasks/log.rake +0 -1
  151. data/lib/rails/tasks/routes.rake +4 -26
  152. data/lib/rails/tasks/statistics.rake +4 -0
  153. data/lib/rails/tasks/yarn.rake +1 -1
  154. data/lib/rails/tasks/zeitwerk.rake +69 -0
  155. data/lib/rails/tasks.rb +1 -0
  156. data/lib/rails/templates/rails/welcome/index.html.erb +2 -2
  157. data/lib/rails/test_help.rb +11 -9
  158. data/lib/rails/test_unit/reporter.rb +1 -1
  159. data/lib/rails/test_unit/runner.rb +14 -6
  160. data/lib/rails/test_unit/testing.rake +1 -1
  161. data/lib/rails.rb +5 -0
  162. metadata +35 -22
  163. data/lib/rails/generators/js/assets/assets_generator.rb +0 -15
  164. data/lib/rails/generators/js/assets/templates/javascript.js +0 -2
  165. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +0 -22
  166. data/lib/rails/generators/rails/app/templates/bin/bundle.tt +0 -2
  167. data/lib/rails/generators/rails/app/templates/bin/update.tt +0 -34
  168. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_5_2.rb.tt +0 -38
  169. data/lib/rails/generators/rails/assets/templates/javascript.js +0 -2
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "fileutils"
4
- require "optparse"
5
4
  require "action_dispatch"
6
5
  require "rails"
7
6
  require "active_support/deprecation"
8
7
  require "active_support/core_ext/string/filters"
9
8
  require "rails/dev_caching"
9
+ require "rails/command/environment_argument"
10
10
 
11
11
  module Rails
12
12
  class Server < ::Rack::Server
@@ -22,19 +22,6 @@ module Rails
22
22
  set_environment
23
23
  end
24
24
 
25
- def app
26
- @app ||= begin
27
- app = super
28
- if app.is_a?(Class)
29
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
30
- Using `Rails::Application` subclass to start the server is deprecated and will be removed in Rails 6.0.
31
- Please change `run #{app}` to `run Rails.application` in config.ru.
32
- MSG
33
- end
34
- app.respond_to?(:to_app) ? app.to_app : app
35
- end
36
- end
37
-
38
25
  def opt_parser
39
26
  Options.new
40
27
  end
@@ -43,18 +30,22 @@ module Rails
43
30
  ENV["RAILS_ENV"] ||= options[:environment]
44
31
  end
45
32
 
46
- def start
47
- print_boot_information
33
+ def start(after_stop_callback = nil)
48
34
  trap(:INT) { exit }
49
35
  create_tmp_directories
50
36
  setup_dev_caching
51
37
  log_to_stdout if options[:log_stdout]
52
38
 
53
- super
39
+ super()
54
40
  ensure
55
- # The '-h' option calls exit before @options is set.
56
- # If we call 'options' with it unset, we get double help banners.
57
- puts "Exiting" unless @options && options[:daemonize]
41
+ after_stop_callback.call if after_stop_callback
42
+ end
43
+
44
+ def serveable? # :nodoc:
45
+ server
46
+ true
47
+ rescue LoadError, NameError
48
+ false
58
49
  end
59
50
 
60
51
  def middleware
@@ -65,6 +56,10 @@ module Rails
65
56
  super.merge(@default_options)
66
57
  end
67
58
 
59
+ def served_url
60
+ "#{options[:SSLEnable] ? 'https' : 'http'}://#{options[:Host]}:#{options[:Port]}" unless use_puma?
61
+ end
62
+
68
63
  private
69
64
  def setup_dev_caching
70
65
  if options[:environment] == "development"
@@ -72,13 +67,6 @@ module Rails
72
67
  end
73
68
  end
74
69
 
75
- def print_boot_information
76
- url = "on #{options[:SSLEnable] ? 'https' : 'http'}://#{options[:Host]}:#{options[:Port]}" unless use_puma?
77
- puts "=> Booting #{ActiveSupport::Inflector.demodulize(server)}"
78
- puts "=> Rails #{Rails.version} application starting in #{Rails.env} #{url}"
79
- puts "=> Run `rails server -h` for more startup options"
80
- end
81
-
82
70
  def create_tmp_directories
83
71
  %w(cache pids sockets).each do |dir_to_make|
84
72
  FileUtils.mkdir_p(File.join(Rails.root, "tmp", dir_to_make))
@@ -97,10 +85,6 @@ module Rails
97
85
  end
98
86
  end
99
87
 
100
- def restart_command
101
- "bin/rails server #{ARGV.join(' ')}"
102
- end
103
-
104
88
  def use_puma?
105
89
  server.to_s == "Rack::Handler::Puma"
106
90
  end
@@ -108,8 +92,16 @@ module Rails
108
92
 
109
93
  module Command
110
94
  class ServerCommand < Base # :nodoc:
95
+ include EnvironmentArgument
96
+
97
+ # Hard-coding a bunch of handlers here as we don't have a public way of
98
+ # querying them from the Rack::Handler registry.
99
+ RACK_SERVERS = %w(cgi fastcgi webrick lsws scgi thin puma unicorn)
100
+
111
101
  DEFAULT_PORT = 3000
112
- DEFAULT_PID_PATH = "tmp/pids/server.pid".freeze
102
+ DEFAULT_PID_PATH = "tmp/pids/server.pid"
103
+
104
+ argument :using, optional: true
113
105
 
114
106
  class_option :port, aliases: "-p", type: :numeric,
115
107
  desc: "Runs Rails on the specified port - defaults to 3000.", banner: :port
@@ -120,31 +112,42 @@ module Rails
120
112
  desc: "Uses a custom rackup configuration.", banner: :file
121
113
  class_option :daemon, aliases: "-d", type: :boolean, default: false,
122
114
  desc: "Runs server as a Daemon."
123
- class_option :environment, aliases: "-e", type: :string,
124
- desc: "Specifies the environment to run this server under (development/test/production).", banner: :name
115
+ class_option :using, aliases: "-u", type: :string,
116
+ desc: "Specifies the Rack server used to run the application (thin/puma/webrick).", banner: :name
125
117
  class_option :pid, aliases: "-P", type: :string, default: DEFAULT_PID_PATH,
126
118
  desc: "Specifies the PID file."
127
- class_option "dev-caching", aliases: "-C", type: :boolean, default: nil,
119
+ class_option :dev_caching, aliases: "-C", type: :boolean, default: nil,
128
120
  desc: "Specifies whether to perform caching in development."
129
- class_option "restart", type: :boolean, default: nil, hide: true
130
- class_option "early_hints", type: :boolean, default: nil, desc: "Enables HTTP/2 early hints."
121
+ class_option :restart, type: :boolean, default: nil, hide: true
122
+ class_option :early_hints, type: :boolean, default: nil, desc: "Enables HTTP/2 early hints."
123
+ class_option :log_to_stdout, type: :boolean, default: nil, optional: true,
124
+ desc: "Whether to log to stdout. Enabled by default in development when not daemonized."
131
125
 
132
- def initialize(args = [], local_options = {}, config = {})
133
- @original_options = local_options
126
+ def initialize(args, local_options, *)
134
127
  super
135
- @server = self.args.shift
136
- @log_stdout = options[:daemon].blank? && (options[:environment] || Rails.env) == "development"
128
+
129
+ @original_options = local_options - %w( --restart )
130
+ deprecate_positional_rack_server_and_rewrite_to_option(@original_options)
137
131
  end
138
132
 
139
133
  def perform
134
+ extract_environment_option_from_argument
140
135
  set_application_directory!
141
136
  prepare_restart
137
+
142
138
  Rails::Server.new(server_options).tap do |server|
143
139
  # Require application after server sets environment to propagate
144
140
  # the --environment option.
145
141
  require APP_PATH
146
142
  Dir.chdir(Rails.application.root)
147
- server.start
143
+
144
+ if server.serveable?
145
+ print_boot_information(server.server, server.served_url)
146
+ after_stop_callback = -> { say "Exiting" unless options[:daemon] }
147
+ server.start(after_stop_callback)
148
+ else
149
+ say rack_server_suggestion(using)
150
+ end
148
151
  end
149
152
  end
150
153
 
@@ -152,8 +155,8 @@ module Rails
152
155
  def server_options
153
156
  {
154
157
  user_supplied_options: user_supplied_options,
155
- server: @server,
156
- log_stdout: @log_stdout,
158
+ server: using,
159
+ log_stdout: log_to_stdout?,
157
160
  Port: port,
158
161
  Host: host,
159
162
  DoNotReverseLookup: true,
@@ -161,7 +164,7 @@ module Rails
161
164
  environment: environment,
162
165
  daemonize: options[:daemon],
163
166
  pid: pid,
164
- caching: options["dev-caching"],
167
+ caching: options[:dev_caching],
165
168
  restart_cmd: restart_command,
166
169
  early_hints: early_hints
167
170
  }
@@ -194,7 +197,7 @@ module Rails
194
197
  name = :Port
195
198
  when :binding
196
199
  name = :Host
197
- when :"dev-caching"
200
+ when :dev_caching
198
201
  name = :caching
199
202
  when :daemonize
200
203
  name = :daemon
@@ -202,7 +205,7 @@ module Rails
202
205
  user_supplied_options << name
203
206
  end
204
207
  end
205
- user_supplied_options << :Host if ENV["HOST"]
208
+ user_supplied_options << :Host if ENV["HOST"] || ENV["BINDING"]
206
209
  user_supplied_options << :Port if ENV["PORT"]
207
210
  user_supplied_options.uniq
208
211
  end
@@ -217,7 +220,17 @@ module Rails
217
220
  options[:binding]
218
221
  else
219
222
  default_host = environment == "development" ? "localhost" : "0.0.0.0"
220
- ENV.fetch("HOST", default_host)
223
+
224
+ if ENV["HOST"] && !ENV["BINDING"]
225
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
226
+ Using the `HOST` environment variable to specify the IP is deprecated and will be removed in Rails 6.1.
227
+ Please use `BINDING` environment variable instead.
228
+ MSG
229
+
230
+ return ENV["HOST"]
231
+ end
232
+
233
+ ENV.fetch("BINDING", default_host)
221
234
  end
222
235
  end
223
236
 
@@ -226,24 +239,74 @@ module Rails
226
239
  end
227
240
 
228
241
  def restart_command
229
- "bin/rails server #{@server} #{@original_options.join(" ")} --restart"
242
+ "bin/rails server #{@original_options.join(" ")} --restart"
230
243
  end
231
244
 
232
245
  def early_hints
233
246
  options[:early_hints]
234
247
  end
235
248
 
249
+ def log_to_stdout?
250
+ options.fetch(:log_to_stdout) do
251
+ options[:daemon].blank? && environment == "development"
252
+ end
253
+ end
254
+
236
255
  def pid
237
256
  File.expand_path(options[:pid])
238
257
  end
239
258
 
240
259
  def self.banner(*)
241
- "rails server [puma, thin etc] [options]"
260
+ "rails server -u [thin/puma/webrick] [options]"
242
261
  end
243
262
 
244
263
  def prepare_restart
245
264
  FileUtils.rm_f(options[:pid]) if options[:restart]
246
265
  end
266
+
267
+ def deprecate_positional_rack_server_and_rewrite_to_option(original_options)
268
+ if using
269
+ ActiveSupport::Deprecation.warn(<<~MSG.squish)
270
+ Passing the Rack server name as a regular argument is deprecated
271
+ and will be removed in the next Rails version. Please, use the -u
272
+ option instead.
273
+ MSG
274
+
275
+ original_options.concat [ "-u", using ]
276
+ else
277
+ # Use positional internally to get around Thor's immutable options.
278
+ # TODO: Replace `using` occurrences with `options[:using]` after deprecation removal.
279
+ @using = options[:using]
280
+ end
281
+ end
282
+
283
+ def rack_server_suggestion(server)
284
+ if server.in?(RACK_SERVERS)
285
+ <<~MSG
286
+ Could not load server "#{server}". Maybe you need to the add it to the Gemfile?
287
+
288
+ gem "#{server}"
289
+
290
+ Run `rails server --help` for more options.
291
+ MSG
292
+ else
293
+ suggestion = Rails::Command::Spellchecker.suggest(server, from: RACK_SERVERS)
294
+ suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion
295
+
296
+ <<~MSG
297
+ Could not find server "#{server}". #{suggestion_msg}
298
+ Run `rails server --help` for more options.
299
+ MSG
300
+ end
301
+ end
302
+
303
+ def print_boot_information(server, url)
304
+ say <<~MSG
305
+ => Booting #{ActiveSupport::Inflector.demodulize(server)}
306
+ => Rails #{Rails.version} application starting in #{Rails.env} #{url}
307
+ => Run `rails server --help` for more startup options
308
+ MSG
309
+ end
247
310
  end
248
311
  end
249
312
  end
@@ -41,34 +41,39 @@ module Rails
41
41
  end
42
42
 
43
43
  def insert_before(*args, &block)
44
- @operations << [__method__, args, block]
44
+ @operations << -> middleware { middleware.send(__method__, *args, &block) }
45
45
  end
46
+ ruby2_keywords(:insert_before) if respond_to?(:ruby2_keywords, true)
46
47
 
47
48
  alias :insert :insert_before
48
49
 
49
50
  def insert_after(*args, &block)
50
- @operations << [__method__, args, block]
51
+ @operations << -> middleware { middleware.send(__method__, *args, &block) }
51
52
  end
53
+ ruby2_keywords(:insert_after) if respond_to?(:ruby2_keywords, true)
52
54
 
53
55
  def swap(*args, &block)
54
- @operations << [__method__, args, block]
56
+ @operations << -> middleware { middleware.send(__method__, *args, &block) }
55
57
  end
58
+ ruby2_keywords(:swap) if respond_to?(:ruby2_keywords, true)
56
59
 
57
60
  def use(*args, &block)
58
- @operations << [__method__, args, block]
61
+ @operations << -> middleware { middleware.send(__method__, *args, &block) }
59
62
  end
63
+ ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true)
60
64
 
61
65
  def delete(*args, &block)
62
- @delete_operations << [__method__, args, block]
66
+ @delete_operations << -> middleware { middleware.send(__method__, *args, &block) }
63
67
  end
64
68
 
65
69
  def unshift(*args, &block)
66
- @operations << [__method__, args, block]
70
+ @operations << -> middleware { middleware.send(__method__, *args, &block) }
67
71
  end
72
+ ruby2_keywords(:unshift) if respond_to?(:ruby2_keywords, true)
68
73
 
69
74
  def merge_into(other) #:nodoc:
70
- (@operations + @delete_operations).each do |operation, args, block|
71
- other.send(operation, *args, &block)
75
+ (@operations + @delete_operations).each do |operation|
76
+ operation.call(other)
72
77
  end
73
78
 
74
79
  other
@@ -79,13 +84,7 @@ module Rails
79
84
  end
80
85
 
81
86
  protected
82
- def operations
83
- @operations
84
- end
85
-
86
- def delete_operations
87
- @delete_operations
88
- end
87
+ attr_reader :operations, :delete_operations
89
88
  end
90
89
 
91
90
  class Generators #:nodoc:
@@ -6,7 +6,7 @@ module Rails
6
6
  class Engine
7
7
  class Configuration < ::Rails::Railtie::Configuration
8
8
  attr_reader :root
9
- attr_accessor :middleware
9
+ attr_accessor :middleware, :javascript_path
10
10
  attr_writer :eager_load_paths, :autoload_once_paths, :autoload_paths
11
11
 
12
12
  def initialize(root = nil)
@@ -14,6 +14,7 @@ module Rails
14
14
  @root = root
15
15
  @generators = app_generators.dup
16
16
  @middleware = Rails::Configuration::MiddlewareStackProxy.new
17
+ @javascript_path = "javascript"
17
18
  end
18
19
 
19
20
  # Holds generators configuration:
@@ -38,7 +39,9 @@ module Rails
38
39
  @paths ||= begin
39
40
  paths = Rails::Paths::Root.new(@root)
40
41
 
41
- paths.add "app", eager_load: true, glob: "{*,*/concerns}"
42
+ paths.add "app", eager_load: true,
43
+ glob: "{*,*/concerns}",
44
+ exclude: ["assets", javascript_path]
42
45
  paths.add "app/assets", glob: "*"
43
46
  paths.add "app/controllers", eager_load: true
44
47
  paths.add "app/channels", eager_load: true, glob: "**/*_channel.rb"
data/lib/rails/engine.rb CHANGED
@@ -230,7 +230,7 @@ module Rails
230
230
  #
231
231
  # If +MyEngine+ is isolated, The routes above will point to
232
232
  # <tt>MyEngine::ArticlesController</tt>. You also don't need to use longer
233
- # url helpers like +my_engine_articles_path+. Instead, you should simply use
233
+ # URL helpers like +my_engine_articles_path+. Instead, you should simply use
234
234
  # +articles_path+, like you would do with your main application.
235
235
  #
236
236
  # To make this behavior consistent with other parts of the framework,
@@ -238,7 +238,7 @@ module Rails
238
238
  # normal Rails app, when you use a namespaced model such as
239
239
  # <tt>Namespace::Article</tt>, <tt>ActiveModel::Naming</tt> will generate
240
240
  # names with the prefix "namespace". In an isolated engine, the prefix will
241
- # be omitted in url helpers and form fields, for convenience.
241
+ # be omitted in URL helpers and form fields, for convenience.
242
242
  #
243
243
  # polymorphic_url(MyEngine::Article.new)
244
244
  # # => "articles_path" # not "my_engine_articles_path"
@@ -286,11 +286,11 @@ module Rails
286
286
  # Note that the <tt>:as</tt> option given to mount takes the <tt>engine_name</tt> as default, so most of the time
287
287
  # you can simply omit it.
288
288
  #
289
- # Finally, if you want to generate a url to an engine's route using
289
+ # Finally, if you want to generate a URL to an engine's route using
290
290
  # <tt>polymorphic_url</tt>, you also need to pass the engine helper. Let's
291
291
  # say that you want to create a form pointing to one of the engine's routes.
292
292
  # All you need to do is pass the helper as the first element in array with
293
- # attributes for url:
293
+ # attributes for URL:
294
294
  #
295
295
  # form_for([my_engine, @user])
296
296
  #
@@ -469,13 +469,16 @@ module Rails
469
469
  self
470
470
  end
471
471
 
472
- # Eager load the application by loading all ruby
473
- # files inside eager_load paths.
474
472
  def eager_load!
473
+ # Already done by Zeitwerk::Loader.eager_load_all. We need this guard to
474
+ # easily provide a compatible API for both zeitwerk and classic modes.
475
+ return if Rails.autoloaders.zeitwerk_enabled?
476
+
475
477
  config.eager_load_paths.each do |load_path|
476
- matcher = /\A#{Regexp.escape(load_path.to_s)}\/(.*)\.rb\Z/
478
+ # Starts after load_path plus a slash, ends before ".rb".
479
+ relname_range = (load_path.to_s.length + 1)...-3
477
480
  Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
478
- require_dependency file.sub(matcher, '\1')
481
+ require_dependency file[relname_range]
479
482
  end
480
483
  end
481
484
  end
@@ -550,16 +553,15 @@ module Rails
550
553
  seed_file = paths["db/seeds.rb"].existent.first
551
554
  return unless seed_file
552
555
 
553
- if config.try(:active_job).try!(:queue_adapter) == :async
556
+ if config.try(:active_job)&.queue_adapter == :async
554
557
  with_inline_jobs { load(seed_file) }
555
558
  else
556
559
  load(seed_file)
557
560
  end
558
561
  end
559
562
 
560
- # Add configured load paths to Ruby's load path, and remove duplicate entries.
561
- initializer :set_load_path, before: :bootstrap_hook do
562
- _all_load_paths.reverse_each do |path|
563
+ initializer :set_load_path, before: :bootstrap_hook do |app|
564
+ _all_load_paths(app.config.add_autoload_paths_to_load_path).reverse_each do |path|
563
565
  $LOAD_PATH.unshift(path) if File.directory?(path)
564
566
  end
565
567
  $LOAD_PATH.uniq!
@@ -574,12 +576,15 @@ module Rails
574
576
  ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths)
575
577
  ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths)
576
578
 
577
- # Freeze so future modifications will fail rather than do nothing mysteriously
578
579
  config.autoload_paths.freeze
579
- config.eager_load_paths.freeze
580
580
  config.autoload_once_paths.freeze
581
581
  end
582
582
 
583
+ initializer :set_eager_load_paths, before: :bootstrap_hook do
584
+ ActiveSupport::Dependencies._eager_load_paths.merge(config.eager_load_paths)
585
+ config.eager_load_paths.freeze
586
+ end
587
+
583
588
  initializer :add_routing_paths do |app|
584
589
  routing_paths = paths["config/routes.rb"].existent
585
590
 
@@ -650,14 +655,12 @@ module Rails
650
655
  end
651
656
 
652
657
  protected
653
-
654
658
  def run_tasks_blocks(*) #:nodoc:
655
659
  super
656
660
  paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
657
661
  end
658
662
 
659
663
  private
660
-
661
664
  def load_config_initializer(initializer) # :doc:
662
665
  ActiveSupport::Notifications.instrument("load_config_initializer.railties", initializer: initializer) do
663
666
  load(initializer)
@@ -704,8 +707,12 @@ module Rails
704
707
  @_all_autoload_paths ||= (config.autoload_paths + config.eager_load_paths + config.autoload_once_paths).uniq
705
708
  end
706
709
 
707
- def _all_load_paths
708
- @_all_load_paths ||= (config.paths.load_paths + _all_autoload_paths).uniq
710
+ def _all_load_paths(add_autoload_paths_to_load_path)
711
+ @_all_load_paths ||= begin
712
+ load_paths = config.paths.load_paths
713
+ load_paths += _all_autoload_paths if add_autoload_paths_to_load_path
714
+ load_paths.uniq
715
+ end
709
716
  end
710
717
 
711
718
  def build_request(env)
@@ -7,10 +7,10 @@ module Rails
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 5
11
- MINOR = 2
12
- TINY = 8
13
- PRE = "1"
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 6
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -40,7 +40,6 @@ module Rails
40
40
  alias :exists? :existing_migration
41
41
 
42
42
  private
43
-
44
43
  def on_conflict_behavior # :doc:
45
44
  options = base.options.merge(config)
46
45
  if identical?