class I18n::Processes::Data::FileSystemBase

Constants

DEFAULTS
ROUTER_NAME_ALIASES

Attributes

base_locale[R]
config[R]
locales[RW]
router[W]

Public Class Methods

new(config = {}) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 23
def initialize(config = {})
  self.config  = config.except(:base_locale, :locales)
  @base_locale = config[:base_locale]
  locales = config[:locales].presence
  @locales = LocaleList.normalize_locale_list(locales || available_locales, base_locale, true)
  if locales.present?
    log_verbose "locales read from config #{@locales * ', '}"
  else
    log_verbose "locales inferred from data: #{@locales * ', '}"
  end
end

Public Instance Methods

[](locale)
Alias for: get
[]=(locale, tree)
Alias for: set
available_locales() click to toggle source

Get available locales from the list of file names to read

# File lib/i18n/processes/data/file_system_base.rb, line 120
def available_locales
  @available_locales ||= begin
    locales = Set.new
    Array(config[:read]).map do |pattern|
      [pattern, Dir.glob(format(pattern, locale: '*'))] if pattern.include?('%{locale}')
    end.compact.each do |pattern, paths|
      p  = pattern.gsub('\\', '\\\\').gsub('/', '\/').gsub('.', '\.')
      p  = p.gsub(/(\*+)/) { Regexp.last_match(1) == '**' ? '.*' : '[^/]*?' }.gsub('%{locale}', '([^/.]+)')
      re = /\A#{p}\z/
      paths.each do |path|
        locales << Regexp.last_match(1) if re =~ path
      end
    end
    locales
  end
end
config=(config) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 143
def config=(config)
  @config = DEFAULTS.deep_merge((config || {}).reject { |_k, v| v.nil? })
  reload
end
external(locale) click to toggle source

@param [String, Symbol] locale @return [::I18n::Processes::Data::Siblings]

# File lib/i18n/processes/data/file_system_base.rb, line 47
def external(locale)
  locale = locale.to_s
  @external ||= {}
  @external[locale] ||= read_locale(locale, paths: config[:external])
end
get(locale) click to toggle source

@param [String, Symbol] locale @return [::I18n::Processes::Data::Siblings]

# File lib/i18n/processes/data/file_system_base.rb, line 37
def get(locale)
  locale = locale.to_s
  @trees ||= {}
  @trees[locale] ||= read_locale(locale)
end
Also aliased as: []
merge!(forest) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 88
def merge!(forest)
  ## forest is a sibling
  forest.inject(Tree::Siblings.new) do |result, root|
    # root is a node, merge is a sibling
    locale = root.key
    merged = get(locale).merge(root)
    $stderr.puts Rainbow("root: #{root}").green
    $stderr.puts Rainbow("locale: #{locale}").green
    $stderr.puts Rainbow("merged: #{merged}").green
    set locale, merged
    result.merge! merged
  end
end
non_normalized_paths(locale) click to toggle source

@param [String] locale @return [Array<String>] paths to files that are not normalized

# File lib/i18n/processes/data/file_system_base.rb, line 78
def non_normalized_paths(locale)
  router.route(locale, get(locale))
        .reject { |path, tree_slice| normalized?(path, tree_slice) }
        .map(&:first)
end
reload() click to toggle source

@return self

# File lib/i18n/processes/data/file_system_base.rb, line 113
def reload
  @trees             = nil
  @available_locales = nil
  self
end
remove_by_key!(forest) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 102
def remove_by_key!(forest)
  forest.inject(Tree::Siblings.new) do |removed, root|
    locale = root.key
    locale_data = get(locale)
    subtracted = locale_data.subtract_by_key(forest)
    set locale, subtracted
    removed.merge! locale_data.subtract_by_key(subtracted)
  end
end
router() click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 160
def router
  @router ||= begin
    name = @config[:router].presence || 'conservative_router'
    name = ROUTER_NAME_ALIASES[name] || name
    router_class = ActiveSupport::Inflector.constantize(name)
    router_class.new(self, @config.merge(base_locale: base_locale, locales: locales))
  end
end
set(locale, tree) click to toggle source

set locale tree @param [String, Symbol] locale @param [::I18n::Processes::Data::Siblings] tree

# File lib/i18n/processes/data/file_system_base.rb, line 56
def set(locale, tree)
  locale = locale.to_s
  @trees.delete(locale) if @trees
  paths_before = Set.new(get(locale)[locale].leaves.map { |node| node.data[:path] })
  paths_after = Set.new([])
  # $stderr.puts Rainbow("locale: #{locale}").green
  # $stderr.puts Rainbow("tree: #{tree.class}").green
  router.route locale, tree do |path, tree_slice|
    paths_after << path
    write_tree path, tree_slice
  end
  (paths_before - paths_after).each do |path|
    FileUtils.remove_file(path) if File.exist?(path)
  end
  @trees.delete(locale) if @trees
  @available_locales = nil
end
Also aliased as: []=
t(key, locale) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 137
def t(key, locale)
  tree = self[locale.to_s]
  return unless tree
  tree[locale][key].try(:value_or_children_hash)
end
with_router(router) { || ... } click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 148
def with_router(router)
  router_was  = self.router
  self.router = router
  yield
ensure
  self.router = router_was
end
write(forest) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 84
def write(forest)
  forest.each { |root| set(root.key, root.to_siblings) }
end

Protected Instance Methods

filter_nil_keys!(path, data, suffix = []) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 185
      def filter_nil_keys!(path, data, suffix = [])
        data.each do |key, value|
          if key.nil?
            data.delete(key)
            log_warn <<-TEXT
Skipping a nil key found in #{path.inspect}:
  key: #{suffix.join('.')}.`nil`
  value: #{value.inspect}
Nil keys are not supported by i18n.
The following unquoted YAML keys result in a nil key:
  #{%w[null Null NULL ~].join(', ')}
See http://yaml.org/type/null.html
TEXT
          elsif value.is_a?(Hash)
            filter_nil_keys! path, value, suffix + [key]
          end
        end
      end
read_locale(locale, paths: config[:read]) click to toggle source
# File lib/i18n/processes/data/file_system_base.rb, line 172
def read_locale(locale, paths: config[:read])
  Array(paths).flat_map do |path|
    Dir.glob format(path, locale: locale)
  end.map do |path|
    [path.freeze, load_file(path) || {}]
  end.map do |path, data|
    filter_nil_keys! path, data
    Data::Tree::Siblings.from_nested_hash(data).tap do |s|
      s.leaves { |x| x.data.update(path: path, locale: locale) }
    end
  end.reduce(Tree::Siblings[locale => {}], :merge!)
end