railties 5.2.4.4 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of railties might be problematic. Click here for more details.

Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +185 -166
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.rdoc +35 -28
  5. data/README.rdoc +1 -1
  6. data/lib/minitest/rails_plugin.rb +6 -10
  7. data/lib/rails/all.rb +4 -0
  8. data/lib/rails/api/generator.rb +2 -1
  9. data/lib/rails/api/task.rb +16 -0
  10. data/lib/rails/app_loader.rb +1 -1
  11. data/lib/rails/app_updater.rb +3 -1
  12. data/lib/rails/application.rb +21 -45
  13. data/lib/rails/application/configuration.rb +54 -12
  14. data/lib/rails/application/default_middleware_stack.rb +2 -0
  15. data/lib/rails/backtrace_cleaner.rb +5 -17
  16. data/lib/rails/code_statistics.rb +3 -3
  17. data/lib/rails/command.rb +11 -10
  18. data/lib/rails/command/actions.rb +0 -10
  19. data/lib/rails/command/base.rb +1 -5
  20. data/lib/rails/command/behavior.rb +4 -46
  21. data/lib/rails/command/environment_argument.rb +1 -11
  22. data/lib/rails/command/spellchecker.rb +58 -0
  23. data/lib/rails/commands/credentials/USAGE +19 -1
  24. data/lib/rails/commands/credentials/credentials_command.rb +42 -23
  25. data/lib/rails/commands/db/system/change/change_command.rb +20 -0
  26. data/lib/rails/commands/dbconsole/dbconsole_command.rb +2 -2
  27. data/lib/rails/commands/dev/dev_command.rb +17 -0
  28. data/lib/rails/commands/encrypted/encrypted_command.rb +2 -3
  29. data/lib/rails/commands/help/help_command.rb +1 -1
  30. data/lib/rails/commands/initializers/initializers_command.rb +16 -0
  31. data/lib/rails/commands/new/new_command.rb +2 -2
  32. data/lib/rails/commands/notes/notes_command.rb +39 -0
  33. data/lib/rails/commands/plugin/plugin_command.rb +1 -1
  34. data/lib/rails/commands/routes/routes_command.rb +37 -0
  35. data/lib/rails/commands/runner/runner_command.rb +6 -6
  36. data/lib/rails/commands/secrets/USAGE +3 -3
  37. data/lib/rails/commands/secrets/secrets_command.rb +3 -3
  38. data/lib/rails/commands/server/server_command.rb +109 -48
  39. data/lib/rails/configuration.rb +1 -7
  40. data/lib/rails/engine.rb +3 -9
  41. data/lib/rails/engine/configuration.rb +3 -1
  42. data/lib/rails/gem_version.rb +4 -4
  43. data/lib/rails/generators.rb +11 -12
  44. data/lib/rails/generators/actions.rb +48 -37
  45. data/lib/rails/generators/app_base.rb +49 -89
  46. data/lib/rails/generators/app_name.rb +50 -0
  47. data/lib/rails/generators/base.rb +0 -4
  48. data/lib/rails/generators/database.rb +57 -0
  49. data/lib/rails/generators/erb/mailer/mailer_generator.rb +1 -1
  50. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +1 -1
  51. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +1 -1
  52. data/lib/rails/generators/generated_attribute.rb +17 -17
  53. data/lib/rails/generators/model_helpers.rb +8 -1
  54. data/lib/rails/generators/named_base.rb +1 -5
  55. data/lib/rails/generators/rails/app/app_generator.rb +37 -72
  56. data/lib/rails/generators/rails/app/templates/Gemfile.tt +3 -6
  57. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -3
  58. data/lib/rails/generators/rails/app/templates/app/{assets/javascripts/cable.js.tt → javascript/channels/consumer.js} +2 -9
  59. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +5 -0
  60. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +15 -0
  61. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +5 -0
  62. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +4 -4
  63. data/lib/rails/generators/rails/app/templates/bin/setup.tt +4 -5
  64. data/lib/rails/generators/rails/app/templates/bin/update.tt +6 -7
  65. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +2 -0
  66. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +1 -1
  67. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +2 -2
  68. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +2 -2
  69. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  70. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  71. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +3 -3
  72. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +4 -4
  73. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  74. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +6 -6
  75. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +2 -2
  76. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +3 -2
  77. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +5 -12
  78. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +6 -2
  79. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  80. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +4 -0
  81. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_0.rb.tt +33 -0
  82. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +1 -1
  83. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +3 -5
  84. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +1 -1
  85. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +6 -6
  86. data/lib/rails/generators/rails/app/templates/gitignore.tt +2 -7
  87. data/lib/rails/generators/rails/app/templates/package.json.tt +7 -1
  88. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
  89. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +11 -0
  90. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +7 -0
  91. data/lib/rails/generators/rails/assets/USAGE +1 -4
  92. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -8
  93. data/lib/rails/generators/rails/controller/controller_generator.rb +11 -1
  94. data/lib/rails/generators/rails/credentials/credentials_generator.rb +7 -8
  95. data/lib/rails/generators/rails/db/system/change/change_generator.rb +55 -0
  96. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +4 -5
  97. data/lib/rails/generators/rails/helper/helper_generator.rb +5 -0
  98. data/lib/rails/generators/rails/plugin/plugin_generator.rb +9 -18
  99. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +1 -1
  100. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +1 -1
  101. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +1 -1
  102. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +1 -1
  103. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
  104. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +1 -1
  105. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +1 -1
  106. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +1 -1
  107. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +1 -2
  108. data/lib/rails/generators/resource_helpers.rb +1 -6
  109. data/lib/rails/generators/test_unit/integration/integration_generator.rb +6 -0
  110. data/lib/rails/generators/test_unit/job/job_generator.rb +5 -0
  111. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +1 -1
  112. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +1 -1
  113. data/lib/rails/generators/test_unit/system/system_generator.rb +5 -0
  114. data/lib/rails/generators/testing/behaviour.rb +3 -0
  115. data/lib/rails/info.rb +2 -2
  116. data/lib/rails/info_controller.rb +1 -1
  117. data/lib/rails/mailers_controller.rb +1 -1
  118. data/lib/rails/paths.rb +19 -9
  119. data/lib/rails/railtie.rb +1 -1
  120. data/lib/rails/ruby_version_check.rb +3 -3
  121. data/lib/rails/secrets.rb +0 -1
  122. data/lib/rails/source_annotation_extractor.rb +125 -117
  123. data/lib/rails/tasks/annotations.rake +9 -9
  124. data/lib/rails/tasks/dev.rake +5 -4
  125. data/lib/rails/tasks/framework.rake +5 -1
  126. data/lib/rails/tasks/initializers.rake +5 -4
  127. data/lib/rails/tasks/log.rake +0 -1
  128. data/lib/rails/tasks/routes.rake +4 -26
  129. data/lib/rails/tasks/statistics.rake +1 -0
  130. data/lib/rails/tasks/yarn.rake +1 -1
  131. data/lib/rails/templates/rails/welcome/index.html.erb +2 -2
  132. data/lib/rails/test_help.rb +11 -9
  133. data/lib/rails/test_unit/reporter.rb +1 -1
  134. data/lib/rails/test_unit/runner.rb +5 -5
  135. data/lib/rails/test_unit/testing.rake +1 -1
  136. metadata +30 -24
  137. data/lib/rails/commands/encrypted/USAGE +0 -28
  138. data/lib/rails/generators/js/assets/assets_generator.rb +0 -15
  139. data/lib/rails/generators/js/assets/templates/javascript.js +0 -2
  140. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +0 -22
  141. data/lib/rails/generators/rails/app/templates/bin/bundle.tt +0 -2
  142. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_5_2.rb.tt +0 -38
  143. data/lib/rails/generators/rails/assets/templates/javascript.js +0 -2
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module Generators
5
+ module AppName # :nodoc:
6
+ RESERVED_NAMES = %w(application destroy plugin runner test)
7
+
8
+ private
9
+ def app_name
10
+ @app_name ||= original_app_name.tr("-", "_")
11
+ end
12
+
13
+ def original_app_name
14
+ @original_app_name ||= (defined_app_const_base? ? defined_app_name : File.basename(destination_root)).tr('\\', "").tr(". ", "_")
15
+ end
16
+
17
+ def defined_app_name
18
+ defined_app_const_base.underscore
19
+ end
20
+
21
+ def defined_app_const_base
22
+ Rails.respond_to?(:application) && defined?(Rails::Application) &&
23
+ Rails.application.is_a?(Rails::Application) && Rails.application.class.name.chomp("::Application")
24
+ end
25
+
26
+ alias :defined_app_const_base? :defined_app_const_base
27
+
28
+ def app_const_base
29
+ @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, "_").squeeze("_").camelize
30
+ end
31
+ alias :camelized :app_const_base
32
+
33
+ def app_const
34
+ @app_const ||= "#{app_const_base}::Application"
35
+ end
36
+
37
+ def valid_const?
38
+ if /^\d/.match?(app_const)
39
+ raise Error, "Invalid application name #{original_app_name}. Please give a name which does not start with numbers."
40
+ elsif RESERVED_NAMES.include?(original_app_name)
41
+ raise Error, "Invalid application name #{original_app_name}. Please give a " \
42
+ "name which does not match one of the reserved rails " \
43
+ "words: #{RESERVED_NAMES.join(", ")}"
44
+ elsif Object.const_defined?(app_const_base)
45
+ raise Error, "Invalid application name #{original_app_name}, constant #{app_const_base} is already in use. Please choose another application name."
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -24,10 +24,6 @@ module Rails
24
24
  add_runtime_options!
