Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/obvious/contract.rb

Overview

Instance Method Summary collapse

Instance Method Details

#has_shape?(shape, return_field = false) ⇒ Boolean

Checks if a hash has a certain structure.

h = { k1: 1, k2: "1" }
h.has_shape?(k1: Integer, k2: String)
#=> true
h.has_shape?(k1: Class, k2: String)
#=> false

It also works with compound data structures.

h = { k1: [], k2: { k3: Struct.new("Foo") } }
shape = { k1: Array, k2: { k3: Module } }
h.has_shape?(shape)
#=> true

Returns:

  • (Boolean)


176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/obvious/contract.rb', line 176

def has_shape?(shape, return_field = false)
  return_value = lambda { |r, f|
    if return_field
      return r, f
    else
      return r 
    end
  }
 
  # I added an empty check
  if self.empty?
    return return_value.call shape.empty?, nil
  end  
 
  self.each do |k, v|
    return return_value.call false, k if shape[k] == nil
  end 

  shape.each do |k, v|
    # hash_value
    hv = self[k]
    return return_value.call false, k unless self.has_key? k 

    next if hv === nil

    if Hash === hv 
      return hv.has_shape?(v, return_field) 
    else
      return return_value.call false, k unless v === hv
    end
  end

  return_value.call true, nil
end

#nil_fields?(list) ⇒ Boolean

Returns:

  • (Boolean)


211
212
213
214
215
216
217
# File 'lib/obvious/contract.rb', line 211

def nil_fields? list
  list.each do |field|
    return true, field unless self[field]
  end  
  
  return false, nil
end