railties 6.1.6 → 7.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +626 -259
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +5 -6
  6. data/lib/minitest/rails_plugin.rb +64 -1
  7. data/lib/rails/all.rb +0 -1
  8. data/lib/rails/api/task.rb +35 -4
  9. data/lib/rails/app_updater.rb +9 -6
  10. data/lib/rails/application/bootstrap.rb +41 -7
  11. data/lib/rails/application/configuration.rb +262 -88
  12. data/lib/rails/application/default_middleware_stack.rb +29 -4
  13. data/lib/rails/application/dummy_config.rb +19 -0
  14. data/lib/rails/application/finisher.rb +89 -124
  15. data/lib/rails/application/routes_reloader.rb +8 -0
  16. data/lib/rails/application.rb +200 -125
  17. data/lib/rails/application_controller.rb +3 -3
  18. data/lib/rails/autoloaders/inflector.rb +21 -0
  19. data/lib/rails/autoloaders.rb +42 -42
  20. data/lib/rails/backtrace_cleaner.rb +1 -1
  21. data/lib/rails/cli.rb +5 -2
  22. data/lib/rails/code_statistics.rb +2 -2
  23. data/lib/rails/code_statistics_calculator.rb +10 -1
  24. data/lib/rails/command/actions.rb +10 -12
  25. data/lib/rails/command/base.rb +61 -45
  26. data/lib/rails/command/behavior.rb +1 -1
  27. data/lib/rails/command/environment_argument.rb +33 -17
  28. data/lib/rails/command/helpers/editor.rb +17 -12
  29. data/lib/rails/command.rb +90 -36
  30. data/lib/rails/commands/about/about_command.rb +14 -0
  31. data/lib/rails/commands/application/application_command.rb +2 -0
  32. data/lib/rails/commands/console/console_command.rb +17 -13
  33. data/lib/rails/commands/credentials/USAGE +53 -53
  34. data/lib/rails/commands/credentials/credentials_command/diffing.rb +31 -19
  35. data/lib/rails/commands/credentials/credentials_command.rb +67 -69
  36. data/lib/rails/commands/db/system/change/change_command.rb +2 -1
  37. data/lib/rails/commands/dbconsole/dbconsole_command.rb +26 -117
  38. data/lib/rails/commands/destroy/destroy_command.rb +3 -2
  39. data/lib/rails/commands/dev/dev_command.rb +1 -6
  40. data/lib/rails/commands/encrypted/USAGE +15 -20
  41. data/lib/rails/commands/encrypted/encrypted_command.rb +46 -35
  42. data/lib/rails/commands/gem_help/USAGE +16 -0
  43. data/lib/rails/commands/gem_help/gem_help_command.rb +13 -0
  44. data/lib/rails/commands/generate/generate_command.rb +2 -2
  45. data/lib/rails/commands/help/USAGE +15 -14
  46. data/lib/rails/commands/help/help_command.rb +21 -2
  47. data/lib/rails/commands/initializers/initializers_command.rb +1 -4
  48. data/lib/rails/commands/middleware/middleware_command.rb +17 -0
  49. data/lib/rails/commands/new/new_command.rb +2 -0
  50. data/lib/rails/commands/notes/notes_command.rb +2 -1
  51. data/lib/rails/commands/plugin/plugin_command.rb +2 -0
  52. data/lib/rails/commands/rake/rake_command.rb +25 -22
  53. data/lib/rails/commands/restart/restart_command.rb +14 -0
  54. data/lib/rails/commands/routes/routes_command.rb +13 -1
  55. data/lib/rails/commands/runner/USAGE +14 -12
  56. data/lib/rails/commands/runner/runner_command.rb +34 -21
  57. data/lib/rails/commands/secret/secret_command.rb +13 -0
  58. data/lib/rails/commands/secrets/USAGE +44 -49
  59. data/lib/rails/commands/secrets/secrets_command.rb +20 -38
  60. data/lib/rails/commands/server/server_command.rb +33 -30
  61. data/lib/rails/commands/test/USAGE +14 -0
  62. data/lib/rails/commands/test/test_command.rb +56 -14
  63. data/lib/rails/commands/unused_routes/unused_routes_command.rb +75 -0
  64. data/lib/rails/commands/version/version_command.rb +1 -0
  65. data/lib/rails/configuration.rb +23 -28
  66. data/lib/rails/console/app.rb +1 -4
  67. data/lib/rails/console/helpers.rb +2 -2
  68. data/lib/rails/deprecator.rb +7 -0
  69. data/lib/rails/engine/configuration.rb +53 -9
  70. data/lib/rails/engine.rb +63 -48
  71. data/lib/rails/gem_version.rb +3 -3
  72. data/lib/rails/generators/actions/create_migration.rb +2 -4
  73. data/lib/rails/generators/actions.rb +231 -73
  74. data/lib/rails/generators/active_model.rb +28 -14
  75. data/lib/rails/generators/app_base.rb +476 -176
  76. data/lib/rails/generators/app_name.rb +3 -14
  77. data/lib/rails/generators/base.rb +24 -20
  78. data/lib/rails/generators/database.rb +39 -1
  79. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
  80. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -0
  81. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +8 -8
  82. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
  83. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
  84. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
  85. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  86. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
  87. data/lib/rails/generators/erb.rb +1 -1
  88. data/lib/rails/generators/generated_attribute.rb +57 -9
  89. data/lib/rails/generators/migration.rb +2 -7
  90. data/lib/rails/generators/model_helpers.rb +3 -2
  91. data/lib/rails/generators/named_base.rb +13 -13
  92. data/lib/rails/generators/rails/app/USAGE +22 -6
  93. data/lib/rails/generators/rails/app/app_generator.rb +113 -114
  94. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
  95. data/lib/rails/generators/rails/app/templates/Gemfile.tt +43 -53
  96. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
  97. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
  98. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +3 -9
  100. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
  101. data/lib/rails/generators/rails/app/templates/bin/rails.tt +1 -4
  102. data/lib/rails/generators/rails/app/templates/bin/rake.tt +0 -3
  103. data/lib/rails/generators/rails/app/templates/bin/setup.tt +16 -12
  104. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +6 -18
  105. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +1 -1
  106. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  107. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  108. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +7 -7
  109. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
  110. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
  111. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  112. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -9
  113. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
  114. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +5 -5
  115. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
  116. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +16 -12
  117. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +38 -61
  118. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +14 -15
  119. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
  120. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
  121. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
  122. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
  123. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
  124. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +283 -0
  125. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -9
  126. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
  127. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +12 -20
  128. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
  129. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
  130. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +6 -4
  131. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
  132. data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
  133. data/lib/rails/generators/rails/app/templates/gitattributes.tt +0 -5
  134. data/lib/rails/generators/rails/app/templates/gitignore.tt +7 -9
  135. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  136. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
  137. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +10 -8
  138. data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
  139. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +2 -1
  140. data/lib/rails/generators/rails/controller/USAGE +12 -4
  141. data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
  142. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
  143. data/lib/rails/generators/rails/credentials/credentials_generator.rb +29 -24
  144. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
  145. data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
  146. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
  147. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
  148. data/lib/rails/generators/rails/migration/USAGE +21 -11
  149. data/lib/rails/generators/rails/model/model_generator.rb +4 -0
  150. data/lib/rails/generators/rails/plugin/USAGE +17 -6
  151. data/lib/rails/generators/rails/plugin/plugin_generator.rb +69 -30
  152. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +7 -3
  153. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +9 -31
  154. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
  155. data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
  156. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
  157. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
  158. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +5 -20
  159. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +0 -7
  160. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
  161. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
  162. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +2 -2
  163. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +6 -11
  164. data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
  165. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
  166. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +1 -1
  167. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -5
  168. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +6 -10
  169. data/lib/rails/generators/resource_helpers.rb +2 -2
  170. data/lib/rails/generators/test_case.rb +2 -2
  171. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +1 -1
  172. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
  173. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -4
  174. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +5 -5
  175. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +7 -7
  176. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
  177. data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +7 -5
  178. data/lib/rails/generators.rb +14 -29
  179. data/lib/rails/health_controller.rb +55 -0
  180. data/lib/rails/info.rb +2 -2
  181. data/lib/rails/info_controller.rb +31 -13
  182. data/lib/rails/initializable.rb +1 -1
  183. data/lib/rails/mailers_controller.rb +17 -9
  184. data/lib/rails/paths.rb +14 -11
  185. data/lib/rails/rack/logger.rb +16 -15
  186. data/lib/rails/rackup/server.rb +15 -0
  187. data/lib/rails/railtie/configuration.rb +15 -3
  188. data/lib/rails/railtie.rb +54 -31
  189. data/lib/rails/ruby_version_check.rb +5 -3
  190. data/lib/rails/secrets.rb +10 -8
  191. data/lib/rails/source_annotation_extractor.rb +68 -19
  192. data/lib/rails/tasks/engine.rake +8 -8
  193. data/lib/rails/tasks/framework.rake +4 -12
  194. data/lib/rails/tasks/log.rake +1 -1
  195. data/lib/rails/tasks/misc.rake +3 -14
  196. data/lib/rails/tasks/statistics.rake +8 -5
  197. data/lib/rails/tasks/tmp.rake +13 -6
  198. data/lib/rails/tasks/yarn.rake +8 -9
  199. data/lib/rails/tasks/zeitwerk.rake +14 -42
  200. data/lib/rails/tasks.rb +0 -2
  201. data/lib/rails/templates/layouts/application.html.erb +15 -0
  202. data/lib/rails/templates/rails/mailers/email.html.erb +45 -11
  203. data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
  204. data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
  205. data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
  206. data/lib/rails/test_help.rb +13 -14
  207. data/lib/rails/test_unit/line_filtering.rb +1 -1
  208. data/lib/rails/test_unit/railtie.rb +0 -4
  209. data/lib/rails/test_unit/reporter.rb +6 -2
  210. data/lib/rails/test_unit/runner.rb +45 -20
  211. data/lib/rails/test_unit/test_parser.rb +88 -0
  212. data/lib/rails/test_unit/testing.rake +18 -43
  213. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  214. data/lib/rails/version.rb +1 -1
  215. data/lib/rails/welcome_controller.rb +1 -0
  216. data/lib/rails/zeitwerk_checker.rb +15 -0
  217. data/lib/rails.rb +26 -15
  218. metadata +74 -42
  219. data/RDOC_MAIN.rdoc +0 -97
  220. data/lib/rails/.DS_Store +0 -0
  221. data/lib/rails/application/dummy_erb_compiler.rb +0 -18
  222. data/lib/rails/command/spellchecker.rb +0 -57
  223. data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
  224. data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
  225. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
  226. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
  227. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
  228. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
  229. data/lib/rails/generators/rails/app/templates/bin/spring.tt +0 -13
  230. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -16
  231. data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
  232. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +0 -8
  233. data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
  234. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb.tt +0 -4
  235. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +0 -67
  236. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +0 -16
  237. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
  238. data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
  239. data/lib/rails/generators/rails/assets/USAGE +0 -16
  240. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
  241. data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
  242. data/lib/rails/generators/rails/model/USAGE +0 -113
  243. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
  244. data/lib/rails/tasks/middleware.rake +0 -9
  245. data/lib/rails/tasks/restart.rake +0 -9
