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