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
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "fileutils"
4
4
  require "digest/md5"
5
- require "active_support/core_ext/string/strip"
6
5
  require "rails/version" unless defined?(Rails::VERSION)
7
6
  require "open-uri"
8
7
  require "uri"
@@ -12,9 +11,8 @@ require "active_support/core_ext/array/extract_options"
12
11
  module Rails
13
12
  module Generators
14
13
  class AppBase < Base # :nodoc:
15
- DATABASES = %w( mysql postgresql sqlite3 oracle frontbase ibm_db sqlserver )
16
- JDBC_DATABASES = %w( jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc )
17
- DATABASES.concat(JDBC_DATABASES)
14
+ include Database
15
+ include AppName
18
16
 
19
17
  attr_accessor :rails_template
20
18
  add_shebang_option!
@@ -32,9 +30,6 @@ module Rails
32
30
  class_option :database, type: :string, aliases: "-d", default: "sqlite3",
33
31
  desc: "Preconfigure for selected database (options: #{DATABASES.join('/')})"
34
32
 
35
- class_option :skip_yarn, type: :boolean, default: false,
36
- desc: "Don't use Yarn for managing JavaScript dependencies"
37
-
38
33
  class_option :skip_gemfile, type: :boolean, default: false,
39
34
  desc: "Don't create a Gemfile"
40
35
 
@@ -48,9 +43,18 @@ module Rails
48
43
  default: false,
49
44
  desc: "Skip Action Mailer files"
50
45
 
46
+ class_option :skip_action_mailbox, type: :boolean, default: false,
47
+ desc: "Skip Action Mailbox gem"
48
+
49
+ class_option :skip_action_text, type: :boolean, default: false,
50
+ desc: "Skip Action Text gem"
51
+
51
52
  class_option :skip_active_record, type: :boolean, aliases: "-O", default: false,
52
53
  desc: "Skip Active Record files"
53
54
 
55
+ class_option :skip_active_job, type: :boolean, default: false,
56
+ desc: "Skip Active Job"
57
+
54
58
  class_option :skip_active_storage, type: :boolean, default: false,
55
59
  desc: "Skip Active Storage files"
56
60
 
@@ -69,15 +73,15 @@ module Rails
69
73
  class_option :skip_listen, type: :boolean, default: false,
70
74
  desc: "Don't generate configuration that depends on the listen gem"
71
75
 
72
- class_option :skip_coffee, type: :boolean, default: false,
73
- desc: "Don't use CoffeeScript"
74
-
75
- class_option :skip_javascript, type: :boolean, aliases: "-J", default: false,
76
+ class_option :skip_javascript, type: :boolean, aliases: "-J", default: name == "plugin",
76
77
  desc: "Skip JavaScript files"
77
78
 
78
79
  class_option :skip_turbolinks, type: :boolean, default: false,
79
80
  desc: "Skip turbolinks gem"
80
81
 
82
+ class_option :skip_jbuilder, type: :boolean, default: false,
83
+ desc: "Skip jbuilder gem"
84
+
81
85
  class_option :skip_test, type: :boolean, aliases: "-T", default: false,
82
86
  desc: "Skip test files"
83
87
 
@@ -88,10 +92,13 @@ module Rails
88
92
  desc: "Skip bootsnap gem"
89
93
 
90
94
  class_option :dev, type: :boolean, default: false,
91
- desc: "Setup the #{name} with Gemfile pointing to your Rails checkout"
95
+ desc: "Set up the #{name} with Gemfile pointing to your Rails checkout"
92
96
 
93
97
  class_option :edge, type: :boolean, default: false,
94
- desc: "Setup the #{name} with Gemfile pointing to Rails repository"
98
+ desc: "Set up the #{name} with Gemfile pointing to Rails repository"
99
+
100
+ class_option :master, type: :boolean, default: false,
101
+ desc: "Set up the #{name} with Gemfile pointing to Rails repository main branch"
95
102
 
