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)


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
210
211
212
213
214
215
216
217
218
# File 'lib/obvious/contract.rb', line 185

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)


220
221
222
223
224
225
226
# File 'lib/obvious/contract.rb', line 220

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

  return false, nil
end