Class: Text::Gen::Store

Inherits:
Object
  • Object
show all
Defined in:
lib/text/gen/store.rb

Overview

Store is a local cache of a builder that is persistent per store to save time on database lookups or transformations.

Constant Summary collapse

NOT_FOUND_BUILDER =
{
  "strategy" => "sample",
  "filters" => [],
  "meta" => {},
  "items" => []
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(lookup) ⇒ Store

Returns a new instance of Store.



15
16
17
18
# File 'lib/text/gen/store.rb', line 15

def initialize(lookup)
  @lookup = lookup
  @store = {}
end

Instance Method Details

#add(key, builder) ⇒ Object



24
25
26
27
# File 'lib/text/gen/store.rb', line 24

def add(key, builder)
  @store[key.to_s.downcase] = builder
  builder
end

#clear(key) ⇒ Object



29
30
31
# File 'lib/text/gen/store.rb', line 29

def clear(key)
  @store.delete(key.to_s.downcase)
end

#fetch(key) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/text/gen/store.rb', line 33

def fetch(key)
  builder = find(key)
  return builder if builder

  keys = key.split("+")
  builders = keys.map do |key|
    builder = @lookup.call(key)
    builder = not_found(key) unless builder
    builder
  end

  builder = merge_builders(builders) if builders.length > 1
  add(key, builder.merge("key" => key.to_s.downcase))
end

#find(key) ⇒ Object



20
21
22
# File 'lib/text/gen/store.rb', line 20

def find(key)
  @store[key.to_s.downcase]
end

#merge_builders(builders) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/text/gen/store.rb', line 48

def merge_builders(builders)
  all_filters = builders.map { |b| b["filters"] }.flatten
  all_meta = builders.inject({}) { |b, acc| acc = Text::Gen::Meta.merge_meta(acc, b["meta"]) }
  all_items = builders.map { |b| b["items"] }.flatten
  strategy = builders.all? {|b| b["strategy"] == "weighted" } ? "weighted" : "sample"
  {
    "strategy" => strategy,
    "filters" => all_filters,
    "meta" => all_meta,
    "items" => all_items,
  }
end

#not_found(key) ⇒ Object



61
62
63
64
65
# File 'lib/text/gen/store.rb', line 61

def not_found(key)
  hsh = NOT_FOUND_BUILDER.dup
  hsh["key"] = key
  hsh
end

#to_hObject



67
68
69
# File 'lib/text/gen/store.rb', line 67

def to_h
  @store
end