96
103
  class_option :rc, type: :string, default: nil,
97
104
  desc: "Path to file containing extra configuration options for rails command"
@@ -103,15 +110,14 @@ module Rails
103
110
  desc: "Show this help message and quit"
104
111
  end
105
112
 
106
- def initialize(*args)
107
- @gem_filter = lambda { |gem| true }
113
+ def initialize(positional_argv, option_argv, *)
114
+ @argv = [*positional_argv, *option_argv]
115
+ @gem_filter = lambda { |gem| true }
108
116
  @extra_entries = []
109
117
  super
110
- convert_database_option_for_jruby
111
118
  end
112
119
 
113
120
  private
114
-
115
121
  def gemfile_entry(name, *args) # :doc:
116
122
  options = args.extract_options!
117
123
  version = args.first
@@ -131,7 +137,7 @@ module Rails
131
137
  def gemfile_entries # :doc:
132
138
  [rails_gemfile_entry,
133
139
  database_gemfile_entry,
134
- webserver_gemfile_entry,
140
+ web_server_gemfile_entry,
135
141
  assets_gemfile_entry,
136
142
  webpacker_gemfile_entry,
137
143
  javascript_gemfile_entry,
@@ -156,7 +162,7 @@ module Rails
156
162
  end
157
163
 
158
164
  def build(meth, *args) # :doc:
159
- builder.send(meth, *args) if builder.respond_to?(meth)
165
+ builder.public_send(meth, *args) if builder.respond_to?(meth)
160
166
  end
161
167
 
162
168
  def create_root # :doc:
@@ -167,9 +173,14 @@ module Rails
167
173
  end
168
174
 
169
175
  def apply_rails_template # :doc:
176
+ original_argv = ARGV.dup
177
+ ARGV.replace(@argv)
178
+
170
179
  apply rails_template if rails_template
171
180
  rescue Thor::Error, LoadError, Errno::ENOENT => e
172
181
  raise Error, "The template [#{rails_template}] could not be loaded. Error: #{e}"
182
+ ensure
183
+ ARGV.replace(original_argv)
173
184
  end
174
185
 
175
186
  def set_default_accessors! # :doc:
@@ -192,10 +203,10 @@ module Rails
192
203
  "Use #{options[:database]} as the database for Active Record"
193
204
  end
194
205
 
195
- def webserver_gemfile_entry # :doc:
206
+ def web_server_gemfile_entry # :doc:
196
207
  return [] if options[:skip_puma]
197
208
  comment = "Use Puma as the app server"
198
- GemfileEntry.new("puma", "~> 3.11", comment)
209
+ GemfileEntry.new("puma", "~> 5.0", comment)
199
210
  end
200
211
 
201
212
  def include_all_railties? # :doc:
@@ -205,9 +216,12 @@ module Rails
205
216
  :skip_action_mailer,
206
217
  :skip_test,
207
218
  :skip_sprockets,
208
- :skip_action_cable
219
+ :skip_action_cable,
220
+ :skip_active_job
209
221
  ),
210
- skip_active_storage?
222
+ skip_active_storage?,
223
+ skip_action_mailbox?,
224
+ skip_action_text?
211
225
  ].flatten.none?
212
226
  end
213
227
 
@@ -236,6 +250,18 @@ module Rails
236
250
  options[:skip_active_storage] || options[:skip_active_record]
237
251
  end
238
252
 
253
+ def skip_action_mailbox? # :doc:
254
+ options[:skip_action_mailbox] || skip_active_storage?
255
+ end
256
+
257
+ def skip_action_text? # :doc:
258
+ options[:skip_action_text] || skip_active_storage?
259
+ end
260
+
261
+ def skip_dev_gems? # :doc:
262
+ options[:skip_dev_gems]
263
+ end
264
+
239
265
  class GemfileEntry < Struct.new(:name, :version, :comment, :options, :commented_out)
240
266
  def initialize(name, version, comment, options = {}, commented_out = false)
241
267
  super
