railties 7.1.3.4 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +128 -775
  3. data/lib/minitest/rails_plugin.rb +6 -3
  4. data/lib/rails/all.rb +1 -3
  5. data/lib/rails/api/task.rb +6 -4
  6. data/lib/rails/application/bootstrap.rb +5 -7
  7. data/lib/rails/application/configuration.rb +81 -43
  8. data/lib/rails/application/default_middleware_stack.rb +4 -0
  9. data/lib/rails/application/dummy_config.rb +2 -2
  10. data/lib/rails/application/finisher.rb +9 -3
  11. data/lib/rails/application/routes_reloader.rb +16 -2
  12. data/lib/rails/application.rb +27 -86
  13. data/lib/rails/backtrace_cleaner.rb +19 -4
  14. data/lib/rails/cli.rb +0 -1
  15. data/lib/rails/code_statistics.rb +128 -86
  16. data/lib/rails/code_statistics_calculator.rb +78 -76
  17. data/lib/rails/command/helpers/editor.rb +1 -1
  18. data/lib/rails/command.rb +0 -6
  19. data/lib/rails/commands/app/update_command.rb +94 -0
  20. data/lib/rails/commands/boot/boot_command.rb +14 -0
  21. data/lib/rails/commands/console/console_command.rb +2 -21
  22. data/lib/rails/commands/console/irb_console.rb +128 -0
  23. data/lib/rails/commands/credentials/USAGE +4 -4
  24. data/lib/rails/commands/credentials/credentials_command.rb +7 -3
  25. data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
  26. data/lib/rails/commands/dev/dev_command.rb +1 -1
  27. data/lib/rails/commands/devcontainer/devcontainer_command.rb +40 -0
  28. data/lib/rails/commands/rake/rake_command.rb +1 -1
  29. data/lib/rails/commands/runner/runner_command.rb +14 -3
  30. data/lib/rails/commands/server/server_command.rb +5 -3
  31. data/lib/rails/commands/stats/stats_command.rb +19 -0
  32. data/lib/rails/commands/test/test_command.rb +2 -0
  33. data/lib/rails/configuration.rb +10 -1
  34. data/lib/rails/console/methods.rb +7 -0
  35. data/lib/rails/dev_caching.rb +2 -2
  36. data/lib/rails/engine/configuration.rb +3 -1
  37. data/lib/rails/engine/lazy_route_set.rb +114 -0
  38. data/lib/rails/engine.rb +16 -12
  39. data/lib/rails/gem_version.rb +4 -4
  40. data/lib/rails/generators/actions.rb +3 -3
  41. data/lib/rails/generators/app_base.rb +115 -68
  42. data/lib/rails/generators/base.rb +1 -1
  43. data/lib/rails/generators/database.rb +263 -71
  44. data/lib/rails/generators/erb/authentication/authentication_generator.rb +15 -0
  45. data/lib/rails/generators/erb/authentication/templates/app/views/passwords/edit.html.erb +9 -0
  46. data/lib/rails/generators/erb/authentication/templates/app/views/passwords/new.html.erb +8 -0
  47. data/lib/rails/generators/erb/authentication/templates/app/views/sessions/new.html.erb +11 -0
  48. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
  49. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
  50. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
  51. data/lib/rails/generators/generated_attribute.rb +42 -12
  52. data/lib/rails/generators/migration.rb +3 -3
  53. data/lib/rails/generators/rails/app/app_generator.rb +75 -54
  54. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +33 -17
  55. data/lib/rails/generators/rails/app/templates/Gemfile.tt +38 -23
  56. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +6 -11
  57. data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
  58. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +17 -3
  59. data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
  60. data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
  61. data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
  62. data/lib/rails/generators/rails/app/templates/bin/dev.tt +1 -0
  63. data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
  64. data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -5
  65. data/lib/rails/generators/rails/app/templates/bin/thrust.tt +4 -0
  66. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
  67. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +26 -3
  68. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +30 -0
  69. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +47 -0
  70. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +26 -3
  71. data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +128 -0
  72. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +22 -26
  73. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +36 -48
  74. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +7 -18
  75. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +0 -7
  76. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
  77. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_0.rb.tt +30 -0
  78. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +35 -27
  79. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +6 -0
  80. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +7 -1
  81. data/lib/rails/generators/rails/app/templates/dockerignore.tt +20 -2
  82. data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +144 -0
  83. data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
  84. data/lib/rails/generators/rails/app/templates/gitignore.tt +4 -5
  85. data/lib/rails/generators/rails/app/templates/kamal-secrets.tt +17 -0
  86. data/lib/rails/generators/rails/app/templates/public/400.html +114 -0
  87. data/lib/rails/generators/rails/app/templates/public/404.html +113 -66
  88. data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +114 -0
  89. data/lib/rails/generators/rails/app/templates/public/422.html +113 -66
  90. data/lib/rails/generators/rails/app/templates/public/500.html +113 -65
  91. data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
  92. data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
  93. data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
  94. data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
  95. data/lib/rails/generators/rails/authentication/USAGE +6 -0
  96. data/lib/rails/generators/rails/authentication/authentication_generator.rb +58 -0
  97. data/lib/rails/generators/rails/authentication/templates/app/channels/application_cable/connection.rb.tt +16 -0
  98. data/lib/rails/generators/rails/authentication/templates/app/controllers/concerns/authentication.rb.tt +52 -0
  99. data/lib/rails/generators/rails/authentication/templates/app/controllers/passwords_controller.rb.tt +33 -0
  100. data/lib/rails/generators/rails/authentication/templates/app/controllers/sessions_controller.rb.tt +21 -0
  101. data/lib/rails/generators/rails/authentication/templates/app/mailers/passwords_mailer.rb.tt +6 -0
  102. data/lib/rails/generators/rails/authentication/templates/app/models/current.rb.tt +4 -0
  103. data/lib/rails/generators/rails/authentication/templates/app/models/session.rb.tt +3 -0
  104. data/lib/rails/generators/rails/authentication/templates/app/models/user.rb.tt +6 -0
  105. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.html.erb.tt +4 -0
  106. data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.text.erb.tt +2 -0
  107. data/lib/rails/generators/rails/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb.tt +7 -0
  108. data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
  109. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +4 -0
  110. data/lib/rails/generators/rails/db/system/change/change_generator.rb +132 -21
  111. data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +176 -0
  112. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
  113. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
  114. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
  115. data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
  116. data/lib/rails/generators/rails/plugin/plugin_generator.rb +47 -16
  117. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
  118. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +6 -2
  119. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
  120. data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
  121. data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +103 -0
  122. data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
  123. data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
  124. data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
  125. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
  126. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
  127. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +3 -3
  128. data/lib/rails/generators/rails/script/USAGE +18 -0
  129. data/lib/rails/generators/rails/script/script_generator.rb +18 -0
  130. data/lib/rails/generators/rails/script/templates/script.rb.tt +3 -0
  131. data/lib/rails/generators/test_unit/authentication/authentication_generator.rb +14 -0
  132. data/lib/rails/generators/test_unit/authentication/templates/test/fixtures/users.yml.tt +9 -0
  133. data/lib/rails/generators/test_unit/authentication/templates/test/models/user_test.rb.tt +7 -0
  134. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
  135. data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
  136. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
  137. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
  138. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
  139. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
  140. data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
  141. data/lib/rails/generators/testing/assertions.rb +20 -0
  142. data/lib/rails/generators/testing/behavior.rb +7 -6
  143. data/lib/rails/generators.rb +7 -2
  144. data/lib/rails/health_controller.rb +1 -1
  145. data/lib/rails/info.rb +2 -2
  146. data/lib/rails/info_controller.rb +10 -2
  147. data/lib/rails/mailers_controller.rb +14 -1
  148. data/lib/rails/paths.rb +2 -2
  149. data/lib/rails/pwa_controller.rb +15 -0
  150. data/lib/rails/rack/logger.rb +15 -7
  151. data/lib/rails/rack/silence_request.rb +33 -0
  152. data/lib/rails/rack.rb +1 -0
  153. data/lib/rails/railtie/configurable.rb +2 -2
  154. data/lib/rails/railtie.rb +15 -16
  155. data/lib/rails/source_annotation_extractor.rb +31 -14
  156. data/lib/rails/tasks/framework.rake +0 -26
  157. data/lib/rails/tasks/statistics.rake +13 -28
  158. data/lib/rails/tasks/tmp.rake +1 -1
  159. data/lib/rails/templates/layouts/application.html.erb +1 -1
  160. data/lib/rails/templates/rails/info/notes.html.erb +65 -0
  161. data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
  162. data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
  163. data/lib/rails/test_help.rb +2 -4
  164. data/lib/rails/test_unit/reporter.rb +8 -2
  165. data/lib/rails/test_unit/runner.rb +27 -2
  166. data/lib/rails/test_unit/test_parser.rb +48 -0
  167. data/lib/rails.rb +7 -4
  168. metadata +77 -45
  169. data/lib/rails/app_updater.rb +0 -40
  170. data/lib/rails/commands/secrets/USAGE +0 -61
  171. data/lib/rails/commands/secrets/secrets_command.rb +0 -47
  172. data/lib/rails/console/app.rb +0 -35
  173. data/lib/rails/console/helpers.rb +0 -19
  174. data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -2
  175. data/lib/rails/generators/rails/app/templates/app/channels/application_cable/channel.rb.tt +0 -4
  176. data/lib/rails/generators/rails/app/templates/app/channels/application_cable/connection.rb.tt +0 -4
  177. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
  178. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
  179. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
  180. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
  181. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
  182. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
  183. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -284
  184. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +0 -13
  185. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
  186. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
  187. data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
  188. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +0 -13
  189. data/lib/rails/generators/rails/plugin/templates/rails/dummy_manifest.js.tt +0 -10
  190. data/lib/rails/generators/rails/plugin/templates/rails/engine_manifest.js.tt +0 -6
  191. data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js.tt +0 -17
  192. data/lib/rails/ruby_version_check.rb +0 -17
  193. data/lib/rails/secrets.rb +0 -110
