Class: Attributor::AttributeResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/attributor/attribute_resolver.rb

Defined Under Namespace

Classes: Data

Constant Summary collapse

ROOT_PREFIX =
'$'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAttributeResolver



15
16
17
# File 'lib/attributor/attribute_resolver.rb', line 15

def initialize
  @data = Data.new
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



13
14
15
# File 'lib/attributor/attribute_resolver.rb', line 13

def data
  @data
end

Class Method Details

.currentObject



106
107
108
109
110
111
112
# File 'lib/attributor/attribute_resolver.rb', line 106

def self.current
  if resolver = Thread.current[:_attributor_attribute_resolver]
    return resolver
  else
    raise AttributorException, "No AttributeResolver set."
  end
end

.current=(resolver) ⇒ Object

TODO: kill this when we also kill Taylor’s IdentityMap.current



101
102
103
# File 'lib/attributor/attribute_resolver.rb', line 101

def self.current=(resolver)
  Thread.current[:_attributor_attribute_resolver] = resolver
end

Instance Method Details

#check(path_prefix, key_path, predicate = nil) ⇒ Object

Checks that the the condition is met. This means the attribute identified by path_prefix and key_path satisfies the optional predicate, which when nil simply checks for existence.

Raises:



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/attributor/attribute_resolver.rb', line 78

def check(path_prefix, key_path, predicate=nil)
  value = self.query(key_path, path_prefix)

  # we have a value, any value, which is good enough given no predicate
  if !value.nil? && predicate.nil?
    return true
  end

  case predicate
  when ::String, ::Regexp, ::Integer, ::Float, ::DateTime, true, false
    return predicate === value
  when ::Proc
    # Cannot use === here as above due to different behavior in Ruby 1.8
    return predicate.call(value)
  when nil
    return !value.nil?
  else
    raise AttributorException.new("predicate not supported: #{predicate.inspect}")
  end

end

#query(key_path, path_prefix = ROOT_PREFIX) ⇒ String

Query for a certain key in the attribute hierarchy



51
52
53
54
55
# File 'lib/attributor/attribute_resolver.rb', line 51

def query(key_path,path_prefix=ROOT_PREFIX)
  query!(key_path,path_prefix)
rescue NoMethodError => e
  nil
end

#query!(key_path, path_prefix = ROOT_PREFIX) ⇒ Object

TODO: support collection queries



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/attributor/attribute_resolver.rb', line 21

def query!(key_path, path_prefix=ROOT_PREFIX)
  # If the incoming key_path is not an absolute path, append the given prefix
  # NOTE: Need to index key_path by range here because Ruby 1.8 returns a
  # FixNum for the ASCII code, not the actual character, when indexing by a number.
  unless key_path[0..0] == ROOT_PREFIX
    # TODO: prepend path_prefix to path_prefix if it did not include it? hm.
    key_path = path_prefix + SEPARATOR + key_path
  end

  # Discard the initial element, which should always be ROOT_PREFIX at this point
  _root, *path = key_path.split(SEPARATOR)

  # Follow the hierarchy path to the requested node and return it
  # Example path => ["instance", "ssh_key", "name"]
  # Example @data => {"instance" => { "ssh_key" => { "name" => "foobar" } }}
  result = path.inject(@data) do |hash, key|
    return nil if hash.nil?
    hash.send key
  end
  result
end

#register(key_path, value) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/attributor/attribute_resolver.rb', line 57

def register(key_path, value)
  if key_path.split(SEPARATOR).size > 1
    raise AttributorException.new("can only register top-level attributes. got: #{key_path}")
  end

  @data[key_path] = value
end