123456789_123456789_123456789_123456789_123456789_

Class: RDoc::Stats

Relationships & Source Files
Namespace Children
Classes:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, Text
Inherits: Object
Defined in: lib/rdoc/stats.rb

Overview

RDoc statistics collector which prints a summary and report of a project’s documentation totals.

Constant Summary

Text - Included

MARKUP_FORMAT, TO_HTML_CHARACTERS

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Text - Included

#expand_tabs

Expands tab characters in text to eight spaces.

#flush_left

Flush text left based on the shortest line.

#markup

Convert a string in markup format into HTML.

#normalize_comment

Strips hashes, expands tabs then flushes text to the left.

#parse

Normalizes text then builds a Markup::Document from it.

#snippet

The first limit characters of text as HTML.

#strip_hashes

Strips leading # characters from text

#strip_newlines

Strips leading and trailing n characters from text

#strip_stars

Strips /* */ style comments.

#to_html

Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in text to properly encoded characters.

#wrap

Wraps txt to line_len

Constructor Details

.new(store, num_files, verbosity = 1) ⇒ Stats

Creates a new Stats that will have #num_files. verbosity defaults to 1 which will create an Stats::Normal outputter.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 29

def initialize store, num_files, verbosity = 1
  @num_files = num_files
  @store     = store

  @coverage_level   = 0
  @doc_items        = nil
  @files_so_far     = 0
  @fully_documented = false
  @num_params       = 0
  @percent_doc      = nil
  @start            = Time.now
  @undoc_params     = 0

  @display = case verbosity
             when 0 then Quiet.new   num_files
             when 1 then Normal.new  num_files
             else        Verbose.new num_files
             end
end

Instance Attribute Details

#coverage_level (rw)

Output level for the coverage report

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 13

attr_reader :coverage_level

#coverage_level=(level) (rw)

Sets coverage report level. Accepted values are:

false or nil

No report

0

Classes, modules, constants, attributes, methods

1

Level 0 + method parameters

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 158

def coverage_level= level
  level = -1 unless level

  @coverage_level = level
end

#files_so_far (readonly)

Count of files parsed during parsing

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 18

attr_reader :files_so_far

#fully_documented?Boolean (readonly)

The documentation status of this project. true when 100%, false when less than 100% and nil when unknown.

Set by calling #calculate

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 185

def fully_documented?
  @fully_documented
end

#num_files (readonly)

Total number of files found

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 23

attr_reader :num_files

Instance Method Details

#add_alias(as)

Records the parsing of an alias as.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 52

def add_alias as
  @display.print_alias as
end

#add_attribute(attribute)

Records the parsing of an attribute attribute

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 59

def add_attribute attribute
  @display.print_attribute attribute
end

#add_class(klass)

Records the parsing of a class klass

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 66

def add_class klass
  @display.print_class klass
end

#add_constant(constant)

Records the parsing of constant

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 73

def add_constant constant
  @display.print_constant constant
end

#add_file(file)

Records the parsing of file

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 80

def add_file(file)
  @files_so_far += 1
  @display.print_file @files_so_far, file
end

#add_method(method)

Records the parsing of method

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 88

def add_method(method)
  @display.print_method method
end

#add_module(mod)

Records the parsing of a module mod

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 95

def add_module(mod)
  @display.print_module mod
end

#begin_adding

Call this to mark the beginning of parsing for display purposes

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 102

def begin_adding
  @display.begin_adding
end

#calculate

Calculates documentation totals and percentages for classes, modules, constants, attributes and methods.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 110