25
25
  strict_args_position!
26
26
 
27
- def self.exit_on_failure? # :nodoc:
28
- false
29
- end
30
-
31
27
  # Returns the source root for this generator using default_source_root as default.
32
28
  def self.source_root(path = nil)
33
29
  @_source_root = path if path
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module Generators
5
+ module Database # :nodoc:
6
+ JDBC_DATABASES = %w( jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc )
7
+ DATABASES = %w( mysql postgresql sqlite3 oracle frontbase ibm_db sqlserver ) + JDBC_DATABASES
8
+
9
+ def initialize(*)
10
+ super
11
+ convert_database_option_for_jruby
12
+ end
13
+
14
+ def gem_for_database(database = options[:database])
15
+ case database
16
+ when "mysql" then ["mysql2", [">= 0.4.4"]]
17
+ when "postgresql" then ["pg", [">= 0.18", "< 2.0"]]
18
+ when "oracle" then ["activerecord-oracle_enhanced-adapter", nil]
19
+ when "frontbase" then ["ruby-frontbase", nil]
20
+ when "sqlserver" then ["activerecord-sqlserver-adapter", nil]
21
+ when "jdbcmysql" then ["activerecord-jdbcmysql-adapter", nil]
22
+ when "jdbcsqlite3" then ["activerecord-jdbcsqlite3-adapter", nil]
23
+ when "jdbcpostgresql" then ["activerecord-jdbcpostgresql-adapter", nil]
24
+ when "jdbc" then ["activerecord-jdbc-adapter", nil]
25
+ else [database, nil]
26
+ end
27
+ end
28
+
29
+ def convert_database_option_for_jruby
30
+ if defined?(JRUBY_VERSION)
31
+ opt = options.dup
32
+ case opt[:database]
33
+ when "postgresql" then opt[:database] = "jdbcpostgresql"
34
+ when "mysql" then opt[:database] = "jdbcmysql"
35
+ when "sqlite3" then opt[:database] = "jdbcsqlite3"
36
+ end
37
+ self.options = opt.freeze
38
+ end
39
+ end
40
+
41
+ private
42
+ def mysql_socket
43
+ @mysql_socket ||= [
44
+ "/tmp/mysql.sock", # default
45
+ "/var/run/mysqld/mysqld.sock", # debian/gentoo
46
+ "/var/tmp/mysql.sock", # freebsd
47
+ "/var/lib/mysql/mysql.sock", # fedora
48
+ "/opt/local/lib/mysql/mysql.sock", # fedora
49
+ "/opt/local/var/run/mysqld/mysqld.sock", # mac + darwinports + mysql
50
+ "/opt/local/var/run/mysql4/mysqld.sock", # mac + darwinports + mysql4
51
+ "/opt/local/var/run/mysql5/mysqld.sock", # mac + darwinports + mysql5
52
+ "/opt/lampp/var/mysql/mysql.sock" # xampp for linux
53
+ ].find { |f| File.exist?(f) } unless Gem.win_platform?
54
+ end
55
+ end
56
+ end
57
+ end
@@ -35,7 +35,7 @@ module Erb # :nodoc:
35
35
  end