@@ -5,14 +5,16 @@ require "active_support/core_ext/string/access"
5
5
 
6
6
  module Rails
7
7
  class BacktraceCleaner < ActiveSupport::BacktraceCleaner # :nodoc:
8
- APP_DIRS_PATTERN = /\A(?:\.\/)?(?:app|config|lib|test|\(\w*\))/
9
- RENDER_TEMPLATE_PATTERN = /:in `.*_\w+_{2,3}\d+_\d+'/
8
+ APP_DIRS_PATTERN = /\A(?:\.\/)?(?:app|config|lib|test|\(\w+(?:-\w+)*\))/
9
+ RENDER_TEMPLATE_PATTERN = /:in [`'].*_\w+_{2,3}\d+_\d+'/
10
10
 
11
11
  def initialize
12
12
  super
13
- @root = "#{Rails.root}/"
14
13
  add_filter do |line|
15
- line.start_with?(@root) ? line.from(@root.size) : line
14
+ # We may be called before Rails.root is assigned.
15
+ # When that happens we fallback to not truncating.
16
+ @root ||= Rails.root && "#{Rails.root}/"
17
+ @root && line.start_with?(@root) ? line.from(@root.size) : line
16
18
  end
17
19
  add_filter do |line|
18
20
  if RENDER_TEMPLATE_PATTERN.match?(line)