def calculate
  return if @doc_items

  ucm = @store.unique_classes_and_modules

  classes = @store.unique_classes.reject { |cm| cm.full_name == 'Object' }

  constants = []
  ucm.each { |cm| constants.concat cm.constants }

  methods = []
  ucm.each { |cm| methods.concat cm.method_list }

  attributes = []
  ucm.each { |cm| attributes.concat cm.attributes }

  @num_attributes, @undoc_attributes = doc_stats attributes
  @num_classes,    @undoc_classes    = doc_stats classes
  @num_constants,  @undoc_constants  = doc_stats constants
  @num_methods,    @undoc_methods    = doc_stats methods
  @num_modules,    @undoc_modules    = doc_stats @store.unique_modules

  @num_items =
    @num_attributes +
    @num_classes +
    @num_constants +
    @num_methods +
    @num_modules +
    @num_params

  @undoc_items =
    @undoc_attributes +
    @undoc_classes +
    @undoc_constants +
    @undoc_methods +
    @undoc_modules +
    @undoc_params

  @doc_items = @num_items - @undoc_items
end

#doc_stats(collection)

Returns the length and number of undocumented items in collection.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 167

def doc_stats collection
  visible = collection.select { |item| item.display? }
  [visible.length, visible.count { |item| not item.documented? }]
end

#done_adding

Call this to mark the end of parsing for display purposes

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 175

def done_adding
  @display.done_adding
end

#great_job

A report that says you did a great job!

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 192

def great_job
  report = RDoc::Markup::Document.new

  report << RDoc::Markup::Paragraph.new('100% documentation!')
  report << RDoc::Markup::Paragraph.new('Great Job!')

  report
end

#percent_doc

Calculates the percentage of items documented.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 204

def percent_doc
  return @percent_doc if @percent_doc

  @fully_documented = (@num_items - @doc_items) == 0

  @percent_doc = @doc_items.to_f / @num_items * 100 if @num_items.nonzero?
  @percent_doc ||= 0

  @percent_doc
end

#report

Returns a report on which items are not documented

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 218

def report
  if @coverage_level > 0 then
    extend RDoc::Text
  end

  if @coverage_level.zero? then
    calculate

    return great_job if @num_items == @doc_items
  end

  ucm = @store.unique_classes_and_modules

  report = RDoc::Markup::Document.new
  report << RDoc::Markup::Paragraph.new('The following items are not documented:')
  report << RDoc::Markup::BlankLine.new

  ucm.sort.each do |cm|
    body = report_class_module(cm) {
      [
        report_constants(cm),
        report_attributes(cm),
        report_methods(cm),
      ].compact
    }

    report << body if body
  end

  if @coverage_level > 0 then
    calculate

    return great_job if @num_items == @doc_items
  end

  report
end

#report_attributes(cm)

Returns a report on undocumented attributes in ClassModule cm

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 259

def report_attributes cm
  return if cm.attributes.empty?

  report = []

  cm.each_attribute do |attr|
    next if attr.documented?
    line = attr.line ? ":#{attr.line}" : nil
    report << "  #{attr.definition} :#{attr.name} # in file #{attr.file.full_name}#{line}\n"
    report << "\n"
  end

  report
end

#report_class_module(cm)

Returns a report on undocumented items in ClassModule cm

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 277

def report_class_module cm
  return if cm.fully_documented? and @coverage_level.zero?
  return unless cm.display?

  report = RDoc::Markup::Document.new

  if cm.in_files.empty? then
    report << RDoc::Markup::Paragraph.new("#{cm.definition} is referenced but empty.")
    report << RDoc::Markup::Paragraph.new("It probably came from another project.  I'm sorry I'm holding it against you.")

    return report
  elsif cm.documented? then
    documented = true
    klass = RDoc::Markup::Verbatim.new("#{cm.definition} # is documented\n")
  else
    report << RDoc::Markup::Paragraph.new('In files:')

    list = RDoc::Markup::List.new :BULLET

    cm.in_files.each do |file|
      para = RDoc::Markup::Paragraph.new file.full_name
      list << RDoc::Markup::ListItem.new(nil, para)
    end

    report << list
    report << RDoc::Markup::BlankLine.new

    klass = RDoc::Markup::Verbatim.new("#{cm.definition}\n")
  end

  klass << "\n"

  body = yield.flatten # HACK remove #flatten

  if body.empty? then
    return if documented

    klass.parts.pop
  else
    klass.parts.concat body
  end

  klass << "end\n"

  report << klass

  report
