railties 6.1.6 → 7.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +626 -259
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +5 -6
  6. data/lib/minitest/rails_plugin.rb +64 -1
  7. data/lib/rails/all.rb +0 -1
  8. data/lib/rails/api/task.rb +35 -4
  9. data/lib/rails/app_updater.rb +9 -6
  10. data/lib/rails/application/bootstrap.rb +41 -7
  11. data/lib/rails/application/configuration.rb +262 -88
  12. data/lib/rails/application/default_middleware_stack.rb +29 -4
  13. data/lib/rails/application/dummy_config.rb +19 -0
  14. data/lib/rails/application/finisher.rb +89 -124
  15. data/lib/rails/application/routes_reloader.rb +8 -0
  16. data/lib/rails/application.rb +200 -125
  17. data/lib/rails/application_controller.rb +3 -3
  18. data/lib/rails/autoloaders/inflector.rb +21 -0
  19. data/lib/rails/autoloaders.rb +42 -42
  20. data/lib/rails/backtrace_cleaner.rb +1 -1
  21. data/lib/rails/cli.rb +5 -2
  22. data/lib/rails/code_statistics.rb +2 -2
  23. data/lib/rails/code_statistics_calculator.rb +10 -1
  24. data/lib/rails/command/actions.rb +10 -12
  25. data/lib/rails/command/base.rb +61 -45
  26. data/lib/rails/command/behavior.rb +1 -1
  27. data/lib/rails/command/environment_argument.rb +33 -17
  28. data/lib/rails/command/helpers/editor.rb +17 -12
  29. data/lib/rails/command.rb +90 -36
  30. data/lib/rails/commands/about/about_command.rb +14 -0
  31. data/lib/rails/commands/application/application_command.rb +2 -0
  32. data/lib/rails/commands/console/console_command.rb +17 -13
  33. data/lib/rails/commands/credentials/USAGE +53 -53
  34. data/lib/rails/commands/credentials/credentials_command/diffing.rb +31 -19
  35. data/lib/rails/commands/credentials/credentials_command.rb +67 -69
  36. data/lib/rails/commands/db/system/change/change_command.rb +2 -1
  37. data/lib/rails/commands/dbconsole/dbconsole_command.rb +26 -117
  38. data/lib/rails/commands/destroy/destroy_command.rb +3 -2
  39. data/lib/rails/commands/dev/dev_command.rb +1 -6
  40. data/lib/rails/commands/encrypted/USAGE +15 -20
  41. data/lib/rails/commands/encrypted/encrypted_command.rb +46 -35
  42. data/lib/rails/commands/gem_help/USAGE +16 -0
  43. data/lib/rails/commands/gem_help/gem_help_command.rb +13 -0
  44. data/lib/rails/commands/generate/generate_command.rb +2 -2
  45. data/lib/rails/commands/help/USAGE +15 -14
  46. data/lib/rails/commands/help/help_command.rb +21 -2
  47. data/lib/rails/commands/initializers/initializers_command.rb +1 -4
  48. data/lib/rails/commands/middleware/middleware_command.rb +17 -0
  49. data/lib/rails/commands/new/new_command.rb +2 -0
  50. data/lib/rails/commands/notes/notes_command.rb +2 -1
  51. data/lib/rails/commands/plugin/plugin_command.rb +2 -0
  52. data/lib/rails/commands/rake/rake_command.rb +25 -22
  53. data/lib/rails/commands/restart/restart_command.rb +14 -0
  54. data/lib/rails/commands/routes/routes_command.rb +13 -1
  55. data/lib/rails/commands/runner/USAGE +14 -12
  56. data/lib/rails/commands/runner/runner_command.rb +34 -21
  57. data/lib/rails/commands/secret/secret_command.rb +13 -0
  58. data/lib/rails/commands/secrets/USAGE +44 -49
  59. data/lib/rails/commands/secrets/secrets_command.rb +20 -38
  60. data/lib/rails/commands/server/server_command.rb +33 -30
  61. data/lib/rails/commands/test/USAGE +14 -0
  62. data/lib/rails/commands/test/test_command.rb +56 -14
  63. data/lib/rails/commands/unused_routes/unused_routes_command.rb +75 -0
  64. data/lib/rails/commands/version/version_command.rb +1 -0
  65. data/lib/rails/configuration.rb +23 -28
  66. data/lib/rails/console/app.rb +1 -4
  67. data/lib/rails/console/helpers.rb +2 -2
  68. data/lib/rails/deprecator.rb +7 -0
  69. data/lib/rails/engine/configuration.rb +53 -9
  70. data/lib/rails/engine.rb +63 -48
  71. data/lib/rails/gem_version.rb +3 -3
  72. data/lib/rails/generators/actions/create_migration.rb +2 -4
  73. data/lib/rails/generators/actions.rb +231 -73
  74. data/lib/rails/generators/active_model.rb +28 -14
  75. data/lib/rails/generators/app_base.rb +476 -176
  76. data/lib/rails/generators/app_name.rb +3 -14
  77. data/lib/rails/generators/base.rb +24 -20
  78. data/lib/rails/generators/database.rb +39 -1
  79. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
  80. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -0
  81. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +8 -8
  82. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
  83. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
  84. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
  85. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  86. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
  87. data/lib/rails/generators/erb.rb +1 -1
  88. data/lib/rails/generators/generated_attribute.rb +57 -9
  89. data/lib/rails/generators/migration.rb +2 -7
  90. data/lib/rails/generators/model_helpers.rb +3 -2
  91. data/lib/rails/generators/named_base.rb +13 -13
  92. data/lib/rails/generators/rails/app/USAGE +22 -6
  93. data/lib/rails/generators/rails/app/app_generator.rb +113 -114
  94. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
  95. data/lib/rails/generators/rails/app/templates/Gemfile.tt +43 -53
  96. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
  97. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
  98. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +3 -9
  100. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
  101. data/lib/rails/generators/rails/app/templates/bin/rails.tt +1 -4
  102. data/lib/rails/generators/rails/app/templates/bin/rake.tt +0 -3
  103. data/lib/rails/generators/rails/app/templates/bin/setup.tt +16 -12
  104. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +6 -18
  105. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +1 -1
  106. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  107. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  108. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +7 -7
  109. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
  110. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
  111. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  112. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -9
  113. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
  114. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +5 -5
  115. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
  116. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +16 -12
  117. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +38 -61
  118. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +14 -15
  119. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
  120. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
  121. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
  122. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
  123. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
  124. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +283 -0
  125. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -9
  126. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
  127. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +12 -20
  128. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
  129. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
  130. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +6 -4
  131. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
  132. data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
  133. data/lib/rails/generators/rails/app/templates/gitattributes.tt +0 -5
  134. data/lib/rails/generators/rails/app/templates/gitignore.tt +7 -9
  135. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  136. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
  137. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +10 -8
  138. data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
  139. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +2 -1
  140. data/lib/rails/generators/rails/controller/USAGE +12 -4
  141. data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
  142. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
  143. data/lib/rails/generators/rails/credentials/credentials_generator.rb +29 -24
  144. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
  145. data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
  146. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
  147. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
  148. data/lib/rails/generators/rails/migration/USAGE +21 -11
  149. data/lib/rails/generators/rails/model/model_generator.rb +4 -0
  150. data/lib/rails/generators/rails/plugin/USAGE +17 -6
  151. data/lib/rails/generators/rails/plugin/plugin_generator.rb +69 -30
  152. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +7 -3
  153. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +9 -31
  154. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
  155. data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
  156. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
  157. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
  158. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +5 -20
  159. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +0 -7
  160. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
  161. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
  162. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +2 -2
  163. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +6 -11
  164. data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
  165. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
  166. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +1 -1
  167. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -5
  168. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +6 -10
  169. data/lib/rails/generators/resource_helpers.rb +2 -2
  170. data/lib/rails/generators/test_case.rb +2 -2
  171. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +1 -1
  172. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
  173. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -4
  174. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +5 -5
  175. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +7 -7
  176. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
  177. data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +7 -5
  178. data/lib/rails/generators.rb +14 -29
  179. data/lib/rails/health_controller.rb +55 -0
  180. data/lib/rails/info.rb +2 -2
  181. data/lib/rails/info_controller.rb +31 -13
  182. data/lib/rails/initializable.rb +1 -1
  183. data/lib/rails/mailers_controller.rb +17 -9
  184. data/lib/rails/paths.rb +14 -11
  185. data/lib/rails/rack/logger.rb +16 -15
  186. data/lib/rails/rackup/server.rb +15 -0
  187. data/lib/rails/railtie/configuration.rb +15 -3
  188. data/lib/rails/railtie.rb +54 -31
  189. data/lib/rails/ruby_version_check.rb +5 -3
  190. data/lib/rails/secrets.rb +10 -8
  191. data/lib/rails/source_annotation_extractor.rb +68 -19
  192. data/lib/rails/tasks/engine.rake +8 -8
  193. data/lib/rails/tasks/framework.rake +4 -12
  194. data/lib/rails/tasks/log.rake +1 -1
  195. data/lib/rails/tasks/misc.rake +3 -14
  196. data/lib/rails/tasks/statistics.rake +8 -5
  197. data/lib/rails/tasks/tmp.rake +13 -6
  198. data/lib/rails/tasks/yarn.rake +8 -9
  199. data/lib/rails/tasks/zeitwerk.rake +14 -42
  200. data/lib/rails/tasks.rb +0 -2
  201. data/lib/rails/templates/layouts/application.html.erb +15 -0
  202. data/lib/rails/templates/rails/mailers/email.html.erb +45 -11
  203. data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
  204. data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
  205. data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
  206. data/lib/rails/test_help.rb +13 -14
  207. data/lib/rails/test_unit/line_filtering.rb +1 -1
  208. data/lib/rails/test_unit/railtie.rb +0 -4
  209. data/lib/rails/test_unit/reporter.rb +6 -2
  210. data/lib/rails/test_unit/runner.rb +45 -20
  211. data/lib/rails/test_unit/test_parser.rb +88 -0
  212. data/lib/rails/test_unit/testing.rake +18 -43
  213. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  214. data/lib/rails/version.rb +1 -1
  215. data/lib/rails/welcome_controller.rb +1 -0
  216. data/lib/rails/zeitwerk_checker.rb +15 -0
  217. data/lib/rails.rb +26 -15
  218. metadata +74 -42
  219. data/RDOC_MAIN.rdoc +0 -97
  220. data/lib/rails/.DS_Store +0 -0
  221. data/lib/rails/application/dummy_erb_compiler.rb +0 -18
  222. data/lib/rails/command/spellchecker.rb +0 -57
  223. data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
  224. data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
  225. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
  226. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
  227. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
  228. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
  229. data/lib/rails/generators/rails/app/templates/bin/spring.tt +0 -13
  230. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -16
  231. data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
  232. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +0 -8
  233. data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
  234. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb.tt +0 -4
  235. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +0 -67
  236. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +0 -16
  237. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
  238. data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
  239. data/lib/rails/generators/rails/assets/USAGE +0 -16
  240. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
  241. data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
  242. data/lib/rails/generators/rails/model/USAGE +0 -113
  243. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
  244. data/lib/rails/tasks/middleware.rake +0 -9
  245. data/lib/rails/tasks/restart.rake +0 -9
