Class: Spider::Model::ModelHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/spiderfw/model/model_hash.rb

Overview

The ModelHash is a specialized hash for models. It is subclassed by Condition and Request. It provides two functions:

  • when given a BaseModel instance as a value, it will unwrap it setting its element-value pairs

  • if the key is a dotted string, will split it and create sub-hashes.

Example:

cat = Cat.new(:name => 'Kitty', :color => 'black')
mh[:test] = cat
  => {:test => {:name => 'Kitty', :color => 'black}}
mh['test.name'] = 'Devilish Kitty'
  => {:test => {:name => 'Devilish Kitty', :color => 'black'}}

Direct Known Subclasses

Request

Instance Method Summary collapse

Constructor Details

#initialize(hash = nil) ⇒ ModelHash

Returns a new instance of ModelHash.

Parameters:

  • hash (Hash) (defaults to: nil)

    A Hash to get data from



18
19
20
21
# File 'lib/spiderfw/model/model_hash.rb', line 18

def initialize(hash=nil)
    super()
    merge!(hash) if (hash && hash.is_a?(Hash))
end

Instance Method Details

#[](key) ⇒ Object

Value retrieval

Parameters:



54
55
56
57
58
# File 'lib/spiderfw/model/model_hash.rb', line 54

def [](key)
    # TODO: deep
    key = key.name if key.is_a?(Element)
    super(key.to_sym)
end

#[]=(key, val) ⇒ Object

Value assignment

Parameters:



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/spiderfw/model/model_hash.rb', line 32

def []=(key, val)
    if (val.is_a?(BaseModel))
        n = self.class.new
        val.each_val do |el, v|
            n[el] = v
        end
        val = n
    end
    key = key.name if key.is_a?(Element)
    if key.is_a?(String)
        parts = key.split('.', 2)
        return super(key.to_sym, val) unless parts[1]
        parts[0] = parts[0].to_sym
        self[parts[0]] = get_deep_obj unless self[parts[0]].is_a?(self.class)
        self[parts[0]][parts[1]] = val
    else
        super(key, val)
    end
end

#get_deep_objModelHash

Returns a new instance when needed by an assignement. May be overridden by subclasses.

Returns:



25
26
27
# File 'lib/spiderfw/model/model_hash.rb', line 25

def get_deep_obj
    return self.class.new
end

#modelhash_orig_setObject

Original hash value assignment



15
# File 'lib/spiderfw/model/model_hash.rb', line 15

alias :modelhash_orig_set :[]=