require 'mspec/runner/formatters/dotted'

# MSpecScript provides a skeleton for all the MSpec runner scripts.

class MSpecScript
def self.config
@config ||= { :path => ['.', 'spec'] }
end

def self.set(key, value)
config[key] = value
end

def initialize
config[:tags_dir] = 'spec/tags'
config[:formatter] = DottedFormatter
config[:includes] = []
config[:excludes] = []
config[:patterns] = []
config[:xpatterns] = []
config[:tags] = []
config[:xtags] = []
config[:profiles] = []
config[:xprofiles] = []
config[:atags] = []
config[:astrings] = []
config[:abort] = true
end

def config
MSpecScript.config
end

def load(name)
return Kernel.load(name) if File.exist?(File.expand_path(name))

config[:path].each do |dir|
file = File.join dir, name
return Kernel.load(file) if File.exist? file
end
end

def register
config[:formatter].new(config[:output]).register

MatchFilter.new(:include, *config[:includes]).register unless config[:includes].empty?
MatchFilter.new(:exclude, *config[:excludes]).register unless config[:excludes].empty?
RegexpFilter.new(:include, *config[:patterns]).register unless config[:patterns].empty?
RegexpFilter.new(:exclude, *config[:xpatterns]).register unless config[:xpatterns].empty?
TagFilter.new(:include, *config[:tags]).register unless config[:tags].empty?
TagFilter.new(:exclude, *config[:xtags]).register unless config[:xtags].empty?
ProfileFilter.new(:include, *config[:profiles]).register unless config[:profiles].empty?
ProfileFilter.new(:exclude, *config[:xprofiles]).register unless config[:xprofiles].empty?

DebugAction.new(config[:atags], config[:astrings]).register if config[:debugger]
GdbAction.new(config[:atags], config[:astrings]).register if config[:gdb]
end

def signals
if config[:abort]
Signal.trap "INT" do
puts "\nProcess aborted!"
exit! 1
end
end
end

def self.main
script = new
script.load 'default.mspec'
script.load '~/.mspecrc'
script.options
script.signals
script.register
script.run
end
end