Sha256: ed3d5c2ccb6ad3408ee67be7e3fc503d9092bdc41658de5ee6122c1d0cd1795e

Contents?: true

Size: 1.97 KB

Versions: 1

Compression:

Stored size: 1.97 KB

Contents

module Transcriber
  class Resource
    extend  Builder
    extend  Parser
    include Response
    include Serialization

    cattr_accessor :id_key
    cattr_writer   :resource_name

    def initialize(attrs = {})
      return if attrs.nil? or attrs.empty?

      attrs = attrs.with_indifferent_access

      self.class.keys.each do |key|
        __send__("#{key.name}=", key.from_hash(attrs[key.name])) if key.present?(self)
      end
    end

    def self.keys
      @keys ||= []
    end

    def self.summarized_keys
      @summarized_keys ||= []
    end

    def self.relations
      @keys.find_all {|k| k.kind_of?(Relation)}
    end

    def self.resource_name(custom_name = nil)
      @resource_name ||= custom_name or to_s.demodulize.tableize
    end

    def self.convert_input_keys(converter = nil)
      @convert_input_keys = converter if converter
      @convert_input_keys
    end

    def resource_id
      __send__(id_key.name)
    end

    def self.method_added(method_name)
      return unless not_allowed_names.include?(method_name.to_s)
      puts "warning: redefining '#{method_name}' may cause serious problems"
    end

    def self.not_allowed_names
      %w(resource_id resource link)
    end

    def to_input(options = {})
      input = {}
      keys_to_input(options).each do |key|
        value = __send__("#{key.name}")
        parsed_value = key.to_input(value, options.fetch(key.name, {}))
        path = key.input_path

        if path.any?
          last = path.pop
          key_input = path.inject(input) {|buffer, key| buffer[key] = {}; buffer[key]}
          key_input[last] = parsed_value
        else
          input.merge!(parsed_value)
        end
      end
      input.with_indifferent_access
    end

    private

    def keys_to_input(options)
      self.class.keys.clone.tap do |keys|
        keys.reject! {|k| k.kind_of?(Relation)} unless options.fetch(:relations, true)
        keys.reject! {|k| Array(options[:without]).include?(k.name)}
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
transcriber-0.0.14 lib/transcriber/resource.rb