railties 5.2.7.1 → 6.1.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +276 -158
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.rdoc +39 -33
  5. data/README.rdoc +3 -3
  6. data/lib/minitest/rails_plugin.rb +23 -12
  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 +9 -17
  13. data/lib/rails/application/configuration.rb +184 -26
  14. data/lib/rails/application/default_middleware_stack.rb +7 -3
  15. data/lib/rails/application/dummy_erb_compiler.rb +18 -0
  16. data/lib/rails/application/finisher.rb +68 -1
  17. data/lib/rails/application/routes_reloader.rb +9 -3
  18. data/lib/rails/application.rb +86 -65
  19. data/lib/rails/application_controller.rb +0 -1
  20. data/lib/rails/autoloaders.rb +48 -0
  21. data/lib/rails/backtrace_cleaner.rb +14 -21
  22. data/lib/rails/code_statistics.rb +8 -6
  23. data/lib/rails/code_statistics_calculator.rb +6 -6
  24. data/lib/rails/command/base.rb +13 -5
  25. data/lib/rails/command/behavior.rb +8 -49
  26. data/lib/rails/command/environment_argument.rb +9 -16
  27. data/lib/rails/command/spellchecker.rb +57 -0
  28. data/lib/rails/command.rb +16 -11
  29. data/lib/rails/commands/console/console_command.rb +6 -0
  30. data/lib/rails/commands/credentials/USAGE +33 -0
  31. data/lib/rails/commands/credentials/credentials_command/diffing.rb +41 -0
  32. data/lib/rails/commands/credentials/credentials_command.rb +76 -19
  33. data/lib/rails/commands/db/system/change/change_command.rb +25 -0
  34. data/lib/rails/commands/dbconsole/dbconsole_command.rb +66 -51
  35. data/lib/rails/commands/dev/dev_command.rb +19 -0
  36. data/lib/rails/commands/encrypted/USAGE +1 -1
  37. data/lib/rails/commands/encrypted/encrypted_command.rb +4 -4
  38. data/lib/rails/commands/generate/generate_command.rb +1 -1
  39. data/lib/rails/commands/help/help_command.rb +1 -1
  40. data/lib/rails/commands/initializers/initializers_command.rb +23 -0
  41. data/lib/rails/commands/new/new_command.rb +2 -2
  42. data/lib/rails/commands/notes/notes_command.rb +29 -0
  43. data/lib/rails/commands/plugin/plugin_command.rb +1 -1
  44. data/lib/rails/commands/rake/rake_command.rb +9 -8
  45. data/lib/rails/commands/routes/routes_command.rb +37 -0
  46. data/lib/rails/commands/runner/runner_command.rb +13 -9
  47. data/lib/rails/commands/secrets/USAGE +6 -0
  48. data/lib/rails/commands/secrets/secrets_command.rb +3 -3
  49. data/lib/rails/commands/server/server_command.rb +92 -56
  50. data/lib/rails/commands/test/test_command.rb +2 -2
  51. data/lib/rails/configuration.rb +48 -19
  52. data/lib/rails/engine/configuration.rb +6 -2
  53. data/lib/rails/engine/updater.rb +1 -1
  54. data/lib/rails/engine.rb +59 -49
  55. data/lib/rails/gem_version.rb +4 -4
  56. data/lib/rails/generators/actions/create_migration.rb +7 -1
  57. data/lib/rails/generators/actions.rb +89 -56
  58. data/lib/rails/generators/app_base.rb +90 -106
  59. data/lib/rails/generators/app_name.rb +50 -0
  60. data/lib/rails/generators/base.rb +15 -12
  61. data/lib/rails/generators/database.rb +57 -0
  62. data/lib/rails/generators/erb/mailer/mailer_generator.rb +1 -2
  63. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +0 -1
  64. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +7 -4
  65. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +1 -1
  66. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +9 -1
  67. data/lib/rails/generators/erb.rb +0 -1
  68. data/lib/rails/generators/generated_attribute.rb +50 -31
  69. data/lib/rails/generators/migration.rb +3 -3
  70. data/lib/rails/generators/model_helpers.rb +33 -2
  71. data/lib/rails/generators/named_base.rb +3 -7
  72. data/lib/rails/generators/rails/app/USAGE +2 -1
  73. data/lib/rails/generators/rails/app/app_generator.rb +120 -84
  74. data/lib/rails/generators/rails/app/templates/Gemfile.tt +17 -20
  75. data/lib/rails/generators/rails/app/templates/Rakefile.tt +1 -1
  76. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -3
  77. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +6 -0
  78. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +5 -0
  79. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +23 -0
  80. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +5 -0
  81. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +6 -5
  82. data/lib/rails/generators/rails/app/templates/bin/rails.tt +5 -2
  83. data/lib/rails/generators/rails/app/templates/bin/rake.tt +5 -2
  84. data/lib/rails/generators/rails/app/templates/bin/setup.tt +9 -9
  85. data/lib/rails/generators/rails/app/templates/bin/spring.tt +13 -0
  86. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +9 -3
  87. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +16 -7
  88. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +2 -2
  89. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +1 -1
  90. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +4 -5
  91. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +12 -11
  92. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +13 -12
  93. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +1 -1
  94. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +13 -12
  95. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +12 -11
  96. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +16 -15
  97. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +1 -1
  98. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +11 -10
  99. data/lib/rails/generators/rails/app/templates/config/environment.rb.tt +1 -1
  100. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +22 -5
  101. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +43 -17
  102. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +26 -7
  103. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  104. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +4 -3
  105. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +7 -0
  106. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
  107. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +67 -0
  108. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -0
  109. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +1 -1
  110. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +10 -4
  111. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +1 -1
  112. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +6 -6
  113. data/lib/rails/generators/rails/app/templates/config.ru.tt +2 -1
  114. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +1 -1
  115. data/lib/rails/generators/rails/app/templates/gitattributes.tt +14 -0
  116. data/lib/rails/generators/rails/app/templates/gitignore.tt +8 -8
  117. data/lib/rails/generators/rails/app/templates/package.json.tt +8 -2
  118. data/lib/rails/generators/rails/app/templates/public/robots.txt +1 -1
  119. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
  120. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +11 -0
  121. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +9 -2
  122. data/lib/rails/generators/rails/assets/USAGE +3 -7
  123. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -1
  124. data/lib/rails/generators/rails/benchmark/USAGE +19 -0
  125. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +29 -0
  126. data/lib/rails/generators/rails/benchmark/templates/benchmark.rb.tt +15 -0
  127. data/lib/rails/generators/rails/controller/USAGE +2 -2
  128. data/lib/rails/generators/rails/controller/controller_generator.rb +10 -39
  129. data/lib/rails/generators/rails/credentials/credentials_generator.rb +6 -7
  130. data/lib/rails/generators/rails/db/system/change/change_generator.rb +65 -0
  131. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +10 -7
  132. data/lib/rails/generators/rails/generator/USAGE +2 -2
  133. data/lib/rails/generators/rails/generator/generator_generator.rb +0 -1
  134. data/lib/rails/generators/rails/generator/templates/USAGE.tt +1 -1
  135. data/lib/rails/generators/rails/helper/USAGE +2 -3
  136. data/lib/rails/generators/rails/helper/helper_generator.rb +5 -0
  137. data/lib/rails/generators/rails/integration_test/USAGE +2 -2
  138. data/lib/rails/generators/rails/migration/USAGE +4 -4
  139. data/lib/rails/generators/rails/model/USAGE +15 -16
  140. data/lib/rails/generators/rails/plugin/plugin_generator.rb +33 -56
  141. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +10 -19
  142. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +3 -10
  143. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +4 -18
  144. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +1 -2
  145. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +1 -1
  146. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +1 -1
  147. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +1 -1
  148. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
  149. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +3 -3
  150. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +14 -11
  151. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +1 -1
  152. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +1 -1
  153. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb.tt +1 -0
  154. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +1 -1
  155. data/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb.tt +4 -4
  156. data/lib/rails/generators/rails/plugin/templates/test/integration/navigation_test.rb.tt +1 -1
  157. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +0 -4
  158. data/lib/rails/generators/rails/resource/USAGE +4 -4
  159. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -27
  160. data/lib/rails/generators/rails/scaffold/USAGE +5 -5
  161. data/lib/rails/generators/rails/scaffold_controller/USAGE +2 -2
  162. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +19 -0
  163. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
  164. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +2 -2
  165. data/lib/rails/generators/rails/system_test/USAGE +2 -2
  166. data/lib/rails/generators/rails/task/USAGE +3 -3
  167. data/lib/rails/generators/resource_helpers.rb +1 -6
  168. data/lib/rails/generators/test_case.rb +1 -1
  169. data/lib/rails/generators/test_unit/controller/controller_generator.rb +2 -0
  170. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb.tt +3 -3
  171. data/lib/rails/generators/test_unit/generator/generator_generator.rb +0 -1
  172. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +2 -2
  173. data/lib/rails/generators/test_unit/integration/integration_generator.rb +5 -0
  174. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb.tt +1 -1
  175. data/lib/rails/generators/test_unit/job/job_generator.rb +5 -0
  176. data/lib/rails/generators/test_unit/job/templates/unit_test.rb.tt +1 -1
  177. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +1 -1
  178. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +1 -1
  179. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +3 -3
  180. data/lib/rails/generators/test_unit/model/templates/unit_test.rb.tt +1 -1
  181. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +1 -1
  182. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +2 -2
  183. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +8 -4
  184. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +1 -1
  185. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +1 -1
  186. data/lib/rails/generators/test_unit/system/system_generator.rb +5 -0
  187. data/lib/rails/generators/testing/assertions.rb +2 -2
  188. data/lib/rails/generators/testing/behaviour.rb +4 -2
  189. data/lib/rails/generators.rb +38 -24
  190. data/lib/rails/info.rb +4 -4
  191. data/lib/rails/info_controller.rb +2 -3
  192. data/lib/rails/mailers_controller.rb +8 -4
  193. data/lib/rails/paths.rb +26 -10
  194. data/lib/rails/rack/logger.rb +1 -2
  195. data/lib/rails/railtie/configurable.rb +0 -1
  196. data/lib/rails/railtie/configuration.rb +3 -3
  197. data/lib/rails/railtie.rb +33 -13
  198. data/lib/rails/ruby_version_check.rb +3 -3
  199. data/lib/rails/secrets.rb +0 -1
  200. data/lib/rails/source_annotation_extractor.rb +124 -117
  201. data/lib/rails/tasks/engine.rake +1 -4
  202. data/lib/rails/tasks/framework.rake +12 -2
  203. data/lib/rails/tasks/log.rake +0 -1
  204. data/lib/rails/tasks/misc.rake +1 -1
  205. data/lib/rails/tasks/statistics.rake +5 -1
  206. data/lib/rails/tasks/yarn.rake +14 -2
  207. data/lib/rails/tasks/zeitwerk.rake +69 -0
  208. data/lib/rails/tasks.rb +1 -4
  209. data/lib/rails/templates/rails/mailers/email.html.erb +1 -0
  210. data/lib/rails/templates/rails/welcome/index.html.erb +3 -3
  211. data/lib/rails/test_help.rb +11 -9
  212. data/lib/rails/test_unit/reporter.rb +3 -2
  213. data/lib/rails/test_unit/runner.rb +25 -8
  214. data/lib/rails/test_unit/testing.rake +7 -1
  215. data/lib/rails.rb +10 -8
  216. metadata +46 -40
  217. data/lib/rails/generators/js/assets/assets_generator.rb +0 -15
  218. data/lib/rails/generators/js/assets/templates/javascript.js +0 -2
  219. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +0 -22
  220. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/cable.js.tt +0 -13
  221. data/lib/rails/generators/rails/app/templates/bin/bundle.tt +0 -2
  222. data/lib/rails/generators/rails/app/templates/bin/update.tt +0 -34
  223. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +0 -50
  224. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +0 -86
  225. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_5_2.rb.tt +0 -38
  226. data/lib/rails/generators/rails/assets/templates/javascript.js +0 -2
  227. data/lib/rails/generators/rails/plugin/templates/rails/application.rb.tt +0 -23
  228. data/lib/rails/tasks/annotations.rake +0 -22
  229. data/lib/rails/tasks/dev.rake +0 -10
  230. data/lib/rails/tasks/initializers.rake +0 -8
  231. data/lib/rails/tasks/routes.rake +0 -31
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/command/environment_argument"
4
+
5
+ module Rails
6
+ module Command
7
+ class InitializersCommand < Base # :nodoc:
8
+ include EnvironmentArgument
9
+
10
+ desc "initializers", "Print out all defined initializers in the order they are invoked by Rails."
11
+ def perform
12
+ extract_environment_option_from_argument
13
+ ENV["RAILS_ENV"] = options[:environment]
14
+
15
+ require_application_and_environment!
16
+
17
+ Rails.application.initializers.tsort_each do |initializer|
18
+ say "#{initializer.context_class}.#{initializer.name}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -10,8 +10,8 @@ module Rails
10
10
  end
