class AbstractBuilder
Public Class Methods
cache_store!(cache_store)
click to toggle source
# File lib/abstract_builder.rb, line 9 def self.cache_store!(cache_store) @@cache_store = cache_store end
format_key!(&block)
click to toggle source
# File lib/abstract_builder.rb, line 13 def self.format_key!(&block) @@format_key = block end
ignore_value!(&block)
click to toggle source
# File lib/abstract_builder.rb, line 17 def self.ignore_value!(&block) @@ignore_value = block end
new()
click to toggle source
# File lib/abstract_builder.rb, line 21 def initialize @format_key = @@format_key @ignore_value = @@ignore_value @cache_store = @@cache_store @lazy_cache = LazyCache.new(@@cache_store) @stack = [] end
Public Instance Methods
array!(key, collection, &block)
click to toggle source
# File lib/abstract_builder.rb, line 66 def array!(key, collection, &block) values = collection.map do |item| builder = _inherit block.call(builder, item) builder.data! end set! key, values end
block!(key, &block)
click to toggle source
# File lib/abstract_builder.rb, line 58 def block!(key, &block) builder = _inherit block.call(builder) value = builder.data! set! key, value unless value.empty? end
cache!(cache_key, options = {}, &block)
click to toggle source
# File lib/abstract_builder.rb, line 76 def cache!(cache_key, options = {}, &block) cache_key = _compute_cache_key(cache_key) @lazy_cache.add(cache_key, options) do builder = _inherit block.call(builder) builder.data! end end
cache_store!(cache_store)
click to toggle source
# File lib/abstract_builder.rb, line 37 def cache_store!(cache_store) @cache_store = cache_store @lazy_cache = LazyCache.new(cache_store) end
call(object, *keys)
click to toggle source
# File lib/abstract_builder.rb, line 52 def call(object, *keys) keys.each do |key| set! key, object.public_send(key) end end
data!()
click to toggle source
# File lib/abstract_builder.rb, line 86 def data! data = {} @stack.each do |(key, value)| key = _format_key(key) data[key] = value unless _ignore_value?(value) end @lazy_cache.resolve.each do |value| data.merge!(value) end data end
format_key!(&block)
click to toggle source
# File lib/abstract_builder.rb, line 29 def format_key!(&block) @format_key = block end
ignore_value!(&block)
click to toggle source
# File lib/abstract_builder.rb, line 33 def ignore_value!(&block) @ignore_value = block end
merge!(value)
click to toggle source
# File lib/abstract_builder.rb, line 46 def merge!(value) value.each_pair do |key, value| set! key, value end end
method_missing(*args, &block)
click to toggle source
# File lib/abstract_builder.rb, line 101 def method_missing(*args, &block) if args.length == 2 && block array!(args[0], args[1], &block) elsif args.length == 1 && block block!(args[0], &block) elsif args.length == 2 set!(args[0], args[1]) else raise ArgumentError, <<~EOF.chomp Expected 1 argument without a block, 0 arguments with a block or 1 argument with a block. This is `AbstractBuilder#set!', `AbstractBuilder#block!' or `AbstractBuilder#array!' signatures, example: builder.content post.content builder.meta do |meta_builder| meta_builder.hashtags post.hashtags end builder.comments post.comments do |comment_builder, comment| comment_builder.content comment.content end Received `#{args[0]}' with #{args.length - 1} argument#{'s' if args.length > 2} #{block ? "with a block" : "without a block"}. EOF end end
set!(key, value)
click to toggle source
# File lib/abstract_builder.rb, line 42 def set!(key, value) @stack << [key, value] end
Private Instance Methods
_compute_cache_key(cache_key)
click to toggle source
# File lib/abstract_builder.rb, line 143 def _compute_cache_key(cache_key) [:abstract_builder, :v1, cache_key] end
_format_key(key)
click to toggle source
# File lib/abstract_builder.rb, line 131 def _format_key(key) @format_key ? @format_key.call(key) : key end
_ignore_value?(value)
click to toggle source
# File lib/abstract_builder.rb, line 147 def _ignore_value?(value) @ignore_value && @ignore_value.call(value) end
_inherit()
click to toggle source
# File lib/abstract_builder.rb, line 135 def _inherit builder = self.class.new builder.format_key!(&@format_key) builder.ignore_value!(&@ignore_value) builder.cache_store!(@cache_store) builder end