railties 6.0.0 → 7.1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +699 -245
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +7 -8
  6. data/lib/minitest/rails_plugin.rb +80 -2
  7. data/lib/rails/all.rb +0 -1
  8. data/lib/rails/api/task.rb +37 -5
  9. data/lib/rails/app_updater.rb +9 -6
  10. data/lib/rails/application/bootstrap.rb +52 -14
  11. data/lib/rails/application/configuration.rb +327 -86
  12. data/lib/rails/application/default_middleware_stack.rb +33 -7
  13. data/lib/rails/application/dummy_config.rb +19 -0
  14. data/lib/rails/application/finisher.rb +94 -113
  15. data/lib/rails/application/routes_reloader.rb +17 -3
  16. data/lib/rails/application.rb +258 -201
  17. data/lib/rails/application_controller.rb +3 -4
  18. data/lib/rails/autoloaders/inflector.rb +21 -0
  19. data/lib/rails/autoloaders.rb +42 -42
  20. data/lib/rails/backtrace_cleaner.rb +13 -8
  21. data/lib/rails/cli.rb +5 -2
  22. data/lib/rails/code_statistics.rb +6 -4
  23. data/lib/rails/code_statistics_calculator.rb +16 -7
  24. data/lib/rails/command/actions.rb +10 -12
  25. data/lib/rails/command/base.rb +66 -46
  26. data/lib/rails/command/behavior.rb +3 -3
  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 -32
  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 +54 -39
  34. data/lib/rails/commands/credentials/credentials_command/diffing.rb +53 -0
  35. data/lib/rails/commands/credentials/credentials_command.rb +83 -60
  36. data/lib/rails/commands/db/system/change/change_command.rb +8 -2
  37. data/lib/rails/commands/dbconsole/dbconsole_command.rb +39 -124
  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 +3 -3
  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 +5 -14
  51. data/lib/rails/commands/plugin/plugin_command.rb +2 -0
  52. data/lib/rails/commands/rake/rake_command.rb +27 -23
  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 -43
  59. data/lib/rails/commands/secrets/secrets_command.rb +20 -38
  60. data/lib/rails/commands/server/server_command.rb +40 -64
  61. data/lib/rails/commands/test/USAGE +14 -0
  62. data/lib/rails/commands/test/test_command.rb +58 -16
  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 +53 -23
  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 +54 -9
  70. data/lib/rails/engine/updater.rb +1 -1
  71. data/lib/rails/engine.rb +105 -81
  72. data/lib/rails/gem_version.rb +5 -5
  73. data/lib/rails/generators/actions/create_migration.rb +9 -5
  74. data/lib/rails/generators/actions.rb +275 -97
  75. data/lib/rails/generators/active_model.rb +28 -14
  76. data/lib/rails/generators/app_base.rb +487 -165
  77. data/lib/rails/generators/app_name.rb +3 -14
  78. data/lib/rails/generators/base.rb +42 -31
  79. data/lib/rails/generators/database.rb +41 -4
  80. data/lib/rails/generators/erb/mailer/mailer_generator.rb +0 -1
  81. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
  82. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -1
  83. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +11 -11
  84. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
  85. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
  86. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
  87. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  88. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
  89. data/lib/rails/generators/erb.rb +1 -2
  90. data/lib/rails/generators/generated_attribute.rb +60 -19
  91. data/lib/rails/generators/migration.rb +4 -8
  92. data/lib/rails/generators/model_helpers.rb +29 -4
  93. data/lib/rails/generators/named_base.rb +15 -15
  94. data/lib/rails/generators/rails/app/USAGE +23 -6
  95. data/lib/rails/generators/rails/app/app_generator.rb +151 -80
  96. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
  97. data/lib/rails/generators/rails/app/templates/Gemfile.tt +44 -54
  98. data/lib/rails/generators/rails/app/templates/Rakefile.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
  100. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
  101. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
  102. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +4 -9
  103. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
  104. data/lib/rails/generators/rails/app/templates/bin/rails.tt +3 -3
  105. data/lib/rails/generators/rails/app/templates/bin/rake.tt +2 -2
  106. data/lib/rails/generators/rails/app/templates/bin/setup.tt +19 -15
  107. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +18 -23
  108. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +3 -3
  109. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +5 -6
  110. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +12 -11
  111. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +17 -16
  112. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
  113. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +12 -11
  114. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +12 -11
  115. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +17 -18
  116. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
  117. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +14 -13
  118. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
  119. data/lib/rails/generators/rails/app/templates/config/environment.rb.tt +1 -1
  120. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +32 -14
  121. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +42 -55
  122. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +27 -15
  123. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
  124. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
  125. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
  126. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +6 -2
  127. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
  128. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +284 -0
  129. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +13 -0
  130. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
  131. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +17 -20
  132. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
  133. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
  134. data/lib/rails/generators/rails/app/templates/config.ru.tt +2 -1
  135. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +7 -5
  136. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
  137. data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
  138. data/lib/rails/generators/rails/app/templates/gitattributes.tt +9 -0
  139. data/lib/rails/generators/rails/app/templates/gitignore.tt +12 -9
  140. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  141. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
  142. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +13 -11
  143. data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
  144. data/lib/rails/generators/rails/benchmark/USAGE +19 -0
  145. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +30 -0
  146. data/lib/rails/generators/rails/benchmark/templates/benchmark.rb.tt +15 -0
  147. data/lib/rails/generators/rails/controller/USAGE +13 -5
  148. data/lib/rails/generators/rails/controller/controller_generator.rb +7 -42
  149. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
  150. data/lib/rails/generators/rails/credentials/credentials_generator.rb +30 -25
  151. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
  152. data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
  153. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +6 -2
  154. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
  155. data/lib/rails/generators/rails/generator/USAGE +2 -2
  156. data/lib/rails/generators/rails/generator/generator_generator.rb +0 -1
  157. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
  158. data/lib/rails/generators/rails/generator/templates/USAGE.tt +1 -1
  159. data/lib/rails/generators/rails/helper/USAGE +2 -3
  160. data/lib/rails/generators/rails/integration_test/USAGE +2 -2
  161. data/lib/rails/generators/rails/migration/USAGE +22 -12
  162. data/lib/rails/generators/rails/model/model_generator.rb +4 -0
  163. data/lib/rails/generators/rails/plugin/USAGE +17 -6
  164. data/lib/rails/generators/rails/plugin/plugin_generator.rb +86 -46
  165. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +15 -20
  166. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +10 -39
  167. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
  168. data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
  169. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +4 -18
  170. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +0 -1
  171. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
  172. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
  173. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +7 -22
  174. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +10 -14
  175. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
  176. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
  177. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb.tt +1 -0
  178. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +3 -3
  179. data/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb.tt +4 -4
  180. data/lib/rails/generators/rails/plugin/templates/test/integration/navigation_test.rb.tt +1 -1
  181. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +6 -14
  182. data/lib/rails/generators/rails/resource/USAGE +4 -4
  183. data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
  184. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -27
  185. data/lib/rails/generators/rails/scaffold/USAGE +5 -5
  186. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
  187. data/lib/rails/generators/rails/scaffold_controller/USAGE +2 -2
  188. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +7 -2
  189. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -6
  190. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +7 -11
  191. data/lib/rails/generators/rails/system_test/USAGE +2 -2
  192. data/lib/rails/generators/rails/task/USAGE +3 -3
  193. data/lib/rails/generators/resource_helpers.rb +2 -2
  194. data/lib/rails/generators/test_case.rb +3 -3
  195. data/lib/rails/generators/test_unit/controller/controller_generator.rb +2 -0
  196. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb.tt +3 -3
  197. data/lib/rails/generators/test_unit/generator/generator_generator.rb +0 -1
  198. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +3 -3
  199. data/lib/rails/generators/test_unit/integration/integration_generator.rb +0 -1
  200. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb.tt +1 -1
  201. data/lib/rails/generators/test_unit/job/templates/unit_test.rb.tt +1 -1
  202. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +1 -1
  203. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +3 -3
  204. data/lib/rails/generators/test_unit/model/templates/unit_test.rb.tt +1 -1
  205. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +1 -1
  206. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +2 -2
  207. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -5
  208. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +6 -6
  209. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +8 -8
  210. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
  211. data/lib/rails/generators/testing/assertions.rb +2 -2
  212. data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +8 -7
  213. data/lib/rails/generators.rb +43 -45
  214. data/lib/rails/health_controller.rb +55 -0
  215. data/lib/rails/info.rb +4 -4
  216. data/lib/rails/info_controller.rb +30 -13
  217. data/lib/rails/initializable.rb +1 -1
  218. data/lib/rails/mailers_controller.rb +18 -9
  219. data/lib/rails/paths.rb +28 -19
  220. data/lib/rails/rack/logger.rb +17 -17
  221. data/lib/rails/rackup/server.rb +15 -0
  222. data/lib/rails/railtie/configurable.rb +0 -1
  223. data/lib/rails/railtie/configuration.rb +15 -3
  224. data/lib/rails/railtie.rb +80 -37
  225. data/lib/rails/ruby_version_check.rb +5 -3
  226. data/lib/rails/secrets.rb +14 -9
  227. data/lib/rails/source_annotation_extractor.rb +69 -34
  228. data/lib/rails/tasks/engine.rake +8 -11
  229. data/lib/rails/tasks/framework.rake +4 -6
  230. data/lib/rails/tasks/log.rake +1 -1
  231. data/lib/rails/tasks/misc.rake +4 -15
  232. data/lib/rails/tasks/statistics.rake +9 -6
  233. data/lib/rails/tasks/tmp.rake +13 -6
  234. data/lib/rails/tasks/yarn.rake +17 -6
  235. data/lib/rails/tasks/zeitwerk.rake +16 -41
  236. data/lib/rails/tasks.rb +0 -6
  237. data/lib/rails/templates/layouts/application.html.erb +15 -0
  238. data/lib/rails/templates/rails/mailers/email.html.erb +46 -11
  239. data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
  240. data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
  241. data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
  242. data/lib/rails/test_help.rb +13 -14
  243. data/lib/rails/test_unit/line_filtering.rb +1 -1
  244. data/lib/rails/test_unit/railtie.rb +0 -4
  245. data/lib/rails/test_unit/reporter.rb +8 -3
  246. data/lib/rails/test_unit/runner.rb +61 -19
  247. data/lib/rails/test_unit/test_parser.rb +88 -0
  248. data/lib/rails/test_unit/testing.rake +17 -36
  249. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  250. data/lib/rails/version.rb +1 -1
  251. data/lib/rails/welcome_controller.rb +1 -0
  252. data/lib/rails/zeitwerk_checker.rb +15 -0
  253. data/lib/rails.rb +31 -23
  254. metadata +89 -58
  255. data/RDOC_MAIN.rdoc +0 -98
  256. data/lib/rails/application/dummy_erb_compiler.rb +0 -18
  257. data/lib/rails/command/spellchecker.rb +0 -58
  258. data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
  259. data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
  260. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
  261. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
  262. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
  263. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
  264. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -10
  265. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +0 -50
  266. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +0 -86
  267. data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
  268. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +0 -7
  269. data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
  270. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb.tt +0 -4
  271. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_0.rb.tt +0 -45
  272. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +0 -16
  273. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
  274. data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
  275. data/lib/rails/generators/rails/assets/USAGE +0 -17
  276. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
  277. data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
  278. data/lib/rails/generators/rails/model/USAGE +0 -114
  279. data/lib/rails/generators/rails/plugin/templates/rails/application.rb.tt +0 -23
  280. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
  281. data/lib/rails/tasks/annotations.rake +0 -22
  282. data/lib/rails/tasks/dev.rake +0 -11
  283. data/lib/rails/tasks/initializers.rake +0 -9
  284. data/lib/rails/tasks/middleware.rake +0 -9
  285. data/lib/rails/tasks/restart.rake +0 -9
  286. data/lib/rails/tasks/routes.rake +0 -9
