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