railties 5.2.2.1 → 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +338 -119
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.rdoc +38 -32
  5. data/README.rdoc +2 -2
  6. data/lib/minitest/rails_plugin.rb +7 -11
  7. data/lib/rails.rb +5 -0
  8. data/lib/rails/all.rb +4 -0
  9. data/lib/rails/api/generator.rb +2 -1
  10. data/lib/rails/api/task.rb +17 -0
  11. data/lib/rails/app_loader.rb +2 -2
  12. data/lib/rails/app_updater.rb +3 -1
  13. data/lib/rails/application.rb +73 -30
  14. data/lib/rails/application/bootstrap.rb +2 -10
  15. data/lib/rails/application/configuration.rb +114 -13
  16. data/lib/rails/application/default_middleware_stack.rb +3 -0
  17. data/lib/rails/application/dummy_erb_compiler.rb +18 -0
  18. data/lib/rails/application/finisher.rb +54 -0
  19. data/lib/rails/autoloaders.rb +48 -0
  20. data/lib/rails/backtrace_cleaner.rb +5 -17
  21. data/lib/rails/code_statistics.rb +3 -3
  22. data/lib/rails/command.rb +11 -10
  23. data/lib/rails/command/actions.rb +10 -0
  24. data/lib/rails/command/base.rb +16 -4
  25. data/lib/rails/command/behavior.rb +7 -48
  26. data/lib/rails/command/environment_argument.rb +8 -15
  27. data/lib/rails/command/spellchecker.rb +58 -0
  28. data/lib/rails/commands/console/console_command.rb +6 -0
  29. data/lib/rails/commands/credentials/USAGE +19 -1
  30. data/lib/rails/commands/credentials/credentials_command.rb +54 -21
  31. data/lib/rails/commands/db/system/change/change_command.rb +20 -0
  32. data/lib/rails/commands/dbconsole/dbconsole_command.rb +20 -8
  33. data/lib/rails/commands/dev/dev_command.rb +19 -0
  34. data/lib/rails/commands/encrypted/USAGE +28 -0
  35. data/lib/rails/commands/encrypted/encrypted_command.rb +3 -2
  36. data/lib/rails/commands/help/help_command.rb +1 -1
  37. data/lib/rails/commands/initializers/initializers_command.rb +23 -0
  38. data/lib/rails/commands/new/new_command.rb +2 -2
  39. data/lib/rails/commands/notes/notes_command.rb +39 -0
  40. data/lib/rails/commands/plugin/plugin_command.rb +1 -1
  41. data/lib/rails/commands/routes/routes_command.rb +37 -0
  42. data/lib/rails/commands/runner/runner_command.rb +13 -9
  43. data/lib/rails/commands/secrets/USAGE +3 -3
  44. data/lib/rails/commands/secrets/secrets_command.rb +3 -3
  45. data/lib/rails/commands/server/server_command.rb +113 -50
  46. data/lib/rails/configuration.rb +1 -7
  47. data/lib/rails/engine.rb +44 -18
  48. data/lib/rails/engine/configuration.rb +5 -2
  49. data/lib/rails/gem_version.rb +3 -3
  50. data/lib/rails/generators.rb +11 -10
  51. data/lib/rails/generators/actions.rb +52 -39
  52. data/lib/rails/generators/app_base.rb +60 -98
  53. data/lib/rails/generators/app_name.rb +50 -0
  54. data/lib/rails/generators/base.rb +4 -0
  55. data/lib/rails/generators/database.rb +58 -0
  56. data/lib/rails/generators/erb/mailer/mailer_generator.rb +1 -1
  57. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +6 -3
  58. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +1 -1
  59. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +9 -1
  60. data/lib/rails/generators/generated_attribute.rb +53 -27
  61. data/lib/rails/generators/migration.rb +1 -2
  62. data/lib/rails/generators/model_helpers.rb +8 -1
  63. data/lib/rails/generators/named_base.rb +2 -6
  64. data/lib/rails/generators/rails/app/app_generator.rb +38 -71
  65. data/lib/rails/generators/rails/app/templates/Gemfile.tt +8 -11
  66. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -3
  67. data/lib/rails/generators/rails/app/templates/app/{assets/javascripts/cable.js.tt → javascript/channels/consumer.js} +2 -9
  68. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +5 -0
  69. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +23 -0
  70. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +5 -0
  71. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +4 -4
  72. data/lib/rails/generators/rails/app/templates/bin/setup.tt +7 -7
  73. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +2 -0
  74. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +1 -1
  75. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +2 -2
  76. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +2 -2
  77. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  78. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  79. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +3 -3
  80. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +1 -1
  81. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +4 -4
  82. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  83. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +6 -6
  84. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +1 -1
  85. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +2 -2
  86. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +5 -2
  87. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +28 -12
  88. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +13 -6
  89. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  90. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +7 -0
  91. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_0.rb.tt +45 -0
  92. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +1 -1
  93. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +7 -3
  94. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +1 -1
  95. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +6 -6
  96. data/lib/rails/generators/rails/app/templates/gitignore.tt +3 -7
  97. data/lib/rails/generators/rails/app/templates/package.json.tt +7 -1
  98. data/lib/rails/generators/rails/app/templates/public/robots.txt +1 -1
  99. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
  100. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +11 -0
  101. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +7 -0
  102. data/lib/rails/generators/rails/assets/USAGE +1 -4
  103. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -1
  104. data/lib/rails/generators/rails/controller/controller_generator.rb +11 -1
  105. data/lib/rails/generators/rails/credentials/credentials_generator.rb +7 -8
  106. data/lib/rails/generators/rails/db/system/change/change_generator.rb +65 -0
  107. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +4 -5
  108. data/lib/rails/generators/rails/helper/helper_generator.rb +5 -0
  109. data/lib/rails/generators/rails/plugin/plugin_generator.rb +9 -33
  110. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +1 -1
  111. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +1 -1
  112. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +1 -1
  113. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +1 -1
  114. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
  115. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +2 -1
  116. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +1 -1
  117. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +1 -1
  118. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +1 -2
  119. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +14 -0
  120. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -1
  121. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +1 -1
  122. data/lib/rails/generators/resource_helpers.rb +1 -6
  123. data/lib/rails/generators/test_unit/integration/integration_generator.rb +6 -0
  124. data/lib/rails/generators/test_unit/job/job_generator.rb +5 -0
  125. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +1 -1
  126. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
  127. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +12 -2
  128. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +8 -0
  129. data/lib/rails/generators/test_unit/system/system_generator.rb +5 -0
  130. data/lib/rails/generators/testing/behaviour.rb +3 -0
  131. data/lib/rails/info.rb +3 -3
  132. data/lib/rails/info_controller.rb +1 -1
  133. data/lib/rails/mailers_controller.rb +7 -4
  134. data/lib/rails/paths.rb +19 -9
  135. data/lib/rails/railtie.rb +1 -1
  136. data/lib/rails/ruby_version_check.rb +3 -3
  137. data/lib/rails/secrets.rb +0 -1
  138. data/lib/rails/source_annotation_extractor.rb +138 -117
  139. data/lib/rails/tasks.rb +1 -0
  140. data/lib/rails/tasks/annotations.rake +9 -9
  141. data/lib/rails/tasks/dev.rake +5 -4
  142. data/lib/rails/tasks/framework.rake +5 -1
  143. data/lib/rails/tasks/initializers.rake +5 -4
  144. data/lib/rails/tasks/log.rake +0 -1
  145. data/lib/rails/tasks/routes.rake +4 -26
  146. data/lib/rails/tasks/statistics.rake +4 -0
  147. data/lib/rails/tasks/yarn.rake +2 -3
  148. data/lib/rails/tasks/zeitwerk.rake +66 -0
  149. data/lib/rails/templates/rails/welcome/index.html.erb +2 -2
  150. data/lib/rails/test_help.rb +11 -9
  151. data/lib/rails/test_unit/reporter.rb +1 -1
  152. data/lib/rails/test_unit/runner.rb +5 -5
  153. data/lib/rails/test_unit/testing.rake +1 -1
  154. metadata +36 -23
  155. data/lib/rails/generators/js/assets/assets_generator.rb +0 -15
  156. data/lib/rails/generators/js/assets/templates/javascript.js +0 -2
  157. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +0 -22
  158. data/lib/rails/generators/rails/app/templates/bin/bundle.tt +0 -2
  159. data/lib/rails/generators/rails/app/templates/bin/update.tt +0 -34
  160. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_5_2.rb.tt +0 -38
  161. data/lib/rails/generators/rails/assets/templates/javascript.js +0 -2