36
36
 
37
37
  def file_name
38
- @_file_name ||= super.gsub(/_mailer/i, "")
38
+ @_file_name ||= super.sub(/_mailer\z/i, "")
39
39
  end
40
40
  end
41
41
  end
@@ -16,7 +16,7 @@
16
16
  <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
17
17
  <tr>
18
18
  <% attributes.reject(&:password_digest?).each do |attribute| -%>
19
- <td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
19
+ <td><%%= <%= singular_table_name %>.<%= attribute.column_name %> %></td>
20
20
  <% end -%>
21
21
  <td><%%= link_to 'Show', <%= model_resource_name %> %></td>
22
22
  <td><%%= link_to 'Edit', edit_<%= singular_route_name %>_path(<%= singular_table_name %>) %></td>
@@ -3,7 +3,7 @@
3
3
  <% attributes.reject(&:password_digest?).each do |attribute| -%>
4
4
  <p>
5
5
  <strong><%= attribute.human_name %>:</strong>
6
- <%%= @<%= singular_table_name %>.<%= attribute.name %> %>
6
+ <%%= @<%= singular_table_name %>.<%= attribute.column_name %> %>
7
7
  </p>
8
8
 
9
9
  <% end -%>
@@ -39,23 +39,23 @@ module Rails
39
39
 