@@ -3,13 +3,12 @@
3
3
  require "fileutils"
4
4
  require "action_dispatch"
5
5
  require "rails"
6
- require "active_support/core_ext/string/filters"
7
- require "active_support/core_ext/symbol/starts_ends_with"
8
6
  require "rails/dev_caching"
9
7
  require "rails/command/environment_argument"
8
+ require "rails/rackup/server"
10
9
 
11
10
  module Rails
12
- class Server < ::Rack::Server
11
+ class Server < Rackup::Server
13
12
  class Options
14
13
  def parse!(args)
15
14
  Rails::Command::ServerCommand.new([], args).server_options
@@ -80,13 +79,13 @@ module Rails
80
79
  console.formatter = Rails.logger.formatter
81
80
  console.level = Rails.logger.level
82
81
 
83
- unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDOUT)
84
- Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
82
+ unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
83
+ Rails.logger.broadcast_to(console)
85
84
  end
86
85
  end
87
86
 
88
87
  def use_puma?
89
- server.to_s == "Rack::Handler::Puma"
88
+ server.to_s.end_with?("Handler::Puma")
90
89
  end
91
90
  end
92
91
 
@@ -94,30 +93,32 @@ module Rails
94
93
  class ServerCommand < Base # :nodoc:
95
94
  include EnvironmentArgument
