module Omnitest::Psychic::Code2Doc::CodeHelper

Public Instance Methods

code2doc(options = { format: :markdown }) click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 81
def code2doc(options = { format: :markdown })
  source_code = File.read(absolute_source_file)
  segmenter_language = infer_language(source_file)

  buffer = StringIO.new
  segmenter_options = {
    language: segmenter_language
  }
  segmenter = Omnitest::Psychic::Code2Doc::CodeSegmenter.new(segmenter_options)
  segments = segmenter.segment source_code
  segments.each do |comment, code|
    comment = comment.join("\n")
    code = code.join("\n")
    code = code_block(code, segmenter_language, options) unless code.empty?
    next if comment.empty? && code.empty?
    code = "\n#{code}\n" if !comment.empty? && !code.empty? # Markdown needs separation
    buffer.puts [comment, code].join("\n")
  end
  buffer.string
end
code_block(source_code, language, opts = { format: :markdown }) click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 42
def code_block(source_code, language, opts = { format: :markdown })
  case opts[:format].to_sym
  when :rst
    ReStructuredTextHelper.code_block source_code, language
  when :md, :markdown
    MarkdownHelper.code_block source_code, language
  when :raw
    source_code
  else
    fail ArgumentError, "Unknown format: #{opts[:format]}"
  end
end
highlighted_code(formatter = 'terminal256') click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 37
def highlighted_code(formatter = 'terminal256')
  language, _comment_style = Code2Doc::CommentStyles.infer source_file.extname
  highlight(source, language: language, filename: absolute_source_file, formatter: formatter)
end
infer_language(file) click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 102
def infer_language(file)
  language, comment_style = Psychic::Code2Doc::CommentStyles.infer File.extname(file)
  segmenter_language = comment_style[:language] || language
end
snippet_after(matcher) click to toggle source

Loses proper indentation on comments

# File lib/omnitest/psychic/code2doc/code_helper.rb, line 56
def snippet_after(matcher)
  segments = segmenter.segment(source)
  buffer = StringIO.new
  segment = segments.find do |s|
    doc_segment_content = s.first.join
    doc_segment_content.match matcher
  end
  buffer.print segment[1].join "\n" if segment # return code segment
  buffer.string
end
snippet_between(before_matcher, after_matcher) click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 67
def snippet_between(before_matcher, after_matcher)
  segments = segmenter.segment(source)
  start_segment = find_segment_index segments, before_matcher
  end_segment   = find_segment_index segments, after_matcher
  buffer = StringIO.new
  if start_segment && end_segment
    segments[start_segment...end_segment].each do |segment|
      buffer.puts @segmenter.comment(segment[0]) unless segment == segments[start_segment]
      buffer.puts segment[1].join
    end
  end
  buffer.string
end
source() click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 29
def source
  File.read absolute_source_file
end
source?() click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 33
def source?
  !absolute_source_file.nil?
end

Private Instance Methods

find_segment_index(segments, matcher) click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 113
def find_segment_index(segments, matcher)
  segments.find_index do |s|
    doc_segment_content = s.first.join
    doc_segment_content.match matcher
  end
end
segmenter() click to toggle source
# File lib/omnitest/psychic/code2doc/code_helper.rb, line 109
def segmenter
  @segmenter ||= Code2Doc::CodeSegmenter.new
end