40
40
  private
41
41
 
42
- # parse possible attribute options like :limit for string/text/binary/integer, :precision/:scale for decimals or :polymorphic for references/belongs_to
43
- # when declaring options curly brackets should be used
44
- def parse_type_and_options(type)
45
- case type
46
- when /(string|text|binary|integer)\{(\d+)\}/
47
- return $1, limit: $2.to_i
48
- when /decimal\{(\d+)[,.-](\d+)\}/
49
- return :decimal, precision: $1.to_i, scale: $2.to_i
50
- when /(references|belongs_to)\{(.+)\}/
51
- type = $1
52
- provided_options = $2.split(/[,.-]/)
53
- options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
54
- return type, options
55
- else
56
- return type, {}
42
+ # parse possible attribute options like :limit for string/text/binary/integer, :precision/:scale for decimals or :polymorphic for references/belongs_to
43
+ # when declaring options curly brackets should be used
44
+ def parse_type_and_options(type)
45
+ case type
46
+ when /(string|text|binary|integer)\{(\d+)\}/
47
+ return $1, limit: $2.to_i
48
+ when /decimal\{(\d+)[,.-](\d+)\}/
49
+ return :decimal, precision: $1.to_i, scale: $2.to_i
50
+ when /(references|belongs_to)\{(.+)\}/
51
+ type = $1
52
+ provided_options = $2.split(/[,.-]/)
53
+ options = Hash[provided_options.map { |opt| [opt.to_sym, true] }]
54
+ return type, options
55
+ else
56
+ return type, {}
57
+ end
57
58
  end
58
- end
59
59
  end
60
60
 
61
61
  def initialize(name, type = nil, index_type = false, attr_options = {})
@@ -153,7 +153,7 @@ module Rails
153
153
  end
154
154
 
155
155
  def inject_options
156
- "".dup.tap { |s| options_for_migration.each { |k, v| s << ", #{k}: #{v.inspect}" } }
156
+ (+"").tap { |s| options_for_migration.each { |k, v| s << ", #{k}: #{v.inspect}" } }
157
157
  end
158
158
 
159
159
  def inject_index_options
@@ -7,6 +7,10 @@ module Rails
7
7
  module ModelHelpers # :nodoc:
