lib/enum_ish/dictionary.rb in enum_ish-1.5.1 vs lib/enum_ish/dictionary.rb in enum_ish-1.6.0

- old
+ new

@@ -1,16 +1,16 @@ # frozen_string_literal: true +require_relative 'dictionary_lookup' + module EnumIsh class Dictionary - CACHE_KEY = :_enum_ish_dictionary_cache - def initialize(klass, enum, options = {}) @klass = klass @enum = enum @options = options - @dict = cache { Lookup.new(@klass, @enum, @options).call } + @dict = cache { DictionaryLookup.new(@klass, @enum, @options).call } end def translate_value(value) if value.is_a?(Array) value.map { |v| @dict[v] || v } @@ -18,79 +18,22 @@ @dict[value] || value end end def translate_options - @dict.to_a.map { |value, label| [label, value] } + @dict.to_a.map { |value, text| [text, value] } end private def cache - if (cache = Thread.current[CACHE_KEY]) != nil + if (cache = EnumIsh::DictionaryCache.cache) != nil cache[I18n.locale] ||= {} cache[I18n.locale][@klass] ||= {} cache[I18n.locale][@klass][@enum] ||= {} cache[I18n.locale][@klass][@enum][@options] ||= yield else yield end - end - - class << self - def cache - Thread.current[CACHE_KEY] = {} - yield - ensure - Thread.current[CACHE_KEY] = nil - end - end - end - - class Lookup - 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.setting[:accessor] - @enum.mapping.each { |k, v| dict[k] = i18n[k].to_s } - else - @enum.mapping.each { |k, v| dict[v] = i18n[k].to_s } - end - - filter(dict) - end - - private - - def lookup_for(klass) - 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.invert - elsif klass.name.blank? || !klass.is_a?(Class) - resolve(klass.superclass) - 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