Class: Yerba::Map

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/yerba/map.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document_or_hash = nil, selector = nil, location = nil, key = nil) ⇒ Map

Returns a new instance of Map.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/yerba/map.rb', line 9

def initialize(document_or_hash = nil, selector = nil, location = nil, key = nil)
  if document_or_hash.is_a?(Document)
    @document = document_or_hash
    @selector = selector
    @location = location
    @key = key
    @data = nil
  elsif document_or_hash.is_a?(Hash)
    @document = nil
    @selector = nil
    @location = nil
    @data = document_or_hash
  else
    @document = nil
    @selector = nil
    @location = nil
    @data = {}
  end
end

Instance Attribute Details

#keyObject (readonly)

Returns the value of attribute key.



7
8
9
# File 'lib/yerba/map.rb', line 7

def key
  @key
end

#locationObject (readonly)

Returns the value of attribute location.



7
8
9
# File 'lib/yerba/map.rb', line 7

def location
  @location
end

#selectorObject (readonly)

Returns the value of attribute selector.



7
8
9
# File 'lib/yerba/map.rb', line 7

def selector
  @selector
end

Instance Method Details

#[](key) ⇒ Object



29
30
31
32
33
34
35
36
# File 'lib/yerba/map.rb', line 29

def [](key)
  if @document
    new_path = @selector.empty? ? key.to_s : "#{@selector}.#{key}"
    @document[new_path]
  else
    @data[key]
  end
end

#[]=(key, value) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/yerba/map.rb', line 38

def []=(key, value)
  if @document
    new_path = @selector.empty? ? key.to_s : "#{@selector}.#{key}"
    @document.set(new_path, value)
  else
    @data[key] = value
  end
end

#delete(key = nil) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/yerba/map.rb', line 94

def delete(key = nil)
  if key && @document
    new_path = @selector.empty? ? key.to_s : "#{@selector}.#{key}"
    @document.delete(new_path)
  elsif @document
    @document.delete(@selector)
  else
    @data.delete(key)
  end

  self
end

#dig(*keys) ⇒ Object



85
86
87
88
89
90
91
92
# File 'lib/yerba/map.rb', line 85

def dig(*keys)
  if @document
    result = keys.reduce(self) { |node, key| node.nil? ? nil : node[key] }
    result&.value
  else
    @data.dig(*keys)
  end
end

#eachObject



75
76
77
78
79
80
81
82
83
# File 'lib/yerba/map.rb', line 75

def each(&)
  return enum_for(:each) unless block_given?

  if @document
    keys.each { |key| yield key, self[key] }
  else
    @data.each(&)
  end
end

#insert(key, value, before: nil, after: nil) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/yerba/map.rb', line 47

def insert(key, value, before: nil, after: nil)
  if @document
    new_path = @selector.empty? ? key.to_s : "#{@selector}.#{key}"
    @document.insert(new_path, value.to_s, before: before, after: after)
  else
    @data[key] = value
  end

  self
end

#inspectObject



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/yerba/map.rb', line 139

def inspect
  if @document
    results = @document.find(@selector)

    if results.is_a?(Array) && !results.empty? && results.first.is_a?(Hash)
      map_keys = results.first.keys.first(5)
      preview = map_keys.map { |key| "#{key}: #{results.first[key].inspect}" }.join(", ")

      "#<Yerba::Map selector=#{@selector.inspect} {#{preview}}>"
    else
      "#<Yerba::Map selector=#{@selector.inspect}>"
    end
  else
    "#<Yerba::Map {#{@data.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")}}>"
  end
end

#key?(key) ⇒ Boolean Also known as: has_key?, include?

Returns:

  • (Boolean)


107
108
109
110
111
112
113
114
# File 'lib/yerba/map.rb', line 107

def key?(key)
  if @document
    new_path = @selector.empty? ? key.to_s : "#{@selector}.#{key}"
    @document.exists?(new_path)
  else
    @data.key?(key)
  end
end

#keysObject



64
65
66
67
68
69
70
71
72
73
# File 'lib/yerba/map.rb', line 64

def keys
  if @document
    results = @document.find(@selector)
    return [] unless results.is_a?(Array) && results.first.is_a?(Hash)

    results.first.keys
  else
    @data.keys
  end
end

#sort_keys(order) ⇒ Object



58
59
60
61
62
# File 'lib/yerba/map.rb', line 58

def sort_keys(order)
  @document&.sort_keys(@selector, order)

  self
end

#to_hObject Also known as: to_hash



122
123
124
125
126
127
128
129
# File 'lib/yerba/map.rb', line 122

def to_h
  if @document
    results = @document.find(@selector)
    results&.first || {}
  else
    @data
  end
end

#to_yamlObject



132
133
134
135
136
137
# File 'lib/yerba/map.rb', line 132

def to_yaml
  to_hash.map do |key, val|
    formatted = format_value(val)
    "#{key}: #{formatted}"
  end.join("\n")
end

#valueObject



118
119
120
# File 'lib/yerba/map.rb', line 118

def value
  @data || nil
end