11
11
 
12
12
  def perform(*)
13
- puts "Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.\n"
14
- puts "Type 'rails' for help."
13
+ say "Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.\n"
14
+ say "Type 'rails' for help."
15
15
  exit 1
16
16
  end
17
17
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/source_annotation_extractor"
4
+
5
+ module Rails
6
+ module Command
7
+ class NotesCommand < Base # :nodoc:
8
+ class_option :annotations, aliases: "-a", desc: "Filter by specific annotations, e.g. Foobar TODO", type: :array
9
+
10
+ def perform(*)
11
+ require_application_and_environment!
12
+
13
+ display_annotations
14
+ end
15
+
16
+ private
17
+ def display_annotations
18
+ annotations = options[:annotations] || Rails::SourceAnnotationExtractor::Annotation.tags
19
+ tag = (annotations.length > 1)
20
+
21
+ Rails::SourceAnnotationExtractor.enumerate annotations.join("|"), tag: tag, dirs: directories
22
+ end
23
+
24
+ def directories
25
+ Rails::SourceAnnotationExtractor::Annotation.directories
26
+ end
27
+ end
28
+ end
29
+ end
@@ -26,7 +26,7 @@ module Rails
26
26
 
27
27
  if File.exist?(railsrc)
28
28
  extra_args = File.read(railsrc).split(/\n+/).flat_map(&:split)
