lib/enum_ish/dictionary.rb in enum_ish-1.4.0 vs lib/enum_ish/dictionary.rb in enum_ish-1.4.1
- old
+ new
@@ -1,67 +1,72 @@
module EnumIsh
class Dictionary
def initialize(klass, enum, options = {})
@klass = klass
- @dict = load(enum, options)
+ @enum = enum
+ @options = options
+ @dict = load_dict
end
def translate_value(value)
if value.is_a?(Array)
value.map { |v| @dict[v] || v }
else
@dict[value] || value
end
- end
+ end
def translate_options
@dict.to_a.map { |value, label| [label, value] }
end
private
- def load(enum, options)
- dict = translate_dict(enum, options)
- filter(dict, options)
- end
+ def load_dict
+ i18n = load_from_i18n.transform_keys { |k| k.to_s.to_sym }
- def translate_dict(enum, options)
- dict = load_dict(enum, options)
- translated = enum.mapping.map { |k, v| dict[k] ? [k, dict[k]] : [k, v.to_s] }.to_h
- translated = translated.map { |k, v| [enum.mapping[k], v] }.to_h unless enum.setting[:accessor]
- translated
- end
+ 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
- def load_dict(enum, options)
- key = i18n_key(enum, options)
- dict = I18n.t("enum_ish.#{@klass.name.to_s.underscore}.#{key}", **i18n_options(enum, options))
- dict.map { |k, v| [k.to_s.to_sym, v.to_s] }.to_h
+ filter(dict)
end
- def i18n_key(enum, options)
- [enum.name, options[:format]].compact.join('/')
- end
+ def load_from_i18n
+ key = [@enum.name, @options[:format]].compact.join('/')
+ options = (@options[:i18n_options] || {}).merge(default: nil)
+ dict = I18n.t(:"enum_ish.#{@klass.name.underscore}.#{key}", **options)
+ return dict if dict
- def i18n_options(enum, options)
- key = i18n_key(enum, options)
- opts = options[:i18n_options] || {}
- opts.merge(default: i18n_ancestors(key) + [:"enum_ish.defaults.#{key}", enum.mapping.invert])
+ i18n_ancestors.each do |ancestor|
+ dict = I18n.t(:"enum_ish.#{ancestor.name.underscore}.#{key}", **options)
+ return dict if dict
+ end
+
+ dict = I18n.t(:"enum_ish.defaults.#{key}", **options)
+ return dict if dict
+
+ @enum.mapping.invert
end
- def i18n_ancestors(key)
- ancestors = @klass.ancestors.drop(1).select { |a| a.is_a?(Class) && !a.name.empty? }
- ancestors.map { |a| :"enum_ish.#{a.name.underscore}.#{key}" }
+ def i18n_ancestors
+ @klass.ancestors.drop(1)
+ .take_while { |a| a.name != 'ActiveRecord::Base' && a.name != 'Object' }
+ .select { |a| a.is_a?(Class) && !a.name.empty? }
end
- def filter(translated, options)
- if options[:except]
- except = Array(options[:except])
- translated.reject! { |k, v| except.include?(k) }
+ 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])
- translated.select! { |k, v| only.include?(k) }
+ if @options[:only]
+ only = Array(@options[:only])
+ dict.select! { |k, v| only.include?(k) }
end
- translated
+ dict
end
end
end