Class: Hash

Inherits:
Object show all
Defined in:
lib/libis/tools/extend/hash.rb

Overview

Extension class for Hash

Instance Method Summary collapse

Instance Method Details

#apply_defaults(other_hash) ⇒ Object

Apply other hash values if current value is blank



48
49
50
# File 'lib/libis/tools/extend/hash.rb', line 48

def apply_defaults(other_hash)
  self.merge(other_hash) {|_,v, w| v.blank? ? w : v}
end

#apply_defaults!(other_hash) ⇒ Object

Apply in-place other hash values if current value is blank



53
54
55
# File 'lib/libis/tools/extend/hash.rb', line 53

def apply_defaults!(other_hash)
  self.merge!(other_hash) {|_,v, w| v.blank? ? w : v}
end

#cleanupObject

Removes all hash entries for which value.empty? is true



5
6
7
# File 'lib/libis/tools/extend/hash.rb', line 5

def cleanup
  self.delete_if { |_,v| v.nil? || (v.respond_to?(:empty?) ? v.empty? : false) }
end

#key_strings_to_symbols(options = {}) ⇒ Object

Return new Hash with all keys converted to symbols.

Parameters:

  • options (Hash) (defaults to: {})

    valid options are:

    • recursive : perform operation recursively

    • upcase : convert all keys to upper case

    • downcase : convert all keys to lower case

    all options are false by default



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/libis/tools/extend/hash.rb', line 77

def key_strings_to_symbols(options = {})
  options = {resursive: false, upcase: false, downcase: false}.merge options

  r = Hash.new
  self.each_pair do |k,v|

    k = k.to_s if k.kind_of? Symbol
    if k.kind_of? String
      k = k.downcase if options[:downcase]
      k = k.upcase if options[:upcase]
      k = k.to_sym
    end

    if options[:recursive]
      case v
        when Hash
          v = v.key_strings_to_symbols options
        when Array
          # noinspection RubyResolve
          v = v.collect { |a| (a.kind_of? Hash) ? a.key_strings_to_symbols(options) :  Marshal.load(Marshal.dump(a)) }
        else
          # noinspection RubyResolve
          v = Marshal.load(Marshal.dump(v))
      end
    end

    r[k] = v

  end

  r
end

#key_strings_to_symbols!(options = {}) ⇒ Object

Convert all keys to symbols. In-place operation.

Parameters:

  • options (Hash) (defaults to: {})

    valid options are:

    • recursive : perform operation recursively

    • upcase : convert all keys to upper case

    • downcase : convert all keys to lower case

    all options are false by default



67
68
69
# File 'lib/libis/tools/extend/hash.rb', line 67

def key_strings_to_symbols!(options = {})
  self.replace self.key_strings_to_symbols options
end

#key_symbols_to_strings(options = {}) ⇒ Object