8
8
  PLURAL_MODEL_NAME_WARN_MESSAGE = "[WARNING] The model name '%s' was recognized as a plural, using the singular '%s' instead. " \
9
9
  "Override with --force-plural or setup custom inflection rules for this noun before running the generator."
10
+ IRREGULAR_MODEL_NAME_WARN_MESSAGE = <<~WARNING
11
+ [WARNING] Rails cannot recover singular form from its plural form '%s'.
12
+ Please setup custom inflection rules for this noun before running the generator in config/initializers/inflections.rb.
13
+ WARNING
10
14
  mattr_accessor :skip_warn
11
15
 
12
16
  def self.included(base) #:nodoc:
@@ -19,11 +23,14 @@ module Rails
19
23
  singular = name.singularize
20
24
  unless ModelHelpers.skip_warn
21
25
  say PLURAL_MODEL_NAME_WARN_MESSAGE % [name, singular]
22
- ModelHelpers.skip_warn = true
23
26
  end
24
27
  name.replace singular
25
28
  assign_names!(name)
26
29
  end
30
+ if name.singularize != name.pluralize.singularize && ! ModelHelpers.skip_warn
31
+ say IRREGULAR_MODEL_NAME_WARN_MESSAGE % [name.pluralize]
32
+ end
33
+ ModelHelpers.skip_warn = true
27
34
  end
28
35
  end
29
36
  end
@@ -31,12 +31,8 @@ module Rails
31
31
  end
32
32
  end
33
33
 
34
- # TODO Change this to private once we've dropped Ruby 2.2 support.
35
- # Workaround for Ruby 2.2 "private attribute?" warning.
36
- protected
37
- attr_reader :file_name
38
-
39
34
  private
35
+ attr_reader :file_name
40
36
 
41
37
  # FIXME: We are avoiding to use alias because a bug on thor that make
42
38
  # this method public and add it to the task list.
@@ -21,7 +21,6 @@ module Rails
21
21
  RUBY
22
22
  end
23
23
 
24
- # TODO: Remove once this is fully in place
25
24
  def method_missing(meth, *args, &block)
26
25
  @generator.send(meth, *args, &block)
27
26
  end
@@ -81,7 +80,6 @@ module Rails
81
80
  directory "app"
82
81
 
83
82
  keep_file "app/assets/images"
84
- empty_directory_with_keep_file "app/assets/javascripts/channels" unless options[:skip_action_cable]
85
83
 
86
84
  keep_file "app/controllers/concerns"
87
85
  keep_file "app/models/concerns"
@@ -95,11 +93,9 @@ module Rails
95
93
  end
96
94
 
97
95
  def bin_when_updating
98
- bin_yarn_exist = File.exist?("bin/yarn")
99
-
100
96
  bin
101
97
 
102
- if options[:api] && !bin_yarn_exist
98
+ if options[:skip_javascript]
103
99
  remove_file "bin/yarn"
104
100
  end
105
101
  end
@@ -159,10 +155,6 @@ module Rails
159
155
  remove_file "config/initializers/cookies_serializer.rb"
160
156
  end
161
157
 
162
- unless assets_config_exist
163
- remove_file "config/initializers/assets.rb"
164
- end
165
-
166
158
  unless csp_config_exist
167
159
  remove_file "config/initializers/content_security_policy.rb"
168
160
  end
@@ -221,6 +213,7 @@ module Rails
221
213
  empty_directory_with_keep_file "test/helpers"
222
214
  empty_directory_with_keep_file "test/integration"
223
215
 
216
+ template "test/channels/application_cable/connection_test.rb"
224
217
  template "test/test_helper.rb"
225
218
  end
226
219
 
@@ -232,7 +225,6 @@ module Rails
232
225
 
233
226
  def tmp
234
227
  empty_directory_with_keep_file "tmp"
235
- empty_directory_with_keep_file "tmp/pids"
236
228
  empty_directory "tmp/cache"
237
229
  empty_directory "tmp/cache/assets"
238
230
  end
@@ -250,14 +242,13 @@ module Rails
250
242
  # We need to store the RAILS_DEV_PATH in a constant, otherwise the path