29
- puts "Using #{extra_args.join(" ")} from #{railsrc}"
29
+ say "Using #{extra_args.join(" ")} from #{railsrc}"
30
30
  plugin_args.insert(1, *extra_args)
31
31
  end
32
32
  end
@@ -12,15 +12,16 @@ module Rails
12
12
  formatted_rake_tasks.map(&:first)
13
13
  end
14
14
 
15
- def perform(task, *)
15
+ def perform(task, args, config)
16
16
  require_rake
17
17
 
18
- ARGV.unshift(task) # Prepend the task, so Rake knows how to run it.
19
-
20
- Rake.application.standard_exception_handling do
21
- Rake.application.init("rails")
22
- Rake.application.load_rakefile
23
- Rake.application.top_level
18
+ Rake.with_application do |rake|
19
+ rake.init("rails", [task, *args])
20
+ rake.load_rakefile
21
+ if Rails.respond_to?(:root)
22
+ rake.options.suppress_backtrace_pattern = /\A(?!#{Regexp.quote(Rails.root.to_s)})/
23
+ end
24
+ rake.standard_exception_handling { rake.top_level }
24
25
  end
25
26
  end
26
27
 
@@ -30,7 +31,7 @@ module Rails
30
31
 
31
32
  return @rake_tasks if defined?(@rake_tasks)
32
33
 
33
- require_application_and_environment!
34
+ require_application!
34
35
 
35
36
  Rake::TaskManager.record_task_metadata = true
36
37
  Rake.application.instance_variable_set(:@name, "rails")
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/command"
4
+
5
+ module Rails
6
+ module Command
7
+ class RoutesCommand < Base # :nodoc:
8
+ class_option :controller, aliases: "-c", desc: "Filter by a specific controller, e.g. PostsController or Admin::PostsController."
9
+ class_option :grep, aliases: "-g", desc: "Grep routes by a specific pattern."
10
+ class_option :expanded, type: :boolean, aliases: "-E", desc: "Print routes expanded vertically with parts explained."
11
+
12
+ def perform(*)
13
+ require_application_and_environment!
14
+ require "action_dispatch/routing/inspector"
15
+
16
+ say inspector.format(formatter, routes_filter)
17
+ end
18
+
19
+ private
20
+ def inspector
21
+ ActionDispatch::Routing::RoutesInspector.new(Rails.application.routes.routes)
22
+ end
23
+
24
+ def formatter
25
+ if options.key?("expanded")
26
+ ActionDispatch::Routing::ConsoleFormatter::Expanded.new
27
+ else
28
+ ActionDispatch::Routing::ConsoleFormatter::Sheet.new
29
+ end
30
+ end
31
+
32
+ def routes_filter
33
+ options.symbolize_keys.slice(:controller, :grep)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,16 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails/command/environment_argument"
4
+
3
5
  module Rails
4
6
  module Command
5
7
  class RunnerCommand < Base # :nodoc:
6
- class_option :environment, aliases: "-e", type: :string,
7
- default: Rails::Command.environment.dup,
8
- desc: "The environment for the runner to operate under (test/development/production)"
8
+ include EnvironmentArgument
9
+
10
+ self.environment_desc = "The environment for the runner to operate under (test/development/production)"
9
11
 
10
12
  no_commands do
11
13
  def help
12
14
  super
13
- puts self.class.desc
15
+ say self.class.desc
14
16
  end
15
17
  end
16
18
 
@@ -19,6 +21,8 @@ module Rails
19
21
  end
20
22
 
21
23
  def perform(code_or_file = nil, *command_argv)
24
+ extract_environment_option_from_argument
25
+
22
26
  unless code_or_file
23
27
  help
24
28
  exit 1
@@ -39,11 +43,11 @@ module Rails
39
43
  else
40
44
  begin
41
45
  eval(code_or_file, TOPLEVEL_BINDING, __FILE__, __LINE__)
42
- rescue SyntaxError, NameError => error
43
- $stderr.puts "Please specify a valid ruby command or the path of a script to run."
44
- $stderr.puts "Run '#{self.class.executable} -h' for help."
45
- $stderr.puts
46
- $stderr.puts error
46
+ 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
47
51
  exit 1
48
52
  end
49
53
  end
@@ -1,3 +1,9 @@
1
+ === ** DEPRECATED **
2
+
3
+ Rails 5.2 has introduced a new `credentials` API that replaces Rails secrets.
4
+ Please use the Rails `credentials` commands instead.
5
+ Run `rails credentials:help` for more information.
6
+
1
7
  === Storing Encrypted Secrets in Source Control
2
8
 
3
9
  The Rails `secrets` commands helps encrypting secrets to slim a production
@@ -22,7 +22,7 @@ module Rails
22
22
  if ENV["EDITOR"].to_s.empty?
23
23
  say "No $EDITOR to open decrypted secrets in. Assign one like this:"
24
24
  say ""
25
- say %(EDITOR="mate --wait" bin/rails secrets:edit)
25
+ say %(EDITOR="mate --wait" rails secrets:edit)
26
26
  say ""
27
27
  say "For editors that fork and exit immediately, it's important to pass a wait flag,"
28
28
  say "otherwise the secrets will be saved immediately with no chance to edit."
@@ -42,7 +42,7 @@ module Rails
42
42
  rescue Rails::Secrets::MissingKeyError => error
43
43
  say error.message
44
44
  rescue Errno::ENOENT => error
45
- if error.message =~ /secrets\.yml\.enc/
45
+ if /secrets\.yml\.enc/.match?(error.message)
46
46
  deprecate_in_favor_of_credentials_and_exit
47
47
  else
48
48
  raise
@@ -56,7 +56,7 @@ module Rails
56
56
  private
57
57
  def deprecate_in_favor_of_credentials_and_exit
58
58
  say "Encrypted secrets is deprecated in favor of credentials. Run:"
59
- say "bin/rails credentials:help"
59
+ say "rails credentials:help"
60
60
 
61
61
  exit 1
62
62
  end
@@ -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
- require "active_support/deprecation"
8
6
  require "active_support/core_ext/string/filters"
7
+ require "active_support/core_ext/symbol/starts_ends_with"
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,14 @@ 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 falcon)
100
+
111
101
  DEFAULT_PORT = 3000
