module Lab42::Literate::Extractor

Constants

ALTERNATE_EQ_FORM
START_EXTRACTION
STOP_EXTRACTION

Public Instance Methods

extract(from_lines) click to toggle source
# File lib/lab42/literate/extractor.rb, line 12
def extract from_lines
  initial = OpenStruct.new(state: :outside, blocks: []) 
  from_lines
    .each_with_index
    .inject(initial){|acc, (line, lnb)| update(line, lnb, acc) }
    .blocks
end

Private Instance Methods

convert(line) click to toggle source

Potentially convert alternate equality syntax to class equality synatx, meaning that A(.*)s+#=>s+(.*)z => expect(strip($1)).to eq(strip($2))

# File lib/lab42/literate/extractor.rb, line 25
def convert line
  line.chomp.sub(ALTERNATE_EQ_FORM){ |*| 
    %W{#{$1}expect(#{$2}).to eq(#{$3.strip})}.join(' ') }
end
merge_acc(acc, **params) click to toggle source
# File lib/lab42/literate/extractor.rb, line 56
def merge_acc acc, **params
  OpenStruct.new(**(acc.to_h.merge params))
end
update(line, lnb, acc) click to toggle source
# File lib/lab42/literate/extractor.rb, line 30
def update line, lnb, acc
  if acc.state == :outside
    update_outside line, lnb, acc
  else
    update_inside line, acc
  end
end
update_inside(line, acc) click to toggle source
# File lib/lab42/literate/extractor.rb, line 38
def update_inside line, acc
  if STOP_EXTRACTION === line.chomp
    merge_acc( acc, state: :outside )
  else
    acc.blocks.last.add_line(convert(line))
    acc
  end
end
update_outside(line, lnb, acc) click to toggle source
# File lib/lab42/literate/extractor.rb, line 47
def update_outside line, lnb, acc
  match = START_EXTRACTION.match line.chomp
  if match 
    merge_acc( acc, state: :inside, blocks: acc.blocks << Block.new(lnb, title: match['explicit_title']) )
  else
    acc
  end
end