251
243
  # can change in Ruby 1.8.7 when we FileUtils.cd.
252
244
  RAILS_DEV_PATH = File.expand_path("../../../../../..", __dir__)
253
- RESERVED_NAMES = %w[application destroy plugin runner test]
254
245
 
255
246
  class AppGenerator < AppBase # :nodoc:
256
247
  WEBPACKS = %w( react vue angular elm stimulus )
257
248
 
258
249
  add_shared_options_for "application"
259
250
 
260
- # Add bin/rails options
251
+ # Add rails command options
261
252
  class_option :version, type: :boolean, aliases: "-v", group: :rails,
262
253
  desc: "Show Rails version number and quit"
263
254
 
@@ -267,21 +258,26 @@ module Rails
267
258
  class_option :skip_bundle, type: :boolean, aliases: "-B", default: false,
268
259
  desc: "Don't run bundle install"
269
260
 
270
- class_option :webpack, type: :string, default: nil,
271
- desc: "Preconfigure for app-like JavaScript with Webpack (options: #{WEBPACKS.join('/')})"
261
+ class_option :webpack, type: :string, aliases: "--webpacker", default: nil,
262
+ desc: "Preconfigure Webpack with a particular framework (options: #{WEBPACKS.join(", ")})"
263
+
264
+ class_option :skip_webpack_install, type: :boolean, default: false,
265
+ desc: "Don't run Webpack install"
272
266
 
273
267
  def initialize(*args)
274
268
  super
275
269
 
276
270
  if !options[:skip_active_record] && !DATABASES.include?(options[:database])
277
- raise Error, "Invalid value for --database option. Supported for preconfiguration are: #{DATABASES.join(", ")}."
271
+ raise Error, "Invalid value for --database option. Supported preconfigurations are: #{DATABASES.join(", ")}."
278
272
  end
279
273
 
280
274
  # Force sprockets and yarn to be skipped when generating API only apps.
281
275
  # Can't modify options hash as it's frozen by default.
282
276
  if options[:api]
283
- self.options = options.merge(skip_sprockets: true, skip_javascript: true, skip_yarn: true).freeze
277
+ self.options = options.merge(skip_sprockets: true, skip_javascript: true).freeze
284
278
  end
279
+
280
+ @after_bundle_callbacks = []
285
281
  end
286
282
 
287
283
  public_task :set_default_accessors!
@@ -295,7 +291,7 @@ module Rails
295
291
  build(:gitignore) unless options[:skip_git]
296
292
  build(:gemfile) unless options[:skip_gemfile]
297
293
  build(:version_control)
298
- build(:package_json) unless options[:skip_yarn]
294
+ build(:package_json) unless options[:skip_javascript]
299
295
  end
300
296
 
301
297
  def create_app_files
@@ -311,6 +307,13 @@ module Rails
311
307
  end
312
308
  remove_task :update_bin_files
313
309
 
310
+ def update_active_storage
311
+ unless skip_active_storage?
312
+ rails_command "active_storage:update"
313
+ end
314
+ end
315
+ remove_task :update_active_storage
316
+
314
317
  def create_config_files
315
318
  build(:config)
316
319
  end
@@ -329,7 +332,7 @@ module Rails
329
332
  end
330
333
 
331
334
  def display_upgrade_guide_info
332
- say "\nAfter this, check Rails upgrade guide at http://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app."
335
+ say "\nAfter this, check Rails upgrade guide at https://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app."
333
336
  end
334
337
  remove_task :display_upgrade_guide_info
335
338
 
@@ -417,7 +420,7 @@ module Rails
417
420
 
418
421
  def delete_js_folder_skipping_javascript
419
422
  if options[:skip_javascript]
420
- remove_dir "app/assets/javascripts"
423
+ remove_dir "app/javascript"
421
424
  end
422
425
  end
423
426
 
@@ -444,8 +447,9 @@ module Rails
444
447
 
445
448
  def delete_action_cable_files_skipping_action_cable
446
449
  if options[:skip_action_cable]
