class Speckle::CLI::Environment

Public Instance Methods

action_needs_args?(action) click to toggle source
# File lib/speckle/cli/environment.rb, line 160
def action_needs_args?(action)
  [:compile_and_test, :compile, :test].include? action
end
args_empty?(args) click to toggle source
# File lib/speckle/cli/environment.rb, line 179
def args_empty?(args)
  args.empty? || (args.length == 1 && args[0] == '')
end
build_riml_path(dirs, pattern = /.*\.riml$/, spec_pattern = /.*_spec\.riml$/) click to toggle source
# File lib/speckle/cli/environment.rb, line 164
def build_riml_path(dirs, pattern = /.*\.riml$/, spec_pattern = /.*_spec\.riml$/)
  libs = []
  dirs.each do |dir|
    if File.directory?(dir)
      Find.find(dir) do |path|
        if path =~ pattern && path !~ spec_pattern
          libs << File.dirname(path)
        end
      end
    end
  end

  libs.uniq.join(':')
end
load(args) click to toggle source
# File lib/speckle/cli/environment.rb, line 12
def load(args)
  options = OpenStruct.new
  options.libs = nil
  options.grep_pattern = nil
  options.grep_invert = false
  options.reporter = 'dot'
  options.args = args
  options.verbose = false
  options.vim = 'vim'
  options.cwd = Dir.pwd
  options.root_dir = ROOT_DIR
  options.speckle_build_dir = "#{ROOT_DIR}/build"
  options.speckle_lib_dir = "#{ROOT_DIR}/lib"
  options.skip_vimrc = false
  options.slow_threshold = 10
  options.colorize = true
  options.bail = false
  options.tag = nil
  options.profile = false

  parser = OptionParser.new do |opts|
    options.opts = opts

    opts.banner = "Usage: speckle [options] [file(s) OR directory]"
    opts.separator ''
    opts.separator 'Options:'
    opts.separator ''

    opts.on_head('-c', '--compile', 'Only compile tests') do
      options.action = :compile
    end

    opts.on_head('-t', '--test', 'Only run tests') do
      options.action = :test
    end

    opts.on_head('-a', '--all', 'Compile and run tests (default)') do
      options.action = :compile_and_test
    end

    opts.on('-I', '--libs <libs>', 'Specify additional riml library path(s)') do |libs|
      options.libs = libs
    end

    opts.on('-g', '--grep <pattern>', 'Only run tests matching the pattern') do |pattern|
      options.grep_pattern = pattern.strip
    end

    opts.on('-i', '--invert', 'Inverts --grep matches') do
      options.grep_invert = true
    end

    opts.on('--tag <tag>', 'Only run tests matching tag') do |tag|
      options.tag = tag
    end

    opts.on('-r', '--reporter <reporter>', 'Specify the reporter to use (spec, min, dot, tap)') do |reporter|
      options.reporter = reporter.strip
    end

    opts.on('-b', '--bail', 'Bail on first test failure') do
      options.bail = true
    end

    opts.on('-w', '--watch', 'Watch tests for changes') do
      options.action = :watch
    end

    opts.on('-m', '--vim <vim>', 'Vim program used to test, default(vim)') do |vim|
      options.vim = vim.strip
    end

    opts.on('-s', '--slow-threshold <ms>', Integer, 'Threshold in milliseconds to indicate slow tests') do |ms|
      options.slow_threshold = ms
    end

    opts.on('-p', '--profile', 'Profiles the tests run') do
      options.profile = true
    end

    opts.on('-k', '--skip-vimrc', 'Does not load ~/.vimrc file') do
      options.skip_vimrc = true
    end

    opts.on('-C', '--no-colors', 'Disable color output') do
      options.colorize = false
    end

    opts.on('-v', '--verbose', 'Display verbose output') do
      options.verbose = true
    end

    opts.on('-D', '--debug', 'Display debug output') do
      options.verbose = true
      options.debug = true
    end

    opts.on_tail('-V', '--version', 'Print Speckle version') do
      options.action = :show_version
    end

    opts.on_tail('-h', '--help', 'Print Speckle help') do
      options.action = :show_help
    end
  end

  begin
    parser.parse!(args)

    if options.action.nil?
      if args_empty?(args)
        spec_dir = "#{options.cwd}/spec"
        if File.directory?(spec_dir)
          args << 'spec'
          options.action = :compile_and_test
        else
          options.action = :show_no_spec_dir
        end
      else
        options.action = :compile_and_test
      end
    elsif action_needs_args?(options.action) and args_empty?(args)
      spec_dir = "#{options.cwd}/spec"
      if File.directory?(spec_dir)
        args << 'spec'
        options.action = :compile_and_test
      end
    end

    options.inputs = args.uniq
  rescue OptionParser::InvalidOption => e
    options.error = e
    options.action = :show_invalid_option
  rescue OptionParser::MissingArgument => e
    options.error = e
    options.action = :show_missing_args
  rescue OptionParser::ParseError => e
    options.error = e
    options.action = :show_parser_error
  end

  if action_needs_args?(options.action) and options.libs.nil?
    options.libs = build_riml_path(['lib', 'spec'])
  end

  options
end