@@ -275,12 +301,16 @@ module Rails
275
301
  ]
276
302
  elsif options.edge?
277
303
  [
278
- GemfileEntry.github("rails", "rails/rails", "5-2-stable")
304
+ GemfileEntry.github("rails", "rails/rails", "6-1-stable")
305
+ ]
306
+ elsif options.master?
307
+ [
308
+ GemfileEntry.github("rails", "rails/rails", "main")
279
309
  ]
280
310
  else
281
311
  [GemfileEntry.version("rails",
282
312
  rails_version_specifier,
283
- "Bundle edge Rails instead: gem 'rails', github: 'rails/rails'")]
313
+ "Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'")]
284
314
  end
285
315
  end
286
316
 
@@ -297,90 +327,30 @@ module Rails
297
327
  end
298
328
  end
299
329
 
300
- def gem_for_database
301
- # %w( mysql postgresql sqlite3 oracle frontbase ibm_db sqlserver jdbcmysql jdbcsqlite3 jdbcpostgresql )
302
- case options[:database]
303
- when "mysql" then ["mysql2", [">= 0.4.4", "< 0.6.0"]]
304
- when "postgresql" then ["pg", [">= 0.18", "< 2.0"]]
305
- when "oracle" then ["activerecord-oracle_enhanced-adapter", nil]
306
- when "frontbase" then ["ruby-frontbase", nil]
307
- when "sqlserver" then ["activerecord-sqlserver-adapter", nil]
308
- when "jdbcmysql" then ["activerecord-jdbcmysql-adapter", nil]
309
- when "jdbcsqlite3" then ["activerecord-jdbcsqlite3-adapter", nil]
310
- when "jdbcpostgresql" then ["activerecord-jdbcpostgresql-adapter", nil]
311
- when "jdbc" then ["activerecord-jdbc-adapter", nil]
312
- else [options[:database], nil]
313
- end
314
- end
315
-
316
- def convert_database_option_for_jruby
317
- if defined?(JRUBY_VERSION)
318
- opt = options.dup
319
- case opt[:database]
320
- when "postgresql" then opt[:database] = "jdbcpostgresql"
321
- when "mysql" then opt[:database] = "jdbcmysql"
322
- when "sqlite3" then opt[:database] = "jdbcsqlite3"
323
- end
324
- self.options = opt.freeze
325
- end
326
- end
327
-
328
330
  def assets_gemfile_entry
329
331
  return [] if options[:skip_sprockets]
330
332
 
331
- gems = []
332
- gems << GemfileEntry.version("sass-rails", "~> 5.0",
333
- "Use SCSS for stylesheets")
334
-
335
- if !options[:skip_javascript]
336
- gems << GemfileEntry.version("uglifier",
337
- ">= 1.3.0",
338
- "Use Uglifier as compressor for JavaScript assets")
339
- end
340
-
341
- gems
333
+ GemfileEntry.version("sass-rails", ">= 6", "Use SCSS for stylesheets")
342
334
  end
343
335
 
344
336
  def webpacker_gemfile_entry
345
- return [] unless options[:webpack]
337
+ return [] if options[:skip_javascript]
346
338
 
347
- comment = "Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker"
348
- GemfileEntry.new "webpacker", nil, comment
339
+ GemfileEntry.version "webpacker", "~> 5.0", "Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker"
349
340
  end
350
341
 
351
342
  def jbuilder_gemfile_entry
343
+ return [] if options[:skip_jbuilder]
352
344
  comment = "Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder"
353
- GemfileEntry.new "jbuilder", "~> 2.5", comment, {}, options[:api]
354
- end
355
-
356
- def coffee_gemfile_entry
357
- GemfileEntry.version "coffee-rails", "~> 4.2", "Use CoffeeScript for .coffee assets and views"
345
+ GemfileEntry.new "jbuilder", "~> 2.7", comment, {}, options[:api]
358
346
  end
359
347
 
360
348
  def javascript_gemfile_entry