96
95
 
96
+ RACK_HANDLER_GEMS = %w(cgi webrick scgi thin puma unicorn falcon)
97
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 falcon)
98
+ # querying them from the Rackup::Handler registry.
99
+ RACK_HANDLERS = RACK_HANDLER_GEMS + %w(fastcgi lsws)
100
+ RECOMMENDED_SERVER = "puma"
100
101
 
101
102
  DEFAULT_PORT = 3000
102
103
  DEFAULT_PIDFILE = "tmp/pids/server.pid"
103
104
 
104
105
  class_option :port, aliases: "-p", type: :numeric,
105
- desc: "Runs Rails on the specified port - defaults to 3000.", banner: :port
106
+ desc: "Run Rails on the specified port - defaults to 3000.", banner: :port
106
107
  class_option :binding, aliases: "-b", type: :string,
107
- desc: "Binds Rails to the specified IP - defaults to 'localhost' in development and '0.0.0.0' in other environments'.",
108
+ desc: "Bind Rails to the specified IP - defaults to 'localhost' in development and '0.0.0.0' in other environments'.",
108
109
  banner: :IP
109
110
  class_option :config, aliases: "-c", type: :string, default: "config.ru",
110
- desc: "Uses a custom rackup configuration.", banner: :file
111
+ desc: "Use a custom rackup configuration.", banner: :file
111
112
  class_option :daemon, aliases: "-d", type: :boolean, default: false,
