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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +128 -775
- data/lib/minitest/rails_plugin.rb +6 -3
- data/lib/rails/all.rb +1 -3
- data/lib/rails/api/task.rb +6 -4
- data/lib/rails/application/bootstrap.rb +5 -7
- data/lib/rails/application/configuration.rb +81 -43
- data/lib/rails/application/default_middleware_stack.rb +4 -0
- data/lib/rails/application/dummy_config.rb +2 -2
- data/lib/rails/application/finisher.rb +9 -3
- data/lib/rails/application/routes_reloader.rb +16 -2
- data/lib/rails/application.rb +27 -86
- data/lib/rails/backtrace_cleaner.rb +19 -4
- data/lib/rails/cli.rb +0 -1
- data/lib/rails/code_statistics.rb +128 -86
- data/lib/rails/code_statistics_calculator.rb +78 -76
- data/lib/rails/command/helpers/editor.rb +1 -1
- data/lib/rails/command.rb +0 -6
- data/lib/rails/commands/app/update_command.rb +94 -0
- data/lib/rails/commands/boot/boot_command.rb +14 -0
- data/lib/rails/commands/console/console_command.rb +2 -21
- data/lib/rails/commands/console/irb_console.rb +128 -0
- data/lib/rails/commands/credentials/USAGE +4 -4
- data/lib/rails/commands/credentials/credentials_command.rb +7 -3
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
- data/lib/rails/commands/dev/dev_command.rb +1 -1
- data/lib/rails/commands/devcontainer/devcontainer_command.rb +40 -0
- data/lib/rails/commands/rake/rake_command.rb +1 -1
- data/lib/rails/commands/runner/runner_command.rb +14 -3
- data/lib/rails/commands/server/server_command.rb +5 -3
- data/lib/rails/commands/stats/stats_command.rb +19 -0
- data/lib/rails/commands/test/test_command.rb +2 -0
- data/lib/rails/configuration.rb +10 -1
- data/lib/rails/console/methods.rb +7 -0
- data/lib/rails/dev_caching.rb +2 -2
- data/lib/rails/engine/configuration.rb +3 -1
- data/lib/rails/engine/lazy_route_set.rb +114 -0
- data/lib/rails/engine.rb +16 -12
- data/lib/rails/gem_version.rb +4 -4
- data/lib/rails/generators/actions.rb +3 -3
- data/lib/rails/generators/app_base.rb +115 -68
- data/lib/rails/generators/base.rb +1 -1
- data/lib/rails/generators/database.rb +263 -71
- data/lib/rails/generators/erb/authentication/authentication_generator.rb +15 -0
- data/lib/rails/generators/erb/authentication/templates/app/views/passwords/edit.html.erb +9 -0
- data/lib/rails/generators/erb/authentication/templates/app/views/passwords/new.html.erb +8 -0
- data/lib/rails/generators/erb/authentication/templates/app/views/sessions/new.html.erb +11 -0
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
- data/lib/rails/generators/generated_attribute.rb +42 -12
- data/lib/rails/generators/migration.rb +3 -3
- data/lib/rails/generators/rails/app/app_generator.rb +75 -54
- data/lib/rails/generators/rails/app/templates/Dockerfile.tt +33 -17
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +38 -23
- data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +6 -11
- data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +17 -3
- data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
- data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
- data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
- data/lib/rails/generators/rails/app/templates/bin/dev.tt +1 -0
- data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -5
- data/lib/rails/generators/rails/app/templates/bin/thrust.tt +4 -0
- data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +26 -3
- data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +30 -0
- data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +47 -0
- data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +26 -3
- data/lib/rails/generators/rails/app/templates/config/deploy.yml.tt +128 -0
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +22 -26
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +36 -48
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +7 -18
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +0 -7
- data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_8_0.rb.tt +30 -0
- data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +35 -27
- data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +6 -0
- data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +7 -1
- data/lib/rails/generators/rails/app/templates/dockerignore.tt +20 -2
- data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +144 -0
- data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/app/templates/gitignore.tt +4 -5
- data/lib/rails/generators/rails/app/templates/kamal-secrets.tt +17 -0
- data/lib/rails/generators/rails/app/templates/public/400.html +114 -0
- data/lib/rails/generators/rails/app/templates/public/404.html +113 -66
- data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +114 -0
- data/lib/rails/generators/rails/app/templates/public/422.html +113 -66
- data/lib/rails/generators/rails/app/templates/public/500.html +113 -65
- data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
- data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/rails/authentication/USAGE +6 -0
- data/lib/rails/generators/rails/authentication/authentication_generator.rb +58 -0
- data/lib/rails/generators/rails/authentication/templates/app/channels/application_cable/connection.rb.tt +16 -0
- data/lib/rails/generators/rails/authentication/templates/app/controllers/concerns/authentication.rb.tt +52 -0
- data/lib/rails/generators/rails/authentication/templates/app/controllers/passwords_controller.rb.tt +33 -0
- data/lib/rails/generators/rails/authentication/templates/app/controllers/sessions_controller.rb.tt +21 -0
- data/lib/rails/generators/rails/authentication/templates/app/mailers/passwords_mailer.rb.tt +6 -0
- data/lib/rails/generators/rails/authentication/templates/app/models/current.rb.tt +4 -0
- data/lib/rails/generators/rails/authentication/templates/app/models/session.rb.tt +3 -0
- data/lib/rails/generators/rails/authentication/templates/app/models/user.rb.tt +6 -0
- data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.html.erb.tt +4 -0
- data/lib/rails/generators/rails/authentication/templates/app/views/passwords_mailer/reset.text.erb.tt +2 -0
- data/lib/rails/generators/rails/authentication/templates/test/mailers/previews/passwords_mailer_preview.rb.tt +7 -0
- data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
- data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +4 -0
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +132 -21
- data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +176 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
- data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +47 -16
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +6 -2
- data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
- data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +103 -0
- data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
- data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +3 -3
- data/lib/rails/generators/rails/script/USAGE +18 -0
- data/lib/rails/generators/rails/script/script_generator.rb +18 -0
- data/lib/rails/generators/rails/script/templates/script.rb.tt +3 -0
- data/lib/rails/generators/test_unit/authentication/authentication_generator.rb +14 -0
- data/lib/rails/generators/test_unit/authentication/templates/test/fixtures/users.yml.tt +9 -0
- data/lib/rails/generators/test_unit/authentication/templates/test/models/user_test.rb.tt +7 -0
- data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
- data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
- data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
- data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
- data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/testing/assertions.rb +20 -0
- data/lib/rails/generators/testing/behavior.rb +7 -6
- data/lib/rails/generators.rb +7 -2
- data/lib/rails/health_controller.rb +1 -1
- data/lib/rails/info.rb +2 -2
- data/lib/rails/info_controller.rb +10 -2
- data/lib/rails/mailers_controller.rb +14 -1
- data/lib/rails/paths.rb +2 -2
- data/lib/rails/pwa_controller.rb +15 -0
- data/lib/rails/rack/logger.rb +15 -7
- data/lib/rails/rack/silence_request.rb +33 -0
- data/lib/rails/rack.rb +1 -0
- data/lib/rails/railtie/configurable.rb +2 -2
- data/lib/rails/railtie.rb +15 -16
- data/lib/rails/source_annotation_extractor.rb +31 -14
- data/lib/rails/tasks/framework.rake +0 -26
- data/lib/rails/tasks/statistics.rake +13 -28
- data/lib/rails/tasks/tmp.rake +1 -1
- data/lib/rails/templates/layouts/application.html.erb +1 -1
- data/lib/rails/templates/rails/info/notes.html.erb +65 -0
- data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
- data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
- data/lib/rails/test_help.rb +2 -4
- data/lib/rails/test_unit/reporter.rb +8 -2
- data/lib/rails/test_unit/runner.rb +27 -2
- data/lib/rails/test_unit/test_parser.rb +48 -0
- data/lib/rails.rb +7 -4
- metadata +77 -45
- data/lib/rails/app_updater.rb +0 -40
- data/lib/rails/commands/secrets/USAGE +0 -61
- data/lib/rails/commands/secrets/secrets_command.rb +0 -47
- data/lib/rails/console/app.rb +0 -35
- data/lib/rails/console/helpers.rb +0 -19
- data/lib/rails/generators/rails/app/templates/app/assets/config/manifest.js.tt +0 -2
- data/lib/rails/generators/rails/app/templates/app/channels/application_cable/channel.rb.tt +0 -4
- data/lib/rails/generators/rails/app/templates/app/channels/application_cable/connection.rb.tt +0 -4
- data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
- data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -284
- data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +0 -13
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
- data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +0 -13
- data/lib/rails/generators/rails/plugin/templates/rails/dummy_manifest.js.tt +0 -10
- data/lib/rails/generators/rails/plugin/templates/rails/engine_manifest.js.tt +0 -6
- data/lib/rails/generators/rails/plugin/templates/rails/javascripts.js.tt +0 -17
- data/lib/rails/ruby_version_check.rb +0 -17
- 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
|
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
|
-
|
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
@@ -3,115 +3,157 @@
|
|
3
3
|
require "rails/code_statistics_calculator"
|
4
4
|
require "active_support/core_ext/enumerable"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
60
|
+
def initialize(*pairs)
|
61
|
+
@pairs = pairs
|
62
|
+
@statistics = calculate_statistics
|
63
|
+
@total = calculate_total if pairs.length > 1
|
64
|
+
end
|
29
65
|
|
30
|
-
|
31
|
-
|
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
|
-
|
36
|
-
|
71
|
+
if @total
|
72
|
+
print_line("Total", @total)
|
73
|
+
print_splitter
|
74
|
+
end
|
37
75
|
|
38
|
-
|
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
|
-
|
44
|
-
|
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
|
-
|
47
|
-
|
87
|
+
Dir.foreach(directory) do |file_name|
|
88
|
+
path = "#{directory}/#{file_name}"
|
48
89
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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
|
-
|
57
|
-
|
97
|
+
stats
|
98
|
+
end
|
58
99
|
|
59
|
-
|
60
|
-
|
61
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
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
|
-
|
104
|
-
|
105
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
151
|
+
def print_code_test_stats
|
152
|
+
code = calculate_code
|
153
|
+
tests = calculate_tests
|
113
154
|
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
-
|
4
|
-
|
3
|
+
module Rails
|
4
|
+
class CodeStatisticsCalculator # :nodoc:
|
5
|
+
attr_reader :lines, :code_lines, :classes, :methods
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
39
|
-
|
39
|
+
PATTERNS[:minitest] = PATTERNS[:rb].merge method: /^\s*(def|test)\s+['"_a-z]/
|
40
|
+
PATTERNS[:rake] = PATTERNS[:rb]
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
62
|
-
|
62
|
+
def add_by_io(io, file_type)
|
63
|
+
patterns = PATTERNS[file_type] || {}
|
63
64
|
|
64
|
-
|
65
|
+
comment_started = false
|
65
66
|
|
66
|
-
|
67
|
-
|
67
|
+
while line = io.gets
|
68
|
+
@lines += 1
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
-
|
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="
|
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 "
|
36
|
-
|
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
|