lib/hornsby.rb in sinsiliux-hornsby-0.3.0 vs lib/hornsby.rb in sinsiliux-hornsby-0.4.0

- old
+ new

@@ -1,46 +1,38 @@ -require File.join(File.dirname(__FILE__), 'hornsby_context') +require File.join(File.dirname(__FILE__), 'hornsby/context') +require File.join(File.dirname(__FILE__), 'hornsby/helper') +require File.join(File.dirname(__FILE__), 'hornsby/errors') +if defined? Spec + require File.join(File.dirname(__FILE__), 'hornsby/rspec_extensions') +else + require File.join(File.dirname(__FILE__), 'hornsby/test_unit_extensions') +end class Hornsby + SCENARIO_FILES = [nil, 'spec', 'test'].product(['hornsby_scenarios', 'hornsby_scenario']).map do |path| + path = File.join(*path.compact) + ["#{path}.rb", File.join(path, "*.rb")] + end.flatten + @@delete_sql = "DELETE FROM %s" - def self.framework_root - RAILS_ROOT rescue Rails.root rescue Merb.root rescue '' - end - cattr_reader :scenarios cattr_accessor :executed_scenarios # @@namespaces = {} @@scenarios = {} @@executed_scenarios = Set.new @@global_executed_scenarios = [] - @@global_context = HornsbyContext + @@global_context = Hornsby::Context @@context = nil - def self.configure_rspec(config, options = {}) - load(options) - - config.include(HornsbyHelper) - config.before do - Hornsby.setup(self) - end - config.after do - Hornsby.teardown - end + def self.framework_root + @@framework_root ||= RAILS_ROOT rescue Rails.root rescue Merb.root rescue nil end - def self.configure_test(config, options) - load(options) - - config.send(:include, HornsbyHelper) - config.setup do - Hornsby.setup(self) - end - config.teardown do - Hornsby.teardown - end + def self.configure_rspec(config, options = {}) + raise '### This is deprecated! Please use config.enable_hornsby instead of Hornsby.configure_rspec(config)' end def self.setup(current_context) @@context = @@global_context.clone @@executed_scenarios = Set.new(@@global_executed_scenarios) @@ -54,30 +46,41 @@ ActiveRecord::Base.connection.rollback_db_transaction ActiveRecord::Base.connection.decrement_open_transactions end def self.build(*names) - scenarios = names.map {|name| @@scenarios[name.to_sym] or raise "scenario #{name} not found"} + scenarios = names.map {|name| @@scenarios[name.to_sym] or raise ScenarioNotFoundError, name} scenarios.each {|s| s.build} end - def self.[](name) - end - def self.load(options = {}) return unless @@scenarios.empty? delete_tables - scenarios_file = options[:filename] || File.join(framework_root, 'spec', 'hornsby_scenarios.rb') - self.module_eval File.read(scenarios_file) + @@framework_root = options[:root] if options[:root] + load_scenarios_files(options[:filename] || SCENARIO_FILES) @@context = @@global_context @@global_scenarios = Hornsby.build(options[:scenarios]) if options[:scenarios] @@global_executed_scenarios = @@executed_scenarios.to_a end + def self.load_scenarios_files(*patterns) + patterns.flatten! + patterns.collect! {|pattern| File.join(framework_root, pattern)} if framework_root + + patterns.each do |pattern| + unless (files = Dir.glob(pattern)).empty? + files.each{|f| self.module_eval File.read(f)} + return + end + end + + raise "Scenarios file not found! Put scenarios in #{patterns.join(' or ')} or pass custom filename with :filename option" + end + def self.scenario(scenario, &block) self.new(scenario, &block) end def self.delete_tables(*args) @@ -98,25 +101,25 @@ end attr_reader :scenario def initialize(scenario, &block) - case scenario + @scenario, @parents = parse_name(scenario) + @block = block + + @@scenarios[@scenario] = self + end + + def parse_name(name) + case name when Hash - parents = scenario.values.first - @parents = Array === parents ? parents : [parents] - scenario = scenario.keys.first + return name.keys.first.to_sym, [name.values.first].flatten.map{|sc| parse_name(sc).first} when Symbol, String - @parents = [] + return name.to_sym, [] else - raise "I don't know how to build `#{scenario.inspect}'" - end - - @scenario = scenario.to_sym - @block = block - - @@scenarios[@scenario] = self + raise TypeError, "Pass scenarios names as strings or symbols only, cannot build scenario '#{name.inspect}'" + end end def say(*messages) puts messages.map { |message| "=> #{message}" } end @@ -132,46 +135,23 @@ @@executed_scenarios << @scenario end def build_parent_scenarios(context) @parents.each do |p| - parent = self.class.scenarios[p] or raise "parent scenario [#{p}] not found!" + parent = @@scenarios[p] or raise ScenarioNotFoundError, p parent.build_parent_scenarios(context) parent.build_scenario(context) end end def surface_errors yield rescue StandardError => error puts - say "There was an error building scenario `#{@scenario}'", error.inspect + say "There was an error building scenario '#{@scenario}'", error.inspect puts puts error.backtrace puts raise error end -end - - -module HornsbyHelper - def hornsby_scenario(*names) - Hornsby.build(*names) - Hornsby.copy_ivars(self) - end - - def hornsby_clear(*args) - options = args.extract_options! - Hornsby.delete_tables(*args) - - if options[:undo] == :all - Hornsby.executed_scenarios.clear - else - undo = [options[:undo]].flatten.compact - unless (not_found = undo - Hornsby.executed_scenarios.to_a).blank? - raise(ArgumentError, "Scenario(s) #{not_found} not found") - end - Hornsby.executed_scenarios -= undo - end - end -end +end \ No newline at end of file