@@ -7,26 +7,15 @@ module Rails
7
7
 
8
8
  private
9
9
  def app_name
10
- @app_name ||= original_app_name.tr('\\', "").tr("-. ", "_")
10
+ @app_name ||= original_app_name.parameterize(preserve_case: true).underscore
11
11
  end
12
12
 
13
13
  def original_app_name
14
- @original_app_name ||= defined_app_const_base? ? defined_app_name : File.basename(destination_root)
14
+ @original_app_name ||= (options[:name] || File.basename(destination_root))
15
15
  end
16
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
17
  def app_const_base
29
- @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, "_").squeeze("_").camelize
18
+ @app_const_base ||= app_name.gsub(/\W/, "_").squeeze("_").camelize
30
19
  end
31
20
  alias :camelized :app_const_base
32
21
 
@@ -86,15 +86,15 @@ module Rails
86
86
  # "rails:test_unit", "test_unit:controller", "test_unit"
87
87
  #
88
88
  # Notice that "rails:generators:test_unit" could be loaded as well, what
89
- # Rails looks for is the first and last parts of the namespace. This is what
90
- # allows any test framework to hook into Rails as long as it provides any
89
+ # \Rails looks for is the first and last parts of the namespace. This is what
90
+ # allows any test framework to hook into \Rails as long as it provides any
91
91
  # of the hooks above.