112
- desc: "Runs server as a Daemon."
113
+ desc: "Run server as a Daemon."
113
114
  class_option :using, aliases: "-u", type: :string,
114
- desc: "Specifies the Rack server used to run the application (thin/puma/webrick).", banner: :name
115
+ desc: "Specify the Rack server used to run the application (thin/puma/webrick).", banner: :name
115
116
  class_option :pid, aliases: "-P", type: :string,
116
- desc: "Specifies the PID file - defaults to #{DEFAULT_PIDFILE}."
117
+ desc: "Specify the PID file - defaults to #{DEFAULT_PIDFILE}."
117
118
  class_option :dev_caching, aliases: "-C", type: :boolean, default: nil,
118
- desc: "Specifies whether to perform caching in development."
119
+ desc: "Specify whether to perform caching in development."
119
120
  class_option :restart, type: :boolean, default: nil, hide: true
120
- class_option :early_hints, type: :boolean, default: nil, desc: "Enables HTTP/2 early hints."
121
+ class_option :early_hints, type: :boolean, default: nil, desc: "Enable HTTP/2 early hints."
121
122
  class_option :log_to_stdout, type: :boolean, default: nil, optional: true,
122
123
  desc: "Whether to log to stdout. Enabled by default in development when not daemonized."
123
124
 
@@ -127,8 +128,8 @@ module Rails
127
128
  @original_options = local_options - %w( --restart )
128
129
  end
129
130
 
131
+ desc "server", "Start the Rails server"
130
132
  def perform
131
- extract_environment_option_from_argument
132
133
  set_application_directory!
133
134
  prepare_restart
134
135
 
@@ -228,7 +229,7 @@ module Rails
228
229
  end
229
230
 
230
231
  def restart_command
231
- "bin/rails server #{@original_options.join(" ")} --restart"
232
+ "#{executable} #{@original_options.join(" ")} --restart"
232
233
  end
233
234
 
234
235
  def early_hints
@@ -245,30 +246,32 @@ module Rails
245
246
  File.expand_path(options[:pid] || ENV.fetch("PIDFILE", DEFAULT_PIDFILE))
246
247
  end
247
248
 
248
- def self.banner(*)
249
- "rails server -u [thin/puma/webrick] [options]"
250
- end
251
-
252
249
  def prepare_restart
253
250
  FileUtils.rm_f(pid) if options[:restart]
254
251
  end
255
252
 
256
253
  def rack_server_suggestion(server)
257
- if server.in?(RACK_SERVERS)
254
+ if server.nil?
255
+ <<~MSG
256
+ Could not find a server gem. Maybe you need to add one to the Gemfile?
257
+
258
+ gem "#{RECOMMENDED_SERVER}"
259
+
260
+ Run `#{executable} --help` for more options.
261
+ MSG
262
+ elsif server.in?(RACK_HANDLER_GEMS)
258
263
  <<~MSG
259
264
  Could not load server "#{server}". Maybe you need to the add it to the Gemfile?
260
265
 
261
266
  gem "#{server}"
262
267
 
263
- Run `bin/rails server --help` for more options.
268
+ Run `#{executable} --help` for more options.
264
269
  MSG
265
270
  else
266
- suggestion = Rails::Command::Spellchecker.suggest(server, from: RACK_SERVERS)
267
- suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion
268
-
271
+ error = CorrectableNameError.new("Could not find server '#{server}'.", server, RACK_HANDLERS)
269
272
  <<~MSG
270
- Could not find server "#{server}". #{suggestion_msg}
271
- Run `bin/rails server --help` for more options.
273
+ #{error.detailed_message}
274
+ Run `#{executable} --help` for more options.
272
275
  MSG
273
276
  end
274
277
  end
@@ -277,7 +280,7 @@ module Rails
277
280
  say <<~MSG
278
281
  => Booting #{ActiveSupport::Inflector.demodulize(server)}
279
282
  => Rails #{Rails.version} application starting in #{Rails.env} #{url}
280
- => Run `bin/rails server --help` for more startup options
283
+ => Run `#{executable} --help` for more startup options
281
284
  MSG
282
285
  end