361
- if options[:skip_javascript] || options[:skip_sprockets]
349
+ if options[:skip_javascript] || options[:skip_turbolinks]
362
350
  []
363
351
  else
364
- gems = [javascript_runtime_gemfile_entry]
365
- gems << coffee_gemfile_entry unless options[:skip_coffee]
366
-
367
- unless options[:skip_turbolinks]
368
- gems << GemfileEntry.version("turbolinks", "~> 5",
369
- "Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks")
370
- end
371
-
372
- gems
373
- end
374
- end
375
-
376
- def javascript_runtime_gemfile_entry
377
- comment = "See https://github.com/rails/execjs#readme for more supported runtimes"
378
- if defined?(JRUBY_VERSION)
379
- GemfileEntry.version "therubyrhino", nil, comment
380
- elsif RUBY_PLATFORM =~ /mingw|mswin/
381
- GemfileEntry.version "duktape", nil, comment
382
- else
383
- GemfileEntry.new "mini_racer", nil, comment, { platforms: :ruby }, true
352
+ [ GemfileEntry.version("turbolinks", "~> 5",
353
+ "Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks") ]
384
354
  end
385
355
  end
386
356
 
@@ -400,7 +370,7 @@ module Rails
400
370
  gems
401
371
  end
402
372
 
403
- def bundle_command(command)
373
+ def bundle_command(command, env = {})
404
374
  say_status :run, "bundle #{command}"
405
375
 
406
376
  # We are going to shell out rather than invoking Bundler::CLI.new(command)
@@ -413,16 +383,16 @@ module Rails
413
383
 
414
384
  require "bundler"
415
385
  Bundler.with_original_env do
416
- exec_bundle_command(_bundle_command, command)
386
+ exec_bundle_command(_bundle_command, command, env)
417
387
  end
418
388
  end
419
389
 