112
- DEFAULT_PID_PATH = "tmp/pids/server.pid".freeze
102
+ DEFAULT_PIDFILE = "tmp/pids/server.pid"
113
103
 
114
104
  class_option :port, aliases: "-p", type: :numeric,
115
105
  desc: "Runs Rails on the specified port - defaults to 3000.", banner: :port
@@ -120,31 +110,41 @@ module Rails
120
110
  desc: "Uses a custom rackup configuration.", banner: :file
121
111
  class_option :daemon, aliases: "-d", type: :boolean, default: false,
122
112
  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
125
- class_option :pid, aliases: "-P", type: :string, default: DEFAULT_PID_PATH,
126
- desc: "Specifies the PID file."
127
- class_option "dev-caching", aliases: "-C", type: :boolean, default: nil,
113
+ class_option :using, aliases: "-u", type: :string,
114
+ desc: "Specifies the Rack server used to run the application (thin/puma/webrick).", banner: :name
115
+ class_option :pid, aliases: "-P", type: :string,
116
+ desc: "Specifies the PID file - defaults to #{DEFAULT_PIDFILE}."
117
+ class_option :dev_caching, aliases: "-C", type: :boolean, default: nil,
128
118
  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."
119
+ 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 :log_to_stdout, type: :boolean, default: nil, optional: true,
122
+ desc: "Whether to log to stdout. Enabled by default in development when not daemonized."
131
123
 
