123456789_123456789_123456789_123456789_123456789_

Class: Rails::CodeStatistics

Relationships & Source Files
Inherits: Object
Defined in: railties/lib/rails/code_statistics.rb

Constant Summary

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(*pairs) ⇒ CodeStatistics

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 74

def initialize(*pairs)
  @pairs      = pairs
  @statistics = calculate_statistics
  @total      = calculate_total if pairs.length > 1
end

Class Attribute Details

.directories (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 49

class_attribute :directories, default: DIRECTORIES

.directories?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 49

class_attribute :directories, default: DIRECTORIES

.extensions (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 51

class_attribute :extensions, default: EXTENSIONS

.extensions?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 51

class_attribute :extensions, default: EXTENSIONS

.pattern (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 52

class_attribute :pattern, default: PATTERN

.pattern?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 52

class_attribute :pattern, default: PATTERN

.test_types (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 50

class_attribute :test_types, default: TEST_TYPES

.test_types?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 50

class_attribute :test_types, default: TEST_TYPES

Class Method Details

.register_directory(label, path, test_directory: false)

Add directories to the output of the bin/rails stats command.

Rails::CodeStatistics.register_directory("My Directory", "path/to/dir")

For directories that contain test code, set the test_directory argument to true.

Rails::CodeStatistics.register_directory("Model specs", "spec/models", test_directory: true)
[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 61

def self.register_directory(label, path, test_directory: false)
  self.directories << [label, path]
  self.test_types << label if test_directory
end

.register_extension(extension)

Add extensions to the output of the bin/rails stats command.

Rails::CodeStatistics.register_extension("txt")
[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 69

def self.register_extension(extension)
  self.extensions += [extension]
  self.pattern = /^(?!\.).*?\.(#{Regexp.union(extensions.map { |e| Regexp.escape(e) })})$/
end

Instance Attribute Details

#directories (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 49

class_attribute :directories, default: DIRECTORIES

#directories?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 49

class_attribute :directories, default: DIRECTORIES

#extensions (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 51

class_attribute :extensions, default: EXTENSIONS

#extensions?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 51

class_attribute :extensions, default: EXTENSIONS

#pattern (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 52

class_attribute :pattern, default: PATTERN

#pattern?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 52

class_attribute :pattern, default: PATTERN

#test_types (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 50

class_attribute :test_types, default: TEST_TYPES

#test_types?Boolean (rw)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 50

class_attribute :test_types, default: TEST_TYPES

Instance Method Details

#calculate_code (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 120

def calculate_code
  code_loc = 0
  @statistics.each { |k, v| code_loc += v.code_lines unless test_types.include? k }
  code_loc
end

#calculate_directory_statistics(directory, pattern = self.class.pattern) (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 98

def calculate_directory_statistics(directory, pattern = self.class.pattern)
  stats = Rails::CodeStatisticsCalculator.new

  Dir.foreach(directory) do |file_name|
    path = "#{directory}/#{file_name}"

    if File.directory?(path) && !file_name.start_with?(".")
      stats.add(calculate_directory_statistics(path, pattern))
    elsif file_name&.match?(pattern)
      stats.add_by_file_path(path)
    end
  end

  stats
end

#calculate_statistics (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 94

def calculate_statistics
  Hash[@pairs.map { |pair| [pair.first, calculate_directory_statistics(pair.last)] }]
end

#calculate_tests (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 126

def calculate_tests
  test_loc = 0
  @statistics.each { |k, v| test_loc += v.code_lines if test_types.include? k }
  test_loc
end

#calculate_total (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 114

def calculate_total
  @statistics.each_with_object(Rails::CodeStatisticsCalculator.new) do |pair, total|
    total.add(pair.last)
  end
end

#to_s

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 80

def to_s
  print_header
  @pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
  print_splitter

  if @total
    print_line("Total", @total)
    print_splitter
  end

  print_code_test_stats
end

#width_for(label) (private)

[ GitHub ]

  
# File 'railties/lib/rails/code_statistics.rb', line 132

def width_for(label)
  [@statistics.values.sum { |s| s.public_send(label) }.to_s.size, HEADERS[label].length].max
end