283
286
  end
@@ -0,0 +1,14 @@
1
+ Examples:
2
+ You can run a single test by appending a line number to a filename:
3
+
4
+ <%= executable %> test/models/user_test.rb:27
5
+
6
+ You can run multiple tests with in a line range by appending the line range to a filename:
7
+
8
+ <%= executable %> test/models/user_test.rb:10-20
9
+
10
+ You can run multiple files and directories at the same time:
11
+
12
+ <%= executable %> test/controllers test/integration/login_test.rb
13
+
14
+ By default test failures and errors are reported inline during a run.
@@ -1,37 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/command"
4
+ require "rails/commands/rake/rake_command"
4
5
  require "rails/test_unit/runner"
5
6
  require "rails/test_unit/reporter"
6
7
 
7
8
  module Rails
8
9
  module Command
9
10
  class TestCommand < Base # :nodoc:
11
+ def self.executable(*args)
12
+ args.empty? ? Rails::TestUnitReporter.executable : super
13
+ end
14
+
10
15
  no_commands do
11
- def help
12
- say "Usage: #{Rails::TestUnitReporter.executable} [options] [files or directories]"
13
- say ""
14
- say "You can run a single test by appending a line number to a filename:"
15
- say ""
16
- say " #{Rails::TestUnitReporter.executable} test/models/user_test.rb:27"
17
- say ""
18
- say "You can run multiple files and directories at the same time:"
19
- say ""
20
- say " #{Rails::TestUnitReporter.executable} test/controllers test/integration/login_test.rb"
16
+ def help(command_name = nil, *)
17
+ super
18
+ if command_name == "test"
19
+ say ""
20
+ say self.class.class_usage
21
+ end
21
22
  say ""
22
- say "By default test failures and errors are reported inline during a run."
23
- say ""
24
-
25
23
  Minitest.run(%w(--help))
26
24
  end
27
25
  end
28
26
 
29
- def perform(*)
27
+ desc "test [PATHS...]", "Run tests except system tests"
28
+ def perform(*args)
30
29
  $LOAD_PATH << Rails::Command.root.join("test").to_s
31
30
 
32
31
  Rails::TestUnit::Runner.parse_options(args)
32
+ run_prepare_task if self.args.none?(EXACT_TEST_ARGUMENT_PATTERN)
33
33
  Rails::TestUnit::Runner.run(args)
34
34
  end
35
+
36
+ # Define Thor tasks to avoid going through Rake and booting twice when using bin/rails test:*
37
+ Rails::TestUnit::Runner::TEST_FOLDERS.each do |name|
38
+ desc name, "Run tests in test/#{name}"
39
+ define_method(name) do |*args|
40
+ perform("test/#{name}", *args)
41
+ end
42
+ end
43
+
44
+ desc "all", "Run all tests, including system tests"
45
+ def all(*args)
46
+ perform("test/**/*_test.rb", *args)
47
+ end
48
+
49
+ desc "functionals", "Run tests in test/controllers, test/mailers, and test/functional"
50
+ def functionals(*args)
51
+ perform("test/controllers", "test/mailers", "test/functional", *args)
52
+ end
53
+
54
+ desc "units", "Run tests in test/models, test/helpers, and test/unit"
55
+ def units(*args)
56
+ perform("test/models", "test/helpers", "test/unit", *args)
57
+ end
58
+
59
+ desc "system", "Run system tests only"
60
+ def system(*args)
61
+ perform("test/system", *args)
62
+ end
63
+
64
+ desc "generators", "Run tests in test/lib/generators"
65
+ def generators(*args)
66
+ perform("test/lib/generators", *args)
67
+ end
68
+
69
+ private
70
+ EXACT_TEST_ARGUMENT_PATTERN = /^-n|^--name\b|#{Rails::TestUnit::Runner::PATH_ARGUMENT_PATTERN}/
71
+
72
+ def run_prepare_task
73
+ Rails::Command::RakeCommand.perform("test:prepare", [], {})
74
+ rescue UnrecognizedCommandError => error
75
+ raise unless error.name == "test:prepare"
76
+ end
35
77
  end
36
78
  end
