# These are the methods considered "base". # A method is deemed base if it is obvious, # simple, unobtrusive and/or widely useful. # # This list is still being refined. # # NOTE # # The #cmp methods are simply aliases for #<=>, they # are here b/c String.succ is not compataible # with it's own #<=> method. The #cmp method proves # an effective way of dealing with when needs be. # DEPRECATED Use Facets.require instead. #require 'kernel/require_facet' # Elementary require 'facet/comparable/cmp' require 'facet/string/cmp' require 'facet/nilclass/to_f' require 'facet/nilclass/to_h' require 'facet/binding/eval' require 'facet/binding/self' require 'facet/binding/caller' require 'facet/module/basename' require 'facet/proc/to_method' require 'facet/kernel/constant' require 'facet/kernel/called' # better name? require 'facet/symbol/to_proc' # Elementary (Know Thyself) require 'facet/hash/to_h' require 'facet/range/to_r' require 'facet/regexp/to_re' require 'facet/time/to_time' # "Minis" (Shorthands) require 'facet/module/is' require 'facet/kernel/fn' require 'facet/kernel/here' require 'facet/kernel/own' # better name? # Convenience require 'facet/array/to_h' require 'facet/enumerable/to_h' require 'facet/enumerable/collect_with_index' require 'facet/enumerable/each_slice' require 'facet/file/self/read_list' require 'facet/float/round_to' require 'facet/float/round_at' require 'facet/hash/slice' require 'facet/matchdata/match' require 'facet/matchdata/matchtree' require 'facet/string/blank' require 'facet/string/to_re' # New Features require 'facet/symbol/not' require 'facet/kernel/as' # This was a bad idea. Bye-bye. # extras #require 'rbconfig' #confdir = Config::CONFIG['sysconfdir'] #extra_facets = File.join( confdir, 'facets', 'extra' ) #if File.file?( extra_facets ) # extra_facets = File.read_list( extra_facets ) # extra_facets.each { |f| require f } #end module Facets extend self # This simply subs terms for Ruby's operators # and removes any trailing ? ! or =. def op_esc_path( name ) ri = name.rindex('/') if ri dir, file = name[0...ri], name[ri+1..-1] else dir, file = nil, name end file = op_esc(file.strip) dir ? File.join( dir, file ) : file end def op_esc( str ) str = str.to_s.chomp('.rb') str = str.strip.gsub(OPERATORS_REGEXP){ OPERATORS_ESCAPE[$1] } str.chomp('?').chomp('!').chomp('=') end OPERATORS = %w{ +@ -@ + - ** * / % ~ <=> << >> < > === == =~ <= >= | & ^ []= [] } OPERATORS_REGEXP = Regexp.new( '(' << OPERATORS.collect{ |k| Regexp.escape(k) }.join('|') << ')' ) OPERATORS_ESCAPE = { "+@" => "op_plus_self", "-@" => "op_minus_self", "+" => "op_plus", "-" => "op_minus", "**" => "op_pow", "*" => "op_mul", "/" => "op_div", "%" => "op_mod", "~" => "op_tilde", "<=>" => "op_cmp", "<<" => "op_lshift", ">>" => "op_rshift", "<" => "op_lt", ">" => "op_gt", "===" => "op_case_eq", "==" => "op_equal", "=~" => "op_apply", "<=" => "op_lt_eq", ">=" => "op_gt_eq", "|" => "op_or", "&" => "op_and", "^" => "op_xor", "[]=" => "op_store", "[]" => "op_fetch" } CLASS_ANCESTORS = { 'array' => ['enumerable','kernel'], 'binding' => ['kernel'], 'class' => ['module','kernel'], 'comparable' => ['kernel'], 'continuation' => ['kernel'], 'date' => ['comparable','kernel'], 'dir' => ['enumerable','kernel'], 'enumerable' => ['kernel'], 'file' => ['io','enumerable','kernel'], 'fileutils' => ['kernel'], 'float' => ['precision','numeric','comparable','kernel'], 'hash' => ['enumerable','kernel'], 'integer' => ['precision','numeric','comparable','kernel'], 'kernel' => ['kernel'], 'logger' => ['kernel'], 'matchdata' => ['kernel'], 'module' => ['kernel'], 'nilclass' => ['kernel'], 'numeric' => ['comparable','kernel'], 'ostruct' => ['kernel'], 'pathname' => ['kernel'], 'proc' => ['kernel'], 'range' => ['enumerable','kernel'], 'regexp' => ['kernel'], 'string' => ['enumerable','comparable','kernel'], 'symbol' => ['kernel'], 'time' => ['comparable','kernel'], 'unboundmethod' => ['kernel'], } METHDIR = "facet" alias_method :require_facet, :require def require( fname ) paths = fname.split('/') klass = paths[0].downcase if CLASS_ANCESTORS.key?( klass ) if paths.size > 1 klass = paths[0].downcase ancestors = CLASS_ANCESTORS[ klass ] || [] paths[-1] = op_esc( paths[-1] ) begin paths[0] = klass require_facet( File.join( METHDIR, *paths ) ) rescue LoadError => e klass = ancestors.shift retry if klass raise e end else require_facet( File.join( METHDIR, fname ) ) end else require_facet( File.join( METHDIR, fname ) ) end end end # Override Kernel require method to reroute Facet requires. # #module Kernel # # alias_method :require_facetless, :require # # def require( fname ) # if /^(facet|facets|nano)[\/\\]/ =~ fname # Facets.require($') # else # require_facetless( fname ) # end # end # #end