132
- def initialize(args = [], local_options = {}, config = {})
133
- @original_options = local_options
124
+ def initialize(args, local_options, *)
134
125
  super
135
- @server = self.args.shift
136
- @log_stdout = options[:daemon].blank? && (options[:environment] || Rails.env) == "development"
126
+
127
+ @original_options = local_options - %w( --restart )
137
128
  end
138
129
 
139
130
  def perform
131
+ extract_environment_option_from_argument
140
132
  set_application_directory!
141
133
  prepare_restart
134
+
142
135
  Rails::Server.new(server_options).tap do |server|
143
136
  # Require application after server sets environment to propagate
144
137
  # the --environment option.
145
138
  require APP_PATH
146
139
  Dir.chdir(Rails.application.root)
147
- server.start
140
+
141
+ if server.serveable?
142
+ print_boot_information(server.server, server.served_url)
143
+ after_stop_callback = -> { say "Exiting" unless options[:daemon] }
144
+ server.start(after_stop_callback)
145
+ else
146
+ say rack_server_suggestion(options[:using])
147
+ end
148
148
  end
149
149
  end
150
150
 
@@ -152,8 +152,8 @@ module Rails
152
152
  def server_options
153
153
  {
154
154
  user_supplied_options: user_supplied_options,
155
- server: @server,
156
- log_stdout: @log_stdout,
155
+ server: options[:using],
156
+ log_stdout: log_to_stdout?,
157
157
  Port: port,
158
158
  Host: host,
159
159
  DoNotReverseLookup: true,
@@ -161,7 +161,7 @@ module Rails
161
161
  environment: environment,
162
162
  daemonize: options[:daemon],
163
163
  pid: pid,
164
- caching: options["dev-caching"],
164
+ caching: options[:dev_caching],
165
165
  restart_cmd: restart_command,
166
166
  early_hints: early_hints
167
167
  }
