Class: Nestful::Mash

Inherits:
Hash
  • Object
show all
Defined in:
lib/nestful/mash.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_hash = nil, default = nil, &blk) ⇒ Mash

Returns a new instance of Mash.


34
35
36
37
# File 'lib/nestful/mash.rb', line 34

def initialize(source_hash = nil, default = nil, &blk)
  deep_update(source_hash.to_hash) if source_hash
  default ? super(default) : super(&blk)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &blk) ⇒ Object


163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/nestful/mash.rb', line 163

def method_missing(method_name, *args, &blk)
  return self.[](method_name, &blk) if key?(method_name)
  match = method_name.to_s.match(/(.*?)([?=!_]?)$/)
  case match[2]
  when "="
    self[match[1]] = args.first
  when "?"
    !!self[match[1]]
  when "!"
    initializing_reader(match[1])
  when "_"
    underbang_reader(match[1])
  else
    default(method_name, *args, &blk)
  end
end

Class Method Details

.delete(action = '', params = {}, options = {}) ⇒ Object


15
16
17
# File 'lib/nestful/mash.rb', line 15

def self.delete(action = '', params = {}, options = {})
  request(action, options.merge(:method => :delete, :params => params))
end

.get(action = '', params = {}, options = {}) ⇒ Object


3
4
5
# File 'lib/nestful/mash.rb', line 3

def self.get(action = '', params = {}, options = {})
  request(action, options.merge(:method => :get, :params => params))
end

.new(value = nil, *args) ⇒ Object Also known as: []


23
24
25
26
27
28
29
30
# File 'lib/nestful/mash.rb', line 23

def self.new(value = nil, *args)
  if value.respond_to?(:each) &&
    !value.respond_to?(:each_pair)
    value.map {|v| super(v) }
  else
    super
  end
end

.post(action = '', params = {}, options = {}) ⇒ Object


11
12
13
# File 'lib/nestful/mash.rb', line 11

def self.post(action = '', params = {}, options = {})
  request(action, options.merge(:method => :post, :params => params))
end

.put(action = '', params = {}, options = {}) ⇒ Object


7
8
9
# File 'lib/nestful/mash.rb', line 7

def self.put(action = '', params = {}, options = {})
  request(action, options.merge(:method => :put, :params => params))
end

.request(url, options = {}) ⇒ Object


19
20
21
# File 'lib/nestful/mash.rb', line 19

def self.request(url, options = {})
  self.new Request.new(url, options).execute
end

Instance Method Details

#custom_reader(key) {|value| ... } ⇒ Object Also known as: []

Retrieves an attribute set in the Mash. Will convert any key passed in to a string before retrieving.

Yields:

  • (value)

54
55
56
57
58
# File 'lib/nestful/mash.rb', line 54

def custom_reader(key)
  value = regular_reader(convert_key(key))
  yield value if block_given?
  value
end

#custom_writer(key, value) ⇒ Object Also known as: []=

Sets an attribute in the Mash. Key will be converted to a string before it is set, and Hashes will be converted into Mashes for nesting purposes.


63
64
65
# File 'lib/nestful/mash.rb', line 63

def custom_writer(key,value) #:nodoc:
  regular_writer(convert_key(key), convert_value(value))
end

#deep_merge(other_hash, &blk) ⇒ Object Also known as: merge

Performs a deep_update on a duplicate of the current mash.


112
113
114
# File 'lib/nestful/mash.rb', line 112

def deep_merge(other_hash, &blk)
  dup.deep_update(other_hash, &blk)
end

#deep_update(other_hash, &blk) ⇒ Object Also known as: deep_merge!, update

Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.


119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/nestful/mash.rb', line 119

def deep_update(other_hash, &blk)
  other_hash.each_pair do |k,v|
    key = convert_key(k)
    if regular_reader(key).is_a?(Mash) and v.is_a?(::Hash)
      custom_reader(key).deep_update(v, &blk)
    else
      value = convert_value(v, true)
      value = blk.call(key, self[k], value) if blk
      custom_writer(key, value)
    end
  end
  self
end

#delete(key) ⇒ Object


93
94
95
# File 'lib/nestful/mash.rb', line 93

def delete(key)
  super(convert_key(key))
end

#dupObject

Duplicates the current mash as a new mash.


99
100
101
# File 'lib/nestful/mash.rb', line 99

def dup
  self.class.new(self, self.default)
end

#fetch(key, *args) ⇒ Object


89
90
91
# File 'lib/nestful/mash.rb', line 89

def fetch(key, *args)
  super(convert_key(key), *args)
end

#idObject

:nodoc:


41
42
43
# File 'lib/nestful/mash.rb', line 41

def id #:nodoc:
  self['id']
end

#initializing_reader(key) ⇒ Object

This is the bang method reader, it will return a new Mash if there isn't a value already assigned to the key requested.


72
73
74
75
76
# File 'lib/nestful/mash.rb', line 72

def initializing_reader(key)
  ck = convert_key(key)
  regular_writer(ck, self.class.new) unless key?(ck)
  regular_reader(ck)
end

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

Returns:

  • (Boolean)

103
104
105
# File 'lib/nestful/mash.rb', line 103

def key?(key)
  super(convert_key(key))
end

#regular_dupObject


97
# File 'lib/nestful/mash.rb', line 97

alias_method :regular_dup, :dup

#replace(other_hash) ⇒ Object


150
151
152
153
154
# File 'lib/nestful/mash.rb', line 150

def replace(other_hash)
  (keys - other_hash.keys).each { |key| delete(key) }
  other_hash.each { |key, value| self[key] = value }
  self
end

#respond_to?(method_name, include_private = false) ⇒ Boolean

Will return true if the Mash has had a key set in addition to normal respond_to? functionality.

Returns:

  • (Boolean)

158
159
160
161
# File 'lib/nestful/mash.rb', line 158

def respond_to?(method_name, include_private=false)
  return true if key?(method_name) || method_name.to_s.slice(/[=?!_]\Z/)
  super
end

#shallow_merge(other_hash) ⇒ Object

Performs a shallow_update on a duplicate of the current mash


137
138
139
# File 'lib/nestful/mash.rb', line 137

def shallow_merge(other_hash)
  dup.shallow_update(other_hash)
end

#shallow_update(other_hash) ⇒ Object

Merges (non-recursively) the hash from the argument, changing the receiving hash


143
144
145
146
147
148
# File 'lib/nestful/mash.rb', line 143

def shallow_update(other_hash)
  other_hash.each_pair do |k,v|
    regular_writer(convert_key(k), convert_value(v, true))
  end
  self
end

#typeObject

:nodoc:


45
46
47
# File 'lib/nestful/mash.rb', line 45

def type #:nodoc:
  self['type']
end

#underbang_reader(key) ⇒ Object

This is the under bang method reader, it will return a temporary new Mash if there isn't a value already assigned to the key requested.


80
81
82
83
84
85
86
87
# File 'lib/nestful/mash.rb', line 80

def underbang_reader(key)
  ck = convert_key(key)
  if key?(ck)
    regular_reader(ck)
  else
    self.class.new
  end
end