class YARD::CLI::Doctest

def add_pwd_to_path

def add_pwd_to_path
  $LOAD_PATH.unshift(Dir.pwd) unless $LOAD_PATH.include?(Dir.pwd)
end

def description

def description
  'Doctests from @example tags'
end

def excluded_files

def excluded_files
  excluded = []
  args = YARD::Config.with_yardopts { YARD::Config.arguments.dup }
  args.each_with_index do |arg, i|
    next unless arg == '--exclude'
    excluded << args[i + 1]
  end
  excluded
end

def generate_tests(examples)

def generate_tests(examples)
  examples.each do |example|
    text = example.text
    text = text.gsub('# =>', '#=>')
    text = text.gsub('#=>', "\n#=>")
    lines = text.split("\n").map(&:strip).reject(&:empty?)
    asserts = [].tap do |arr|
      until lines.empty?
        actual = lines.take_while { |l| l !~ /^#=>/ }
        expected = lines[actual.size] || ''
        lines.slice! 0..actual.size
        arr << {
          expected: expected.sub('#=>', '').strip,
          actual: actual.join("\n"),
        }
      end
    end
    spec = YARD::Doctest::Example.new(example.name)
    spec.definition = example.object.path
    spec.filepath = "#{Dir.pwd}/#{example.object.files.first.join(':')}"
    spec.asserts = asserts
    spec.generate
  end
end

def parse_examples(files)

def parse_examples(files)
  YARD.parse(files, excluded_files)
  registry = Registry.load_all
  registry.all.map { |object| object.tags(:example) }.flatten
end

def parse_files(globs)

def parse_files(globs)
  globs = %w(app lib) if globs.empty?
  files = globs.map do |glob|
    if glob !~ /.rb$/
      glob = "#{glob}/**/*.rb"
    end
    Dir[glob]
  end
  files.flatten
end

def run(*args)

Parameters:
  • args (Array) -- Switches are passed to minitest,
def run(*args)
  files = args.select { |arg| arg !~ /^-/ }
  files = parse_files(files)
  examples = parse_examples(files)
  add_pwd_to_path
  generate_tests(examples)
end