@@ -175,7 +175,7 @@ module Rails
175
175
  # ["-p3001", "-C", "--binding", "127.0.0.1"] # => {"-p"=>true, "-C"=>true, "--binding"=>true}
176
176
  user_flag = {}
177
177
  @original_options.each do |command|
178
- if command.to_s.start_with?("--")
178
+ if command.start_with?("--")
179
179
  option = command.split("=")[0]
180
180
  user_flag[option] = true
181
181
  elsif command =~ /\A(-.)/
@@ -194,7 +194,7 @@ module Rails
194
194
  name = :Port
195
195
  when :binding
196
196
  name = :Host
197
- when :"dev-caching"
197
+ when :dev_caching
198
198
  name = :caching
199
199
  when :daemonize
200
200
  name = :daemon
@@ -202,8 +202,9 @@ module Rails
202
202
  user_supplied_options << name
203
203
  end
204
204
  end
205
- user_supplied_options << :Host if ENV["HOST"]
205
+ user_supplied_options << :Host if ENV["HOST"] || ENV["BINDING"]
206
206
  user_supplied_options << :Port if ENV["PORT"]
207
+ user_supplied_options << :pid if ENV["PIDFILE"]
207
208
  user_supplied_options.uniq
208
209
  end
209
210
  end
@@ -217,7 +218,8 @@ module Rails
217
218
  options[:binding]