92
92
  #
93
93
  # ==== Options
94
94
  #
95
95
  # The first and last part used to find the generator to be invoked are
96
96
  # guessed based on class invokes hook_for, as noticed in the example above.
97
- # This can be customized with two options: :in and :as.
97
+ # This can be customized with two options: +:in+ and +:as+.
98
98
  #
99
99
  # Let's suppose you are creating a generator that needs to invoke the
100
100
  # controller generator from test unit. Your first attempt is:
@@ -108,7 +108,7 @@ module Rails
108
108
  # "test_unit:awesome", "test_unit"
109
109
  #
110
110
  # Which is not the desired lookup. You can change it by providing the
111
- # :as option:
111
+ # +:as+ option:
112
112
  #
113
113
  # class AwesomeGenerator < Rails::Generators::Base
114
114
  # hook_for :test_framework, as: :controller
@@ -119,7 +119,7 @@ module Rails
119
119
  # "test_unit:controller", "test_unit"
120
120
  #
121
121
  # Similarly, if you want it to also look up in the rails namespace, you
122
- # just need to provide the :in value:
122
+ # just need to provide the +:in+ value:
123
123
  #
124
124
  # class AwesomeGenerator < Rails::Generators::Base
125
125
  # hook_for :test_framework, in: :rails, as: :controller
