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