Sha256: b2698961c6da98271ae93636d3eac50d65350764a2d9ad78de767eeca4b9a463

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

module TarvitHelpers
  module HashPresenter

    class Simple
      require 'active_support/core_ext/string'

      attr_reader :_hash, :_levels, :_parent

      def initialize(hash, levels=[], parent=nil)
        @_hash = _prepare_keys(hash)
        @_levels = levels
        @_parent = parent
      end

      def method_missing(m, *args)
        return _value(m) if _accessor_method?(m)
        super
      end

      protected

      def _value(method_name)
        _transform_value(method_name, _hash_value(method_name))
      end

      def _hash_value(method_name)
        _hash[method_name]
      end

      def _transform_value(method_name, value)
        return value.map{|key| _transform_value(method_name, key) } if value.is_a?(Array)
        value.is_a?(Hash) ? _new_level_presenter(value, method_name) : value
      end

      def _accessor_method?(method_name)
        self._hash.keys.include?(method_name)
      end

      def _key_to_method(key)
        key.to_s.gsub(/\s+/, ?_).underscore.to_sym
      end

      def _prepare_keys(hash)
        res = hash.map do |k ,v|
          [ _key_to_method(k), v ]
        end
        Hash[res]
      end

      def _path(key)
        _levels + [ key ]
      end

      def _new_level_presenter(value, method_name)
        self.class.new(value, _path(method_name), self)
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tarvit-helpers-0.0.20 lib/tarvit-helpers/modules/hash_presenter/simple.rb
tarvit-helpers-0.0.19 lib/tarvit-helpers/modules/hash_presenter/simple_hash_presenter.rb