railties 5.2.0 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +293 -89
  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 +24 -13
  7. data/lib/rails/all.rb +4 -0
  8. data/lib/rails/api/generator.rb +2 -1
  9. data/lib/rails/api/task.rb +17 -0
  10. data/lib/rails/app_loader.rb +2 -2
  11. data/lib/rails/app_updater.rb +4 -1
  12. data/lib/rails/application/bootstrap.rb +9 -17
  13. data/lib/rails/application/configuration.rb +177 -27
  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 +69 -2
  17. data/lib/rails/application/routes_reloader.rb +9 -19
  18. data/lib/rails/application.rb +96 -66
  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/actions.rb +10 -0
  25. data/lib/rails/command/base.rb +17 -5
  26. data/lib/rails/command/behavior.rb +8 -49
  27. data/lib/rails/command/environment_argument.rb +9 -16
  28. data/lib/rails/command/spellchecker.rb +57 -0
  29. data/lib/rails/command.rb +18 -11
  30. data/lib/rails/commands/console/console_command.rb +6 -0
  31. data/lib/rails/commands/credentials/USAGE +33 -0
  32. data/lib/rails/commands/credentials/credentials_command/diffing.rb +41 -0
  33. data/lib/rails/commands/credentials/credentials_command.rb +78 -21
  34. data/lib/rails/commands/db/system/change/change_command.rb +25 -0
  35. data/lib/rails/commands/dbconsole/dbconsole_command.rb +66 -51
  36. data/lib/rails/commands/dev/dev_command.rb +19 -0
  37. data/lib/rails/commands/encrypted/USAGE +28 -0
  38. data/lib/rails/commands/encrypted/encrypted_command.rb +5 -4
  39. data/lib/rails/commands/generate/generate_command.rb +1 -1
  40. data/lib/rails/commands/help/help_command.rb +1 -1
  41. data/lib/rails/commands/initializers/initializers_command.rb +23 -0
  42. data/lib/rails/commands/new/new_command.rb +2 -2
  43. data/lib/rails/commands/notes/notes_command.rb +29 -0
  44. data/lib/rails/commands/plugin/plugin_command.rb +1 -1
  45. data/lib/rails/commands/rake/rake_command.rb +9 -8
  46. data/lib/rails/commands/routes/routes_command.rb +37 -0
  47. data/lib/rails/commands/runner/runner_command.rb +13 -9
  48. data/lib/rails/commands/secrets/USAGE +6 -0
  49. data/lib/rails/commands/secrets/secrets_command.rb +3 -3
  50. data/lib/rails/commands/server/server_command.rb +92 -56
  51. data/lib/rails/commands/test/test_command.rb +2 -2
  52. data/lib/rails/configuration.rb +48 -19
  53. data/lib/rails/engine/configuration.rb +6 -2
  54. data/lib/rails/engine/updater.rb +1 -1
  55. data/lib/rails/engine.rb +63 -35
  56. data/lib/rails/gem_version.rb +2 -2
  57. data/lib/rails/generators/actions/create_migration.rb +5 -1
  58. data/lib/rails/generators/actions.rb +89 -56
  59. data/lib/rails/generators/app_base.rb +80 -108
  60. data/lib/rails/generators/app_name.rb +50 -0
  61. data/lib/rails/generators/base.rb +19 -12
  62. data/lib/rails/generators/database.rb +57 -0
  63. data/lib/rails/generators/erb/mailer/mailer_generator.rb +1 -2
  64. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +0 -1
  65. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +7 -4
  66. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +1 -1
  67. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +9 -1
  68. data/lib/rails/generators/erb.rb +0 -1
  69. data/lib/rails/generators/generated_attribute.rb +50 -31
  70. data/lib/rails/generators/migration.rb +3 -3
  71. data/lib/rails/generators/model_helpers.rb +33 -2
  72. data/lib/rails/generators/named_base.rb +3 -7
  73. data/lib/rails/generators/rails/app/USAGE +2 -1
  74. data/lib/rails/generators/rails/app/app_generator.rb +127 -84
  75. data/lib/rails/generators/rails/app/templates/Gemfile.tt +18 -21
  76. data/lib/rails/generators/rails/app/templates/Rakefile.tt +1 -1
  77. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -3
  78. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +6 -0
  79. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +5 -0
  80. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +23 -0
  81. data/lib/rails/generators/rails/app/templates/app/jobs/application_job.rb.tt +5 -0
  82. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +6 -5
  83. data/lib/rails/generators/rails/app/templates/bin/rails.tt +5 -2
  84. data/lib/rails/generators/rails/app/templates/bin/rake.tt +5 -2
  85. data/lib/rails/generators/rails/app/templates/bin/setup.tt +9 -9
  86. data/lib/rails/generators/rails/app/templates/bin/spring.tt +9 -0
  87. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +11 -3
  88. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +16 -7
  89. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +2 -2
  90. data/lib/rails/generators/rails/app/templates/config/cable.yml.tt +1 -1
  91. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +4 -5
  92. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +12 -11
  93. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +13 -12
  94. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +1 -1
  95. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +13 -12
  96. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +12 -11
  97. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +16 -15
  98. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +11 -10
  100. data/lib/rails/generators/rails/app/templates/config/environment.rb.tt +1 -1
  101. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +22 -5
  102. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +43 -17
  103. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +26 -7
  104. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  105. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +4 -3
  106. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +7 -0
  107. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
  108. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +63 -0
  109. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -0
  110. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +1 -1
  111. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +13 -4
  112. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +1 -1
  113. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +6 -6
  114. data/lib/rails/generators/rails/app/templates/config.ru.tt +2 -1
  115. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +1 -1
  116. data/lib/rails/generators/rails/app/templates/gitattributes.tt +14 -0
  117. data/lib/rails/generators/rails/app/templates/gitignore.tt +10 -7
  118. data/lib/rails/generators/rails/app/templates/package.json.tt +8 -2
  119. data/lib/rails/generators/rails/app/templates/public/robots.txt +1 -1
  120. data/lib/rails/generators/rails/app/templates/ruby-version.tt +1 -1
  121. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +11 -0
  122. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +9 -2
  123. data/lib/rails/generators/rails/assets/USAGE +3 -7
  124. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -1
  125. data/lib/rails/generators/rails/benchmark/USAGE +19 -0
  126. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +29 -0
  127. data/lib/rails/generators/rails/benchmark/templates/benchmark.rb.tt +15 -0
  128. data/lib/rails/generators/rails/controller/USAGE +2 -2
  129. data/lib/rails/generators/rails/controller/controller_generator.rb +10 -39
  130. data/lib/rails/generators/rails/credentials/credentials_generator.rb +6 -7
  131. data/lib/rails/generators/rails/db/system/change/change_generator.rb +65 -0
  132. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +10 -7
  133. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -0
  134. data/lib/rails/generators/rails/generator/USAGE +2 -2
  135. data/lib/rails/generators/rails/generator/generator_generator.rb +0 -1
  136. data/lib/rails/generators/rails/generator/templates/USAGE.tt +1 -1
  137. data/lib/rails/generators/rails/helper/USAGE +2 -3
  138. data/lib/rails/generators/rails/helper/helper_generator.rb +5 -0
  139. data/lib/rails/generators/rails/integration_test/USAGE +2 -2
  140. data/lib/rails/generators/rails/migration/USAGE +4 -4
  141. data/lib/rails/generators/rails/model/USAGE +15 -16
  142. data/lib/rails/generators/rails/plugin/plugin_generator.rb +32 -56
  143. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +18 -18
  144. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +3 -10
  145. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +4 -18
  146. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +1 -2
  147. data/lib/rails/generators/rails/plugin/templates/app/helpers/%namespaced_name%/application_helper.rb.tt +1 -1
  148. data/lib/rails/generators/rails/plugin/templates/app/jobs/%namespaced_name%/application_job.rb.tt +1 -1
  149. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +1 -1
  150. data/lib/rails/generators/rails/plugin/templates/app/models/%namespaced_name%/application_record.rb.tt +1 -1
  151. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +3 -3
  152. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +14 -11
  153. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +1 -1
  154. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/railtie.rb.tt +1 -1
  155. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb.tt +1 -0
  156. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +1 -1
  157. data/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb.tt +4 -4
  158. data/lib/rails/generators/rails/plugin/templates/test/integration/navigation_test.rb.tt +1 -1
  159. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +0 -4
  160. data/lib/rails/generators/rails/resource/USAGE +4 -4
  161. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -27
  162. data/lib/rails/generators/rails/scaffold/USAGE +5 -5
  163. data/lib/rails/generators/rails/scaffold_controller/USAGE +2 -2
  164. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +19 -0
  165. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
  166. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +2 -2
  167. data/lib/rails/generators/rails/system_test/USAGE +2 -2
  168. data/lib/rails/generators/rails/task/USAGE +3 -3
  169. data/lib/rails/generators/resource_helpers.rb +1 -6
  170. data/lib/rails/generators/test_case.rb +1 -1
  171. data/lib/rails/generators/test_unit/controller/controller_generator.rb +2 -0
  172. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb.tt +3 -3
  173. data/lib/rails/generators/test_unit/generator/generator_generator.rb +0 -1
  174. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +2 -2
  175. data/lib/rails/generators/test_unit/integration/integration_generator.rb +5 -0
  176. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb.tt +1 -1
  177. data/lib/rails/generators/test_unit/job/job_generator.rb +5 -0
  178. data/lib/rails/generators/test_unit/job/templates/unit_test.rb.tt +1 -1
  179. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +1 -1
  180. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +1 -1
  181. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +3 -3
  182. data/lib/rails/generators/test_unit/model/templates/unit_test.rb.tt +1 -1
  183. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +1 -1
  184. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +2 -2
  185. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +12 -3
  186. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +1 -1
  187. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +1 -1
  188. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +10 -2
  189. data/lib/rails/generators/test_unit/system/system_generator.rb +5 -0
  190. data/lib/rails/generators/testing/assertions.rb +2 -2
  191. data/lib/rails/generators/testing/behaviour.rb +4 -2
  192. data/lib/rails/generators.rb +38 -24
  193. data/lib/rails/info.rb +4 -4
  194. data/lib/rails/info_controller.rb +2 -3
  195. data/lib/rails/mailers_controller.rb +10 -4
  196. data/lib/rails/paths.rb +26 -10
  197. data/lib/rails/rack/logger.rb +5 -6
  198. data/lib/rails/railtie/configurable.rb +0 -1
  199. data/lib/rails/railtie/configuration.rb +3 -3
  200. data/lib/rails/railtie.rb +33 -13
  201. data/lib/rails/ruby_version_check.rb +3 -3
  202. data/lib/rails/secrets.rb +0 -1
  203. data/lib/rails/source_annotation_extractor.rb +124 -117
  204. data/lib/rails/tasks/engine.rake +1 -4
  205. data/lib/rails/tasks/framework.rake +13 -3
  206. data/lib/rails/tasks/log.rake +0 -1
  207. data/lib/rails/tasks/misc.rake +1 -1
  208. data/lib/rails/tasks/statistics.rake +5 -1
  209. data/lib/rails/tasks/yarn.rake +14 -1
  210. data/lib/rails/tasks/zeitwerk.rake +69 -0
  211. data/lib/rails/tasks.rb +1 -4
  212. data/lib/rails/templates/rails/mailers/email.html.erb +11 -7
  213. data/lib/rails/templates/rails/welcome/index.html.erb +3 -3
  214. data/lib/rails/test_help.rb +11 -9
  215. data/lib/rails/test_unit/reporter.rb +3 -2
  216. data/lib/rails/test_unit/runner.rb +25 -8
  217. data/lib/rails/test_unit/testing.rake +7 -1
  218. data/lib/rails.rb +10 -8
  219. metadata +45 -39
  220. data/lib/rails/generators/js/assets/assets_generator.rb +0 -15
  221. data/lib/rails/generators/js/assets/templates/javascript.js +0 -2
  222. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +0 -22
  223. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/cable.js.tt +0 -13
  224. data/lib/rails/generators/rails/app/templates/bin/bundle.tt +0 -2
  225. data/lib/rails/generators/rails/app/templates/bin/update.tt +0 -34
  226. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +0 -50
  227. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +0 -86
  228. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_5_2.rb.tt +0 -35
  229. data/lib/rails/generators/rails/assets/templates/javascript.js +0 -2
  230. data/lib/rails/generators/rails/plugin/templates/rails/application.rb.tt +0 -23
  231. data/lib/rails/tasks/annotations.rake +0 -22
  232. data/lib/rails/tasks/dev.rake +0 -10
  233. data/lib/rails/tasks/initializers.rake +0 -8
  234. data/lib/rails/tasks/routes.rake +0 -31