@@ -23,5 +25,18 @@ module Rails
23
25
  end
24
26
  add_silencer { |line| !APP_DIRS_PATTERN.match?(line) }
25
27
  end
28
+
29
+ def clean(backtrace, kind = :silent)
30
+ return backtrace if ENV["BACKTRACE"]
31
+
32
+ super(backtrace, kind)
33
+ end
34
+ alias_method :filter, :clean
35
+
36
+ def clean_frame(frame, kind = :silent)
37
+ return frame if ENV["BACKTRACE"]
38
+
39
+ super(frame, kind)
40
+ end
26
41
  end
27
42
  end
data/lib/rails/cli.rb CHANGED
@@ -6,7 +6,6 @@ require "rails/app_loader"
6
6
  # the rest of this script is not run.
7
7
  Rails::AppLoader.exec_app
8
8
 
9
- require "rails/ruby_version_check"
10
9
  Signal.trap("INT") { puts; exit(1) }
11
10
 
12
11
  require "rails/command"
@@ -3,115 +3,157 @@
3
3
  require "rails/code_statistics_calculator"
4
4
  require "active_support/core_ext/enumerable"
5
5
 
6
- class CodeStatistics # :nodoc:
7
- TEST_TYPES = ["Controller tests",
8
- "Helper tests",
9
- "Model tests",
10
- "Mailer tests",
11
- "Mailbox tests",
12
- "Channel tests",
13
- "Job tests",
14
- "Integration tests",
15
- "System tests"]
16
-
17
- HEADERS = { lines: " Lines", code_lines: " LOC", classes: "Classes", methods: "Methods" }
18
-
19
- def initialize(*pairs)
20
- @pairs = pairs
21
- @statistics = calculate_statistics
22
- @total = calculate_total if pairs.length > 1
23
- end
6
+ module Rails
7
+ class CodeStatistics
8
+ DIRECTORIES = [
9
+ %w(Controllers app/controllers),
10
+ %w(Helpers app/helpers),
11
+ %w(Jobs app/jobs),
12
+ %w(Models app/models),
13
+ %w(Mailers app/mailers),
14
+ %w(Mailboxes app/mailboxes),
15
+ %w(Channels app/channels),
16
+ %w(Views app/views),
17
+ %w(JavaScripts app/assets/javascripts),
18
+ %w(Stylesheets app/assets/stylesheets),
19
+ %w(JavaScript app/javascript),
20
+ %w(Libraries lib/),
21
+ %w(APIs app/apis),
22
+ %w(Controller\ tests test/controllers),
23
+ %w(Helper\ tests test/helpers),
24
+ %w(Job\ tests test/jobs),
25
+ %w(Model\ tests test/models),
26
+ %w(Mailer\ tests test/mailers),
27
+ %w(Mailbox\ tests test/mailboxes),
28
+ %w(Channel\ tests test/channels),
29
+ %w(Integration\ tests test/integration),
30
+ %w(System\ tests test/system),
31
+ ]
32
+
33
+ TEST_TYPES = ["Controller tests",
34
+ "Helper tests",
35
+ "Model tests",
36
+ "Mailer tests",
37
+ "Mailbox tests",
38
+ "Channel tests",
39
+ "Job tests",
40
+ "Integration tests",
41
+ "System tests"]
42
+
43
+ HEADERS = { lines: " Lines", code_lines: " LOC", classes: "Classes", methods: "Methods" }
44
+
45
+ class_attribute :directories, default: DIRECTORIES
46
+ class_attribute :test_types, default: TEST_TYPES
47
+
48
+ # Add directories to the output of the `bin/rails stats` command.
49
+ #
50
+ # Rails::CodeStatistics.register_directory("My Directory", "path/to/dir")
51
+ #
52
+ # For directories that contain test code, set the `test_directory` argument to true.
53
+ #
54
+ # Rails::CodeStatistics.register_directory("Model specs", "spec/models", test_directory: true)
55
+ def self.register_directory(label, path, test_directory: false)
56
+ self.directories << [label, path]
57
+ self.test_types << label if test_directory
58
+ end
24
59
 
