Sha256: cb191811a985cc20385020f826f60a78c460c14b85bdb6740c4363c4b9389c2e

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

module EnumIsh
  class DictionaryLookup
    def initialize(klass, enum, options = {})
      @klass = klass
      @enum = enum
      @options = options
    end

    def call
      i18n = lookup_for(@klass).transform_keys { |k| k.to_s.to_sym }

      dict = {}
      if @enum.use?(:accessor)
        @enum.mapping.each { |k, v| dict[k] = i18n[k] }
      else
        @enum.mapping.each { |k, v| dict[v] = i18n[k] }
      end

      filter(dict)
    end

    private

    def lookup_for(klass)
      if klass.name.blank? || !klass.is_a?(Class)
        return lookup_for(klass.superclass)
      end

      key = [@enum.name, @options[:format]].compact.join('/')
      options = (@options[:i18n_options] || {}).merge(default: nil)

      if klass.name.to_s.in?(['ActiveRecord::Base', 'Object'])
        I18n.t(:"enum_ish.defaults.#{key}", **options) || @enum.mapping
      else
        I18n.t(:"enum_ish.#{klass.name.underscore}.#{key}", **options) || lookup_for(klass.superclass)
      end
    end

    def filter(dict)
      if @options[:except]
        except = Array(@options[:except])
        dict.reject! { |k, v| except.include?(k) }
      end
      if @options[:only]
        only = Array(@options[:only])
        dict.select! { |k, v| only.include?(k) }
      end
      dict
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
enum_ish-1.6.1 lib/enum_ish/dictionary_lookup.rb
enum_ish-1.6.0 lib/enum_ish/dictionary_lookup.rb