@@ -9,41 +9,45 @@ module Rails
9
9
 
10
10
  class << self
11
11
  def printing_commands
12
- formatted_rake_tasks.map(&:first)
12
+ rake_tasks.filter_map do |task|
13
+ if task.comment && task.locations.any?(non_app_file_pattern)
14
+ [task.name_with_args, task.comment]
15
+ end
16
+ end
13
17
  end
14
18
 
15
- def perform(task, *)
16
- require_rake
17
-
18
- ARGV.unshift(task) # Prepend the task, so Rake knows how to run it.
19
+ def perform(task, args, config)
20
+ with_rake(task, *args) do |rake|
21
+ if unrecognized_task = rake.top_level_tasks.find { |task| !rake.lookup(task[/[^\[]+/]) }
22
+ @rake_tasks = rake.tasks
23
+ raise UnrecognizedCommandError.new(unrecognized_task)
24
+ end
19
25
 
20
- Rake.application.standard_exception_handling do
21
- Rake.application.init("rails")
22
- Rake.application.load_rakefile
23
- Rake.application.top_level
26
+ rake.options.suppress_backtrace_pattern = non_app_file_pattern
27
+ rake.standard_exception_handling { rake.top_level }
24
28
  end
25
29
  end
26
30
 
27
31
  private
28
- def rake_tasks
29
- require_rake
30
-
31
- return @rake_tasks if defined?(@rake_tasks)
32
-
33
- require_application_and_environment!
32
+ def non_app_file_pattern
33
+ /\A(?!#{Regexp.quote Rails::Command.root.to_s})/
34
+ end
34
35
 
36
+ def with_rake(*args, &block)
37
+ require "rake"
35
38
  Rake::TaskManager.record_task_metadata = true
36
- Rake.application.instance_variable_set(:@name, "rails")
37
- load_tasks
38
- @rake_tasks = Rake.application.tasks.select(&:comment)
39
- end
40
39
 
41
- def formatted_rake_tasks
42
- rake_tasks.map { |t| [ t.name_with_args, t.comment ] }
40
+ result = nil
41
+ Rake.with_application do |rake|
42
+ rake.init(bin, args) unless args.empty?
43
+ rake.load_rakefile
44
+ result = block.call(rake)
45
+ end
46
+ result
43
47
  end
44
48
 
45
- def require_rake
46
- require "rake" # Defer booting Rake until we know it's needed.
49
+ def rake_tasks
50
+ @rake_tasks ||= with_rake(&:tasks)
47
51
  end
48
52
  end
49
53
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module Command
5
+ class RestartCommand < Base # :nodoc:
6
+ desc "restart", "Restart app by touching tmp/restart.txt"
7
+ def perform
8
+ require "fileutils"
9
+ FileUtils.mkdir_p Rails::Command.application_root.join("tmp")
10
+ FileUtils.touch Rails::Command.application_root.join("tmp/restart.txt")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,9 +8,21 @@ module Rails
8
8
  class_option :controller, aliases: "-c", desc: "Filter by a specific controller, e.g. PostsController or Admin::PostsController."
9
9
  class_option :grep, aliases: "-g", desc: "Grep routes by a specific pattern."
10
10
  class_option :expanded, type: :boolean, aliases: "-E", desc: "Print routes expanded vertically with parts explained."
11
+ class_option :unused, type: :boolean, aliases: "-u", desc: "Print unused routes."
11
12
 
13
+ no_commands do
14
+ def invoke_command(*)
15
+ if options.key?("unused")
16
+ Rails::Command.invoke "unused_routes", ARGV
17
+ else
18
+ super
19
+ end
20
+ end
21
+ end
22
+
23
+ desc "routes", "List all the defined routes"
12
24
  def perform(*)
13
- require_application_and_environment!
25
+ boot_application!
14
26
  require "action_dispatch/routing/inspector"
15
27
 
16
28
  say inspector.format(formatter, routes_filter)
@@ -1,20 +1,22 @@
1
- Examples:
1
+ Description:
2
+ The Rails `runner` allows running Ruby code in the context of your application.
2
3
 
3
- Run `puts Rails.env` after loading the app:
4
+ Examples:
5
+ Run `puts Rails.env` after loading the app:
4
6
 
5
- <%= executable %> 'puts Rails.env'
7
+ <%= executable %> 'puts Rails.env'
6
8
 
7
- Run the Ruby file located at `path/to/filename.rb` after loading the app:
9
+ Run the Ruby file located at `path/to/filename.rb` after loading the app:
8
10
 
9
- <%= executable %> path/to/filename.rb
11
+ <%= executable %> path/to/filename.rb
10
12
 
11
- Run the Ruby script read from stdin after loading the app:
12
- <%= executable %> -
13
+ Run the Ruby script read from stdin after loading the app:
13
14
 
14
- <% unless Gem.win_platform? %>
15
- You can also use the runner command as a shebang line for your executables:
15
+ <%= executable %> -
16
+ <% unless Gem.win_platform? -%>
16
17
 
17
- #!/usr/bin/env <%= File.expand_path(executable) %>
18
+ You can also use the runner command as a shebang line for your executables:
18
19
 
19
- Product.all.each { |p| p.price *= 2 ; p.save! }
20
- <% end %>
20
+ #!/usr/bin/env <%= File.expand_path(executable) %>
21
+ Product.all.each { |p| p.price *= 2 ; p.save! }
22
+ <% end -%>
@@ -7,51 +7,64 @@ module Rails
7
7
  class RunnerCommand < Base # :nodoc:
8
8
  include EnvironmentArgument
9
9
 
10
- self.environment_desc = "The environment for the runner to operate under (test/development/production)"
11
-
12
10
  no_commands do
13
- def help
11
+ def help(command_name = nil, *)
14
12
  super
15
- say self.class.desc
13
+ if command_name == "runner"
14
+ say ""
15
+ say self.class.class_usage
16
+ end
16
17
  end
17
18
  end
18
19
 
19
- def self.banner(*)
20
- "#{super} [<'Some.ruby(code)'> | <filename.rb> | -]"
21
- end
22
-
20
+ desc "runner [<'Some.ruby(code)'> | <filename.rb> | -]",
21
+ "Run Ruby code in the context of your application"
23
22
  def perform(code_or_file = nil, *command_argv)
24
- extract_environment_option_from_argument
25
-
26
23
  unless code_or_file
27
24
  help
28
25
  exit 1
29
26
  end
30
27
 
31
- ENV["RAILS_ENV"] = options[:environment]
32
-
33
- require_application_and_environment!
28
+ boot_application!
34
29
  Rails.application.load_runner
35
30
 
36
31
  ARGV.replace(command_argv)
37
32
 
38
33
  if code_or_file == "-"
39
- eval($stdin.read, TOPLEVEL_BINDING, "stdin")
34
+ Rails.application.executor.wrap(source: "application.runner.railties") do
35
+ eval($stdin.read, TOPLEVEL_BINDING, "stdin")
36
+ end
40
37
  elsif File.exist?(code_or_file)
41
- $0 = code_or_file
42
- Kernel.load code_or_file
38
+ expanded_file_path = File.expand_path code_or_file
39
+ $0 = expanded_file_path
40
+ Rails.application.executor.wrap(source: "application.runner.railties") do
41
+ Kernel.load expanded_file_path
42
+ end
43
43
  else
44
44
  begin
45
- eval(code_or_file, TOPLEVEL_BINDING, __FILE__, __LINE__)
45
+ Rails.application.executor.wrap(source: "application.runner.railties") do
46
+ eval(code_or_file, TOPLEVEL_BINDING, __FILE__, __LINE__)
47
+ end
46
48
  rescue SyntaxError, NameError => e
47
- error "Please specify a valid ruby command or the path of a script to run."
48
- error "Run '#{self.class.executable} -h' for help."
49
- error ""
50
- error e
49
+ if looks_like_a_file_path?(code_or_file)
50
+ error "The file #{code_or_file} could not be found, please check and try again."
51
+ error "Run '#{self.class.executable} -h' for help."
52
+ else
53
+ error "Please specify a valid ruby command or the path of a script to run."
54
+ error "Run '#{self.class.executable} -h' for help."
55
+ error ""
56
+ error e
57
+ end
58
+
51
59
  exit 1
52
60
  end
53
61
  end
54
62
  end
63
+
64
+ private
65
+ def looks_like_a_file_path?(code_or_file)
66
+ code_or_file.ends_with?(".rb")
67
+ end
55
68
  end
56
69
  end
57
70
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module Command
5
+ class SecretCommand < Base # :nodoc:
6
+ desc "secret", "Generate a cryptographically secure secret key (this is typically used to generate a secret for cookie sessions)."
7
+ def perform
8
+ require "securerandom"
9
+ puts SecureRandom.hex(64)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,60 +1,61 @@
1
- === Storing Encrypted Secrets in Source Control
1
+ Description:
2
+ ** DEPRECATED **
3
+ Rails 5.2 has introduced a new `credentials` API that replaces Rails secrets.
4
+ Please use the Rails `credentials` commands instead.
5
+ Run `bin/rails credentials:help` for more information.
2
6
 
3
- The Rails `secrets` commands helps encrypting secrets to slim a production
4
- environment's `ENV` hash. It's also useful for atomic deploys: no need to
5
- coordinate key changes to get everything working as the keys are shipped
6
- with the code.
7
+ The Rails `secrets` commands helps encrypting secrets to slim a production
8
+ environment's `ENV` hash. It's also useful for atomic deploys: no need to
9
+ coordinate key changes to get everything working as the keys are shipped
10
+ with the code.
7
11
 
8
- === Setup
12
+ Setup:
13
+ Run `<%= executable(:setup) %>` to opt in and generate the `config/secrets.yml.key`
14
+ and `config/secrets.yml.enc` files.
9
15
 
10
- Run `rails secrets:setup` to opt in and generate the `config/secrets.yml.key`
11
- and `config/secrets.yml.enc` files.
16
+ The latter contains all the keys to be encrypted while the former holds the
17
+ encryption key.
12
18
 
13
- The latter contains all the keys to be encrypted while the former holds the
14
- encryption key.
19
+ Don't lose the key! Put it in a password manager your team can access.
20
+ Should you lose it no one, including you, will be able to access any encrypted
21
+ secrets.
22
+ Don't commit the key! Add `config/secrets.yml.key` to your source control's
23
+ ignore file. If you use Git, Rails handles this for you.
15
24
 
16
- Don't lose the key! Put it in a password manager your team can access.
17
- Should you lose it no one, including you, will be able to access any encrypted
18
- secrets.
19
- Don't commit the key! Add `config/secrets.yml.key` to your source control's
20
- ignore file. If you use Git, Rails handles this for you.
25
+ Rails also looks for the key in `ENV["RAILS_MASTER_KEY"]` if that's easier to
26
+ manage.
21
27
 
22
- Rails also looks for the key in `ENV["RAILS_MASTER_KEY"]` if that's easier to
23
- manage.
28
+ You could prepend that to your server's start command like this:
24
29
 
25
- You could prepend that to your server's start command like this:
30
+ RAILS_MASTER_KEY="im-the-master-now-hahaha" bin/rails server
26
31
 
27
- RAILS_MASTER_KEY="im-the-master-now-hahaha" server.start
32
+ The `config/secrets.yml.enc` has much the same format as `config/secrets.yml`:
28
33
 
34
+ production:
35
+ secret_key_base: so-secret-very-hidden-wow
36
+ payment_processing_gateway_key: much-safe-very-gaedwey-wow
29
37
 
30
- The `config/secrets.yml.enc` has much the same format as `config/secrets.yml`:
38
+ But that's where the similarities between `secrets.yml` and `secrets.yml.enc`
39
+ end, e.g. no keys from `secrets.yml` will be moved to `secrets.yml.enc` and
40
+ be encrypted.
31
41
 
32
- production:
33
- secret_key_base: so-secret-very-hidden-wow
34
- payment_processing_gateway_key: much-safe-very-gaedwey-wow
42
+ A `shared:` top level key is also supported such that any keys there is merged
43
+ into the other environments.
35
44
 
36
- But that's where the similarities between `secrets.yml` and `secrets.yml.enc`
37
- end, e.g. no keys from `secrets.yml` will be moved to `secrets.yml.enc` and
38
- be encrypted.
45
+ Additionally, Rails won't read encrypted secrets out of the box even if you have
46
+ the key. Add this:
39
47
 
40
- A `shared:` top level key is also supported such that any keys there is merged
41
- into the other environments.
48
+ config.read_encrypted_secrets = true
42
49
 
43
- Additionally, Rails won't read encrypted secrets out of the box even if you have
44
- the key. Add this:
50
+ to the environment you'd like to read encrypted secrets. `<%= executable(:setup) %>`
51
+ inserts this into the production environment by default.
45
52
 
46
- config.read_encrypted_secrets = true
53
+ Editing Secrets:
54
+ After `<%= executable(:setup) %>`, run `<%= executable(:edit) %>`.
47
55
 
48
- to the environment you'd like to read encrypted secrets. `rails secrets:setup`
49
- inserts this into the production environment by default.
56
+ That command opens a temporary file in `$VISUAL` or `$EDITOR` with the decrypted
57
+ contents of `config/secrets.yml.enc` to edit the encrypted secrets.
50
58
 
51
- === Editing Secrets
52
-
53
- After `rails secrets:setup`, run `rails secrets:edit`.
54
-
55
- That command opens a temporary file in `$EDITOR` with the decrypted contents of
56
- `config/secrets.yml.enc` to edit the encrypted secrets.
57
-
58
- When the temporary file is next saved the contents are encrypted and written to
59
- `config/secrets.yml.enc` while the file itself is destroyed to prevent secrets
60
- from leaking.
59
+ When the temporary file is next saved the contents are encrypted and written to
60
+ `config/secrets.yml.enc` while the file itself is destroyed to prevent secrets
61
+ from leaking.
@@ -1,65 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support"
4
+ require "active_support/core_ext/string/filters"
4
5
  require "rails/secrets"
6
+ require "rails/command/helpers/editor"
5
7
 
6
8
  module Rails
7
9
  module Command
8
10
  class SecretsCommand < Rails::Command::Base # :nodoc:
9
- no_commands do
10
- def help
11
- say "Usage:\n #{self.class.banner}"
12
- say ""
13
- say self.class.desc
14
- end
15
- end
16
-
17
- def setup
18
- deprecate_in_favor_of_credentials_and_exit
19
- end
11
+ include Helpers::Editor
20
12
 
13
+ desc "edit", "**deprecated** Open the secrets in `$VISUAL` or `$EDITOR` for editing"
21
14
  def edit
22
- if ENV["EDITOR"].to_s.empty?
23
- say "No $EDITOR to open decrypted secrets in. Assign one like this:"
24
- say ""
25
- say %(EDITOR="mate --wait" rails secrets:edit)
26
- say ""
27
- say "For editors that fork and exit immediately, it's important to pass a wait flag,"
28
- say "otherwise the secrets will be saved immediately with no chance to edit."
15
+ Rails.deprecator.warn(<<~MSG.squish)
16
+ `bin/rails secrets:edit` is deprecated in favor of credentials and will be removed in Rails 7.2.
17
+ Run `bin/rails credentials:help` for more information.
18
+ MSG
29
19
 
30
- return
31
- end
32
-
33
- require_application_and_environment!
20
+ boot_application!
34
21
 
35
- Rails::Secrets.read_for_editing do |tmp_path|
36
- system("#{ENV["EDITOR"]} #{tmp_path}")
22
+ using_system_editor do
23
+ Rails::Secrets.read_for_editing { |tmp_path| system_editor(tmp_path) }
24
+ say "File encrypted and saved."
37
25
  end
38
-
39
- say "New secrets encrypted and saved."
40
- rescue Interrupt
41
- say "Aborted changing encrypted secrets: nothing saved."
42
26
  rescue Rails::Secrets::MissingKeyError => error
43
27
  say error.message
44
28
  rescue Errno::ENOENT => error
45
- if /secrets\.yml\.enc/.match?(error.message)
46
- deprecate_in_favor_of_credentials_and_exit
29
+ if error.message.include?("secrets.yml.enc")
30
+ exit 1
47
31
  else
48
32
  raise
49
33
  end
50
34
  end
51
35
 
36
+ desc "show", "**deprecated** Show the decrypted secrets"
52
37
  def show
38
+ Rails.deprecator.warn(<<~MSG.squish)
39
+ `bin/rails secrets:show` is deprecated in favor of credentials and will be removed in Rails 7.2.
40
+ Run `bin/rails credentials:help` for more information.
41
+ MSG
42
+
53
43
  say Rails::Secrets.read
54
44
  end
55
-
56
- private
57
- def deprecate_in_favor_of_credentials_and_exit
58
- say "Encrypted secrets is deprecated in favor of credentials. Run:"
59
- say "rails credentials:help"
60
-
61
- exit 1
62
- end
63
45
  end
64
46
  end
65
47
  end
@@ -3,13 +3,12 @@
3
3
  require "fileutils"
4
4
  require "action_dispatch"
5
5
  require "rails"
6
- require "active_support/deprecation"
7
- require "active_support/core_ext/string/filters"
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,32 +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)
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
- DEFAULT_PID_PATH = "tmp/pids/server.pid"
103
-
104
- argument :using, optional: true
103
+ DEFAULT_PIDFILE = "tmp/pids/server.pid"
105
104
 
106
105
  class_option :port, aliases: "-p", type: :numeric,
107
- 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
108
107
  class_option :binding, aliases: "-b", type: :string,
109
- 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'.",
110
109
  banner: :IP
111
110
  class_option :config, aliases: "-c", type: :string, default: "config.ru",
112
- desc: "Uses a custom rackup configuration.", banner: :file
111
+ desc: "Use a custom rackup configuration.", banner: :file
113
112
  class_option :daemon, aliases: "-d", type: :boolean, default: false,
114
- desc: "Runs server as a Daemon."
113
+ desc: "Run server as a Daemon."
115
114
  class_option :using, aliases: "-u", type: :string,
116
- desc: "Specifies the Rack server used to run the application (thin/puma/webrick).", banner: :name
117
- class_option :pid, aliases: "-P", type: :string, default: DEFAULT_PID_PATH,
118
- desc: "Specifies the PID file."
115
+ desc: "Specify the Rack server used to run the application (thin/puma/webrick).", banner: :name
116
+ class_option :pid, aliases: "-P", type: :string,
117
+ desc: "Specify the PID file - defaults to #{DEFAULT_PIDFILE}."
119
118
  class_option :dev_caching, aliases: "-C", type: :boolean, default: nil,
120
- desc: "Specifies whether to perform caching in development."
119
+ desc: "Specify whether to perform caching in development."
121
120
  class_option :restart, type: :boolean, default: nil, hide: true
122
- 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."
123
122
  class_option :log_to_stdout, type: :boolean, default: nil, optional: true,
124
123
  desc: "Whether to log to stdout. Enabled by default in development when not daemonized."
125
124
 
@@ -127,11 +126,10 @@ module Rails
127
126
  super
128
127
 
129
128
  @original_options = local_options - %w( --restart )
130
- deprecate_positional_rack_server_and_rewrite_to_option(@original_options)
131
129
  end
132
130
 
131
+ desc "server", "Start the Rails server"
133
132
  def perform
134
- extract_environment_option_from_argument
135
133
  set_application_directory!
136
134
  prepare_restart
137
135
 
@@ -146,7 +144,7 @@ module Rails
146
144
  after_stop_callback = -> { say "Exiting" unless options[:daemon] }
147
145
  server.start(after_stop_callback)
148
146
  else
149
- say rack_server_suggestion(using)
147
+ say rack_server_suggestion(options[:using])
150
148
  end
151
149
  end
152
150
  end
@@ -155,7 +153,7 @@ module Rails
155
153
  def server_options
156
154
  {
157
155
  user_supplied_options: user_supplied_options,
158
- server: using,
156
+ server: options[:using],
159
157
  log_stdout: log_to_stdout?,
160
158
  Port: port,
161
159
  Host: host,
@@ -178,7 +176,7 @@ module Rails
178
176
  # ["-p3001", "-C", "--binding", "127.0.0.1"] # => {"-p"=>true, "-C"=>true, "--binding"=>true}
179
177
  user_flag = {}
180
178
  @original_options.each do |command|
181
- if command.to_s.start_with?("--")
179
+ if command.start_with?("--")
182
180
  option = command.split("=")[0]
183
181
  user_flag[option] = true
184
182
  elsif command =~ /\A(-.)/
@@ -207,6 +205,7 @@ module Rails
207
205
  end
208
206
  user_supplied_options << :Host if ENV["HOST"] || ENV["BINDING"]
209
207
  user_supplied_options << :Port if ENV["PORT"]
208
+ user_supplied_options << :pid if ENV["PIDFILE"]
210
209
  user_supplied_options.uniq
211
210
  end
212
211
  end
@@ -221,15 +220,6 @@ module Rails
221
220
  else
222
221
  default_host = environment == "development" ? "localhost" : "0.0.0.0"
223
222
 
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
223
  ENV.fetch("BINDING", default_host)
234
224
  end
235
225
  end
@@ -239,7 +229,7 @@ module Rails
239
229
  end
240
230
 
241
231
  def restart_command
242
- "bin/rails server #{@original_options.join(" ")} --restart"
232
+ "#{executable} #{@original_options.join(" ")} --restart"
243
233
  end
244
234
 
245
235
  def early_hints
@@ -253,49 +243,35 @@ module Rails
253
243
  end
254
244
 
255
245
  def pid
256
- File.expand_path(options[:pid])
257
- end
258
-
259
- def self.banner(*)
260
- "rails server -u [thin/puma/webrick] [options]"
246
+ File.expand_path(options[:pid] || ENV.fetch("PIDFILE", DEFAULT_PIDFILE))
261
247
  end
262
248
 
263
249
  def prepare_restart
264
- FileUtils.rm_f(options[:pid]) if options[:restart]
250
+ FileUtils.rm_f(pid) if options[:restart]
265
251
  end
266
252
 
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
253
+ def rack_server_suggestion(server)
254
+ if server.nil?
255
+ <<~MSG
256
+ Could not find a server gem. Maybe you need to add one to the Gemfile?
274
257
 
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
258
+ gem "#{RECOMMENDED_SERVER}"
282
259
 
283
- def rack_server_suggestion(server)
284
- if server.in?(RACK_SERVERS)
260
+ Run `#{executable} --help` for more options.
261
+ MSG
262
+ elsif server.in?(RACK_HANDLER_GEMS)
285
263
  <<~MSG
286
264
  Could not load server "#{server}". Maybe you need to the add it to the Gemfile?
287
265
 
288
266
  gem "#{server}"
289
267
 
290
- Run `rails server --help` for more options.
268
+ Run `#{executable} --help` for more options.
291
269
  MSG
292
270
  else
293
- suggestion = Rails::Command::Spellchecker.suggest(server, from: RACK_SERVERS)
294
- suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion
295
-
271
+ error = CorrectableNameError.new("Could not find server '#{server}'.", server, RACK_HANDLERS)
296
272
  <<~MSG
297
- Could not find server "#{server}". #{suggestion_msg}
298
- Run `rails server --help` for more options.
273
+ #{error.detailed_message}
274
+ Run `#{executable} --help` for more options.
299
275
  MSG
300
276
  end
301
277
  end
@@ -304,7 +280,7 @@ module Rails
304
280
  say <<~MSG
305
281
  => Booting #{ActiveSupport::Inflector.demodulize(server)}
306
282
  => Rails #{Rails.version} application starting in #{Rails.env} #{url}
307
- => Run `rails server --help` for more startup options
283
+ => Run `#{executable} --help` for more startup options
308
284
  MSG
309
285
  end
310
286
  end