420
- def exec_bundle_command(bundle_command, command)
390
+ def exec_bundle_command(bundle_command, command, env)
421
391
  full_command = %Q["#{Gem.ruby}" "#{bundle_command}" #{command}]
422
392
  if options[:quiet]
423
- system(full_command, out: File::NULL)
393
+ system(env, full_command, out: File::NULL)
424
394
  else
425
- system(full_command)
395
+ system(env, full_command)
426
396
  end
427
397
  end
428
398
 
@@ -434,6 +404,10 @@ module Rails
434
404
  !options[:skip_spring] && !options.dev? && Process.respond_to?(:fork) && !RUBY_PLATFORM.include?("cygwin")
435
405
  end
436
406
 
407
+ def webpack_install?
408
+ !(options[:skip_javascript] || options[:skip_webpack_install])
409
+ end
410
+
437
411
  def depends_on_system_test?
438
412
  !(options[:skip_system_test] || options[:skip_test] || options[:api])
439
413
  end
@@ -447,23 +421,33 @@ module Rails
447
421
  end
448
422
 
449
423
  def os_supports_listen_out_of_the_box?
450
- RbConfig::CONFIG["host_os"] =~ /darwin|linux/
424
+ /darwin|linux/.match?(RbConfig::CONFIG["host_os"])
451
425
  end
452
426
 
453
427
  def run_bundle
454
- bundle_command("install") if bundle_install?
428
+ bundle_command("install", "BUNDLE_IGNORE_MESSAGES" => "1") if bundle_install?
455
429
  end
456
430
 
457
431
  def run_webpack
458
- if !(webpack = options[:webpack]).nil?
459
- rails_command "webpacker:install"
460
- rails_command "webpacker:install:#{webpack}" unless webpack == "webpack"
432
+ return unless webpack_install?
433
+
434
+ unless bundle_install?
435
+ say <<~EXPLAIN
436
+ Skipping `rails webpacker:install` because `bundle install` was skipped.
437
+ To complete setup, you must run `bundle install` followed by `rails webpacker:install`.
438
+ EXPLAIN
439
+ return
440
+ end
441
+
442
+ rails_command "webpacker:install"
443
+ if options[:webpack] && options[:webpack] != "webpack"
444
+ rails_command "webpacker:install:#{options[:webpack]}"
461
445
  end
462
446
  end
463
447
 
464
- def generate_spring_binstubs
465
- if bundle_install? && spring_install?
466
- bundle_command("exec spring binstub --all")
448
+ def generate_bundler_binstub
449
+ if bundle_install?
450
+ bundle_command("binstubs bundler")
467
451
  end
468
452
  end
469
453
 
@@ -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('\\', "").tr("-. ", "_")
11
+ end
12
+
13
+ def original_app_name
14
+ @original_app_name ||= defined_app_const_base? ? defined_app_name : File.basename(destination_root)
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
@@ -19,7 +19,9 @@ module Rails
19
19
  include Rails::Generators::Actions
20
20
 
21
21
  class_option :skip_namespace, type: :boolean, default: false,
22
- desc: "Skip namespace (affects only isolated applications)"
22
+ desc: "Skip namespace (affects only isolated engines)"
23
+ class_option :skip_collision_check, type: :boolean, default: false,
24
+ desc: "Skip collision check"
23
25
 
24
26
  add_runtime_options!
25
27
  strict_args_position!
@@ -51,7 +53,7 @@ module Rails
51
53
  # is removed.
52
54
  def self.namespace(name = nil)
53
55
  return super if name
54
- @namespace ||= super.sub(/_generator$/, "").sub(/:generators:/, ":")
56
+ @namespace ||= super.delete_suffix("_generator").sub(/:generators:/, ":")
55
57
  end
56
58
 
57
59
  # Convenience method to hide this generator from the available ones when
@@ -77,7 +79,7 @@ module Rails
77
79
  #
78
80
  # For example, if the user invoke the controller generator as:
79
81
  #
80
- # rails generate controller Account --test-framework=test_unit
82
+ # bin/rails generate controller Account --test-framework=test_unit
81
83
  #
82
84
  # The controller generator will then try to invoke the following generators:
83
85
  #
@@ -132,11 +134,11 @@ module Rails
132
134
  # All hooks come with switches for user interface. If you do not want
133
135
  # to use any test framework, you can do:
134
136
  #
135
- # rails generate controller Account --skip-test-framework
137
+ # bin/rails generate controller Account --skip-test-framework
136
138
  #
137
139
  # Or similarly:
138
140
  #
139
- # rails generate controller Account --no-test-framework
141
+ # bin/rails generate controller Account --no-test-framework
140
142
  #
141
143
  # ==== Boolean hooks
142
144
  #
@@ -148,7 +150,7 @@ module Rails
148
150
  #
149
151
  # Then, if you want webrat to be invoked, just supply:
150
152
  #
151
- # rails generate controller Account --webrat
153
+ # bin/rails generate controller Account --webrat
152
154
  #
153
155
  # The hooks lookup is similar as above:
154
156
  #
@@ -235,7 +237,7 @@ module Rails
235
237
  # Invoke source_root so the default_source_root is set.
236
238
  base.source_root
237
239
 
238
- if base.name && base.name !~ /Base$/
240
+ if base.name && !base.name.end_with?("Base")
239
241
  Rails::Generators.subclasses << base
240
242
 
241
243
  Rails::Generators.templates_path.each do |path|
@@ -249,11 +251,12 @@ module Rails
249
251
  end
250
252
 
251
253
  private
252
-
253
254
  # Check whether the given class names are already taken by user
254
255
  # application or Ruby on Rails.
255
256
  def class_collisions(*class_names)
256
257
  return unless behavior == :invoke
258
+ return if options.skip_collision_check?
259
+ return if options.force?
257
260
 
258
261
  class_names.flatten.each do |class_name|
259
262
  class_name = class_name.to_s
@@ -266,8 +269,8 @@ module Rails
266
269
 
267
270
  if last && last.const_defined?(last_name.camelize, false)
268
271
  raise Error, "The name '#{class_name}' is either already used in your application " \
269
- "or reserved by Ruby on Rails. Please choose an alternative and run " \
270
- "this generator again."
272
+ "or reserved by Ruby on Rails. Please choose an alternative or use --skip-collision-check " \
273
+ "or --force to skip this check and run this generator again."
271
274
  end
272
275
  end
273
276
  end
@@ -316,7 +319,7 @@ module Rails
316
319
 
317
320
  # Use Rails default banner.
318
321
  def self.banner # :doc:
319
- "rails generate #{namespace.sub(/^rails:/, '')} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
322
+ "rails generate #{namespace.delete_prefix("rails:")} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
320
323
  end
321
324
 
322
325
  # Sets the base_name taking into account the current class namespace.
@@ -333,7 +336,7 @@ module Rails
333
336
  def self.generator_name # :doc:
334
337
  @generator_name ||= begin
335
338
  if generator = name.to_s.split("::").last
336
- generator.sub!(/Generator$/, "")
339
+ generator.delete_suffix!("Generator")
337
340
  generator.underscore
338
341
  end
339
342
  end
@@ -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 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.5"]]
17
+ when "postgresql" then ["pg", ["~> 1.1"]]
18
+ when "sqlite3" then ["sqlite3", ["~> 1.4"]]
19
+ when "oracle" then ["activerecord-oracle_enhanced-adapter", 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
@@ -29,13 +29,12 @@ module Erb # :nodoc:
29
29
  end
30
30
 
31
31
  private
32
-
33
32
  def formats
34
33
  [:text, :html]
35
34
  end
36
35
 
37
36
  def file_name
38
- @_file_name ||= super.gsub(/_mailer/i, "")
37
+ @_file_name ||= super.sub(/_mailer\z/i, "")
39
38
  end
40
39
  end
41
40
  end
@@ -24,7 +24,6 @@ module Erb # :nodoc:
24
24
  end
25
25
 
26
26
  private
27
-
28
27
  def available_views
29
28
  %w(index edit show new _form)
30
29
  end
@@ -1,12 +1,12 @@
1
- <%%= form_with(model: <%= model_resource_name %>, local: true) do |form| %>
1
+ <%%= form_with(model: <%= model_resource_name %>) do |form| %>
2
2
  <%% if <%= singular_table_name %>.errors.any? %>
3
3
  <div id="error_explanation">
4
4
  <h2><%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
5
5
 
6
6
  <ul>
7
- <%% <%= singular_table_name %>.errors.full_messages.each do |message| %>
8
- <li><%%= message %></li>
9
- <%% end %>
7
+ <%% <%= singular_table_name %>.errors.each do |error| %>
8
+ <li><%%= error.full_message %></li>
9
+ <%% end %>
10
10
  </ul>
11
11
  </div>
12
12
  <%% end %>
@@ -21,6 +21,9 @@
21
21
  <div class="field">
22
22
  <%%= form.label :password_confirmation %>
23
23
  <%%= form.password_field :password_confirmation %>
24
+ <% elsif attribute.attachments? -%>
25
+ <%%= form.label :<%= attribute.column_name %> %>
26
+ <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true %>
24
27
  <% else -%>
25
28
  <%%= form.label :<%= attribute.column_name %> %>
26
29
  <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %> %>
@@ -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,15 @@
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
+ <% if attribute.attachment? -%>
7
+ <%%= link_to @<%= singular_table_name %>.<%= attribute.column_name %>.filename, @<%= singular_table_name %>.<%= attribute.column_name %> if @<%= singular_table_name %>.<%= attribute.column_name %>.attached? %>
8
+ <% elsif attribute.attachments? -%>
9
+ <%% @<%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
10
+ <div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
11
+ <%% end %>
12
+ <% else -%>
13
+ <%%= @<%= singular_table_name %>.<%= attribute.column_name %> %>
14
+ <% end -%>
7
15
  </p>
8
16
 
9
17
  <% end -%>