end

#report_constants(cm)

Returns a report on undocumented constants in ClassModule cm

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 329

def report_constants cm
  return if cm.constants.empty?

  report = []

  cm.each_constant do |constant|
    # TODO constant aliases are listed in the summary but not reported
    # figure out what to do here
    next if constant.documented? || constant.is_alias_for

    line = constant.line ? ":#{constant.line}" : line
    report << "  # in file #{constant.file.full_name}#{line}\n"
    report << "  #{constant.name} = nil\n"
    report << "\n"
  end

  report
end

#report_methods(cm)

Returns a report on undocumented methods in ClassModule cm

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 351

def report_methods cm
  return if cm.method_list.empty?

  report = []

  cm.each_method do |method|
    next if method.documented? and @coverage_level.zero?

    if @coverage_level > 0 then
      params, undoc = undoc_params method

      @num_params += params

      unless undoc.empty? then
        @undoc_params += undoc.length

        undoc = undoc.map do |param| "#{param}" end
        param_report = "  # #{undoc.join ', '} is not documented\n"
      end
    end

    next if method.documented? and not param_report

    line = method.line ? ":#{method.line}" : nil
    scope = method.singleton ? 'self.' : nil

    report << "  # in file #{method.file.full_name}#{line}\n"
    report << param_report if param_report
    report << "  def #{scope}#{method.name}#{method.params}; end\n"
    report << "\n"
  end

  report
end

#summary

Returns a summary of the collected statistics.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 389

def summary
  calculate

  num_width = [@num_files, @num_items].max.to_s.length
  undoc_width = [
    @undoc_attributes,
    @undoc_classes,
    @undoc_constants,
    @undoc_items,
    @undoc_methods,
    @undoc_modules,
    @undoc_params,
  ].max.to_s.length

  report = RDoc::Markup::Verbatim.new

  report << "Files:      %*d\n" % [num_width, @num_files]

  report << "\n"

  report << "Classes:    %*d (%*d undocumented)\n" % [
    num_width, @num_classes, undoc_width, @undoc_classes]
  report << "Modules:    %*d (%*d undocumented)\n" % [
    num_width, @num_modules, undoc_width, @undoc_modules]
  report << "Constants:  %*d (%*d undocumented)\n" % [
    num_width, @num_constants, undoc_width, @undoc_constants]
  report << "Attributes: %*d (%*d undocumented)\n" % [
    num_width, @num_attributes, undoc_width, @undoc_attributes]
  report << "Methods:    %*d (%*d undocumented)\n" % [
    num_width, @num_methods, undoc_width, @undoc_methods]
  report << "Parameters: %*d (%*d undocumented)\n" % [
    num_width, @num_params, undoc_width, @undoc_params] if
      @coverage_level > 0

  report << "\n"

  report << "Total:      %*d (%*d undocumented)\n" % [
    num_width, @num_items, undoc_width, @undoc_items]

  report << "%6.2f%% documented\n" % percent_doc
  report << "\n"
  report << "Elapsed: %0.1fs\n" % (Time.now - @start)

  RDoc::Markup::Document.new report
end

#undoc_params(method)

Determines which parameters in method were not documented. Returns a total parameter count and an Array of undocumented methods.

[ GitHub ]

  
# File 'lib/rdoc/stats.rb', line 439

def undoc_params method
  @formatter ||= RDoc::Markup::ToTtOnly.new

  params = method.param_list

  params = params.map { |param| param.gsub(/^\*\*?/, '') }

  return 0, [] if params.empty?

  document = parse method.comment

  tts = document.accept @formatter

  undoc = params - tts

  [params.length, undoc]
end