37
79
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/commands/routes/routes_command"
4
+
5
+ module Rails
6
+ module Command
7
+ class UnusedRoutesCommand < Rails::Command::Base # :nodoc:
8
+ hide_command!
9
+ class_option :controller, aliases: "-c", desc: "Filter by a specific controller, e.g. PostsController or Admin::PostsController."
10
+ class_option :grep, aliases: "-g", desc: "Grep routes by a specific pattern."
11
+
12
+ class RouteInfo
13
+ def initialize(route)
14
+ requirements = route.requirements
15
+ @controller_name = requirements[:controller]
16
+ @action_name = requirements[:action]
17
+ @controller_class = (@controller_name.to_s.camelize + "Controller").safe_constantize
18
+ end
19
+
20
+ def unused?
21
+ controller_class_missing? || (action_missing? && template_missing?)
22
+ end
23
+
24
+ private
25
+ def view_path(root)
26
+ File.join(root.path, @controller_name, @action_name)
27
+ end
28
+
29
+ def controller_class_missing?
30
+ @controller_name && @controller_class.nil?
31
+ end
32
+
33
+ def template_missing?
34
+ @controller_class && @controller_class.try(:view_paths).to_a.flat_map { |path| Dir["#{view_path(path)}.*"] }.none?
35
+ end
36
+
37
+ def action_missing?
38
+ @controller_class && @controller_class.instance_methods.exclude?(@action_name.to_sym)
39
+ end
40
+ end
41
+
42
+ def perform(*)
43
+ boot_application!
44
+ require "action_dispatch/routing/inspector"
45
+
46
+ say(inspector.format(formatter, routes_filter))
47
+
48
+ exit(1) if routes.any?
49
+ end
50
+
51
+ private
52
+ def inspector
53
+ ActionDispatch::Routing::RoutesInspector.new(routes)
54
+ end
55
+
56
+ def routes
57
+ @routes ||= begin
58
+ routes = Rails.application.routes.routes.select do |route|
59
+ RouteInfo.new(route).unused?
60
+ end
61
+
62
+ ActionDispatch::Journey::Routes.new(routes)
63
+ end
64
+ end
65
+
66
+ def formatter
67
+ ActionDispatch::Routing::ConsoleFormatter::Unused.new
68
+ end
69
+
70
+ def routes_filter
71
+ options.symbolize_keys.slice(:controller, :grep)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -3,6 +3,7 @@
3
3
  module Rails
4
4
  module Command
5
5
  class VersionCommand < Base # :nodoc:
6
+ desc "version", "Show the Rails version"
6
7
  def perform
7
8
  Rails::Command.invoke :application, [ "--version" ]
8
9
  end
@@ -7,17 +7,17 @@ require "rails/rack"
7
7
 
8
8
  module Rails
9
9
  module Configuration
10
- # MiddlewareStackProxy is a proxy for the Rails middleware stack that allows
10
+ # MiddlewareStackProxy is a proxy for the \Rails middleware stack that allows
11
11
  # you to configure middlewares in your application. It works basically as a
12
12
  # command recorder, saving each command to be applied after initialization
13
13
  # over the default middleware stack, so you can add, swap, or remove any
14
- # middleware in Rails.
14
+ # middleware in \Rails.
15
15
  #
16
16
  # You can add your own middlewares by using the +config.middleware.use+ method:
17
17
  #
18
18
  # config.middleware.use Magical::Unicorns
19
19
  #
20
- # This will put the <tt>Magical::Unicorns</tt> middleware on the end of the stack.
20
+ # This will put the +Magical::Unicorns+ middleware on the end of the stack.
21
21
  # You can use +insert_before+ if you wish to add a middleware before another:
22
22
  #
23
23
  # config.middleware.insert_before Rack::Head, Magical::Unicorns
@@ -34,8 +34,8 @@ module Rails
34
34
  #
35
35
  # config.middleware.move_before ActionDispatch::Flash, Magical::Unicorns
36
36
  #
37
- # This will move the <tt>Magical::Unicorns</tt> middleware before the
38
- # <tt>ActionDispatch::Flash</tt>. You can also move it after:
37
+ # This will move the +Magical::Unicorns+ middleware before the
38
+ # +ActionDispatch::Flash+. You can also move it after:
39
39
  #
40
40
  # config.middleware.move_after ActionDispatch::Flash, Magical::Unicorns
41
41
  #
@@ -49,48 +49,43 @@ module Rails
49
49
  @delete_operations = delete_operations
50
50
  end
51
51
 
52
- def insert_before(*args, &block)
53
- @operations << -> middleware { middleware.insert_before(*args, &block) }
52
+ def insert_before(...)
53
+ @operations << -> middleware { middleware.insert_before(...) }
54
54
  end
55
- ruby2_keywords(:insert_before) if respond_to?(:ruby2_keywords, true)
56
55
 
57
56
  alias :insert :insert_before
58
57
 
59
- def insert_after(*args, &block)
60
- @operations << -> middleware { middleware.insert_after(*args, &block) }
58
+ def insert_after(...)
59
+ @operations << -> middleware { middleware.insert_after(...) }
61
60
  end