@@ -88,7 +88,7 @@ task default: :test
88
88
 
89
89
  PASSTHROUGH_OPTIONS = [
90
90
  :skip_active_record, :skip_active_storage, :skip_action_mailer, :skip_javascript, :skip_action_cable, :skip_sprockets, :database,
91
- :javascript, :skip_yarn, :api, :quiet, :pretend, :skip
91
+ :api, :quiet, :pretend, :skip
92
92
  ]
93
93
 
94
94
  def generate_test_dummy(force = false)
@@ -98,6 +98,7 @@ task default: :test
98
98
  opts[:skip_listen] = true
99
99
  opts[:skip_git] = true
100
100
  opts[:skip_turbolinks] = true
101
+ opts[:skip_webpack_install] = true
101
102
  opts[:dummy_app] = true
102
103
 
103
104
  invoke Rails::Generators::AppGenerator,
@@ -113,7 +114,7 @@ task default: :test
113
114
  end
114
115
 
115
116
  def test_dummy_assets
116
- template "rails/javascripts.js", "#{dummy_path}/app/assets/javascripts/application.js", force: true
117
+ template "rails/javascripts.js", "#{dummy_path}/app/javascript/packs/application.js", force: true
117
118
  template "rails/stylesheets.css", "#{dummy_path}/app/assets/stylesheets/application.css", force: true