25
- def to_s
26
- print_header
27
- @pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
28
- print_splitter
60
+ def initialize(*pairs)
61
+ @pairs = pairs
62
+ @statistics = calculate_statistics
63
+ @total = calculate_total if pairs.length > 1
64
+ end
29
65
 
30
- if @total
31
- print_line("Total", @total)
66
+ def to_s
67
+ print_header
68
+ @pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
32
69
  print_splitter
33
- end
34
70
 
35
- print_code_test_stats
36
- end
71
+ if @total
72
+ print_line("Total", @total)
73
+ print_splitter
74
+ end
37
75
 
38
- private
39
- def calculate_statistics
40
- Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }]
76
+ print_code_test_stats
41
77
  end
42
78
 
43
- def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/)
44
- stats = CodeStatisticsCalculator.new
79
+ private
80
+ def calculate_statistics
81
+ Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }]
82
+ end
83
+
84
+ def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/)
85
+ stats = Rails::CodeStatisticsCalculator.new
45
86
 
46
- Dir.foreach(directory) do |file_name|
47
- path = "#{directory}/#{file_name}"
87
+ Dir.foreach(directory) do |file_name|
88
+ path = "#{directory}/#{file_name}"
48
89
 
49
- if File.directory?(path) && !file_name.start_with?(".")
50
- stats.add(calculate_directory_statistics(path, pattern))
51
- elsif file_name&.match?(pattern)
52
- stats.add_by_file_path(path)
90
+ if File.directory?(path) && !file_name.start_with?(".")
91
+ stats.add(calculate_directory_statistics(path, pattern))
92
+ elsif file_name&.match?(pattern)
93
+ stats.add_by_file_path(path)
94
+ end
53
95
  end