218
219
  else
219
220
  default_host = environment == "development" ? "localhost" : "0.0.0.0"
220
- ENV.fetch("HOST", default_host)
221
+
222
+ ENV.fetch("BINDING", default_host)
221
223
  end
222
224
  end
223
225
 
@@ -226,23 +228,57 @@ module Rails
226
228
  end
227
229
 
228
230
  def restart_command
229
- "bin/rails server #{@server} #{@original_options.join(" ")} --restart"
231
+ "bin/rails server #{@original_options.join(" ")} --restart"
230
232
  end
231
233
 
232
234
  def early_hints
233
235
  options[:early_hints]
234
236
  end
235
237
 
238
+ def log_to_stdout?
239
+ options.fetch(:log_to_stdout) do
240
+ options[:daemon].blank? && environment == "development"
241
+ end
242
+ end
243
+
236
244
  def pid
237
- File.expand_path(options[:pid])
245
+ File.expand_path(options[:pid] || ENV.fetch("PIDFILE", DEFAULT_PIDFILE))
238
246
  end
239
247
 
240
248
  def self.banner(*)
241
- "rails server [puma, thin etc] [options]"
249
+ "rails server -u [thin/puma/webrick] [options]"
242
250
  end
243
251
 
244
252
  def prepare_restart
245
- FileUtils.rm_f(options[:pid]) if options[:restart]
253
+ FileUtils.rm_f(pid) if options[:restart]
254
+ end
255
+
256
+ def rack_server_suggestion(server)
257
+ if server.in?(RACK_SERVERS)
258
+ <<~MSG
259
+ Could not load server "#{server}". Maybe you need to the add it to the Gemfile?
260
+
261
+ gem "#{server}"
262
+
263
+ Run `bin/rails server --help` for more options.
264
+ MSG
265
+ else
266
+ suggestion = Rails::Command::Spellchecker.suggest(server, from: RACK_SERVERS)
267
+ suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion
268
+
269
+ <<~MSG
270
+ Could not find server "#{server}". #{suggestion_msg}
271
+ Run `bin/rails server --help` for more options.
272
+ MSG
273
+ end
274
+ end
275
+
276
+ def print_boot_information(server, url)
277
+ say <<~MSG
278
+ => Booting #{ActiveSupport::Inflector.demodulize(server)}
279
+ => Rails #{Rails.version} application starting in #{Rails.env} #{url}
280
+ => Run `bin/rails server --help` for more startup options
281
+ MSG
246
282
  end
247
283
  end
248
284
  end
@@ -29,8 +29,8 @@ module Rails
29
29
  def perform(*)
30
30
  $LOAD_PATH << Rails::Command.root.join("test").to_s
31
31
 
32
- Rails::TestUnit::Runner.parse_options(ARGV)
33
- Rails::TestUnit::Runner.run(ARGV)
32
+ Rails::TestUnit::Runner.parse_options(args)
33
+ Rails::TestUnit::Runner.run(args)
34
34
  end
35
35
  end
36
36
  end
@@ -30,6 +30,15 @@ module Rails
30
30
  #
31
31
  # config.middleware.swap ActionDispatch::Flash, Magical::Unicorns
32
32
  #
33
+ # Middlewares can be moved from one place to another:
34
+ #
35
+ # config.middleware.move_before ActionDispatch::Flash, Magical::Unicorns
36
+ #
37
+ # This will move the <tt>Magical::Unicorns</tt> middleware before the
38
+ # <tt>ActionDispatch::Flash</tt>. You can also move it after:
39
+ #
40
+ # config.middleware.move_after ActionDispatch::Flash, Magical::Unicorns
41
+ #
33
42
  # And finally they can also be removed from the stack completely:
34
43
  #