118
119
  template "rails/dummy_manifest.js", "#{dummy_path}/app/assets/config/manifest.js", force: true
119
120
  end
@@ -143,17 +144,6 @@ task default: :test
143
144
  end
144
145
  end
145
146
 
146
- def javascripts
147
- return if options.skip_javascript?
148
-
149
- if mountable?
150
- template "rails/javascripts.js",
151
- "app/assets/javascripts/#{namespaced_name}/application.js"
152
- elsif full?
153
- empty_directory_with_keep_file "app/assets/javascripts/#{namespaced_name}"
154
- end
155
- end
156
-
157
147
  def bin(force = false)
158
148
  bin_file = engine? ? "bin/rails.tt" : "bin/test.tt"
159
149
  template bin_file, force: force do |content|
@@ -235,10 +225,6 @@ task default: :test
235
225
  build(:stylesheets) unless api?
236
226
  end
237
227
 
238
- def create_javascript_files
239
- build(:javascripts) unless api?
240
- end
241
-
242
228
  def create_bin_files
243
229
  build(:bin)
244
230
  end
@@ -262,16 +248,6 @@ task default: :test
262
248
 
263
249
  public_task :apply_rails_template
264
250
 
265
- def run_after_bundle_callbacks
266
- unless @after_bundle_callbacks.empty?
267
- ActiveSupport::Deprecation.warn("`after_bundle` is deprecated and will be removed in the next version of Rails. ")
268
- end
269
-
270
- @after_bundle_callbacks.each do |callback|
271
- callback.call
272
- end
273
- end
274
-
275
251
  def name
276
252
  @name ||= begin