54
- end
55
96
 
56
- stats
57
- end
97
+ stats
98
+ end
58
99
 
59
- def calculate_total
60
- @statistics.each_with_object(CodeStatisticsCalculator.new) do |pair, total|
61
- total.add(pair.last)
100
+ def calculate_total
101
+ @statistics.each_with_object(Rails::CodeStatisticsCalculator.new) do |pair, total|
102
+ total.add(pair.last)
103
+ end
62
104
  end
63
- end
64
105
 
65
- def calculate_code
66
- code_loc = 0
67
- @statistics.each { |k, v| code_loc += v.code_lines unless TEST_TYPES.include? k }
68
- code_loc
69
- end
106
+ def calculate_code
107
+ code_loc = 0
108
+ @statistics.each { |k, v| code_loc += v.code_lines unless test_types.include? k }
109
+ code_loc
110
+ end
70
111
 
71
- def calculate_tests
72
- test_loc = 0
73
- @statistics.each { |k, v| test_loc += v.code_lines if TEST_TYPES.include? k }
74
- test_loc
75
- end
112
+ def calculate_tests
113
+ test_loc = 0
114
+ @statistics.each { |k, v| test_loc += v.code_lines if test_types.include? k }
115
+ test_loc
116
+ end
76
117
 
77
- def width_for(label)
78
- [@statistics.values.sum { |s| s.public_send(label) }.to_s.size, HEADERS[label].length].max
79
- end
118
+ def width_for(label)
119
+ [@statistics.values.sum { |s| s.public_send(label) }.to_s.size, HEADERS[label].length].max
120
+ end
80
121
 
81
- def print_header
82
- print_splitter
83
- print "| Name "
84
- HEADERS.each do |k, v|
85
- print " | #{v.rjust(width_for(k))}"
122
+ def print_header
123
+ print_splitter
124
+ print "| Name "
125
+ HEADERS.each do |k, v|
126
+ print " | #{v.rjust(width_for(k))}"
127
+ end
128
+ puts " | M/C | LOC/M |"
129
+ print_splitter
86
130
  end
87
- puts " | M/C | LOC/M |"
88
- print_splitter
89
- end
90
131
 
91
- def print_splitter
92
- print "+----------------------"
93
- HEADERS.each_key do |k|
94
- print "+#{'-' * (width_for(k) + 2)}"
132
+ def print_splitter
133
+ print "+----------------------"
134
+ HEADERS.each_key do |k|
135
+ print "+#{'-' * (width_for(k) + 2)}"
136
+ end
137
+ puts "+-----+-------+"
95
138
  end
96
- puts "+-----+-------+"
97
- end
98
139
 
99
- def print_line(name, statistics)
100
- m_over_c = (statistics.methods / statistics.classes) rescue 0
101
- loc_over_m = (statistics.code_lines / statistics.methods) - 2 rescue 0
140
+ def print_line(name, statistics)
141
+ m_over_c = (statistics.methods / statistics.classes) rescue 0
142
+ loc_over_m = (statistics.code_lines / statistics.methods) - 2 rescue 0
102
143
 
103
- print "| #{name.ljust(20)} "
104
- HEADERS.each_key do |k|
105
- print "| #{statistics.send(k).to_s.rjust(width_for(k))} "
144
+ print "| #{name.ljust(20)} "
145
+ HEADERS.each_key do |k|
146
+ print "| #{statistics.send(k).to_s.rjust(width_for(k))} "
147
+ end
148
+ puts "| #{m_over_c.to_s.rjust(3)} | #{loc_over_m.to_s.rjust(5)} |"
106
149
  end
107
- puts "| #{m_over_c.to_s.rjust(3)} | #{loc_over_m.to_s.rjust(5)} |"
108
- end
109
150
 
110
- def print_code_test_stats
111
- code = calculate_code
112
- tests = calculate_tests
151
+ def print_code_test_stats
152
+ code = calculate_code
153
+ tests = calculate_tests
113
154
 
114
- puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f / code)}"
115
- puts ""
116
- end
155
+ puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f / code)}"
156
+ puts ""
157
+ end
158
+ end
117
159
  end