@@ -0,0 +1,19 @@
1
+ Description:
2
+ Generate benchmarks to compare performance optimizations.
3
+
4
+ Makes use of the `benchmark-ips` gem as it provides a number of benefits like:
5
+ - Simple significance test
6
+ - Automatic warmup
7
+ - No need to specify the number of iterations
8
+
9
+ Example:
10
+ `bin/rails generate benchmark opt_compare`
11
+
12
+ This will create:
13
+ script/benchmarks/opt_compare.rb
14
+
15
+ You can run the generated benchmark file using:
16
+ `ruby script/benchmarks/opt_compare.rb`
17
+
18
+ You can specify different reports:
19
+ `bin/rails generate benchmark opt_compare patch1 patch2 patch3`
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/named_base"
4
+
5
+ module Rails
6
+ module Generators
7
+ class BenchmarkGenerator < NamedBase
8
+ IPS_GEM_NAME = "benchmark-ips"
9
+
10
+ argument :reports, type: :array, default: ["before", "after"]
11
+
12
+ def generate_layout
13
+ add_ips_to_gemfile unless ips_installed?
14
+ template("benchmark.rb.tt", "script/benchmarks/#{file_name}.rb")
15
+ end
16
+
17
+ private
18
+ def add_ips_to_gemfile
19
+ gem(IPS_GEM_NAME, group: [:development, :test])
20
+ end
21
+
22
+ def ips_installed?
23
+ in_root do
24
+ return File.read("Gemfile").match?(/gem.*\b#{IPS_GEM_NAME}\b.*/)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../config/environment"
4
+
5
+ # Any benchmarking setup goes here...
6
+
7
+
8
+
9
+ Benchmark.ips do |x|
10
+ <%- reports.each do |report| -%>
11
+ x.report("<%= report %>") { }
12
+ <%- end -%>
13
+
14
+ x.compare!
15
+ end
@@ -1,5 +1,5 @@
1
1
  Description:
2
- Stubs out a new controller and its views. Pass the controller name, either
2
+ Generates a new controller and its views. Pass the controller name, either
3
3
  CamelCased or under_scored, and a list of views as arguments.
4
4
 
5
5
  To create a controller within a module, specify the controller name as a
@@ -9,7 +9,7 @@ Description:
9
9
  template engine, assets, and test framework generators.
10
10
 
11
11
  Example:
12
- `rails generate controller CreditCards open debit credit close`
12
+ `bin/rails generate controller CreditCards open debit credit close`
13
13
 
14
14
  CreditCards controller with URLs like /credit_cards/debit.
15
15
  Controller: app/controllers/credit_cards_controller.rb
@@ -17,50 +17,21 @@ module Rails
17
17
  def add_routes
18
18
  return if options[:skip_routes]
19
19
  return if actions.empty?
20
- route generate_routing_code
20
+ routing_code = actions.map { |action| "get '#{file_name}/#{action}'" }.join("\n")
21
+ route routing_code, namespace: regular_class_path
21
22
  end
22
23
 
23
- hook_for :template_engine, :test_framework, :helper, :assets
24
+ hook_for :template_engine, :test_framework, :helper, :assets do |generator|
25
+ invoke generator, [ remove_possible_suffix(name), actions ]
26
+ end
24
27
 
25
28
  private
29
+ def file_name
30
+ @_file_name ||= remove_possible_suffix(super)
31
+ end
26
32
 
27
- # This method creates nested route entry for namespaced resources.
28
- # For eg. rails g controller foo/bar/baz index show
29
- # Will generate -
30
- # namespace :foo do
31
- # namespace :bar do
32
- # get 'baz/index'
33
- # get 'baz/show'
34
- # end
35
- # end
36
- def generate_routing_code
37
- depth = 0
38
- lines = []
39
-
40
- # Create 'namespace' ladder
41
- # namespace :foo do
42
- # namespace :bar do
43
- regular_class_path.each do |ns|
44
- lines << indent("namespace :#{ns} do\n", depth * 2)
45
- depth += 1
46
- end
47
-
48
- # Create route
49
- # get 'baz/index'
50
- # get 'baz/show'
51
- actions.each do |action|
52
- lines << indent(%{get '#{file_name}/#{action}'\n}, depth * 2)
53
- end
54
-
55
- # Create `end` ladder
56
- # end
57
- # end
58
- until depth.zero?
59
- depth -= 1
60
- lines << indent("end\n", depth * 2)
61
- end
62
-
63
- lines.join
33
+ def remove_possible_suffix(name)
34
+ name.sub(/_?controller$/i, "")
64
35
  end
65
36
  end
66
37
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "rails/generators/base"
4
4
  require "rails/generators/rails/master_key/master_key_generator"
5
- require "active_support/core_ext/string/strip"
6
5
  require "active_support/encrypted_configuration"
7
6
 
8
7
  module Rails
@@ -43,13 +42,13 @@ module Rails
43
42
  end
44
43
 
45
44
  def credentials_template
46
- <<-YAML.strip_heredoc
47
- # aws:
48
- # access_key_id: 123
49
- # secret_access_key: 345
45
+ <<~YAML
46
+ # aws:
47
+ # access_key_id: 123
48
+ # secret_access_key: 345
50
49
 
51
- # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
52
- secret_key_base: #{SecureRandom.hex(64)}
50
+ # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
51
+ secret_key_base: #{SecureRandom.hex(64)}
53
52
  YAML
54
53
  end
55
54
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/base"
4
+
5
+ module Rails
6
+ module Generators
7
+ module Db
8
+ module System
9
+ class ChangeGenerator < Base # :nodoc:
10
+ include Database
11
+ include AppName
12
+
13
+ class_option :to, required: true,
14
+ desc: "The database system to switch to."
15
+
16
+ def self.default_generator_root
17
+ path = File.expand_path(File.join(base_name, "app"), base_root)
18
+ path if File.exist?(path)
19
+ end
20
+
21
+ def initialize(*)
22
+ super
23
+
24
+ unless DATABASES.include?(options[:to])
25
+ raise Error, "Invalid value for --to option. Supported preconfigurations are: #{DATABASES.join(", ")}."
26
+ end
27
+
28
+ opt = options.dup
29
+ opt[:database] ||= opt[:to]
30
+ self.options = opt.freeze
31
+ end
32
+
33
+ def edit_database_config
34
+ template("config/databases/#{options[:database]}.yml", "config/database.yml")
35
+ end
36
+
37
+ def edit_gemfile
38
+ name, version = gem_for_database
39
+ gsub_file("Gemfile", all_database_gems_regex, name)
40
+ gsub_file("Gemfile", gem_entry_regex_for(name), gem_entry_for(name, *version))
41
+ end
42
+
43
+ private
44
+ def all_database_gems
45
+ DATABASES.map { |database| gem_for_database(database) }
46
+ end
47
+
48
+ def all_database_gems_regex
49
+ all_database_gem_names = all_database_gems.map(&:first)
50
+ /(\b#{all_database_gem_names.join('\b|\b')}\b)/
51
+ end
52
+
53
+ def gem_entry_regex_for(gem_name)
54
+ /^gem.*\b#{gem_name}\b.*/
55
+ end
56
+
57
+ def gem_entry_for(*gem_name_and_version)
58
+ gem_name_and_version.map! { |segment| "'#{segment}'" }
59
+ "gem #{gem_name_and_version.join(", ")}"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails/generators/base"
4
- require "active_support/core_ext/string/strip"
5
4
  require "active_support/encrypted_file"
6
5
 
7
6
  module Rails
@@ -9,17 +8,21 @@ module Rails
9
8
  class EncryptedFileGenerator < Base # :nodoc:
10
9
  def add_encrypted_file_silently(file_path, key_path, template = encrypted_file_template)
11
10
  unless File.exist?(file_path)
12
- setup = { content_path: file_path, key_path: key_path, env_key: "RAILS_MASTER_KEY", raise_if_missing_key: true }
13
- ActiveSupport::EncryptedFile.new(setup).write(template)
11
+ ActiveSupport::EncryptedFile.new(
12
+ content_path: file_path,
13
+ key_path: key_path,
14
+ env_key: "RAILS_MASTER_KEY",
15
+ raise_if_missing_key: true
16
+ ).write(template)
14
17
  end
15
18
  end
16
19
 
17
20
  private
18
21
  def encrypted_file_template
19
- <<-YAML.strip_heredoc
20
- # aws:
21
- # access_key_id: 123
22
- # secret_access_key: 345
22
+ <<~YAML
23
+ # aws:
24
+ # access_key_id: 123
25
+ # secret_access_key: 345
23
26
 
24
27
  YAML
25
28
  end
@@ -27,6 +27,7 @@ module Rails
27
27
 
28
28
  def add_key_file_silently(key_path, key = nil)
29
29
  create_file key_path, key || ActiveSupport::EncryptedFile.generate_key
30
+ key_path.chmod 0600
30
31
  end
31
32
 
32
33
  def ignore_key_file(key_path, ignore: key_ignore(key_path))
@@ -1,9 +1,9 @@
1
1
  Description:
2
- Stubs out a new generator at lib/generators. Pass the generator name as an argument,
2
+ Generates a new generator at lib/generators. Pass the generator name as an argument,
3
3
  either CamelCased or snake_cased.
4
4
 
5
5
  Example:
6
- `rails generate generator Awesome`
6
+ `bin/rails generate generator Awesome`
7
7
 
8
8
  creates a standard awesome generator:
9
9
  lib/generators/awesome/
@@ -15,7 +15,6 @@ module Rails
15
15
  hook_for :test_framework
16
16
 
17
17
  private
18
-
19
18
  def generator_dir
20
19
  if options[:namespace]
21
20
  File.join("lib", "generators", regular_class_path, file_name)
@@ -2,7 +2,7 @@ Description:
2
2
  Explain the generator
3
3
 
4
4
  Example:
5
- rails generate <%= file_name %> Thing
5
+ bin/rails generate <%= file_name %> Thing
6
6
 
7
7
  This will create:
8
8
  what/will/it/create
@@ -1,13 +1,12 @@
1
1
  Description:
2
- Stubs out a new helper. Pass the helper name, either CamelCased
2
+ Generates a new helper. Pass the helper name, either CamelCased
3
3
  or under_scored.
4
4
 
5
5
  To create a helper within a module, specify the helper name as a
6
6
  path like 'parent_module/helper_name'.
7
7
 
8
8
  Example:
9
- `rails generate helper CreditCard`
9
+ `bin/rails generate helper CreditCard`
10
10
 
11
11
  Credit card helper.
12
12
  Helper: app/helpers/credit_card_helper.rb
13
-
@@ -10,6 +10,11 @@ module Rails
10
10
  end
11
11
 
12
12
  hook_for :test_framework
13
+
14
+ private
15
+ def file_name
16
+ @_file_name ||= super.sub(/_helper\z/i, "")
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -1,10 +1,10 @@
1
1
  Description:
2
- Stubs out a new integration test. Pass the name of the test, either
2
+ Generates a new integration test. Pass the name of the test, either
3
3
  CamelCased or under_scored, as an argument.
4
4
 
5
5
  This generator invokes the current integration tool, which defaults to
6
6
  TestUnit.
7
7
 
8
8
  Example:
9
- `rails generate integration_test GeneralStories` creates a GeneralStories
9
+ `bin/rails generate integration_test GeneralStories` creates a GeneralStories
10
10
  integration test in test/integration/general_stories_test.rb
@@ -1,5 +1,5 @@
1
1
  Description:
2
- Stubs out a new database migration. Pass the migration name, either
2
+ Generates a new database migration. Pass the migration name, either
3
3
  CamelCased or under_scored, and an optional list of attribute pairs as arguments.
4
4
 
5
5
  A migration class is generated in db/migrate prefixed by a timestamp of the current date and time.
@@ -8,12 +8,12 @@ Description:
8
8
  column lines from supplied attributes: AddColumnsToTable or RemoveColumnsFromTable
9
9
 
10
10
  Example:
11
- `rails generate migration AddSslFlag`
11
+ `bin/rails generate migration AddSslFlag`
12
12
 
13
13
  If the current date is May 14, 2008 and the current time 09:09:12, this creates the AddSslFlag migration
14
14
  db/migrate/20080514090912_add_ssl_flag.rb
15
15
 
16
- `rails generate migration AddTitleBodyToPost title:string body:text published:boolean`
16
+ `bin/rails generate migration AddTitleBodyToPost title:string body:text published:boolean`
17
17
 
18
18
  This will create the AddTitleBodyToPost in db/migrate/20080514090912_add_title_body_to_post.rb with this in the Change migration:
19
19
 
@@ -25,7 +25,7 @@ Migration names containing JoinTable will generate join tables for use with
25
25
  has_and_belongs_to_many associations.
26
26
 
27
27
  Example:
28
- `rails g migration CreateMediaJoinTable artists musics:uniq`
28
+ `bin/rails g migration CreateMediaJoinTable artists musics:uniq`
29
29
 
30
30
  will create the migration
31
31
 
@@ -1,5 +1,5 @@
1
1
  Description:
2
- Stubs out a new model. Pass the model name, either CamelCased or
2
+ Generates a new model. Pass the model name, either CamelCased or
3
3
  under_scored, and an optional list of attribute pairs as arguments.
4
4
 
5
5
  Attribute pairs are field:type arguments specifying the
@@ -29,7 +29,7 @@ Available field types:
29
29
  Just after the field name you can specify a type like text or boolean.
30
30
  It will generate the column with the associated SQL type. For instance:
31
31
 
32
- `rails generate model post title:string body:text`
32
+ `bin/rails generate model post title:string body:text`
33
33
 
34
34
  will generate a title column with a varchar type and a body column with a text
35
35
  type. If no type is specified the string type will be used by default.
@@ -49,47 +49,47 @@ Available field types:
49
49
 
50
50
  You can also consider `references` as a kind of type. For instance, if you run:
51
51
 
52
- `rails generate model photo title:string album:references`
52
+ `bin/rails generate model photo title:string album:references`
53
53
 
54
54
  It will generate an `album_id` column. You should generate these kinds of fields when
55
55
  you will use a `belongs_to` association, for instance. `references` also supports
56
56
  polymorphism, you can enable polymorphism like this:
57
57
 
58
- `rails generate model product supplier:references{polymorphic}`
58
+ `bin/rails generate model product supplier:references{polymorphic}`
59
59
 
60
60
  For integer, string, text and binary fields, an integer in curly braces will
61
61
  be set as the limit:
62
62
 
63
- `rails generate model user pseudo:string{30}`
63
+ `bin/rails generate model user pseudo:string{30}`
64
64
 
65
65
  For decimal, two integers separated by a comma in curly braces will be used
66
66
  for precision and scale:
67
67
 
68
- `rails generate model product 'price:decimal{10,2}'`
68
+ `bin/rails generate model product 'price:decimal{10,2}'`
69
69
 
70
70
  You can add a `:uniq` or `:index` suffix for unique or standard indexes
71
71
  respectively:
72
72
 
73
- `rails generate model user pseudo:string:uniq`
74
- `rails generate model user pseudo:string:index`
73
+ `bin/rails generate model user pseudo:string:uniq`
74
+ `bin/rails generate model user pseudo:string:index`
75
75
 
76
76
  You can combine any single curly brace option with the index options:
77
77
 
78
- `rails generate model user username:string{30}:uniq`
79
- `rails generate model product supplier:references{polymorphic}:index`
78
+ `bin/rails generate model user username:string{30}:uniq`
79
+ `bin/rails generate model product supplier:references{polymorphic}:index`
80
80
 
81
81
  If you require a `password_digest` string column for use with
82
82
  has_secure_password, you can specify `password:digest`:
83
83
 
84
- `rails generate model user password:digest`
84
+ `bin/rails generate model user password:digest`
85
85
 
86
86
  If you require a `token` string column for use with
87
87
  has_secure_token, you can specify `auth_token:token`:
88
88
 
89
- `rails generate model user auth_token:token`
89
+ `bin/rails generate model user auth_token:token`
90
90
 
91
91
  Examples:
92
- `rails generate model account`
92
+ `bin/rails generate model account`
93
93
 
94
94
  For Active Record and TestUnit it creates:
95
95
 
@@ -98,11 +98,11 @@ Examples:
98
98
  Fixtures: test/fixtures/accounts.yml
99
99
  Migration: db/migrate/XXX_create_accounts.rb
100
100
 
101
- `rails generate model post title:string body:text published:boolean`
101
+ `bin/rails generate model post title:string body:text published:boolean`
102
102
 
103
103
  Creates a Post model with a string title, text body, and published flag.
104
104
 
105
- `rails generate model admin/account`
105
+ `bin/rails generate model admin/account`
106
106
 
107
107
  For Active Record and TestUnit it creates:
108
108
 
@@ -111,4 +111,3 @@ Examples:
111
111
  Test: test/models/admin/account_test.rb
112
112
  Fixtures: test/fixtures/admin/accounts.yml
113
113
  Migration: db/migrate/XXX_create_admin_accounts.rb
114
-