Sha256: 0a56752a8aac3e586083508f98f91b967f33fa59620550830451763c7b6fb8a9

Contents?: true

Size: 1.98 KB

Versions: 15

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

require 'i18n/tasks/key_pattern_matching'
require 'i18n/tasks/data/tree/node'

module I18n::Tasks
  module Data::Router
    # Route based on key name
    class PatternRouter
      include ::I18n::Tasks::KeyPatternMatching

      attr_reader :routes
      # @option data_config write [Array] of routes
      # @example
      #   {write:
      #     # keys matched top to bottom
      #     [['devise.*', 'config/locales/devise.%{locale}.yml'],
      #     # default catch-all (same as ['*', 'config/locales/%{locale}.yml'])
      #     'config/locales/%{locale}.yml']}
      def initialize(_adapter, data_config)
        @routes_config = data_config[:write]
        @routes = compile_routes @routes_config
      end

      # Route keys to destinations
      # @param forest [I18n::Tasks::Data::Tree::Siblings] forest roots are locales.
      # @yieldparam [String] dest_path
      # @yieldparam [I18n::Tasks::Data::Tree::Siblings] tree_slice
      # @return [Hash] mapping of destination => [ [key, value], ... ]
      def route(locale, forest, &block)
        return to_enum(:route, locale, forest) unless block
        locale = locale.to_s
        out = {}
        forest.keys do |key, _node|
          pattern, path = routes.detect { |route| route[0] =~ key }
          if pattern
            key_match = $~
            path      = format(path, locale: locale)
            path.gsub!(/\\\d+/) { |m| key_match[m[1..-1].to_i] }
            (out[path] ||= Set.new) << "#{locale}.#{key}"
          else
            fail CommandError, "Cannot route key #{key}. Routes are #{@routes_config.inspect}"
          end
        end
        out.each do |dest, keys|
          block.yield dest,
                      forest.select_keys(root: true) { |key, _| keys.include?(key) }
        end
      end

      private

      def compile_routes(routes)
        routes.map { |x| x.is_a?(String) ? ['*', x] : x }.map do |x|
          [compile_key_pattern(x[0]), x[1]]
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
i18n-tasks-0.9.33 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.32 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.31 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.30 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.29 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.28 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.27 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.26 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.25 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.24 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.23 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.22 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.21 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.20 lib/i18n/tasks/data/router/pattern_router.rb
i18n-tasks-0.9.19 lib/i18n/tasks/data/router/pattern_router.rb