Class: Beaker::Options::OptionsHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/beaker/options/options_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 OptionsHash is dumped

'    '
EOL =

The end of line when dumping

"\n"

Instance Method Summary collapse

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

Examples:

Use this method to return the value for a given key

a['key'] = 'value'
a['key'] == a[:key] == 'value'

Parameters:

  • k (Object)

    The key to find, searches for both k as String and k as Symbol

Returns:

  • (nil, Object)

    Return the Object found at given key, or nil if no Object found



26
27
28
# File 'lib/beaker/options/options_hash.rb', line 26

def [] k
  super(k.to_s) || super(k.to_sym)
end

#[]=(k, v) ⇒ Object

Set Symbol key to Object value

Examples:

Use this method to set the value for a key

a['key'] = 'value'

Parameters:

  • k (Object)

    The key to associated with the value, converted to Symbol key

  • v (Object)

    The value to store in the ObjectHash

Returns:

  • (Object)

    Return the Object value just stored



39
40
41
# File 'lib/beaker/options/options_hash.rb', line 39

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



159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/beaker/options/options_hash.rb', line 159

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 OptionsHash, 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

Examples:

Use this method to set the value for a key

a['key'] = 'value'
a.delete[:key] == 'value'

Parameters:

  • k (Object)

    The key to delete in ObjectHash,

Returns:

  • (Object, nil)

    The Object deleted at value,



79
80
81
# File 'lib/beaker/options/options_hash.rb', line 79

def delete k
  super(k.to_s) || super(k.to_sym)
end

#dumpString

Pretty print the options as JSON

Examples:

base = { :key => { :subkey1 => 'subval', :subkey2 => 'subval' } }
base.dump
#=>  '{
          "key": {
              "subkey1": "subval",
              "subkey2": 2
          }
      }

Returns:

  • (String)

    The description of self



309
310
311
# File 'lib/beaker/options/options_hash.rb', line 309

def dump
  fmt_collection( self, 0, DIV )
end

#fmt_assoc(coll, in_lvl = 0, in_inc = DIV) ⇒ String

Pretty prints an associative collection

Examples:

base = { :key => 'value', :key2 => 'value' }
self.fmt_assoc( base )
#=> '{
         "key": "value",
         "key2": "value"
     }'

Parameters:

  • coll (#each_pair)

    The collection to be printed

  • in_lvl (Integer) (defaults to: 0)

    The level of indentation

  • in_inc (String) (defaults to: DIV)

    The increment to indent

Returns:

  • (String)

    The collection as a pretty JSON object



216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/beaker/options/options_hash.rb', line 216

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

Examples:

self.fmt_value( 4 )
#=> '4'
self.fmt_value( true )
#=> 'true'
self.fmt_value( nil )
#=> 'null'
self.fmt_value( 'string' )
#=> '"string"'

Parameters:

  • value (Object)

    The collection to be printed

Returns:

  • (String)

    The value as a valid JSON primitive



288
289
290
291
292
293
294
# File 'lib/beaker/options/options_hash.rb', line 288

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

Examples:

base = {:key => { :subkey1 => 'subval', :subkey2 => ['subval'] }}
self.fmt_collection( base )
#=> '{
         "key": {
             "subkey": "subval",
             "subkey2": [
                 "subval"
             ]
         }
     }'

Parameters:

  • collection (Enumerable)

    The collection to be printed

  • in_lvl (Integer) (defaults to: 0)

    The level of indentation

  • in_inc (String) (defaults to: DIV)

    The increment to indent

Returns:

  • (String)

    The collection as a pretty JSON object



191
192
193
194
195
196
197
198
199
# File 'lib/beaker/options/options_hash.rb', line 191

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

Examples:

base = [ 'first', 'second' ]
self.fmt_list( base )
#=> '[
         "first",
         "second"
     ]'

Parameters:

  • coll (#each)

    The collection to be printed

  • in_lvl (Integer) (defaults to: 0)

    The level of indentation

  • in_inc (String) (defaults to: DIV)

    The increment to indent

Returns:

  • (String)

    The collection as a pretty JSON object



244
245
246
247
248
249
250
251
252
253
254
# File 'lib/beaker/options/options_hash.rb', line 244

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



259
260
261
262
263
264
265
# File 'lib/beaker/options/options_hash.rb', line 259

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

Examples:

Use this method to set the value for a key

a['key'] = 'value'
a.has_key[:key] == true

Parameters:

  • k (Object)

    The key to find in ObjectHash, searches for both k as String and k as Symbol

Returns:

  • (Boolean)


63
64
65
# File 'lib/beaker/options/options_hash.rb', line 63

def has_key? k
  super(k.to_s) || super(k.to_sym)
end

#is_pe?Boolean

Determine if type of ObjectHash is pe, defaults to true

Examples:

Use this method to return the value for a given key

a['type'] = 'pe'
a.is_pe? == true

Returns:

  • (Boolean)


50
51
52
# File 'lib/beaker/options/options_hash.rb', line 50

def is_pe?
  self[:type] ? self[:type] =~ /pe/ : true
end

#merge(hash) ⇒ OptionsHash

Create new OptionsHash from recursively merged self with an OptionsHash or Hash

Examples:

base = { :key => { :subkey1 => 'subval', :subkey2 => 'subval' } }
hash = { :key => { :subkey1 => 'newval'} }

base.merge(hash)
#=> {:key =>
      {:subkey1 => 'newval',
       :subkey2 => 'subval' }

Parameters:

Returns:



126
127
128
129
130
# File 'lib/beaker/options/options_hash.rb', line 126

def merge hash
  #make a deep copy into an empty hash object
  merged_hash = rmerge(OptionsHash.new, self)
  rmerge(merged_hash, hash)
end

#merge!(hash) ⇒ OptionsHash

Recursively merge self with an OptionsHash or Hash

Examples:

base = { :key => { :subkey1 => 'subval', :subkey2 => 'subval' } }
hash = { :key => { :subkey1 => 'newval'} }

base.merge!(hash)
#=> {:key =>
      {:subkey1 => 'newval',
       :subkey2 => 'subval' }

Parameters:

Returns:



146
147
148
# File 'lib/beaker/options/options_hash.rb', line 146

def merge! hash
  rmerge(self, hash)
end

#rmerge(base, hash) ⇒ OptionsHash

Recursively merge and OptionsHash with an OptionsHash or Hash

Examples:

base = { :key => { :subkey1 => 'subval', :subkey2 => 'subval' } }
hash = { :key => { :subkey1 => 'newval'} }

rmerge(base, hash)
#=>  {:key =>
        {:subkey1 => 'newval',
         :subkey2 => 'subval'}}

Parameters:

Returns:



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/beaker/options/options_hash.rb', line 98

def rmerge base, hash
  return base unless hash.is_a?(Hash) || hash.is_a?(OptionsHash)
  hash.each do |key, v|
    if (base[key].is_a?(Hash) || base[key].is_a?(OptionsHash)) && (hash[key].is_a?(Hash) || has[key].is_a?(OptionsHash))
      rmerge(base[key], hash[key])
    elsif hash[key].is_a?(Hash)
      base[key] = OptionsHash.new.merge(hash[key])
    else
      base[key]= hash[key]
    end
  end
  base
end