@@ -189,6 +189,13 @@ module Rails
189
189
  class_option(name, defaults.merge!(options))
190
190
  end
191
191
 
192
+ klass = self
193
+
194
+ singleton_class.define_method("#{name}_generator") do
195
+ value = class_options[name].default
196
+ Rails::Generators.find_by_namespace(klass.generator_name, value)
197
+ end
198
+
192
199
  hooks[name] = [ in_base, as_hook ]
193
200
  invoke_from_option(name, options, &block)
194
201
  end
@@ -201,12 +208,13 @@ module Rails
201
208
  remove_invocation(*names)
202
209
 
203
210
  names.each do |name|
211
+ singleton_class.undef_method("#{name}_generator")
204
212
  hooks.delete(name)
205
213
  end
206
214
  end
207
215
 
208
216
  # Make class option aware of Rails::Generators.options and Rails::Generators.aliases.
209
- def self.class_option(name, options = {}) #:nodoc:
217
+ def self.class_option(name, options = {}) # :nodoc:
210
218
  options[:desc] = "Indicates when to generate #{name.to_s.humanize.downcase}" unless options.key?(:desc)
211
219
  options[:aliases] = default_aliases_for_option(name, options)
212
220
  options[:default] = default_value_for_option(name, options)
@@ -231,7 +239,7 @@ module Rails
231
239
 
232
240
  # Cache source root and add lib/generators/base/generator/templates to
233
241
  # source paths.
234
- def self.inherited(base) #:nodoc:
242
+ def self.inherited(base) # :nodoc:
235
243
  super
236
244
 
237
245
  # Invoke source_root so the default_source_root is set.
@@ -317,28 +325,24 @@ module Rails
317
325
  @namespaced_path ||= namespace_dirs.join("/")
318
326
  end
319
327
 
320
- # Use Rails default banner.
328
+ # Use \Rails default banner.
321
329
  def self.banner # :doc:
322
- "rails generate #{namespace.delete_prefix("rails:")} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
330
+ "bin/rails generate #{namespace.delete_prefix("rails:")} #{arguments.map(&:usage).join(' ')} [options]".gsub(/\s+/, " ")
323
331
  end
324
332
 
325
333
  # Sets the base_name taking into account the current class namespace.
326
334
  def self.base_name # :doc:
327
- @base_name ||= begin
328
- if base = name.to_s.split("::").first
329
- base.underscore
330
- end
335
+ @base_name ||= if base = name.to_s.split("::").first
336
+ base.underscore
331
337
  end
332
338
  end
333
339
 
334
340
  # Removes the namespaces and get the generator name. For example,
335
341
  # Rails::Generators::ModelGenerator will return "model" as generator name.
336
342
  def self.generator_name # :doc:
337
- @generator_name ||= begin
338
- if generator = name.to_s.split("::").last
339
- generator.delete_suffix!("Generator")
340
- generator.underscore
341
- end
343
+ @generator_name ||= if generator = name.to_s.split("::").last
344
+ generator.delete_suffix!("Generator")
345
+ generator.underscore
342
346
  end
343
347
  end
344
348
 
@@ -368,13 +372,13 @@ module Rails
368
372
  end
369
373
 
370
374
  # Keep hooks configuration that are used on prepare_for_invocation.
371
- def self.hooks #:nodoc:
375
+ def self.hooks # :nodoc:
372
376
  @hooks ||= from_superclass(:hooks, {})
373
377
  end
374
378
 
375
379
  # Prepare class invocation to search on Rails namespace if a previous
376
380
  # added hook is being used.
377
- def self.prepare_for_invocation(name, value) #:nodoc:
381
+ def self.prepare_for_invocation(name, value) # :nodoc:
378
382
  return super unless value.is_a?(String) || value.is_a?(Symbol)
379
383
 
380
384
  if value && constants = hooks[name]
@@ -4,7 +4,7 @@ module Rails
4
4
  module Generators
5
5
  module Database # :nodoc:
6
6
  JDBC_DATABASES = %w( jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc )
7
- DATABASES = %w( mysql postgresql sqlite3 oracle sqlserver ) + JDBC_DATABASES
7
+ DATABASES = %w( mysql trilogy postgresql sqlite3 oracle sqlserver ) + JDBC_DATABASES
8
8
 
9
9
  def initialize(*)
10
10
  super
@@ -14,6 +14,7 @@ module Rails
14
14
  def gem_for_database(database = options[:database])
15
15
  case database
16
16
  when "mysql" then ["mysql2", ["~> 0.5"]]
