class Fusuma::Config::Searcher
Search config.yml
Attributes
context[R]
Public Class Methods
new()
click to toggle source
# File lib/fusuma/config/searcher.rb, line 8 def initialize @cache = nil end
Private Class Methods
conditions(&block)
click to toggle source
@return [Hash]
# File lib/fusuma/config/searcher.rb, line 80 def conditions(&block) { nothing: -> { block.call }, skip: -> { Config::Searcher.skip { block.call } } } end
fallback(&block)
click to toggle source
switch context for fallback
# File lib/fusuma/config/searcher.rb, line 149 def fallback(&block) @fallback = true result = block.call @fallback = false result end
fallback?()
click to toggle source
# File lib/fusuma/config/searcher.rb, line 140 def fallback? @fallback end
find_condition(&block)
click to toggle source
Execute block with all conditions @return [Array<Symbol, Object>]
# File lib/fusuma/config/searcher.rb, line 96 def find_condition(&block) conditions(&block).find do |c, l| result = l.call return [c, result] if result nil end end
find_context(request_context, &block)
click to toggle source
Return a matching context from config @params request_context [Hash] @return [Hash]
# File lib/fusuma/config/searcher.rb, line 118 def find_context(request_context, &block) # Search in blocks in the following order. # 1. complete match config[:context] == request_context # 2. partial match config[:context] =~ request_context # 3. no context Config.instance.keymap.each do |config| next unless config[:context] == request_context return config[:context] if with_context(config[:context]) { block.call } end if request_context.keys.size > 1 Config.instance.keymap.each do |config| next if config[:context].nil? next unless config[:context].all? { |k, v| request_context[k] == v } return config[:context] if with_context(config[:context]) { block.call } end end return {} if with_context({}) { block.call } end
skip(&block)
click to toggle source
# File lib/fusuma/config/searcher.rb, line 156 def skip(&block) @skip = true result = block.call @skip = false result end
skip?()
click to toggle source
# File lib/fusuma/config/searcher.rb, line 144 def skip? @skip end
with_condition(condition, &block)
click to toggle source
Execute block with specified conditions @param conidtion [Symbol] @return [Object]
# File lib/fusuma/config/searcher.rb, line 90 def with_condition(condition, &block) conditions(&block)[condition].call end
with_context(context, &block)
click to toggle source
Search with context from load_streamed Config
@param context [Hash] @return [Object]
# File lib/fusuma/config/searcher.rb, line 108 def with_context(context, &block) @context = context || {} result = block.call @context = {} result end
Public Instance Methods
cache(key) { |: nil| ... }
click to toggle source
# File lib/fusuma/config/searcher.rb, line 56 def cache(key) @cache ||= {} key = key.join(',') if key.is_a? Array if @cache.key?(key) @cache[key] else @cache[key] = block_given? ? yield : nil end end
search(index, location:)
click to toggle source
@param index [Index] @param location [Hash] @return [NilClass] @return [Hash] @return [Object]
# File lib/fusuma/config/searcher.rb, line 17 def search(index, location:) key = index.keys.first return location if key.nil? return nil if location.nil? return nil unless location.is_a?(Hash) next_index = Index.new(index.keys[1..-1]) value = nil next_location_cadidates(location, key).find do |next_location| value = search(next_index, location: next_location) end value end
search_with_cache(index, location:)
click to toggle source
@param index [Index] @param location [Hash] @return [NilClass] @return [Hash] @return [Object]
# File lib/fusuma/config/searcher.rb, line 50 def search_with_cache(index, location:) cache([index.cache_key, Searcher.context, Searcher.skip?, Searcher.fallback?]) do search_with_context(index, location: location, context: Searcher.context) end end
search_with_context(index, location:, context:)
click to toggle source
# File lib/fusuma/config/searcher.rb, line 34 def search_with_context(index, location:, context:) return nil if location.nil? return search(index, location: location[0]) if context == {} new_location = location.find do |conf| search(index, location: conf) if conf[:context] == context end search(index, location: new_location) end
Private Instance Methods
next_location_cadidates(location, key)
click to toggle source
next locations' candidates sorted by priority
1. look up location with key 2. skip the key and go to child location
# File lib/fusuma/config/searcher.rb, line 71 def next_location_cadidates(location, key) [ location[key.symbol], Searcher.skip? && key.skippable && location ].compact end