62
- ruby2_keywords(:insert_after) if respond_to?(:ruby2_keywords, true)
63
61
 
64
- def swap(*args, &block)
65
- @operations << -> middleware { middleware.swap(*args, &block) }
62
+ def swap(...)
63
+ @operations << -> middleware { middleware.swap(...) }
66
64
  end
67
- ruby2_keywords(:swap) if respond_to?(:ruby2_keywords, true)
68
65
 
69
- def use(*args, &block)
70
- @operations << -> middleware { middleware.use(*args, &block) }
66
+ def use(...)
67
+ @operations << -> middleware { middleware.use(...) }
71
68
  end
72
- ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true)
73
69
 
74
- def delete(*args, &block)
75
- @delete_operations << -> middleware { middleware.delete(*args, &block) }
70
+ def delete(...)
71
+ @delete_operations << -> middleware { middleware.delete(...) }
76
72
  end
77
73
 
78
- def move_before(*args, &block)
79
- @delete_operations << -> middleware { middleware.move_before(*args, &block) }
74
+ def move_before(...)
75
+ @delete_operations << -> middleware { middleware.move_before(...) }
80
76
  end
81
77
 
82
78
  alias :move :move_before
83
79
 
84
- def move_after(*args, &block)
85
- @delete_operations << -> middleware { middleware.move_after(*args, &block) }
80
+ def move_after(...)
81
+ @delete_operations << -> middleware { middleware.move_after(...) }
86
82
  end
87
83
 
88
- def unshift(*args, &block)
89
- @operations << -> middleware { middleware.unshift(*args, &block) }
84
+ def unshift(...)
85
+ @operations << -> middleware { middleware.unshift(...) }
90
86
  end
91
- ruby2_keywords(:unshift) if respond_to?(:ruby2_keywords, true)
92
87
 
93
- def merge_into(other) #:nodoc:
88
+ def merge_into(other) # :nodoc:
94
89
  (@operations + @delete_operations).each do |operation|
95
90
  operation.call(other)
96
91
  end
@@ -106,7 +101,7 @@ module Rails
106
101
  attr_reader :operations, :delete_operations
107
102
  end
108
103
 
109
- class Generators #:nodoc:
104
+ class Generators # :nodoc:
110
105
  attr_accessor :aliases, :options, :templates, :fallbacks, :colorize_logging, :api_only
111
106
  attr_reader :hidden_namespaces, :after_generate_callbacks
112
107
 
@@ -9,9 +9,7 @@ module Rails
9
9
  # instance, pass a non-false value as the parameter.
10
10
  def app(create = false)
11
11
  @app_integration_instance = nil if create
12
- @app_integration_instance ||= new_session do |sess|
13
- sess.host! "www.example.com"
14
- end
12
+ @app_integration_instance ||= new_session
15
13
  end
16
14
 
17
15
  # create a new session. If a block is given, the new session will be yielded
@@ -19,7 +17,6 @@ module Rails
19
17
  def new_session
20
18
  app = Rails.application
21
19
  session = ActionDispatch::Integration::Session.new(app)
22
- yield session if block_given?
23
20
 
24
21
  # This makes app.url_for and app.foo_path available in the console
25
22
  session.extend(app.routes.url_helpers)
@@ -4,14 +4,14 @@ module Rails
4
4
  module ConsoleMethods
5
5
  # Gets the helper methods available to the controller.
6
6
  #
7
- # This method assumes an +ApplicationController+ exists, and it extends +ActionController::Base+
7
+ # This method assumes an +ApplicationController+ exists, and that it extends ActionController::Base.
8
8
  def helper
9
9
  ApplicationController.helpers
10
10
  end
11
11
 
12
12
  # Gets a new instance of a controller object.
13
13
  #
14
- # This method assumes an +ApplicationController+ exists, and it extends +ActionController::Base+
14
+ # This method assumes an +ApplicationController+ exists, and that it extends ActionController::Base.
15
15
  def controller
16
16
  @controller ||= ApplicationController.new
17
17
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ def self.deprecator # :nodoc:
5
+ @deprecator ||= ActiveSupport::Deprecation.new
6
+ end
7
+ end
@@ -9,12 +9,45 @@ module Rails
9
9
  attr_accessor :middleware, :javascript_path
10
10
  attr_writer :eager_load_paths, :autoload_once_paths, :autoload_paths
11
11
 
