module DotNotation

Constants

VERSION

Public Class Methods

included(base) click to toggle source

Your code goes here…

# File lib/dot_notation.rb, line 5
def self.included(base)
  raise "Unsupported Class" unless base.respond_to?('[]')
end

Public Instance Methods

dot(path) click to toggle source
# File lib/dot_notation.rb, line 9
def dot(path)
  return nil if self.nil? # optimization for NilClass

  data = self
  path.split(/\./).each do |selector|

    selector = selector.to_i if selector =~ /^\d+$/

    if value = access(data, selector)
      data = value
    else
      return nil
    end
  end

  if @dot_options && @dot_options[:autodot]
    extend_result!(data)
    data.each{|e| extend_result!(e) } if data.kind_of? Array
  end

  data
end
dot_options(options) click to toggle source
# File lib/dot_notation.rb, line 32
def dot_options(options)
  @dot_options = (@dot_options || {}).merge(options)
end

Private Instance Methods

access(data, selector) click to toggle source
# File lib/dot_notation.rb, line 47
def access(data, selector)
  if defined?(ActiveRecord::Base) && data.kind_of?(ActiveRecord::Base)
    access_active_record(data, selector)
  else
    access_generic(data, selector)
  end
end
access_active_record(data, selector) click to toggle source
# File lib/dot_notation.rb, line 55
def access_active_record(data, selector)
  selsym = selector.respond_to?(:to_sym) ? selector.to_sym : nil
  if selsym && data.respond_to?(selsym)
    data.send(selsym)
  else
    access_generic(data, selector)
  end
end
access_generic(data, selector) click to toggle source
# File lib/dot_notation.rb, line 64
def access_generic(data, selector)
  if data[selector]
    data[selector]
  else
    selsym = selector.respond_to?(:to_sym) ? selector.to_sym : nil
    if selsym && data[selsym]
      data[selsym]
    else
      nil
    end
  end
end
extend_result!(result) click to toggle source
# File lib/dot_notation.rb, line 38
def extend_result!(result)
  begin
    result.extend(DotNotation)
    result.dot_options(@dot_options)
  rescue TypeError
    # ignore, we get this when trying to extend an int or something
  end
end