277
253
  # same as ActiveSupport::Inflector#underscore except not replacing '-'
@@ -348,9 +324,9 @@ task default: :test
348
324
  def wrap_in_modules(unwrapped_code)
349
325
  unwrapped_code = "#{unwrapped_code}".strip.gsub(/\s$\n/, "")
350
326
  modules.reverse.inject(unwrapped_code) do |content, mod|
351
- str = "module #{mod}\n"
352
- str += content.lines.map { |line| " #{line}" }.join
353
- str += content.present? ? "\nend" : "end"
327
+ str = +"module #{mod}\n"
328
+ str << content.lines.map { |line| " #{line}" }.join
329
+ str << (content.present? ? "\nend" : "end")
354
330
  end
355
331
  end
356
332
 
@@ -385,11 +361,11 @@ task default: :test
385
361
  end
386
362
 
387
363
  def valid_const?
388
- if original_name =~ /-\d/
364
+ if /-\d/.match?(original_name)
389
365
  raise Error, "Invalid plugin name #{original_name}. Please give a name which does not contain a namespace starting with numeric characters."
390
- elsif original_name =~ /[^\w-]+/
366
+ elsif /[^\w-]+/.match?(original_name)
391
367
  raise Error, "Invalid plugin name #{original_name}. Please give a name which uses only alphabetic, numeric, \"_\" or \"-\" characters."
392
- elsif camelized =~ /^\d/
368
+ elsif /^\d/.match?(camelized)
393
369
  raise Error, "Invalid plugin name #{original_name}. Please give a name which does not start with numbers."
394
370
  elsif RESERVED_NAMES.include?(name)
395
371
  raise Error, "Invalid plugin name #{original_name}. Please give a " \
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class ApplicationController < ActionController::#{api? ? "API" : "Base"}
3
3
  #{ api? ? '# ' : '' }protect_from_forgery with: :exception
4
4
  end
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  module ApplicationHelper
3
3
  end
4
4
  rb
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class ApplicationJob < ActiveJob::Base
3
3
  end
4
4
  rb
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class ApplicationMailer < ActionMailer::Base
3
3
  default from: 'from@example.com'
4
4
  layout 'mailer'
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class ApplicationRecord < ActiveRecord::Base
3
3
  self.abstract_class = true
4
4
  end
@@ -5,9 +5,10 @@ pkg/
5
5
  <% if sqlite3? -%>