12
+ # An array of custom autoload paths to be added to the ones defined
13
+ # automatically by Rails. These won't be eager loaded, unless you push
14
+ # them to +eager_load_paths+ too, which is recommended.
15
+ #
16
+ # This collection is empty by default, it accepts strings and +Pathname+
17
+ # objects.
18
+ #
19
+ # If you'd like to add +lib+ to it, please see +autoload_lib+.
20
+ attr_reader :autoload_paths
21
+
22
+ # An array of custom autoload once paths. These won't be eager loaded
23
+ # unless you push them to +eager_load_paths+ too, which is recommended.
24
+ #
25
+ # This collection is empty by default, it accepts strings and +Pathname+
26
+ # objects.
27
+ #
28
+ # If you'd like to add +lib+ to it, please see +autoload_lib_once+.
29
+ attr_reader :autoload_once_paths
30
+
31
+ # An array of custom eager load paths to be added to the ones defined
32
+ # automatically by Rails. Anything in this collection is considered to be
33
+ # an autoload path regardless of whether it was added to +autoload_paths+.
34
+ #
35
+ # This collection is empty by default, it accepts strings and +Pathname+
36
+ # objects.
37
+ #
38
+ # If you'd like to add +lib+ to it, please see +autoload_lib+.
39
+ attr_reader :eager_load_paths
40
+
12
41
  def initialize(root = nil)
13
42
  super()
14
43
  @root = root
15
44
  @generators = app_generators.dup
16
45
  @middleware = Rails::Configuration::MiddlewareStackProxy.new
17
46
  @javascript_path = "javascript"
47
+
48
+ @autoload_paths = []
49
+ @autoload_once_paths = []
50
+ @eager_load_paths = []
18
51
  end
19
52
 
20
53
  # Holds generators configuration:
@@ -44,20 +77,23 @@ module Rails
44
77
  exclude: ["assets", javascript_path]
45
78
  paths.add "app/assets", glob: "*"
46
79
  paths.add "app/controllers", eager_load: true
47
- paths.add "app/channels", eager_load: true, glob: "**/*_channel.rb"
80
+ paths.add "app/channels", eager_load: true
48
81
  paths.add "app/helpers", eager_load: true
49
82
  paths.add "app/models", eager_load: true
50
83
  paths.add "app/mailers", eager_load: true
51
84
  paths.add "app/views"
52
85
 
86
+ # If you add more lib subdirectories here that should not be managed
87
+ # by the main autoloader, please update the config.autoload_lib call
88
+ # in the template that generates config/application.rb accordingly.
53
89
  paths.add "lib", load_path: true
54
90
  paths.add "lib/assets", glob: "*"
55
91
  paths.add "lib/tasks", glob: "**/*.rake"
56
92
 
57
93
  paths.add "config"
58
- paths.add "config/environments", glob: "#{Rails.env}.rb"
94
+ paths.add "config/environments", glob: -"#{Rails.env}.rb"
59
95
  paths.add "config/initializers", glob: "**/*.rb"
60
- paths.add "config/locales", glob: "*.{rb,yml}"
96
+ paths.add "config/locales", glob: "**/*.{rb,yml}"
61
97
  paths.add "config/routes.rb"
62
98
  paths.add "config/routes", glob: "**/*.rb"
63
99
 
@@ -68,6 +104,8 @@ module Rails
68
104
  paths.add "vendor", load_path: true
69
105
  paths.add "vendor/assets", glob: "*"
70
106
 
107
+ paths.add "test/mailers/previews", autoload: true
108
+
71
109
  paths
72
110
  end
73
111
  end
@@ -76,16 +114,22 @@ module Rails
76
114
  @root = paths.path = Pathname.new(value).expand_path
77
115
  end
78
116
 
79
- def eager_load_paths
80
- @eager_load_paths ||= paths.eager_load
117
+ # Private method that adds custom autoload paths to the ones defined by
118
+ # +paths+.
119
+ def all_autoload_paths # :nodoc:
120
+ autoload_paths + paths.autoload_paths
81
121
  end
82
122
 
83
- def autoload_once_paths
84
- @autoload_once_paths ||= paths.autoload_once
123
+ # Private method that adds custom autoload once paths to the ones defined
124
+ # by +paths+.
125
+ def all_autoload_once_paths # :nodoc:
126
+ autoload_once_paths + paths.autoload_once
85
127
  end
86
128
 
87
- def autoload_paths
88
- @autoload_paths ||= paths.autoload_paths
129
+ # Private method that adds custom eager load paths to the ones defined by
130
+ # +paths+.
131
+ def all_eager_load_paths # :nodoc:
132
+ eager_load_paths + paths.eager_load
89
133
  end
90
134
  end
91
135
  end