148 lines
3.8 KiB
Ruby
148 lines
3.8 KiB
Ruby
|
require 'singleton'
|
||
|
|
||
|
module PTK
|
||
|
|
||
|
class Configuration
|
||
|
class << self
|
||
|
def load(config, fatal = false)
|
||
|
if (file = PTK::PathSet.instance.send(config)) == :ignore then false
|
||
|
elsif File.exists?(file)
|
||
|
require file
|
||
|
true
|
||
|
elsif fatal then raise LoadError, "PTK could not find #{file}"
|
||
|
else
|
||
|
STDERR.puts "PTK::WARNING: could not find #{file}"
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def find_path(config, fatal = false)
|
||
|
if (file = PTK::PathSet.instance.send(config)) == :ignore then false
|
||
|
elsif File.exists?(file) then file
|
||
|
elsif fatal then raise LoadError, "PTK could not find #{file}"
|
||
|
else
|
||
|
STDERR.puts "PTK::WARNING: could not find #{file}"
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def draw
|
||
|
yield PTK::PathSet.instance
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class PathSet
|
||
|
include Singleton
|
||
|
|
||
|
attr_accessor :ptk_prefix
|
||
|
attr_accessor :config
|
||
|
attr_accessor :fixtures
|
||
|
attr_accessor :environment
|
||
|
attr_accessor :schema
|
||
|
attr_accessor :database
|
||
|
attr_accessor :routes
|
||
|
|
||
|
def initialize
|
||
|
self.ptk_prefix = 'ptk'
|
||
|
self.config = File.join(RAILS_ROOT, 'config')
|
||
|
self.fixtures = File.join(RAILS_ROOT, 'fixtures')
|
||
|
|
||
|
self.environment = File.join(self.config, 'environment.rb')
|
||
|
|
||
|
self.database = File.join(self.config, 'database.yml')
|
||
|
self.schema = File.join(self.config, 'schema.rb')
|
||
|
|
||
|
self.routes = File.join(self.config, 'routes.rb')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Initializer
|
||
|
|
||
|
# The init.rb in the root directory of the plugin will be loaded by default
|
||
|
attr_accessor :init
|
||
|
|
||
|
# The specific environmental frameworks of a plugin, such as needing the ActionController
|
||
|
# ActionMailer or ActiveRecord gems to be preloaded. A special requirement called
|
||
|
# 'environment' will load tests as though they were in the test environment of a normal
|
||
|
# Rails application.
|
||
|
attr_accessor :frameworks
|
||
|
def frameworks
|
||
|
[@frameworks].flatten
|
||
|
end
|
||
|
|
||
|
# Suites are test extensions including assertions and various tools for easier testing
|
||
|
attr_accessor :suites
|
||
|
def suites
|
||
|
[@suites].flatten
|
||
|
end
|
||
|
|
||
|
# A container for the PathSet instance
|
||
|
attr_reader :paths
|
||
|
|
||
|
def initialize
|
||
|
self.init = true
|
||
|
self.frameworks = :none
|
||
|
self.suites = :all
|
||
|
@paths = PTK::PathSet.instance
|
||
|
end
|
||
|
|
||
|
def self.run(command = :process)
|
||
|
initializer = PTK::Initializer.new
|
||
|
yield initializer if block_given?
|
||
|
initializer.send(command)
|
||
|
end
|
||
|
|
||
|
def process
|
||
|
initialize_frameworks
|
||
|
initialize_suites
|
||
|
initialize_plugin
|
||
|
end
|
||
|
|
||
|
def initialize_frameworks
|
||
|
return if frameworks.include?(:none)
|
||
|
self.frameworks = [:rails] if frameworks.include?(:rails)
|
||
|
frameworks.each { |lib| require_ptk File.join('gem', lib.to_s) }
|
||
|
end
|
||
|
|
||
|
def initialize_suites
|
||
|
return if suites.include?(:none)
|
||
|
self.suites = all_suites if suites.include?(:all)
|
||
|
suites.each { |lib| require_ptk File.join('suite', lib.to_s) }
|
||
|
end
|
||
|
|
||
|
def initialize_plugin
|
||
|
return unless self.init
|
||
|
require File.join(RAILS_ROOT, '..', 'init')
|
||
|
end
|
||
|
|
||
|
protected
|
||
|
|
||
|
def all_suites
|
||
|
Dir.glob(File.join(RAILS_ROOT, 'lib', 'ptk', 'suite', '*.rb')).inject([]) do |a, file|
|
||
|
a << File.basename(file, '.rb').to_sym
|
||
|
a
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def require_ptk(library)
|
||
|
file = paths.ptk_prefix.empty? ? library : File.join(paths.ptk_prefix, library)
|
||
|
require file
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class LoadPath
|
||
|
|
||
|
def self.expand(file, *dirs)
|
||
|
File.join(*([File.expand_path(File.dirname(file))] << dirs))
|
||
|
end
|
||
|
|
||
|
def self.add(*dirs)
|
||
|
path = File.expand_path(File.join(*dirs))
|
||
|
$:.unshift path
|
||
|
$:.uniq!
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|