lib/usher/interface.rb in usher-0.5.6 vs lib/usher/interface.rb in usher-0.5.7

- old
+ new

@@ -1,37 +1,43 @@ +# From Extlib +module CamelCaseMixin + def camel_case + return self if self !~ /_/ && self =~ /[A-Z]+.*/ + split('_').map{|e| e.capitalize}.join + end +end + +# TODO: refactoring: I suggest to use usher/interfaces/rack.rb instead of +# usher/interface/rack_interface.rb, it will enable me to simplify this code class Usher module Interface - autoload :Rails2_2Interface, File.join(File.dirname(__FILE__), 'interface', 'rails2_2_interface') - autoload :Rails2_3Interface, File.join(File.dirname(__FILE__), 'interface', 'rails2_3_interface') - autoload :MerbInterface, File.join(File.dirname(__FILE__), 'interface', 'merb_interface') - autoload :RackInterface, File.join(File.dirname(__FILE__), 'interface', 'rack_interface') - autoload :EmailInterface, File.join(File.dirname(__FILE__), 'interface', 'email_interface') - autoload :Rails3Interface, File.join(File.dirname(__FILE__), 'interface', 'rails3_interface') - autoload :TextInterface, File.join(File.dirname(__FILE__), 'interface', 'text_interface') - - def self.for(type, &blk) - class_for(type).new(&blk) + # Get root directory of interfaces of path to specified interface + def self.interface_directory + File.join(File.dirname(__FILE__), "interface") end - - def self.class_for(type) - case type - when :rails2_2 - Rails2_2Interface - when :rails2_3 - Rails2_3Interface - when :merb - MerbInterface - when :rack - RackInterface - when :email - EmailInterface - when :rails3 - Rails3Interface - when :text - TextInterface + + # path to file + def self.interface_path(name) + File.join(self.interface_directory, "#{name}_interface.rb") + end + + # Usher::Interface.for(:rack, &block) + def self.for(name, &block) + if File.exist?(self.interface_path(name)) + require self.interface_path(name) + snake_cased = "#{name}_interface".extend(CamelCaseMixin) + Usher::Interface.const_get(snake_cased.camel_case).new(&block) + else + raise ArgumentError, "Interface #{name} doesn't exist. Choose one of: #{self.interfaces.inspect}" end - end - - + + # Array of symbols + # Usher::Interface.interfaces + # => [:email_interface, :merb_interface, :rack_interface, :rails2_2_interface, :rails2_3_interface, :rails3_interface, :text_interface] + def self.interfaces + Dir["#{self.interface_directory}/*.rb"].map do |interface| + File.basename(interface).sub("_interface.rb", "").to_sym + end + end end -end \ No newline at end of file +end