17
+ when "trilogy" then ["trilogy", ["~> 2.4"]]
17
18
  when "postgresql" then ["pg", ["~> 1.1"]]
18
19
  when "sqlite3" then ["sqlite3", ["~> 1.4"]]
19
20
  when "oracle" then ["activerecord-oracle_enhanced-adapter", nil]
@@ -26,6 +27,26 @@ module Rails
26
27
  end
27
28
  end
28
29
 
30
+ def docker_for_database_build(database = options[:database])
31
+ case database
32
+ when "mysql" then "build-essential default-libmysqlclient-dev git"
33
+ when "trilogy" then "build-essential default-libmysqlclient-dev git"
34
+ when "postgresql" then "build-essential git libpq-dev"
35
+ when "sqlite3" then "build-essential git"
36
+ else nil
37
+ end
38
+ end
39
+
40
+ def docker_for_database_deploy(database = options[:database])
41
+ case database
42
+ when "mysql" then "curl default-mysql-client libvips"
43
+ when "trilogy" then "curl default-mysql-client libvips"
44
+ when "postgresql" then "curl libvips postgresql-client"
45
+ when "sqlite3" then "curl libsqlite3-0 libvips"
46
+ else nil
47
+ end
48
+ end
49
+
29
50
  def convert_database_option_for_jruby
30
51
  if defined?(JRUBY_VERSION)
31
52
  opt = options.dup
@@ -38,6 +59,23 @@ module Rails
38
59
  end
39
60
  end
40
61
 
62
+ def build_package_for_database(database = options[:database])
63
+ case database
64
+ when "mysql" then "default-libmysqlclient-dev"
65
+ when "postgresql" then "libpq-dev"
66
+ else nil
67
+ end
68
+ end
69
+
70
+ def deploy_package_for_database(database = options[:database])
71
+ case database
72
+ when "mysql" then "default-mysql-client"
73
+ when "postgresql" then "postgresql-client"
74
+ when "sqlite3" then "libsqlite3-0"
75
+ else nil
76
+ end
77
+ end
78
+
41
79
  private
42
80
  def mysql_socket
