From 7cdf4020a6d92266a55b982d8df218bf74166b53 Mon Sep 17 00:00:00 2001 From: Joel Hawksley Date: Tue, 10 Nov 2020 09:02:48 -0700 Subject: [PATCH] Add support for stylesheets and ERB views to `rails stats`. --- railties/CHANGELOG.md | 4 ++ railties/lib/rails/code_statistics.rb | 2 +- .../lib/rails/code_statistics_calculator.rb | 9 ++++ railties/lib/rails/tasks/statistics.rake | 4 +- railties/test/application/rake_test.rb | 2 +- .../test/code_statistics_calculator_test.rb | 53 +++++++++++++++++++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/railties/CHANGELOG.md b/railties/CHANGELOG.md index 8a3d7bfb02..8c0dcf4512 100644 --- a/railties/CHANGELOG.md +++ b/railties/CHANGELOG.md @@ -1,3 +1,7 @@ +* Add support for stylesheets and ERB views to `rails stats`. + + *Joel Hawksley* + * Allow appended root routes to take precedence over internal welcome controller. *Gannon McGibbon* diff --git a/railties/lib/rails/code_statistics.rb b/railties/lib/rails/code_statistics.rb index 699ce18e26..477d6b70cf 100644 --- a/railties/lib/rails/code_statistics.rb +++ b/railties/lib/rails/code_statistics.rb @@ -40,7 +40,7 @@ class CodeStatistics #:nodoc: Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }] end - def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|coffee|rake)$/) + def calculate_directory_statistics(directory, pattern = /^(?!\.).*?\.(rb|js|ts|css|scss|coffee|rake|erb)$/) stats = CodeStatisticsCalculator.new Dir.foreach(directory) do |file_name| diff --git a/railties/lib/rails/code_statistics_calculator.rb b/railties/lib/rails/code_statistics_calculator.rb index d9efd63a7e..8bcdca2c06 100644 --- a/railties/lib/rails/code_statistics_calculator.rb +++ b/railties/lib/rails/code_statistics_calculator.rb @@ -11,6 +11,15 @@ class CodeStatisticsCalculator #:nodoc: class: /^\s*class\s+[_A-Z]/, method: /^\s*def\s+[_a-z]/, }, + erb: { + line_comment: %r{((^\s*<%#.*%>)|(<\!--.*-->))}, + }, + css: { + line_comment: %r{^\s*\/\*.*\*\/}, + }, + scss: { + line_comment: %r{((^\s*\/\*.*\*\/)|(^\s*\/\/))}, + }, js: { line_comment: %r{^\s*//}, begin_block_comment: %r{^\s*/\*}, diff --git a/railties/lib/rails/tasks/statistics.rake b/railties/lib/rails/tasks/statistics.rake index 4912b9882b..c315e4f3cf 100644 --- a/railties/lib/rails/tasks/statistics.rake +++ b/railties/lib/rails/tasks/statistics.rake @@ -11,17 +11,19 @@ STATS_DIRECTORIES ||= [ %w(Mailers app/mailers), %w(Mailboxes app/mailboxes), %w(Channels app/channels), + %w(Views app/views), %w(JavaScripts app/assets/javascripts), + %w(Stylesheets app/assets/stylesheets), %w(JavaScript app/javascript), %w(Libraries lib/), %w(APIs app/apis), %w(Controller\ tests test/controllers), %w(Helper\ tests test/helpers), + %w(Job\ tests test/jobs), %w(Model\ tests test/models), %w(Mailer\ tests test/mailers), %w(Mailbox\ tests test/mailboxes), %w(Channel\ tests test/channels), - %w(Job\ tests test/jobs), %w(Integration\ tests test/integration), %w(System\ tests test/system), ].collect do |name, dir| diff --git a/railties/test/application/rake_test.rb b/railties/test/application/rake_test.rb index fdb4da55e2..12f506025e 100644 --- a/railties/test/application/rake_test.rb +++ b/railties/test/application/rake_test.rb @@ -173,7 +173,7 @@ module ApplicationTests end def test_code_statistics_sanity - assert_match "Code LOC: 32 Test LOC: 3 Code to Test Ratio: 1:0.1", + assert_match "Code LOC: 74 Test LOC: 3 Code to Test Ratio: 1:0.0", rails("stats") end diff --git a/railties/test/code_statistics_calculator_test.rb b/railties/test/code_statistics_calculator_test.rb index e763cfb376..49c123fa99 100644 --- a/railties/test/code_statistics_calculator_test.rb +++ b/railties/test/code_statistics_calculator_test.rb @@ -218,6 +218,59 @@ class CodeStatisticsCalculatorTest < ActiveSupport::TestCase assert_equal 0, @code_statistics_calculator.methods end + test "skip ERB comments" do + code = <<-'CODE' + + <%# This is a great comment! %> +
+ <%= hello %> + +
+ CODE + + @code_statistics_calculator.add_by_io(StringIO.new(code), :erb) + + assert_equal 6, @code_statistics_calculator.lines + assert_equal 3, @code_statistics_calculator.code_lines + assert_equal 0, @code_statistics_calculator.classes + assert_equal 0, @code_statistics_calculator.methods + end + + test "skip CSS comments" do + code = <<-'CODE' + /* My cool CSS */ + .selector { + background-color: blue; + + } + CODE + + @code_statistics_calculator.add_by_io(StringIO.new(code), :css) + + assert_equal 5, @code_statistics_calculator.lines + assert_equal 3, @code_statistics_calculator.code_lines + assert_equal 0, @code_statistics_calculator.classes + assert_equal 0, @code_statistics_calculator.methods + end + + test "skip SCSS comments" do + code = <<-'CODE' + // My cool SCSS + /* My cool SCSS */ + .selector { + background-color: blue; + + } + CODE + + @code_statistics_calculator.add_by_io(StringIO.new(code), :scss) + + assert_equal 6, @code_statistics_calculator.lines + assert_equal 3, @code_statistics_calculator.code_lines + assert_equal 0, @code_statistics_calculator.classes + assert_equal 0, @code_statistics_calculator.methods + end + test "calculate number of CoffeeScript methods" do code = <<-'CODE' square = (x) -> x * x