Class: Chef::Node::Attribute
- Includes:
- Immutablize, Mixin::DeepMergeCache, Mixin::ImmutablizeHash, Mixin::StateTracking, Enumerable
- Defined in:
- lib/chef/node/attribute.rb
Overview
Attribute
Attribute implements a nested key-value (Hash) and flat collection (Array) data structure supporting multiple levels of precedence, such that a given key may have multiple values internally, but will only return the highest precedence value when reading.
Constant Summary collapse
- COMPONENTS =
List of the component attribute hashes, in order of precedence, low to high.
[ :@default, :@env_default, :@role_default, :@force_default, :@normal, :@override, :@role_override, :@env_override, :@force_override, :@automatic, ].freeze
- DEFAULT_COMPONENTS =
[ :@default, :@env_default, :@role_default, :@force_default, ].freeze
- OVERRIDE_COMPONENTS =
[ :@override, :@role_override, :@env_override, :@force_override, ].freeze
- ENUM_METHODS =
[ :all?, :any?, :assoc, :chunk, :collect, :collect_concat, :compare_by_identity, :compare_by_identity?, :count, :cycle, :detect, :drop, :drop_while, :each, :each_cons, :each_entry, :each_key, :each_pair, :each_slice, :each_value, :each_with_index, :each_with_object, :empty?, :entries, :except, :fetch, :find, :find_all, :find_index, :first, :flat_map, :flatten, :grep, :group_by, :has_value?, :include?, :index, :inject, :invert, :key, :keys, :length, :map, :max, :max_by, :merge, :min, :min_by, :minmax, :minmax_by, :none?, :one?, :partition, :rassoc, :reduce, :reject, :reverse_each, :select, :size, :slice_before, :sort, :sort_by, :store, :symbolize_keys, :take, :take_while, :to_a, :to_h, :to_hash, :to_set, :value?, :values, :values_at, :zip, ].freeze
Constants included from Mixin::ImmutablizeHash
Mixin::ImmutablizeHash::ALLOWED_METHODS, Mixin::ImmutablizeHash::DISALLOWED_MUTATOR_METHODS
Instance Attribute Summary collapse
-
#automatic ⇒ Object
return the automatic level attribute component.
-
#default ⇒ Object
return the cookbook level default attribute component.
-
#env_default ⇒ Object
return the environment level default attribute component.
-
#env_override ⇒ Object
return the enviroment level override attribute component.
-
#force_default ⇒ Object
return the force_default level attribute component.
-
#force_override ⇒ Object
return the force override level attribute component.
-
#normal ⇒ Object
return the “normal” level attribute component.
-
#override ⇒ Object
return the cookbook level override attribute component.
-
#role_default ⇒ Object
return the role level default attribute component.
-
#role_override ⇒ Object
return the role level override attribute component.
Attributes included from Mixin::StateTracking
#__node__, #__path__, #__precedence__, #__root__
Attributes included from Mixin::DeepMergeCache
Instance Method Summary collapse
- #combined_default(*path) ⇒ Object
- #combined_override(*path) ⇒ Object
-
#debug_value(*args) ⇒ Object
Debug what’s going on with an attribute.
-
#default!(*args) ⇒ Object
sets default attributes without merging.
- #default_unless(*args) ⇒ Object
- #exist?(*path) ⇒ Boolean
-
#force_default!(*args) ⇒ Object
clears from all default precedence levels and then sets force_default.
-
#force_override!(*args) ⇒ Object
clears from all override precedence levels and then sets force_override.
- #has_key?(key) ⇒ Boolean (also: #attribute?, #member?, #include?, #key?)
-
#initialize(normal, default, override, automatic, node = nil) ⇒ Attribute
constructor
A new instance of Attribute.
- #inspect ⇒ Object
-
#merged_attributes(*path) ⇒ Object
Accessing merged attributes.
-
#normal!(*args) ⇒ Object
sets normal attributes without merging.
- #normal_unless(*args) ⇒ Object
-
#override!(*args) ⇒ Object
sets override attributes without merging.
- #override_unless(*args) ⇒ Object
-
#read(*path) ⇒ Object
method-style access to attributes (has to come after the prepended ImmutablizeHash).
- #read!(*path) ⇒ Object
-
#rm(*args) ⇒ Object
clears attributes from all precedence levels.
-
#rm_default(*args) ⇒ Object
clears attributes from all default precedence levels.
-
#rm_normal(*args) ⇒ Object
clears attributes from normal precedence.
-
#rm_override(*args) ⇒ Object
clears attributes from all override precedence levels.
- #to_s ⇒ Object
- #unlink(level, *path) ⇒ Object
- #unlink!(level, *path) ⇒ Object
- #write(level, *args, &block) ⇒ Object
- #write!(level, *args, &block) ⇒ Object
Methods included from Mixin::StateTracking
Methods included from Mixin::DeepMergeCache
Methods included from Immutablize
Methods inherited from Mash
#[]=, #delete, #except, #fetch, from_hash, #initialize_copy, #internal_set, #merge, #regular_update, #regular_writer, #stringify_keys!, #symbolize_keys, #to_hash, #update, #values_at
Constructor Details
#initialize(normal, default, override, automatic, node = nil) ⇒ Attribute
Returns a new instance of Attribute.
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/chef/node/attribute.rb', line 194 def initialize(normal, default, override, automatic, node = nil) @default = VividMash.new(default, self, node, :default) @env_default = VividMash.new({}, self, node, :env_default) @role_default = VividMash.new({}, self, node, :role_default) @force_default = VividMash.new({}, self, node, :force_default) @normal = VividMash.new(normal, self, node, :normal) @override = VividMash.new(override, self, node, :override) @role_override = VividMash.new({}, self, node, :role_override) @env_override = VividMash.new({}, self, node, :env_override) @force_override = VividMash.new({}, self, node, :force_override) @automatic = VividMash.new(automatic, self, node, :automatic) super(nil, self, node, :merged) end |
Instance Attribute Details
#automatic ⇒ Object
return the automatic level attribute component
192 193 194 |
# File 'lib/chef/node/attribute.rb', line 192 def automatic @automatic end |
#default ⇒ Object
return the cookbook level default attribute component
165 166 167 |
# File 'lib/chef/node/attribute.rb', line 165 def default @default end |
#env_default ⇒ Object
return the environment level default attribute component
171 172 173 |
# File 'lib/chef/node/attribute.rb', line 171 def env_default @env_default end |
#env_override ⇒ Object
return the enviroment level override attribute component
186 187 188 |
# File 'lib/chef/node/attribute.rb', line 186 def env_override @env_override end |
#force_default ⇒ Object
return the force_default level attribute component
174 175 176 |
# File 'lib/chef/node/attribute.rb', line 174 def force_default @force_default end |
#force_override ⇒ Object
return the force override level attribute component
189 190 191 |
# File 'lib/chef/node/attribute.rb', line 189 def force_override @force_override end |
#normal ⇒ Object
return the “normal” level attribute component
177 178 179 |
# File 'lib/chef/node/attribute.rb', line 177 def normal @normal end |
#override ⇒ Object
return the cookbook level override attribute component
180 181 182 |
# File 'lib/chef/node/attribute.rb', line 180 def override @override end |
#role_default ⇒ Object
return the role level default attribute component
168 169 170 |
# File 'lib/chef/node/attribute.rb', line 168 def role_default @role_default end |
#role_override ⇒ Object
return the role level override attribute component
183 184 185 |
# File 'lib/chef/node/attribute.rb', line 183 def role_override @role_override end |
Instance Method Details
#combined_default(*path) ⇒ Object
412 413 414 |
# File 'lib/chef/node/attribute.rb', line 412 def combined_default(*path) merge_defaults(path) end |
#combined_override(*path) ⇒ Object
408 409 410 |
# File 'lib/chef/node/attribute.rb', line 408 def combined_override(*path) merge_overrides(path) end |
#debug_value(*args) ⇒ Object
Debug what’s going on with an attribute. args is a path spec to the attribute you’re interested in. For example, to debug where the value of node[:network][:default_interface] is coming from, use:
debug_value(:network, :default_interface).
The return value is an Array of Arrays. The Arrays are pairs of ‘[“precedence_level”, value]`, where precedence level is the component, such as role default, normal, etc. and value is the attribute value set at that precedence level. If there is no value at that precedence level, value will be the symbol :not_present.
221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/chef/node/attribute.rb', line 221 def debug_value(*args) COMPONENTS.map do |component| value = begin instance_variable_get(component).read!(*args) rescue :not_present end [component.to_s.sub(/^@/, ""), value] end end |
#default!(*args) ⇒ Object
sets default attributes without merging
-
this API autovivifies (and cannot trainwreck)
358 359 360 361 |
# File 'lib/chef/node/attribute.rb', line 358 def default!(*args) return Decorator::Unchain.new(self, :default!) unless args.length > 0 write(:default, *args) end |
#default_unless(*args) ⇒ Object
421 422 423 424 |
# File 'lib/chef/node/attribute.rb', line 421 def default_unless(*args) return Decorator::Unchain.new(self, :default_unless) unless args.length > 0 write(:default, *args) if default.read(*args[0...-1]).nil? end |
#exist?(*path) ⇒ Boolean
447 448 449 |
# File 'lib/chef/node/attribute.rb', line 447 def exist?(*path) merged_attributes.exist?(*path) end |
#force_default!(*args) ⇒ Object
clears from all default precedence levels and then sets force_default
-
this API autovivifies (and cannot trainwreck)
382 383 384 385 386 387 |
# File 'lib/chef/node/attribute.rb', line 382 def force_default!(*args) return Decorator::Unchain.new(self, :force_default!) unless args.length > 0 value = args.pop rm_default(*args) write(:force_default, *args, value) end |
#force_override!(*args) ⇒ Object
clears from all override precedence levels and then sets force_override
390 391 392 393 394 395 |
# File 'lib/chef/node/attribute.rb', line 390 def force_override!(*args) return Decorator::Unchain.new(self, :force_override!) unless args.length > 0 value = args.pop rm_override(*args) write(:force_override, *args, value) end |
#has_key?(key) ⇒ Boolean Also known as: attribute?, member?, include?, key?
431 432 433 434 435 |
# File 'lib/chef/node/attribute.rb', line 431 def has_key?(key) COMPONENTS.any? do |component_ivar| instance_variable_get(component_ivar).key?(key) end end |
#inspect ⇒ Object
478 479 480 481 482 |
# File 'lib/chef/node/attribute.rb', line 478 def inspect "#<#{self.class} " << (COMPONENTS + [:@merged_attributes, :@properties]).map do |iv| "#{iv}=#{instance_variable_get(iv).inspect}" end.join(", ") << ">" end |
#merged_attributes(*path) ⇒ Object
404 405 406 |
# File 'lib/chef/node/attribute.rb', line 404 def merged_attributes(*path) merge_all(path) end |
#normal!(*args) ⇒ Object
sets normal attributes without merging
-
this API autovivifies (and cannot trainwreck)
366 367 368 369 |
# File 'lib/chef/node/attribute.rb', line 366 def normal!(*args) return Decorator::Unchain.new(self, :normal!) unless args.length > 0 write(:normal, *args) end |
#normal_unless(*args) ⇒ Object
416 417 418 419 |
# File 'lib/chef/node/attribute.rb', line 416 def normal_unless(*args) return Decorator::Unchain.new(self, :normal_unless) unless args.length > 0 write(:normal, *args) if normal.read(*args[0...-1]).nil? end |
#override!(*args) ⇒ Object
sets override attributes without merging
-
this API autovivifies (and cannot trainwreck)
374 375 376 377 |
# File 'lib/chef/node/attribute.rb', line 374 def override!(*args) return Decorator::Unchain.new(self, :override!) unless args.length > 0 write(:override, *args) end |
#override_unless(*args) ⇒ Object
426 427 428 429 |
# File 'lib/chef/node/attribute.rb', line 426 def override_unless(*args) return Decorator::Unchain.new(self, :override_unless) unless args.length > 0 write(:override, *args) if override.read(*args[0...-1]).nil? end |
#read(*path) ⇒ Object
method-style access to attributes (has to come after the prepended ImmutablizeHash)
439 440 441 |
# File 'lib/chef/node/attribute.rb', line 439 def read(*path) merged_attributes.read(*path) end |
#read!(*path) ⇒ Object
443 444 445 |
# File 'lib/chef/node/attribute.rb', line 443 def read!(*path) merged_attributes.read!(*path) end |
#rm(*args) ⇒ Object
clears attributes from all precedence levels
296 297 298 299 300 301 302 |
# File 'lib/chef/node/attribute.rb', line 296 def rm(*args) with_deep_merged_return_value(self, *args) do rm_default(*args) rm_normal(*args) rm_override(*args) end end |
#rm_default(*args) ⇒ Object
clears attributes from all default precedence levels
similar to: force_default![‘bar’].delete(‘baz’)
-
does not autovivify
-
does not trainwreck if interior keys do not exist
309 310 311 312 313 314 315 316 |
# File 'lib/chef/node/attribute.rb', line 309 def rm_default(*args) with_deep_merged_return_value(combined_default, *args) do default.unlink(*args) role_default.unlink(*args) env_default.unlink(*args) force_default.unlink(*args) end end |
#rm_normal(*args) ⇒ Object
clears attributes from normal precedence
equivalent to: normal![‘bar’].delete(‘baz’)
-
does not autovivify
-
does not trainwreck if interior keys do not exist
323 324 325 |
# File 'lib/chef/node/attribute.rb', line 323 def rm_normal(*args) normal.unlink(*args) end |
#rm_override(*args) ⇒ Object
clears attributes from all override precedence levels
equivalent to: force_override![‘bar’].delete(‘baz’)
-
does not autovivify
-
does not trainwreck if interior keys do not exist
332 333 334 335 336 337 338 339 |
# File 'lib/chef/node/attribute.rb', line 332 def rm_override(*args) with_deep_merged_return_value(combined_override, *args) do override.unlink(*args) role_override.unlink(*args) env_override.unlink(*args) force_override.unlink(*args) end end |
#to_s ⇒ Object
474 475 476 |
# File 'lib/chef/node/attribute.rb', line 474 def to_s merged_attributes.to_s end |
#unlink(level, *path) ⇒ Object
459 460 461 |
# File 'lib/chef/node/attribute.rb', line 459 def unlink(level, *path) send(level).unlink(*path) end |
#unlink!(level, *path) ⇒ Object
463 464 465 |
# File 'lib/chef/node/attribute.rb', line 463 def unlink!(level, *path) send(level).unlink!(*path) end |
#write(level, *args, &block) ⇒ Object
451 452 453 |
# File 'lib/chef/node/attribute.rb', line 451 def write(level, *args, &block) send(level).write(*args, &block) end |
#write!(level, *args, &block) ⇒ Object
455 456 457 |
# File 'lib/chef/node/attribute.rb', line 455 def write!(level, *args, &block) send(level).write!(*args, &block) end |