43
81
  @mysql_socket ||= [
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
5
  <style>
6
6
  /* Email styles need to be inline */
7
7
  </style>
@@ -21,6 +21,8 @@ module Erb # :nodoc:
21
21
  template filename, File.join("app/views", controller_file_path, filename)
22
22
  end
23
23
  end
24
+
25
+ template "partial.html.erb", File.join("app/views", controller_file_path, "_#{singular_name}.html.erb")
24
26
  end
25
27
 
26
28
  private
@@ -1,6 +1,6 @@
1
1
  <%%= form_with(model: <%= model_resource_name %>) do |form| %>
2
2
  <%% if <%= singular_table_name %>.errors.any? %>
3
- <div id="error_explanation">
3
+ <div style="color: red">
4
4
  <h2><%%= pluralize(<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
5
5
 
6
6
  <ul>
@@ -12,26 +12,26 @@
12
12
  <%% end %>
13
13
 
14
14
  <% attributes.each do |attribute| -%>
15
- <div class="field">
15
+ <div>
16
16
  <% if attribute.password_digest? -%>
17
- <%%= form.label :password %>
17
+ <%%= form.label :password, style: "display: block" %>
18
18
  <%%= form.password_field :password %>
19
19
  </div>
20
20
 
21
- <div class="field">
22
- <%%= form.label :password_confirmation %>
21
+ <div>
22
+ <%%= form.label :password_confirmation, style: "display: block" %>
23
23
  <%%= form.password_field :password_confirmation %>
24
24
  <% elsif attribute.attachments? -%>
25
- <%%= form.label :<%= attribute.column_name %> %>
25
+ <%%= form.label :<%= attribute.column_name %>, style: "display: block" %>
26
26
  <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true %>
27
27
  <% else -%>
28
- <%%= form.label :<%= attribute.column_name %> %>
28
+ <%%= form.label :<%= attribute.column_name %>, style: "display: block" %>
29
29
  <%%= form.<%= attribute.field_type %> :<%= attribute.column_name %> %>
30
30
  <% end -%>
31
31
  </div>
32
32
 
33
33
  <% end -%>
34
- <div class="actions">
34
+ <div>
35
35
  <%%= form.submit %>
36
36
  </div>
37
37
  <%% end %>
@@ -1,6 +1,10 @@
1
- <h1>Editing <%= singular_table_name.titleize %></h1>
1
+ <h1>Editing <%= human_name.downcase %></h1>
2
2
 
3
- <%%= render 'form', <%= singular_table_name %>: @<%= singular_table_name %> %>
3
+ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
4
4
 
5
- <%%= link_to 'Show', @<%= singular_table_name %> %> |
6
- <%%= link_to 'Back', <%= index_helper %>_path %>
5
+ <br>
6
+
7
+ <div>
8
+ <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %> %> |
9
+ <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
10
+ </div>
@@ -1,31 +1,14 @@
1
- <p id="notice"><%%= notice %></p>
1
+ <p style="color: green"><%%= notice %></p>
2
2
 
3
- <h1><%= plural_table_name.titleize %></h1>
3
+ <h1><%= human_name.pluralize %></h1>
4
4
 
5
- <table>
6
- <thead>
7
- <tr>
8
- <% attributes.reject(&:password_digest?).each do |attribute| -%>
9
- <th><%= attribute.human_name %></th>
10
- <% end -%>
11
- <th colspan="3"></th>
12
- </tr>
13
- </thead>
5
+ <div id="<%= plural_table_name %>">
6
+ <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
7
+ <%%= render <%= singular_table_name %> %>
8
+ <p>
9
+ <%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %> %>
10
+ </p>
11
+ <%% end %>
12
+ </div>
14
13
 
15
- <tbody>
16
- <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
17
- <tr>
18
- <% attributes.reject(&:password_digest?).each do |attribute| -%>
19
- <td><%%= <%= singular_table_name %>.<%= attribute.column_name %> %></td>
20
- <% end -%>
21
- <td><%%= link_to 'Show', <%= model_resource_name %> %></td>
22
- <td><%%= link_to 'Edit', edit_<%= singular_route_name %>_path(<%= singular_table_name %>) %></td>
23
- <td><%%= link_to 'Destroy', <%= model_resource_name %>, method: :delete, data: { confirm: 'Are you sure?' } %></td>
24
- </tr>
25
- <%% end %>
26
- </tbody>
27
- </table>
28
-
29
- <br>
30
-
31
- <%%= link_to 'New <%= singular_table_name.titleize %>', new_<%= singular_route_name %>_path %>
14
+ <%%= link_to "New <%= human_name.downcase %>", <%= new_helper(type: :path) %> %>
@@ -1,5 +1,9 @@
1
- <h1>New <%= singular_table_name.titleize %></h1>
1
+ <h1>New <%= human_name.downcase %></h1>
2
2
 
3
- <%%= render 'form', <%= singular_table_name %>: @<%= singular_table_name %> %>
3
+ <%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
4
4
 
5
- <%%= link_to 'Back', <%= index_helper %>_path %>
5
+ <br>
6
+
7
+ <div>
8
+ <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
9
+ </div>
@@ -0,0 +1,17 @@
1
+ <div id="<%%= dom_id <%= singular_name %> %>">
2
+ <% attributes.reject(&:password_digest?).each do |attribute| -%>
3
+ <p>
4
+ <strong><%= attribute.human_name %>:</strong>
5
+ <% if attribute.attachment? -%>
6
+ <%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %> if <%= singular_name %>.<%= attribute.column_name %>.attached? %>
7
+ <% elsif attribute.attachments? -%>
8
+ <%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
9
+ <div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
10
+ <%% end %>
11
+ <% else -%>
12
+ <%%= <%= singular_name %>.<%= attribute.column_name %> %>
13
+ <% end -%>
14
+ </p>
15
+
16
+ <% end -%>
17
+ </div>
@@ -1,19 +1,10 @@
1
- <p id="notice"><%%= notice %></p>
1
+ <p style="color: green"><%%= notice %></p>
2
2
 
3
- <% attributes.reject(&:password_digest?).each do |attribute| -%>
4
- <p>
5
- <strong><%= attribute.human_name %>:</strong>
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 -%>
15
- </p>
3
+ <%%= render @<%= singular_table_name %> %>
16
4
 
17
- <% end -%>
18
- <%%= link_to 'Edit', edit_<%= singular_table_name %>_path(@<%= singular_table_name %>) %> |
19
- <%%= link_to 'Back', <%= index_helper %>_path %>
5
+ <div>
6
+ <%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %> %> |
7
+ <%%= link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> %>
8
+
9
+ <%%= button_to "Destroy this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, method: :delete %>
10
+ </div>
@@ -4,7 +4,7 @@ require "rails/generators/named_base"
4
4
 
5
5
  module Erb # :nodoc:
6
6
  module Generators # :nodoc:
7
- class Base < Rails::Generators::NamedBase #:nodoc:
7
+ class Base < Rails::Generators::NamedBase # :nodoc:
8
8
  private
9
9
  def formats
10
10
  [format]
@@ -7,6 +7,25 @@ module Rails
7
7
  class GeneratedAttribute # :nodoc:
8
8
  INDEX_OPTIONS = %w(index uniq)
9
9
  UNIQ_INDEX_OPTIONS = %w(uniq)
10
+ DEFAULT_TYPES = %w(
11
+ attachment
12
+ attachments
13
+ belongs_to
14
+ boolean
15
+ date
16
+ datetime
17
+ decimal
18
+ digest
19
+ float
20
+ integer
21
+ references
22
+ rich_text
23
+ string
24
+ text
25
+ time
26
+ timestamp
27
+ token
28
+ )
10
29
 
11
30
  attr_accessor :name, :type
12
31
  attr_reader :attr_options
@@ -14,23 +33,50 @@ module Rails
14
33
 
15
34
  class << self
16
35
  def parse(column_definition)
17
- name, type, has_index = column_definition.split(":")
36
+ name, type, index_type = column_definition.split(":")
18
37
 
19
38
  # if user provided "name:index" instead of "name:string:index"
20
39
  # type should be set blank so GeneratedAttribute's constructor
21
40
  # could set it to :string
22
- has_index, type = type, nil if INDEX_OPTIONS.include?(type)
41
+ index_type, type = type, nil if valid_index_type?(type)
23
42
 
24
43
  type, attr_options = *parse_type_and_options(type)
25
44
  type = type.to_sym if type
26
45
 
46
+ if dangerous_name?(name)
47
+ raise Error, "Could not generate field '#{name}', as it is already defined by Active Record."
48
+ end
49
+
50
+ if type && !valid_type?(type)
51
+ raise Error, "Could not generate field '#{name}' with unknown type '#{type}'."
52
+ end
53
+
54
+ if index_type && !valid_index_type?(index_type)
55
+ raise Error, "Could not generate field '#{name}' with unknown index '#{index_type}'."
56
+ end
57
+
27
58
  if type && reference?(type)
28
- if UNIQ_INDEX_OPTIONS.include?(has_index)
59
+ if UNIQ_INDEX_OPTIONS.include?(index_type)
29
60
  attr_options[:index] = { unique: true }
30
61
  end
31
62
  end
32
63
 
33
- new(name, type, has_index, attr_options)
64
+ new(name, type, index_type, attr_options)
65
+ end
66
+
67
+ def dangerous_name?(name)
68
+ defined?(ActiveRecord::Base) &&
69
+ ActiveRecord::Base.dangerous_attribute_method?(name)
70
+ end
71
+
72
+ def valid_type?(type)
73
+ DEFAULT_TYPES.include?(type.to_s) ||
74
+ !defined?(ActiveRecord::Base) ||
75
+ ActiveRecord::Base.connection.valid_type?(type)
76
+ end
77
+
78
+ def valid_index_type?(index_type)
79
+ INDEX_OPTIONS.include?(index_type.to_s)
34
80
  end
35
81
 
36
82
  def reference?(type)
@@ -42,6 +88,8 @@ module Rails
42
88
  # when declaring options curly brackets should be used
43
89
  def parse_type_and_options(type)
44
90
  case type
91
+ when /(text|binary)\{([a-z]+)\}/
92
+ return $1, size: $2.to_sym
45
93
  when /(string|text|binary|integer)\{(\d+)\}/
46
94
  return $1, limit: $2.to_i
47
95
  when /decimal\{(\d+)[,.-](\d+)\}/
@@ -70,9 +118,9 @@ module Rails
70
118
  @field_type ||= case type
71
119
  when :integer then :number_field
72
120
  when :float, :decimal then :text_field
73
- when :time then :time_select
74
- when :datetime, :timestamp then :datetime_select
75
- when :date then :date_select
121
+ when :time then :time_field
122
+ when :datetime, :timestamp then :datetime_field
123
+ when :date then :date_field
76
124
  when :text then :text_area
77
125
  when :rich_text then :rich_text_area
78
126
  when :boolean then :check_box
@@ -87,8 +135,8 @@ module Rails
87
135
  when :integer then 1
88
136
  when :float then 1.5
89
137
  when :decimal then "9.99"
90
- when :datetime, :timestamp, :time then Time.now.to_s(:db)
91
- when :date then Date.today.to_s(:db)
138
+ when :datetime, :timestamp, :time then Time.now.to_fs(:db)
139
+ when :date then Date.today.to_fs(:db)
92
140
  when :string then name == "type" ? "" : "MyString"
93
141
  when :text then "MyText"
94
142
  when :boolean then false
@@ -12,7 +12,7 @@ module Rails
12
12
  extend ActiveSupport::Concern
13
13
  attr_reader :migration_number, :migration_file_name, :migration_class_name
14
14
 
15
- module ClassMethods #:nodoc:
15
+ module ClassMethods # :nodoc:
16
16
  def migration_lookup_at(dirname)
17
17
  Dir.glob("#{dirname}/[0-9]*_*.rb")
18
18
  end
@@ -57,17 +57,12 @@ module Rails
57
57
  source = File.expand_path(find_in_source_paths(source.to_s))
58
58
 
59
59
  set_migration_assigns!(destination)
60
- context = instance_eval("binding")
61
60
 
62
61
  dir, base = File.split(destination)
63
62
  numbered_destination = File.join(dir, ["%migration_number%", base].join("_"))
64
63
 
65
64
  file = create_migration numbered_destination, nil, config do
66
- if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
67
- ERB.new(::File.binread(source), trim_mode: "-", eoutvar: "@output_buffer").result(context)
68
- else
69
- ERB.new(::File.binread(source), nil, "-", "@output_buffer").result(context)
70
- end
65
+ ERB.new(::File.binread(source), trim_mode: "-", eoutvar: "@output_buffer").result(binding)
71
66
  end
72
67
  Rails::Generators.add_generated_file(file)
73
68
  end
@@ -18,8 +18,9 @@ module Rails
18
18
  ERROR
19
19
  mattr_accessor :skip_warn
20
20
 
21
- def self.included(base) #:nodoc:
22
- base.class_option :force_plural, type: :boolean, default: false, desc: "Forces the use of the given model name"
21
+ def self.included(base) # :nodoc:
22
+ base.class_option :force_plural, type: :boolean, default: false,
23
+ desc: "Do not singularize the model name, even if it appears plural"
23
24
  end
24
25
 
25
26
  def initialize(args, *_options)
@@ -8,7 +8,7 @@ module Rails
8
8
  class NamedBase < Base
9
9
  argument :name, type: :string
10
10
 
11
- def initialize(args, *options) #:nodoc:
11
+ def initialize(args, *options) # :nodoc:
12
12
  @inside_template = nil
13
13
  # Unfreeze name in case it's given as a frozen string
14
14
  args[0] = args[0].dup if args[0].is_a?(String) && args[0].frozen?
@@ -94,20 +94,20 @@ module Rails
94
94
  singular_name == plural_name
95
95
  end
96
96
 
97
- def index_helper # :doc:
98
- uncountable? ? "#{plural_route_name}_index" : plural_route_name
97
+ def index_helper(type: nil) # :doc:
98
+ [plural_route_name, ("index" if uncountable?), type].compact.join("_")
99
99
  end
100
100
 
101
- def show_helper # :doc:
102
- "#{singular_route_name}_url(@#{singular_table_name})"
101
+ def show_helper(arg = "@#{singular_table_name}", type: :url) # :doc:
102
+ "#{singular_route_name}_#{type}(#{arg})"
103
103
  end
104
104
 
105
- def edit_helper # :doc:
106
- "edit_#{show_helper}"
105
+ def edit_helper(...) # :doc:
106
+ "edit_#{show_helper(...)}"
107
107
  end
108
108
 
109
- def new_helper # :doc:
110
- "new_#{singular_route_name}_url"
109
+ def new_helper(type: :url) # :doc:
110
+ "new_#{singular_route_name}_#{type}"
111
111
  end
112
112
 
113
113
  def singular_table_name # :doc:
@@ -127,7 +127,7 @@ module Rails
127
127
  end
128
128
 
129
129
  def route_url # :doc:
130
- @route_url ||= class_path.collect { |dname| "/" + dname }.join + "/" + plural_file_name
130
+ @route_url ||= controller_class_path.collect { |dname| "/" + dname }.join + "/" + plural_file_name
131
131
  end
132
132
 
133
133
  def url_helper_prefix # :doc:
@@ -147,8 +147,8 @@ module Rails
147
147
  model_resource_name(prefix: "@")
148
148
  end
149
149
 
150
- def model_resource_name(prefix: "") # :doc:
151
- resource_name = "#{prefix}#{singular_table_name}"
150
+ def model_resource_name(base_name = singular_table_name, prefix: "") # :doc:
151
+ resource_name = "#{prefix}#{base_name}"
152
152
  if options[:model_name]
153
153
  "[#{controller_class_path.map { |name| ":" + name }.join(", ")}, #{resource_name}]"
154
154
  else
@@ -202,7 +202,7 @@ module Rails
202
202
  end
203
203
 
204
204
  # Add a class collisions name to be checked on class initialization. You
205
- # can supply a hash with a :prefix or :suffix to be tested.
205
+ # can supply a hash with a +:prefix+ or +:suffix+ to be tested.
206
206
  #
207
207
  # ==== Examples
208
208
  #