class SpecsProcessor

This class could be used to dynamically generate documentation from cops spec. It recognizes bad and good examples by signal words like `raises`. Additional information for documentation could be passed by setting `DETAILS` constant.

Constants

CLOSE_SQUARE_BRACKET_END_LINE
LINE_BEGIN_OPEN_SQUARE_BRACKET
LINE_BEGIN_QUOTE
QUOTE_COMMA_END_LINE

Attributes

cases[R]

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/ducalis/documentation.rb, line 16
def initialize(*)
  super
  @cases = []
  @nesting = []
end

Public Instance Methods

on_send(node) click to toggle source
Calls superclass method
# File lib/ducalis/documentation.rb, line 28
def on_send(node)
  _, name, _body = *node
  cases << [current_it, source_code(node)] if name == :inspect_source
  super
end
process(node) click to toggle source
Calls superclass method
# File lib/ducalis/documentation.rb, line 22
def process(node)
  @nesting.push(node)
  super
  @nesting.pop
end

Private Instance Methods

current_it() click to toggle source
# File lib/ducalis/documentation.rb, line 49
def current_it
  it_block = @nesting.reverse.find { |node| node.type == :block }
  it = it_block.to_a.first
  _, _, message_node = *it
  message_node.to_a.first
end
prepare_code(node) click to toggle source
# File lib/ducalis/documentation.rb, line 43
def prepare_code(node)
  remove_array_wrapping(node.to_a.last.loc.expression.source)
    .split("\n")
    .map { |line| remove_string_wrapping(line) }
end
remove_array_wrapping(source) click to toggle source
# File lib/ducalis/documentation.rb, line 56
def remove_array_wrapping(source)
  source.sub(LINE_BEGIN_OPEN_SQUARE_BRACKET, '')
        .sub(CLOSE_SQUARE_BRACKET_END_LINE, '')
end
remove_string_wrapping(line) click to toggle source
# File lib/ducalis/documentation.rb, line 61
def remove_string_wrapping(line)
  line.strip.sub(LINE_BEGIN_QUOTE, '')
      .sub(QUOTE_COMMA_END_LINE, '')
end
source_code(node) click to toggle source
# File lib/ducalis/documentation.rb, line 36
def source_code(node)
  prepare_code(node).tap do |code|
    code.shift if code.first.to_s.empty?
    code.pop if code.last.to_s.empty?
  end
end