6
6
  <%= dummy_path %>/db/*.sqlite3
7
7
  <%= dummy_path %>/db/*.sqlite3-journal
8
+ <%= dummy_path %>/db/*.sqlite3-*
8
9
  <% end -%>
9
10
  <%= dummy_path %>/log/*.log
10
- <% unless options[:skip_yarn] -%>
11
+ <% unless options[:skip_javascript] -%>
11
12
  <%= dummy_path %>/node_modules/
12
13
  <%= dummy_path %>/yarn-error.log
13
14
  <% end -%>
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class Engine < ::Rails::Engine
3
3
  #{mountable? ? ' isolate_namespace ' + camelized_modules : ' '}
4
4
  #{api? ? " config.generators.api_only = true" : ' '}
@@ -1,4 +1,4 @@
1
- <%= wrap_in_modules <<-rb.strip_heredoc
1
+ <%= wrap_in_modules <<~rb
2
2
  class Railtie < ::Rails::Railtie
3
3
  end
4
4
  rb
@@ -10,8 +10,7 @@ ActiveRecord::Migrator.migrations_paths << File.expand_path('../db/migrate', __d
10
10
  <% end -%>
11
11
  require "rails/test_help"
12
12
 
13
- # Filter out Minitest backtrace while allowing backtrace from other libraries
14
- # to be shown.
13
+ # Filter out the backtrace from minitest while preserving the one from other libraries.
15
14
  Minitest.backtrace_filter = Minitest::BacktraceFilter.new
16
15
 
17
16
  <% unless engine? -%>
@@ -32,6 +32,20 @@ module Rails
32
32
  hook_for :helper, as: :scaffold do |invoked|
33
33
  invoke invoked, [ controller_name ]
34
34
  end
35
+
36
+ private
37
+
38
+ def permitted_params
39
+ attachments, others = attributes_names.partition { |name| attachments?(name) }
40
+ params = others.map { |name| ":#{name}" }
41
+ params += attachments.map { |name| "#{name}: []" }
42
+ params.join(", ")
43
+ end
44
+
45
+ def attachments?(name)
46
+ attribute = attributes.find { |attr| attr.name == name }
47
+ attribute&.attachments?
48
+ end
35
49
  end
36
50
  end
37
51
  end
@@ -54,7 +54,7 @@ class <%= controller_class_name %>Controller < ApplicationController
54
54
  <%- if attributes_names.empty? -%>
55
55
  params.fetch(:<%= singular_table_name %>, {})
56
56
  <%- else -%>
57
- params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
57
+ params.require(:<%= singular_table_name %>).permit(<%= permitted_params %>)
58
58
  <%- end -%>
59
59
  end
60
60
  end
@@ -61,7 +61,7 @@ class <%= controller_class_name %>Controller < ApplicationController
61
61
  <%- if attributes_names.empty? -%>
62
62
  params.fetch(:<%= singular_table_name %>, {})
63
63
  <%- else -%>
64
- params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
64
+ params.require(:<%= singular_table_name %>).permit(<%= permitted_params %>)
65
65
  <%- end -%>
66
66
  end
67
67
  end
@@ -25,13 +25,8 @@ module Rails
25
25
  assign_controller_names!(controller_name.pluralize)
26
26
  end
27
27
 
28
- # TODO Change this to private once we've dropped Ruby 2.2 support.
29
- # Workaround for Ruby 2.2 "private attribute?" warning.
30
- protected
31
-
32
- attr_reader :controller_name, :controller_file_name
33
-
34
28
  private
29
+ attr_reader :controller_name, :controller_file_name
35
30
 
36
31
  def controller_class_path
37
32
  if options[:model_name]
@@ -10,6 +10,12 @@ module TestUnit # :nodoc:
10
10
  def create_test_files
11
11
  template "integration_test.rb", File.join("test/integration", class_path, "#{file_name}_test.rb")
12
12
  end
13
+
14
+ private
15
+
16
+ def file_name
17
+ @_file_name ||= super.sub(/_test\z/i, "")
18
+ end
13
19
  end
14
20
  end
15
21
  end
@@ -10,6 +10,11 @@ module TestUnit # :nodoc:
10
10
  def create_test_file
11
11
  template "unit_test.rb", File.join("test/jobs", class_path, "#{file_name}_job_test.rb")
12
12
  end
13
+
14
+ private
15
+ def file_name
16
+ @_file_name ||= super.sub(/_job\z/i, "")
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -21,7 +21,7 @@ module TestUnit # :nodoc:
21
21
 
22
22
  private
23
23
  def file_name
24
- @_file_name ||= super.gsub(/_mailer/i, "")
24
+ @_file_name ||= super.sub(/_mailer\z/i, "")
25
25
  end
26
26
  end
27
27
  end
@@ -1,4 +1,4 @@
1
- # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
1
+ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
2
  <% unless attributes.empty? -%>
3
3
  <% %w(one two).each do |name| %>
4
4
  <%= name %>:
@@ -7,7 +7,7 @@
7
7
  password_digest: <%%= BCrypt::Password.create('secret') %>
8
8
  <%- elsif attribute.reference? -%>
9
9
  <%= yaml_key_value(attribute.column_name.sub(/_id$/, ''), attribute.default || name) %>
10
- <%- else -%>
10
+ <%- elsif !attribute.virtual? -%>
11
11
  <%= yaml_key_value(attribute.column_name, attribute.default) %>
12
12
  <%- end -%>
13
13
  <%- if attribute.polymorphic? -%>
@@ -49,10 +49,20 @@ module TestUnit # :nodoc:
49
49
  attributes_names.map do |name|
50
50
  if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
51
51
  ["#{name}", "'secret'"]
52
- else
52
+ elsif !virtual?(name)
53
53
  ["#{name}", "@#{singular_table_name}.#{name}"]
54
54
  end
55
- end.sort.to_h
55
+ end.compact.sort.to_h
56
+ end
57
+
58
+ def boolean?(name)
59
+ attribute = attributes.find { |attr| attr.name == name }
60
+ attribute&.type == :boolean
61
+ end
62
+
63
+ def virtual?(name)
64
+ attribute = attributes.find { |attr| attr.name == name }
65
+ attribute&.virtual?
56
66
  end
57
67
  end
58
68
  end
@@ -16,8 +16,12 @@ class <%= class_name.pluralize %>Test < ApplicationSystemTestCase
16
16
  click_on "New <%= class_name.titleize %>"
17
17
 
18
18
  <%- attributes_hash.each do |attr, value| -%>
19
+ <%- if boolean?(attr) -%>
20
+ check "<%= attr.humanize %>" if <%= value %>
21
+ <%- else -%>
19
22
  fill_in "<%= attr.humanize %>", with: <%= value %>
20
23
  <%- end -%>
24
+ <%- end -%>
21
25
  click_on "Create <%= human_name %>"
22
26
 
23
27
  assert_text "<%= human_name %> was successfully created"
@@ -29,8 +33,12 @@ class <%= class_name.pluralize %>Test < ApplicationSystemTestCase
29
33
  click_on "Edit", match: :first
30
34
 
31
35
  <%- attributes_hash.each do |attr, value| -%>
36
+ <%- if boolean?(attr) -%>
37
+ check "<%= attr.humanize %>" if <%= value %>
38
+ <%- else -%>
32
39
  fill_in "<%= attr.humanize %>", with: <%= value %>
33
40
  <%- end -%>
41
+ <%- end -%>
34
42
  click_on "Update <%= human_name %>"
35
43
 
36
44
  assert_text "<%= human_name %> was successfully updated"
@@ -14,6 +14,11 @@ module TestUnit # :nodoc:
14
14
 
15
15
  template "system_test.rb", File.join("test/system", class_path, "#{file_name.pluralize}_test.rb")
16
16
  end
17
+
18
+ private
19
+ def file_name
20
+ @_file_name ||= super.sub(/_test\z/i, "")
21
+ end
17
22
  end
18
23
  end
19
24
  end
@@ -67,6 +67,9 @@ module Rails
67
67
  def run_generator(args = default_arguments, config = {})
68
68
  capture(:stdout) do
69
69
  args += ["--skip-bundle"] unless args.include? "--dev"
70
+ args |= ["--skip-bootsnap"] unless args.include? "--no-skip-bootsnap"
71
+ args |= ["--skip-webpack-install"] unless args.include? "--no-skip-webpack-install"
72
+
70
73
  generator_class.start(args, config.reverse_merge(destination_root: destination_root))
71
74
  end
72
75
  end
@@ -41,7 +41,7 @@ module Rails
41
41
  alias inspect to_s
42
42
 
43
43
  def to_html
44
- "<table>".dup.tap do |table|
44
+ (+"<table>").tap do |table|
45
45
  properties.each do |(name, value)|
46
46
  table << %(<tr><td class="name">#{CGI.escapeHTML(name.to_s)}</td>)
47
47
  formatted_value = if value.kind_of?(Array)
@@ -63,12 +63,12 @@ module Rails
63
63
 
64
64
  # The Ruby version and platform, e.g. "2.0.0-p247 (x86_64-darwin12.4.0)".
65
65
  property "Ruby version" do
66
- "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})"
66
+ RUBY_DESCRIPTION
67
67
  end
68
68
 
69
69
  # The RubyGems version, if it's installed.
70
70
  property "RubyGems version" do
71
- Gem::RubyGemsVersion
71
+ Gem::VERSION
72
72
  end
73
73
 
74
74
  property "Rack version" do
@@ -4,7 +4,7 @@ require "rails/application_controller"
4
4
  require "action_dispatch/routing/inspector"
5
5
 
6
6
  class Rails::InfoController < Rails::ApplicationController # :nodoc:
7
- prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
7
+ prepend_view_path ActionDispatch::DebugView::RESCUES_TEMPLATE_PATH
8
8
  layout -> { request.xhr? ? false : "application" }
9
9
 
10
10
  before_action :require_local!
@@ -3,10 +3,11 @@
3
3
  require "rails/application_controller"
4
4
 
5
5
  class Rails::MailersController < Rails::ApplicationController # :nodoc:
6
- prepend_view_path ActionDispatch::DebugExceptions::RESCUES_TEMPLATE_PATH
6
+ prepend_view_path ActionDispatch::DebugView::RESCUES_TEMPLATE_PATH
7
7
 
8
+ around_action :set_locale, only: :preview
9
+ before_action :find_preview, only: :preview
8
10
  before_action :require_local!, unless: :show_previews?
9
- before_action :find_preview, :set_locale, only: :preview
10
11
 
11
12
  helper_method :part_query, :locale_query
12
13
 
@@ -38,7 +39,7 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
38
39
  end
39
40
  else
40
41
  @part = find_preferred_part(request.format, Mime[:html], Mime[:text])
41
- render action: "email", layout: false, formats: %w[html]
42
+ render action: "email", layout: false, formats: [:html]
42
43
  end
43
44
  else
44
45
  raise AbstractController::ActionNotFound, "Email '#{@email_action}' not found in #{@preview.name}"
@@ -92,6 +93,8 @@ class Rails::MailersController < Rails::ApplicationController # :nodoc:
92
93
  end
93
94
 
94
95
  def set_locale
95
- I18n.locale = params[:locale] || I18n.default_locale
96
+ I18n.with_locale(params[:locale] || I18n.default_locale) do
97
+ yield
98
+ end
96
99
  end
97
100
  end
@@ -113,10 +113,11 @@ module Rails
113
113
  attr_accessor :glob
114
114
 
115
115
  def initialize(root, current, paths, options = {})
116
- @paths = paths
117
- @current = current
118
- @root = root
119
- @glob = options[:glob]
116
+ @paths = paths
117
+ @current = current
118
+ @root = root
119
+ @glob = options[:glob]
120
+ @exclude = options[:exclude]
120
121
 
121
122
  options[:autoload_once] ? autoload_once! : skip_autoload_once!
122
123
  options[:eager_load] ? eager_load! : skip_eager_load!
@@ -189,13 +190,11 @@ module Rails
189
190
  raise "You need to set a path root" unless @root.path
190
191
  result = []
191
192
 
192
- each do |p|
193
- path = File.expand_path(p, @root.path)
193
+ each do |path|
194
+ path = File.expand_path(path, @root.path)
194
195
 
195
196
  if @glob && File.directory?(path)
196
- Dir.chdir(path) do
197
- result.concat(Dir.glob(@glob).map { |file| File.join path, file }.sort)
198
- end
197
+ result.concat files_in(path)
199
198
  else
200
199
  result << path
201
200
  end
@@ -222,6 +221,17 @@ module Rails
222
221
  end
223
222
 
224
223
  alias to_a expanded
224
+
225
+ private
226
+
227
+ def files_in(path)
228
+ Dir.chdir(path) do
229
+ files = Dir.glob(@glob)
230
+ files -= @exclude if @exclude
231
+ files.map! { |file| File.join(path, file) }
232
+ files.sort
233
+ end
234
+ end
225
235
  end
226
236
  end
227
237
  end