Return new Hash with all keys converted to strings. (see #key_strings_to_symbols)

Parameters:

  • options (Hash) (defaults to: {})

    valid options are:

    • recursive : perform operation recursively

    • upcase : convert all keys to upper case

    • downcase : convert all keys to lower case

    all options are false by default



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/libis/tools/extend/hash.rb', line 128

def key_symbols_to_strings(options = {})
options = {resursive: false, upcase: false, downcase: false}.merge options

  r = Hash.new
  self.each_pair do |k,v|

    k = k.to_sym if k.kind_of? String
    if k.kind_of? Symbol
      k = k.to_s
      k = k.downcase if options[:downcase]
      k = k.upcase if options[:upcase]
    end

    if options[:recursive]
      case v
        when Hash
          v = v.key_symbols_to_strings(options)
        when Array
          # noinspection RubyResolve
          v = v.collect { |a| (a.kind_of? Hash) ? a.key_symbols_to_strings(options) : Marshal.load(Marshal.dump(a)) }
        else
          # noinspection RubyResolve
          v = Marshal.load(Marshal.dump(v))
      end
    end

    r[k] = v

  end

  r
end

#key_symbols_to_strings!(options = {}) ⇒ Object

Convert all keys to strings. In-place operation. (@see #key_symbols_to_strings)

Parameters:

  • options (Hash) (defaults to: {})

    valid options are:

    • recursive : perform operation recursively

    • upcase : convert all keys to upper case

    • downcase : convert all keys to lower case

    all options are false by default



121
122
123
# File 'lib/libis/tools/extend/hash.rb', line 121

def key_symbols_to_strings!(options = {})
  self.replace self.key_symbols_to_strings options
end

#recursive_cleanupObject

Removes all hash entries for which value.empty? is true. Performed recursively.



10
11
12
13
# File 'lib/libis/tools/extend/hash.rb', line 10

def recursive_cleanup
  each { |_, v| v.recursive_cleanup if Array === v || Hash === v }
  cleanup
end

#recursive_merge(other_hash) ⇒ Object

Merges two hashes, but does so recursively.



16
17
18
19
20
21
22
23
24
# File 'lib/libis/tools/extend/hash.rb', line 16

def recursive_merge(other_hash)
  self.merge(other_hash) do |_, old_val, new_val|
    if old_val.is_a? Hash
      old_val.recursive_merge new_val
    else
      new_val
    end
  end
end

#recursive_merge!(other_hash) ⇒ Object

Merges two hashes in-place, but does so recursively.



27
28
29
30
31
32
33
34
35
# File 'lib/libis/tools/extend/hash.rb', line 27

def recursive_merge!(other_hash)
  self.merge!(other_hash) do |_, old_val, new_val|
    if old_val.is_a? Hash
      old_val.recursive_merge new_val
    else
      new_val
    end
  end
end

#reverse_merge(other_hash) ⇒ Object

Merges two hashes with priority for the first hash



38
39
40
# File 'lib/libis/tools/extend/hash.rb', line 38

def reverse_merge(other_hash)
  self.merge(other_hash) {|_,v, _| v}
end

#reverse_merge!(other_hash) ⇒ Object

Merges two hashes in-place with priority for the first hash



43
44
45
# File 'lib/libis/tools/extend/hash.rb', line 43

def reverse_merge!(other_hash)
  self.merge!(other_hash) {|_,v, _| v}
end

#stringify_keysObject



110
111
112
# File 'lib/libis/tools/extend/hash.rb', line 110

def stringify_keys
  self.transform_keys {|k| k.to_s}
end

#stringify_keys!Object



114
115
116
# File 'lib/libis/tools/extend/hash.rb', line 114

def stringify_keys!
  self.transform_keys! {|k| k.to_s}
end

#symbolize_keysObject



57
58
59
# File 'lib/libis/tools/extend/hash.rb', line 57

def symbolize_keys
  self.transform_keys {|k| k.to_sym}
end

#symbolize_keys!Object



61
62
63
# File 'lib/libis/tools/extend/hash.rb', line 61

def symbolize_keys!
  self.transform_keys! {|k| k.to_sym}
end

#transform_keysObject



161
162
163
164
165
166
167
# File 'lib/libis/tools/extend/hash.rb', line 161

def transform_keys
  result = {}
  each_key do |key|
    result[yield(key)] = self[key]
  end
  result
end

#transform_keys!Object



169
170
171
172
173
174
# File 'lib/libis/tools/extend/hash.rb', line 169

def transform_keys!
  keys.each do |key|
    self[yield(key)] = delete(key)
  end
  self
end

#transform_valuesObject



176
177
178
179
180
181
182
183
184
# File 'lib/libis/tools/extend/hash.rb', line 176

def transform_values
  return enum_for(:transform_values) { size } unless block_given?
  return {} if empty?
  result = self.class.new
  each do |key, value|
    result[key] = yield(value)
  end
  result
end

#transform_values!Object



186
187
188
189
190
191
# File 'lib/libis/tools/extend/hash.rb', line 186

def transform_values!
  return enum_for(:transform_values!) { size } unless block_given?
  each do |key, value|
    self[key] = yield(value)
  end
end