class M::Parser

def initialize argv

def initialize argv
  @argv = argv
  @testable = Testable.new
end

def parse

def parse
  # With no arguments,
  if argv.empty?
    # Just shell out to `rake test`.
    exec "rake test"
  else
    parse_options! argv
    if argv.first.start_with? "--"
      exec "rake test #{argv.join}"
      exit 0
    else
      # Parse out ARGV, it should be coming in in a format like `test/test_file.rb:9:19`
      parsed = argv.shift.split ":"
      testable.file = parsed.shift
      testable.lines = parsed if testable.lines.none?
      # Anything else on ARGV will be passed along to the runner
      testable.passthrough_options = argv
    end
    # If this file is a directory, not a file, run the tests inside of this directory
    return testable unless Dir.exist? testable.file
    # Make a new rake test task with a hopefully unique name, and run every test looking file in it
    require "rake/testtask"
    Rake::TestTask.new :m_custom do |t|
      t.libs << "test"
      t.libs << "spec"
      t.test_files = FileList[wildcard("test"), wildcard("spec")]
      t.warning = false
    end
    # Invoke the rake task and exit, hopefully it'll work!
    begin
      Rake::Task["m_custom"].invoke
    rescue RuntimeError
      exit 1
    ensure
      exit $?.exitstatus
    end
  end
end

def parse_options! argv

def parse_options! argv
  require "optparse"
  OptionParser.new do |opts|
    opts.banner = "Options:"
    opts.version = M::VERSION
    opts.on "-h", "--help", "Display this help." do
      puts "Usage: m [OPTIONS] [FILES]\n\n", opts
      exit
    end
    opts.on "--version", "Display the version." do
      puts "m #{M::VERSION}"
      exit
    end
    opts.on "-l", "--line LINE", Integer, "Line number for file." do |line|
      p "parsing line #{line}"
      testable.lines = [line]
    end
    opts.on "-r", "--recursive DIR", "Search provided directory recursively." do |directory|
      testable.recursive = true
      argv << directory
    end
    opts.parse! argv
  end
end

def wildcard type

def wildcard type
  if testable.recursive
    "#{testable.file}/**/*#{type}*.rb"
  else
    "#{testable.file}/*#{type}*.rb"
  end
end