Class: StringifyHash
- Inherits:
-
Hash
- Object
- Hash
- StringifyHash
- Defined in:
- lib/stringify-hash.rb
Overview
A hash that treats Symbol and String keys interchangeably and recursively merges hashes
Constant Summary collapse
- DIV =
The dividor between elements when StringifyHash is dumped
' '- EOL =
The end of line when dumping
"\n"
Instance Method Summary collapse
-
#[](k) ⇒ nil, Object
Get value for given key, search for both k as String and k as Symbol, if not present return nil.
-
#[]=(k, v) ⇒ Object
Set Symbol key to Object value.
-
#as_coll(opening, closing, in_lvl, in_inc, &block) ⇒ Object
Helper for formatting collections Computes the indentation level for elements of the collection Yields indentation to block to so the caller can create map of element strings Places delimiters in the correct location Joins everything with correct EOL.
-
#delete(k) ⇒ Object?
Determine key=>value entry in StringifyHash, remove both value at String key and value at Symbol key.
-
#dump ⇒ String
Pretty print the options as JSON.
-
#fmt_assoc(coll, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints an associative collection.
-
#fmt_basic(value) ⇒ String
Pretty prints primitive JSON values.
-
#fmt_collection(collection, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints a collection.
-
#fmt_list(coll, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints a list collection.
-
#fmt_value(value, in_lvl = 0, in_inc = DIV) ⇒ Object
Chooses between collection and primitive formatting.
-
#has_key?(k) ⇒ Boolean
Determine if key is stored in ObjectHash.
-
#merge(hash) ⇒ StringifyHash
Create new StringifyHash from recursively merged self with an OptionsHash or Hash.
-
#merge!(hash) ⇒ StringifyHash
Recursively merge self with an StringifyHash or Hash.
-
#rmerge(base, hash) ⇒ StringifyHash
Recursively merge and StringifyHash with an OptionsHash or Hash.
Instance Method Details
#[](k) ⇒ nil, Object
Get value for given key, search for both k as String and k as Symbol, if not present return nil
23 24 25 |
# File 'lib/stringify-hash.rb', line 23 def [] k super(k.to_s) || super(k.to_sym) end |
#[]=(k, v) ⇒ Object
Set Symbol key to Object value
36 37 38 |
# File 'lib/stringify-hash.rb', line 36 def []=k,v super(k.to_sym, v) end |
#as_coll(opening, closing, in_lvl, in_inc, &block) ⇒ Object
Helper for formatting collections Computes the indentation level for elements of the collection Yields indentation to block to so the caller can create map of element strings Places delimiters in the correct location Joins everything with correct EOL
!@visibility private
145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/stringify-hash.rb', line 145 def as_coll( opening, closing, in_lvl, in_inc, &block ) delim_indent = in_inc * in_lvl elem_indent = in_inc * (in_lvl + 1) open_brace = opening close_brace = delim_indent + closing fmtd_coll = block.call( elem_indent ) str_coll = fmtd_coll.join( ',' + EOL ) return open_brace + EOL + str_coll + EOL + close_brace end |
#delete(k) ⇒ Object?
Determine key=>value entry in StringifyHash, remove both value at String key and value at Symbol key
deletes both k as String and k as Symbol
nil if no Object deleted
65 66 67 |
# File 'lib/stringify-hash.rb', line 65 def delete k super(k.to_s) || super(k.to_sym) end |
#dump ⇒ String
Pretty print the options as JSON
295 296 297 |
# File 'lib/stringify-hash.rb', line 295 def dump fmt_collection( self, 0, DIV ) end |
#fmt_assoc(coll, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints an associative collection
202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/stringify-hash.rb', line 202 def fmt_assoc( coll, in_lvl = 0, in_inc = DIV ) if coll.empty? return '{}' else as_coll '{', '}', in_lvl, in_inc do |elem_indent| coll.map do |key, value| assoc_line = elem_indent + '"' + key.to_s + '"' + ': ' assoc_line += fmt_value( value, in_lvl, in_inc ) end end end end |
#fmt_basic(value) ⇒ String
Pretty prints primitive JSON values
274 275 276 277 278 279 280 |
# File 'lib/stringify-hash.rb', line 274 def fmt_basic( value ) case value when Numeric, TrueClass, FalseClass then value.to_s when NilClass then "null" else "\"#{value}\"" end end |
#fmt_collection(collection, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints a collection
177 178 179 180 181 182 183 184 185 |
# File 'lib/stringify-hash.rb', line 177 def fmt_collection( collection, in_lvl = 0, in_inc = DIV ) if collection.respond_to? :each_pair string = fmt_assoc( collection, in_lvl, in_inc ) else string = fmt_list( collection, in_lvl, in_inc ) end return string end |
#fmt_list(coll, in_lvl = 0, in_inc = DIV) ⇒ String
Pretty prints a list collection
230 231 232 233 234 235 236 237 238 239 240 |
# File 'lib/stringify-hash.rb', line 230 def fmt_list( coll, in_lvl = 0, in_inc = DIV ) if coll.empty? return '[]' else as_coll '[', ']', in_lvl, in_inc do |indent| coll.map do |el| indent + fmt_value( el, in_lvl, in_inc ) end end end end |
#fmt_value(value, in_lvl = 0, in_inc = DIV) ⇒ Object
Chooses between collection and primitive formatting
!@visibility private
245 246 247 248 249 250 251 |
# File 'lib/stringify-hash.rb', line 245 def fmt_value( value, in_lvl = 0, in_inc = DIV ) if value.kind_of? Enumerable and not value.is_a? String fmt_collection( value, in_lvl + 1, in_inc ) else fmt_basic( value ) end end |
#has_key?(k) ⇒ Boolean
Determine if key is stored in ObjectHash
49 50 51 |
# File 'lib/stringify-hash.rb', line 49 def has_key? k super(k.to_s) || super(k.to_sym) end |
#merge(hash) ⇒ StringifyHash
Create new StringifyHash from recursively merged self with an OptionsHash or Hash
112 113 114 115 116 |
# File 'lib/stringify-hash.rb', line 112 def merge hash #make a deep copy into an empty hash object merged_hash = rmerge(StringifyHash.new, self) rmerge(merged_hash, hash) end |
#merge!(hash) ⇒ StringifyHash
Recursively merge self with an StringifyHash or Hash
132 133 134 |
# File 'lib/stringify-hash.rb', line 132 def merge! hash rmerge(self, hash) end |
#rmerge(base, hash) ⇒ StringifyHash
Recursively merge and StringifyHash with an OptionsHash or Hash
84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/stringify-hash.rb', line 84 def rmerge base, hash return base unless hash.is_a?(Hash) || hash.is_a?(StringifyHash) hash.each do |key, v| if (base[key].is_a?(Hash) || base[key].is_a?(StringifyHash)) && (hash[key].is_a?(Hash) || hash[key].is_a?(OptionsHash)) rmerge(base[key], hash[key]) elsif hash[key].is_a?(Hash) base[key] = StringifyHash.new.merge(hash[key]) else base[key]= hash[key] end end base end |