@@ -1,97 +1,99 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class CodeStatisticsCalculator # :nodoc:
4
- attr_reader :lines, :code_lines, :classes, :methods
3
+ module Rails
4
+ class CodeStatisticsCalculator # :nodoc:
5
+ attr_reader :lines, :code_lines, :classes, :methods
5
6
 
6
- PATTERNS = {
7
- rb: {
8
- line_comment: /^\s*#/,
9
- begin_block_comment: /^=begin/,
10
- end_block_comment: /^=end/,
11
- class: /^\s*class\s+[_A-Z]/,
12
- method: /^\s*def\s+[_a-z]/,
13
- },
14
- erb: {
15
- line_comment: %r{((^\s*<%#.*%>)|(<!--.*-->))},
16
- },
17
- css: {
18
- line_comment: %r{^\s*/\*.*\*/},
19
- },
20
- scss: {
21
- line_comment: %r{((^\s*/\*.*\*/)|(^\s*//))},
22
- },
23
- js: {
24
- line_comment: %r{^\s*//},
25
- begin_block_comment: %r{^\s*/\*},
26
- end_block_comment: %r{\*/},
27
- method: /function(\s+[_a-zA-Z][\da-zA-Z]*)?\s*\(/,
28
- },
29
- coffee: {
30
- line_comment: /^\s*#/,
31
- begin_block_comment: /^\s*###/,
32
- end_block_comment: /^\s*###/,
33
- class: /^\s*class\s+[_A-Z]/,
34
- method: /[-=]>/,
7
+ PATTERNS = {
8
+ rb: {
9
+ line_comment: /^\s*#/,
10
+ begin_block_comment: /^=begin/,
11
+ end_block_comment: /^=end/,
12
+ class: /^\s*class\s+[_A-Z]/,
13
+ method: /^\s*def\s+[_a-z]/,
14
+ },
15
+ erb: {
16
+ line_comment: %r{((^\s*<%#.*%>)|(<!--.*-->))},
17
+ },
18
+ css: {
19
+ line_comment: %r{^\s*/\*.*\*/},
20
+ },
21
+ scss: {
22
+ line_comment: %r{((^\s*/\*.*\*/)|(^\s*//))},
23
+ },
24
+ js: {
25
+ line_comment: %r{^\s*//},
26
+ begin_block_comment: %r{^\s*/\*},
27
+ end_block_comment: %r{\*/},
28
+ method: /function(\s+[_a-zA-Z][\da-zA-Z]*)?\s*\(/,
29
+ },
30
+ coffee: {
31
+ line_comment: /^\s*#/,
32
+ begin_block_comment: /^\s*###/,
33
+ end_block_comment: /^\s*###/,
34
+ class: /^\s*class\s+[_A-Z]/,
35
+ method: /[-=]>/,
36
+ }
35
37
  }
36
- }
37
38
 
38
- PATTERNS[:minitest] = PATTERNS[:rb].merge method: /^\s*(def|test)\s+['"_a-z]/
39
- PATTERNS[:rake] = PATTERNS[:rb]
39
+ PATTERNS[:minitest] = PATTERNS[:rb].merge method: /^\s*(def|test)\s+['"_a-z]/
40
+ PATTERNS[:rake] = PATTERNS[:rb]
40
41
 
41
- def initialize(lines = 0, code_lines = 0, classes = 0, methods = 0)
42
- @lines = lines
43
- @code_lines = code_lines
44
- @classes = classes
45
- @methods = methods
46
- end
42
+ def initialize(lines = 0, code_lines = 0, classes = 0, methods = 0)
43
+ @lines = lines
44
+ @code_lines = code_lines
45
+ @classes = classes
46
+ @methods = methods
47
+ end
47
48
 
48
- def add(code_statistics_calculator)
49
- @lines += code_statistics_calculator.lines
50
- @code_lines += code_statistics_calculator.code_lines
51
- @classes += code_statistics_calculator.classes
52
- @methods += code_statistics_calculator.methods
53
- end
49
+ def add(code_statistics_calculator)
50
+ @lines += code_statistics_calculator.lines
51
+ @code_lines += code_statistics_calculator.code_lines
52
+ @classes += code_statistics_calculator.classes
53
+ @methods += code_statistics_calculator.methods
54
+ end
54
55
 
55
- def add_by_file_path(file_path)
56
- File.open(file_path) do |f|
57
- add_by_io(f, file_type(file_path))
56
+ def add_by_file_path(file_path)
57
+ File.open(file_path) do |f|
58
+ add_by_io(f, file_type(file_path))
59
+ end
58
60
  end
59
- end
60
61
 
61
- def add_by_io(io, file_type)
62
- patterns = PATTERNS[file_type] || {}
62
+ def add_by_io(io, file_type)
63
+ patterns = PATTERNS[file_type] || {}
63
64
 
64
- comment_started = false
65
+ comment_started = false
65
66
 
66
- while line = io.gets
67
- @lines += 1
67
+ while line = io.gets
68
+ @lines += 1
68
69
 
69
- if comment_started
70
- if patterns[:end_block_comment] && patterns[:end_block_comment].match?(line)
71
- comment_started = false
72
- end
73
- next
74
- else
75
- if patterns[:begin_block_comment] && patterns[:begin_block_comment].match?(line)
76
- comment_started = true
70
+ if comment_started
71
+ if patterns[:end_block_comment] && patterns[:end_block_comment].match?(line)
72
+ comment_started = false
73
+ end
77
74
  next
75
+ else
76
+ if patterns[:begin_block_comment] && patterns[:begin_block_comment].match?(line)
77
+ comment_started = true
78
+ next
79
+ end
78
80
  end
79
- end
80
81
 
81
- @classes += 1 if patterns[:class] && patterns[:class].match?(line)
82
- @methods += 1 if patterns[:method] && patterns[:method].match?(line)
83
- if !line.match?(/^\s*$/) && (patterns[:line_comment].nil? || !line.match?(patterns[:line_comment]))
84
- @code_lines += 1
82
+ @classes += 1 if patterns[:class] && patterns[:class].match?(line)
83
+ @methods += 1 if patterns[:method] && patterns[:method].match?(line)
84
+ if !line.match?(/^\s*$/) && (patterns[:line_comment].nil? || !line.match?(patterns[:line_comment]))
85
+ @code_lines += 1
86
+ end
85
87
  end
86
88
  end
87
- end
88
89
 
89
- private
90
- def file_type(file_path)
91
- if file_path.end_with? "_test.rb"
92
- :minitest
93
- else
94
- File.extname(file_path).delete_prefix(".").downcase.to_sym
90
+ private
91
+ def file_type(file_path)
92
+ if file_path.end_with? "_test.rb"
93
+ :minitest
94
+ else
95
+ File.extname(file_path).delete_prefix(".").downcase.to_sym
96
+ end
95
97
  end
96
- end
98
+ end
97
99
  end
@@ -16,7 +16,7 @@ module Rails
16
16
  if editor.to_s.empty?
17
17
  say "No $VISUAL or $EDITOR to open file in. Assign one like this:"
18
18
  say ""
19
- say %(VISUAL="mate --wait" #{executable(current_subcommand)})
19
+ say %(VISUAL="code --wait" #{executable(current_subcommand)})
20
20
  say ""
21
21
  say "For editors that fork and exit immediately, it's important to pass a wait flag;"
22
22
  say "otherwise, the file will be saved immediately with no chance to edit."
data/lib/rails/command.rb CHANGED
@@ -23,12 +23,6 @@ module Rails
23
23
  super(message)
24
24
  end
25
25
 
26
- if !Exception.method_defined?(:detailed_message)
27
- def detailed_message(...)
28
- message
29
- end
30
- end
31
-
32
26
  if defined?(DidYouMean::Correctable) && defined?(DidYouMean::SpellChecker)
33
27
  include DidYouMean::Correctable
34
28
 
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "rails/generators/rails/app/app_generator"
5
+
6
+ module Rails
7
+ module Command
8
+ module App
9
+ class UpdateCommand < Base # :nodoc:
10
+ include Thor::Actions
11
+ add_runtime_options!
12
+
13
+ desc "update", "Update configs and some other initially generated files (or use just update:configs or update:bin)"
14
+ def perform
15
+ require_application!
16
+ Rails.application.deprecators.silenced = true
17
+
18
+ configs
19
+ bin
20
+ public_directory
21
+ active_storage
22
+ display_upgrade_guide_info
23
+ end
24
+
25
+ desc "configs", "Update config files in the application config/ directory", hide: true
26
+ def configs
27
+ app_generator.create_boot_file
28
+ app_generator.update_config_files
29
+ end
30
+
31
+ desc "bin", "Add or update executables in the application bin/ directory", hide: true
32
+ def bin
33
+ app_generator.update_bin_files
34
+ end
35
+
36
+ desc "public_directory", "Add or update files in the application public/ directory", hide: true
37
+ def public_directory
38
+ app_generator.create_public_files
39
+ end
40
+
41
+ desc "active_storage", "Run the active_storage:update command", hide: true
42
+ def active_storage
43
+ app_generator.update_active_storage
44
+ end
45
+
46
+ private
47
+ def display_upgrade_guide_info
48
+ say "\nAfter this, check Rails upgrade guide at https://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app."
49
+ end
50
+
51
+ def app_generator
52
+ @app_generator ||= begin
53
+ gen = Rails::Generators::AppGenerator.new(["rails"], generator_options, destination_root: Rails.root)
54
+ gen.send(:valid_const?) unless File.exist?(Rails.root.join("config", "application.rb"))
55
+ gen
56
+ end
57
+ end
58
+
59
+ def generator_options
60
+ {
61
+ api: !!Rails.application.config.api_only,
62
+ update: true,
63
+ name: Rails.application.class.name.chomp("::Application").underscore,
64
+ skip_active_job: !defined?(ActiveJob::Railtie),
65
+ skip_active_record: !defined?(ActiveRecord::Railtie),
66
+ skip_active_storage: !defined?(ActiveStorage::Engine),
67
+ skip_action_mailer: !defined?(ActionMailer::Railtie),
68
+ skip_action_mailbox: !defined?(ActionMailbox::Engine),
69
+ skip_action_text: !defined?(ActionText::Engine),
70
+ skip_action_cable: !defined?(ActionCable::Engine),
71
+ skip_brakeman: skip_gem?("brakeman"),
72
+ skip_rubocop: skip_gem?("rubocop"),
73
+ skip_thruster: skip_gem?("thruster"),
74
+ skip_test: !defined?(Rails::TestUnitRailtie),
75
+ skip_system_test: Rails.application.config.generators.system_tests.nil?,
76
+ skip_asset_pipeline: asset_pipeline.nil?,
77
+ skip_bootsnap: !defined?(Bootsnap),
78
+ }.merge(options)
79
+ end
80
+
81
+ def asset_pipeline
82
+ "propshaft" if defined?(Propshaft::Railtie)
83
+ end
84
+
85
+ def skip_gem?(gem_name)
86
+ gem gem_name
87
+ false
88
+ rescue LoadError
89
+ true
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/command/environment_argument"
4
+
5
+ module Rails
6
+ module Command
7
+ class BootCommand < Base # :nodoc:
8
+ include EnvironmentArgument
9
+
10
+ desc "boot", "Boot the application and exit"
11
+ def perform(*) = boot_application!
12
+ end
13
+ end
14
+ end
@@ -4,14 +4,6 @@ require "rails/command/environment_argument"
4
4
 
5
5
  module Rails
6
6
  class Console
7
- module BacktraceCleaner
8
- def filter_backtrace(bt)
9
- if result = super
10
- Rails.backtrace_cleaner.filter([result]).first
11
- end
12
- end
13
- end
14
-
15
7
  def self.start(*args)
16
8
  new(*args).start
17
9
  end
@@ -32,16 +24,8 @@ module Rails
32
24
  app.load_console
33
25
 
34
26
  @console = app.config.console || begin
35
- require "irb"
36
- require "irb/completion"
37
-
38
- IRB::WorkSpace.prepend(BacktraceCleaner)
39
-
40
- if !Rails.env.local?
41
- ENV["IRB_USE_AUTOCOMPLETE"] ||= "false"
42
- end
43
-
44
- IRB
27
+ require "rails/commands/console/irb_console"
28
+ IRBConsole.new(app)
45
29
  end
46
30
  end
47
31
 
@@ -72,9 +56,6 @@ module Rails
72
56
  puts "Loading #{Rails.env} environment (Rails #{Rails.version})"
73
57
  end
74
58
 
75
- if defined?(console::ExtendCommandBundle)
76
- console::ExtendCommandBundle.include(Rails::ConsoleMethods)
77
- end
78
59
  console.start
79
60
  end
80
61
  end