35
44
  # config.middleware.delete ActionDispatch::Flash
@@ -41,34 +50,49 @@ module Rails
41
50
  end
42
51
 
43
52
  def insert_before(*args, &block)
44
- @operations << [__method__, args, block]
53
+ @operations << -> middleware { middleware.insert_before(*args, &block) }
45
54
  end
55
+ ruby2_keywords(:insert_before) if respond_to?(:ruby2_keywords, true)
46
56
 
47
57
  alias :insert :insert_before
48
58
 
49
59
  def insert_after(*args, &block)
50
- @operations << [__method__, args, block]
60
+ @operations << -> middleware { middleware.insert_after(*args, &block) }
51
61
  end
62
+ ruby2_keywords(:insert_after) if respond_to?(:ruby2_keywords, true)
52
63
 
53
64
  def swap(*args, &block)
54
- @operations << [__method__, args, block]
65
+ @operations << -> middleware { middleware.swap(*args, &block) }
55
66
  end
67
+ ruby2_keywords(:swap) if respond_to?(:ruby2_keywords, true)
56
68
 
57
69
  def use(*args, &block)
58
- @operations << [__method__, args, block]
70
+ @operations << -> middleware { middleware.use(*args, &block) }
59
71
  end
72
+ ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true)
60
73
 
61
74
  def delete(*args, &block)
62
- @delete_operations << [__method__, args, block]
75
+ @delete_operations << -> middleware { middleware.delete(*args, &block) }
76
+ end
77
+
78
+ def move_before(*args, &block)
79
+ @delete_operations << -> middleware { middleware.move_before(*args, &block) }
80
+ end
81
+
82
+ alias :move :move_before
83
+
84
+ def move_after(*args, &block)
85
+ @delete_operations << -> middleware { middleware.move_after(*args, &block) }
63
86
  end
64
87
 
65
88
  def unshift(*args, &block)
66
- @operations << [__method__, args, block]
89
+ @operations << -> middleware { middleware.unshift(*args, &block) }
67
90
  end
91
+ ruby2_keywords(:unshift) if respond_to?(:ruby2_keywords, true)
68
92
 
69
93
  def merge_into(other) #:nodoc:
70
- (@operations + @delete_operations).each do |operation, args, block|
71
- other.send(operation, *args, &block)
94
+ (@operations + @delete_operations).each do |operation|
95
+ operation.call(other)
72
96
  end
73
97
 
74
98
  other
@@ -79,18 +103,12 @@ module Rails
79
103
  end
80
104
 
81
105
  protected
82
- def operations
83
- @operations
84
- end
85
-
86
- def delete_operations
87
- @delete_operations
88
- end
106
+ attr_reader :operations, :delete_operations
89
107
  end
90
108
 
91
109
  class Generators #:nodoc:
92
110
  attr_accessor :aliases, :options, :templates, :fallbacks, :colorize_logging, :api_only
93
- attr_reader :hidden_namespaces
111
+ attr_reader :hidden_namespaces, :after_generate_callbacks
94
112
 
95
113
  def initialize
96
114
  @aliases = Hash.new { |h, k| h[k] = {} }
@@ -100,6 +118,7 @@ module Rails
100
118
  @colorize_logging = true
101
119
  @api_only = false
102
120
  @hidden_namespaces = []
121
+ @after_generate_callbacks = []
103
122
  end
104
123
 
105
124
  def initialize_copy(source)
@@ -113,10 +132,20 @@ module Rails
113
132
  @hidden_namespaces << namespace
114
133
  end
115
134
 
116
- def method_missing(method, *args)
117
- method = method.to_s.sub(/=$/, "").to_sym
135
+ def after_generate(&block)
136
+ @after_generate_callbacks << block
137
+ end
118
138
 
119
- return @options[method] if args.empty?
139
+ def method_missing(method, *args)
140
+ method = method.to_s.delete_suffix("=").to_sym
141
+
142
+ if args.empty?
143
+ if method == :rails
144
+ return @options[method]
145
+ else
146
+ return @options[:rails][method]
147
+ end
148
+ end
120
149
 
121
150
  if method == :rails || args.first.is_a?(Hash)
122
151
  namespace, configuration = method, args.shift