lib/i18n/tasks/missing_keys.rb in i18n-tasks-0.5.4 vs lib/i18n/tasks/missing_keys.rb in i18n-tasks-0.6.0
- old
+ new
@@ -1,56 +1,99 @@
# coding: utf-8
module I18n::Tasks
module MissingKeys
def missing_keys_types
- @missing_keys_types ||= [:missing_from_base, :eq_base, :missing_from_locale]
+ @missing_keys_types ||= [:used, :diff]
end
- # @param [:missing_from_base, :missing_from_locale, :eq_base] type (default nil)
+ # @param [:missing_used, :missing_diff] type (default nil)
# @return [Siblings]
def missing_keys(opts = {})
locales = Array(opts[:locales]).presence || self.locales
- types = Array(opts[:type] || opts[:types].presence || missing_keys_types)
+ types = (Array(opts[:types]).presence || missing_keys_types).map(&:to_s)
+ validate_missing_types! types
+ base = opts[:base_locale] || base_locale
+ tree = Data::Tree::Siblings.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!)
+ types.each do |type|
+ tree.merge! send(:"missing_#{type}_forest", locales, base)
+ end
+ tree
end
- def missing_tree(locale, compared_to = base_locale)
+ def eq_base_keys(opts = {})
+ locales = Array(opts[:locales]).presence || self.locales
+ (locales - [base_locale]).inject(Data::Tree::Siblings.new) { |tree, locale|
+ tree.merge! equal_values_tree(locale, base_locale)
+ }
+ end
+
+ def missing_diff_forest(locales, base = base_locale)
+ tree = Data::Tree::Siblings.new
+ # present in base but not locale
+ (locales - [base]).each { |locale|
+ tree.merge! missing_diff_tree(locale, base)
+ }
+ if locales.include?(base)
+ # present in locale but not base
+ (self.locales - [base]).each { |locale|
+ tree.merge! missing_diff_tree(base, locale).set_root_key(base)
+ }
+ end
+ tree
+ end
+
+ def missing_used_forest(locales, base = base_locale)
+ if locales.include?(base)
+ missing_used_tree(base)
+ else
+ Data::Tree::Siblings.new
+ end
+ end
+
+ def missing_tree(locale, compared_to)
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
+ missing_used_tree locale
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
+ missing_diff_tree locale, compared_to
end
end
- def eq_base_tree(locale, compare_to = base_locale)
+ # keys present in compared_to, but not in locale
+ def missing_diff_tree(locale, compared_to = base_locale)
+ data[compared_to].select_keys { |key, _node|
+ locale_key_missing?(locale, key)
+ }.set_root_key(locale, type: :missing_diff).tap { |t| collapse_plural_nodes!(t) }
+ end
+
+ # keys used in the code missing translations in locale
+ def missing_used_tree(locale)
+ used_tree.select_keys { |key, _node|
+ !key_expression?(key) && locale_key_missing?(locale, key)
+ }.set_root_key(locale, type: :missing_used)
+ end
+
+ def equal_values_tree(locale, compare_to = base_locale)
base = data[compare_to].first.children
- set_locale_tree_type data[locale].select_keys(root: false) { |key, node|
+ 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
+ }.set_root_key(locale, type: :eq_base)
end
- def set_locale_tree_type(tree, locale, type)
- tree.siblings { |root|
- root.key = locale
- }.leaves { |node|
- node.data[:type] = type
- }
+ def locale_key_missing?(locale, key)
+ !key_value?(key, locale) && !ignore_key?(key, :missing)
+ end
+
+ private
+
+ def validate_missing_types!(types)
+ valid_types = missing_keys_types.map(&:to_s)
+ types = types.map(&:to_s)
+ invalid_types = types - valid_types
+ if invalid_types.present?
+ raise CommandError.new("Unknown types: #{invalid_types * ', '}. Valid types are: #{valid_types * ', '}.")
+ end
+ true
end
end
end