lib/i18n/tasks/missing_keys.rb in i18n-tasks-0.4.5 vs lib/i18n/tasks/missing_keys.rb in i18n-tasks-0.5.0
- old
+ new
@@ -1,61 +1,56 @@
# coding: utf-8
module I18n::Tasks
module MissingKeys
+ def missing_keys_types
+ @missing_keys_types ||= [:missing_from_base, :eq_base, :missing_from_locale]
+ end
+
# @param [:missing_from_base, :missing_from_locale, :eq_base] type (default nil)
- # @return [KeyGroup]
+ # @return [Siblings]
def missing_keys(opts = {})
locales = Array(opts[:locales]).presence || self.locales
- type = opts[:type]
- unless type
- types = opts[:types].presence || missing_keys_types
- opts = opts.except(:types).merge(locales: locales)
- return types.map { |t| missing_keys(opts.merge(type: t)) }.reduce(:+)
- end
+ types = Array(opts[:type] || opts[:types].presence || missing_keys_types)
- if type.to_s == 'missing_from_base'
- keys = keys_missing_from_base if locales.include?(base_locale)
- else
- keys = non_base_locales(locales).map { |locale|
- send("keys_#{type}", locale)
- }.reduce(:+)
- end
- keys || KeyGroup.new([])
+ types.map { |type|
+ case type.to_s
+ when 'missing_from_base'
+ missing_tree(base_locale) if locales.include?(base_locale)
+ when 'missing_from_locale'
+ non_base_locales(locales).map { |locale| missing_tree(locale) }.reduce(:merge!)
+ when 'eq_base'
+ non_base_locales(locales).map { |locale| eq_base_tree(locale) }.reduce(:merge!)
+ end
+ }.compact.reduce(:merge!)
end
- def missing_keys_types
- @missing_keys_types ||= [:missing_from_base, :eq_base, :missing_from_locale]
- end
-
- # @return [KeyGroup] missing keys, i.e. key that are in the code but are not in the base locale data
- def keys_missing_from_base
- @keys_missing_from_base ||= begin
- keys = used_keys.keys.reject { |k|
- key = k.key
- k.expr? || key_value?(key, base_locale) || ignore_key?(key, :missing)
- }.map(&:clone_orphan)
- KeyGroup.new keys, type: :missing_from_base, locale: base_locale
+ def missing_tree(locale, compared_to = base_locale)
+ if locale == compared_to
+ # keys used, but not present in locale
+ set_locale_tree_type used_tree.select_keys { |key, node|
+ !(key_expression?(key) || key_value?(key, locale) || ignore_key?(key, :missing))
+ }, locale, :missing_from_base
+ else
+ # keys present in compared_to, but not in locale
+ collapse_plural_nodes! set_locale_tree_type data[compared_to].select_keys { |key, node|
+ !key_value?(key, locale) && !ignore_key?(key, :missing)
+ }, locale, :missing_from_locale
end
end
- # @return [KeyGroup] keys missing (nil or blank?) in locale but present in base
- def keys_missing_from_locale(locale)
- return keys_missing_from_base if locale == base_locale
- @keys_missing_from_locale ||= {}
- @keys_missing_from_locale[locale] ||= begin
- keys = missing_tree(locale).key_names.map { |key| depluralize_key(key, locale) }.uniq
- KeyGroup.new keys, type: :missing_from_locale, locale: locale
- end
+ def eq_base_tree(locale, compare_to = base_locale)
+ base = data[compare_to].first.children
+ set_locale_tree_type data[locale].select_keys(root: false) { |key, node|
+ other_node = base[key]
+ other_node && node.value == other_node.value && !ignore_key?(key, :eq_base, locale)
+ }, locale, :eq_base
end
- # @return [KeyGroup] keys missing value (but present in base)
- def keys_eq_base(locale)
- @keys_eq_base ||= {}
- @keys_eq_base[locale] ||= begin
- keys = data[base_locale].keys(root: false).map { |key, node|
- key if node.value == t(key, locale) && !ignore_key?(key, :eq_base, locale)
- }.compact
- KeyGroup.new keys, type: :eq_base, locale: locale
- end
+ def set_locale_tree_type(tree, locale, type)
+ tree.siblings { |root|
+ root.key = locale
+ }.leaves { |node|
+ node.data[:type] = type
+ }
end
end
end