447
- remove_file "app/assets/javascripts/cable.js"
450
+ remove_dir "app/javascript/channels"
448
451
  remove_dir "app/channels"
452
+ remove_dir "test/channels"
449
453
  end
450
454
  end
451
455
 
@@ -464,12 +468,12 @@ module Rails
464
468
 
465
469
  def delete_new_framework_defaults
466
470
  unless options[:update]
467
- remove_file "config/initializers/new_framework_defaults_5_2.rb"
471
+ remove_file "config/initializers/new_framework_defaults_6_0.rb"
468
472
  end
469
473
  end
470
474
 
471
- def delete_bin_yarn_if_skip_yarn_option
472
- remove_file "bin/yarn" if options[:skip_yarn]
475
+ def delete_bin_yarn
476
+ remove_file "bin/yarn" if options[:skip_javascript]
473
477
  end
474
478
 
475
479
  def finish_template
@@ -477,7 +481,8 @@ module Rails
477
481
  end
478
482
 
479
483
  public_task :apply_rails_template, :run_bundle
480
- public_task :run_webpack, :generate_spring_binstubs
484
+ public_task :generate_bundler_binstub, :generate_spring_binstubs
485
+ public_task :run_webpack
481
486
 
482
487
  def run_after_bundle_callbacks
483
488
  @after_bundle_callbacks.each(&:call)
@@ -494,54 +499,14 @@ module Rails
494
499
  create_file(*args, &block)
495
500
  end
496
501
 
497
- def app_name
498
- @app_name ||= (defined_app_const_base? ? defined_app_name : File.basename(destination_root)).tr('\\', "").tr(". ", "_")
499
- end
500
-
501
- def defined_app_name
502
- defined_app_const_base.underscore
503
- end
504
-
505
- def defined_app_const_base
506
- Rails.respond_to?(:application) && defined?(Rails::Application) &&
507
- Rails.application.is_a?(Rails::Application) && Rails.application.class.name.sub(/::Application$/, "")
508
- end
509
-
510
- alias :defined_app_const_base? :defined_app_const_base
511
-
512
- def app_const_base
513
- @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, "_").squeeze("_").camelize
514
- end
515
- alias :camelized :app_const_base
516
-
517
- def app_const
518
- @app_const ||= "#{app_const_base}::Application"
519
- end
520
-
521
- def valid_const?
522
- if app_const =~ /^\d/
523
- raise Error, "Invalid application name #{app_name}. Please give a name which does not start with numbers."
524
- elsif RESERVED_NAMES.include?(app_name)
525
- raise Error, "Invalid application name #{app_name}. Please give a " \
526
- "name which does not match one of the reserved rails " \
527
- "words: #{RESERVED_NAMES.join(", ")}"
528
- elsif Object.const_defined?(app_const_base)
529
- raise Error, "Invalid application name #{app_name}, constant #{app_const_base} is already in use. Please choose another application name."
530
- end
531
- end
532
-
533
- def mysql_socket
534
- @mysql_socket ||= [
535
- "/tmp/mysql.sock", # default
536
- "/var/run/mysqld/mysqld.sock", # debian/gentoo
537
- "/var/tmp/mysql.sock", # freebsd
538
- "/var/lib/mysql/mysql.sock", # fedora
539
- "/opt/local/lib/mysql/mysql.sock", # fedora
540
- "/opt/local/var/run/mysqld/mysqld.sock", # mac + darwinports + mysql
541
- "/opt/local/var/run/mysql4/mysqld.sock", # mac + darwinports + mysql4
542
- "/opt/local/var/run/mysql5/mysqld.sock", # mac + darwinports + mysql5
543
- "/opt/lampp/var/mysql/mysql.sock" # xampp for linux
544
- ].find { |f| File.exist?(f) } unless Gem.win_platform?
502
+ # Registers a callback to be executed after bundle and spring binstubs
503
+ # have run.
504
+ #
505
+ # after_bundle do
506
+ # git add: '.'
507
+ # end
508
+ def after_bundle(&block) # :doc:
509
+ @after_bundle_callbacks << block
545
510
  end
546
511
 
547
512
  def get_builder_class