Class: Bogo::Smash

Inherits:
Hash
  • Object
show all
Includes:
Hashie::Extensions::Coercion, Hashie::Extensions::DeepMerge, Hashie::Extensions::IndifferentAccess, Hashie::Extensions::MergeInitializer
Defined in:
lib/bogo/smash.rb

Overview

Customized Hash

Defined Under Namespace

Classes: NoValue

Constant Summary collapse

NO_VALUE =
NoValue.new

Instance Method Summary collapse

Methods inherited from Hash

#to_smash

Constructor Details

#initialize(*args) ⇒ Smash

Create new instance

Parameters:

  • args (Object)

    argument list



23
24
25
26
27
28
29
30
31
32
# File 'lib/bogo/smash.rb', line 23

def initialize(*args)
  base = nil
  if(args.first.is_a?(::Hash))
    base = args.shift
  end
  super *args
  if(base)
    self.replace(base.to_smash)
  end
end

Instance Method Details

#checksumString

Calculate checksum of hash (sha256)

Returns:

  • (String)

    checksum



132
133
134
# File 'lib/bogo/smash.rb', line 132

def checksum
  Digest::SHA256.hexdigest(self.to_smash(:sorted).to_s)
end

#fetch(*args, &block) ⇒ Object

Fetch value at given path or return a default value

Parameters:

  • args (String, Symbol, Object)

    key path to walk. last value default to return

Returns:

  • (Object)

    value at key or default value



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/bogo/smash.rb', line 86

def fetch(*args, &block)
  if(block_given?)
    default_value = block
  elsif(args.size > 1)
    default_value = args.pop
  elsif(args.size < 1)
    raise ArgumentError.new("Default value must be provided for #fetch")
  end
  result = retrieve(*args)
  if(result == NO_VALUE)
    block_given? ? default_value.call(self) : default_value
  else
    result
  end
end

#get(*args) ⇒ Object, NilClass

Get value at given path

Parameters:

  • args (String, Symbol)

    key path to walk

Returns:

  • (Object, NilClass)


77
78
79
80
# File 'lib/bogo/smash.rb', line 77

def get(*args)
  val = args.empty? ? self : retrieve(*args)
  val == NO_VALUE ? nil : val
end

#merge(hash) ⇒ Object



39
40
41
42
# File 'lib/bogo/smash.rb', line 39

def merge(hash)
  hash = hash.to_smash
  super(hash)
end

#merge!(hash) ⇒ Object



34
35
36
37
# File 'lib/bogo/smash.rb', line 34

def merge!(hash)
  hash = hash.to_smash
  super(hash)
end

#retrieve(*args) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/bogo/smash.rb', line 51

def retrieve(*args)
  prefix = args[0, args.size - 1]
  final = args.last
  result = prefix.empty? ? self : dig(*prefix)
  if(result.is_a?(Hash) && result.has_key?(final))
    result[final]
  else
    NO_VALUE
  end
end

#set(*args) ⇒ Object

Set value at given path

Parameters:

  • args (String, Symbol, Object)

    key path to walk. set last value to given path

Returns:

  • (Object)

    value set



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/bogo/smash.rb', line 106

def set(*args)
  unless(args.size > 1)
    raise ArgumentError.new 'Set requires at least one key and a value'
  end
  value = args.pop
  set_key = args.pop
  leaf = args.inject(self) do |memo, key|
    unless(memo[key].is_a?(Hash))
      memo[key] = Smash.new
    end
    memo[key]
  end
  leaf[set_key] = value
  value
end

#to_hash(*args) ⇒ Hash

Convert to Hash

Returns:



125
126
127
# File 'lib/bogo/smash.rb', line 125

def to_hash(*args)
  self.to_type_converter(::Hash, :to_hash, *args)
end