lib/merb/merb_utils.rb in merb-0.0.3 vs lib/merb/merb_utils.rb in merb-0.0.4

- old
+ new

@@ -1,21 +1,110 @@ class String def import - Merb::Server.config[:allow_reloading] ? load( self + '.rb' ) : require( self ) + Merb::Server.config[:allow_reloading] ? load( self.snake_case + '.rb' ) : require( self.snake_case ) end - - def controller_class_name - self.capitalize + + def snake_case + return self unless self =~ %r/[A-Z]/ + self.reverse.scan(%r/[A-Z]+|[^A-Z]*[A-Z]+?/).reverse.map{|word| word.reverse.downcase}.join '_' end -end -class MerbHash < HashWithIndifferentAccess - def method_missing(m,*a) - m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m]:raise(NoMethodError,"#{m}") + + def camel_case + return self if self =~ %r/[A-Z]/ and self !~ %r/_/ + words = self.strip.split %r/\s*_+\s*/ + words.map!{|w| w.downcase.sub(%r/^./){|c| c.upcase}} + words.join end + end class Symbol def to_s @str_rep || (@str_rep = id2name.freeze) end -end \ No newline at end of file + def to_proc + Proc.new{|*args| args.shift.__send__(self, *args)} + end +end + +class Object + def returning(value) + yield(value) + value + end +end + +class Hash + def with_indifferent_access + MerbHash.new(self) + end +end + +class MerbHash < Hash + def initialize(constructor = {}) + if constructor.is_a?(Hash) + super() + update(constructor) + else + super(constructor) + end + end + + def default(key) + self[key.to_s] if key.is_a?(Symbol) + end + + alias_method :regular_writer, :[]= unless method_defined?(:regular_writer) + alias_method :regular_update, :update unless method_defined?(:regular_update) + + def []=(key, value) + regular_writer(convert_key(key), convert_value(value)) + end + + def update(other_hash) + other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) } + self + end + + alias_method :merge!, :update + + def key?(key) + super(convert_key(key)) + end + + alias_method :include?, :key? + alias_method :has_key?, :key? + alias_method :member?, :key? + + def fetch(key, *extras) + super(convert_key(key), *extras) + end + + def values_at(*indices) + indices.collect {|key| self[convert_key(key)]} + end + + def dup + MerbHash.new(self) + end + + def merge(hash) + self.dup.update(hash) + end + + def delete(key) + super(convert_key(key)) + end + + def method_missing(m,*a) + m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m]:raise(NoMethodError,"#{m}") + end + + protected + def convert_key(key) + key.kind_of?(Symbol) ? key.to_s : key + end + def convert_value(value) + value.is_a?(Hash) ? value.with_indifferent_access : value + end +end