Class: Puppet::Property Abstract
- Defined in:
- lib/puppet/property.rb,
lib/puppet/type/zpool.rb,
lib/puppet/property/list.rb,
lib/puppet/property/keyvalue.rb,
lib/puppet/property/ordered_list.rb
Overview
Describe meta-parameter shadowing. This concept can not be understood by just looking at the descriptions of the methods involved.
Properties of Types are expressed using subclasses of this class. Such a class describes one named property of a particular Type (as opposed to describing a type of property in general). This limits the use of one (concrete) property class instance to occur only once for a given type’s inheritance chain. An instance of a Property class is the value holder of one instance of the resource type (e.g. the mode of a file resource instance). A Property class may server as the superclass _(parent)_ of another; e.g. a Size property that describes handling of measurements such as kb, mb, gb. If a type requires two different size measurements it requires one concrete class per such measure; e.g. MinSize (:parent => Size), and MaxSize (:parent => Size).
The Property class is the implementation of a resource’s attributes of property kind. A Property is a specialized Resource Type Parameter that has both an ‘is’ (current) state, and a ‘should’ (wanted state). However, even if this is conceptually true, the current is value is obtained by asking the associated provider for the value, and hence it is not actually part of a property’s state, and only available when a provider has been selected and can obtain the value (i.e. when running on an agent).
A Property (also in contrast to a parameter) is intended to describe a managed attribute of some system entity, such as the name or mode of a file.
The current value _(is)_ is read and written with the methods #retrieve and #set, and the wanted value _(should)_ is read and written with the methods #value and #value= which delegate to #should and #should=, i.e. when a property is used like any other parameter, it is the should value that is operated on.
All resource type properties in the puppet system are derived from this class.
The intention is that new parameters are created by using the DSL method Type.newproperty.
Defined Under Namespace
Classes: Boolean, Ensure, KeyValue, List, MultiVDev, OrderedList, VDev
Constant Summary
Constants included from Util::Docs
Constants included from Util
Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE
Constants included from Util::POSIX
Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS
Constants included from Util::SymbolicFileMode
Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit
Class Attribute Summary collapse
-
.array_matching ⇒ Symbol
The ‘is` vs. `should` array matching mode; `:first`, or `:all`.
-
.name ⇒ Symbol
readonly
The name of the property as given when the property was created.
-
.unmanaged ⇒ Object
??? Probably Unused.
Instance Attribute Summary collapse
-
#noop ⇒ Boolean
Returns whether this property is in noop mode or not; if a difference between the is and should values should be acted on or not.
-
#shadow ⇒ Object
readonly
What is this used for?.
-
#shouldorig ⇒ Array<Object>, ...
readonly
Returns the original wanted value(s) _(should)_ unprocessed by munging/unmunging.
Attributes inherited from Parameter
Attributes included from Util::Docs
Class Method Summary collapse
-
.method_added(sym) ⇒ Object
private
Protects against override of the #safe_insync? method.
-
.newvalue(name, options = {}, &block) ⇒ Object
Defines a new valid value for this property.
-
.value_name(name) ⇒ Symbol, Regexp
private
Looks up a value’s name among valid values, to enable option lookup with result as a key.
-
.value_option(name, option) ⇒ Object
private
Returns the value of the given option (set when a valid value with the given “name” was defined).
Instance Method Summary collapse
-
#call_provider(value) ⇒ Object
private
Calls the provider setter method for this property with the given value as argument.
-
#call_valuemethod(name, value) ⇒ Object
private
Sets the value of this property to the given value by calling the dynamically created setter method associated with the “valid value” referenced by the given name.
-
#change_to_s(current_value, newvalue) ⇒ String
Formats a message for a property change from the given ‘current_value` to the given `newvalue`.
-
#event ⇒ Puppet::Transaction::Event
Produces an event describing a change of this property.
-
#event_name ⇒ String
Produces the name of the event to use to describe a change of this property’s value.
-
#initialize(hash = {}) ⇒ Property
constructor
private
Initializes a Property the same way as a Parameter and handles the special case when a property is shadowing a meta-parameter.
-
#insync?(is) ⇒ Boolean
Checks if the current _(is)_ value is in sync with the wanted _(should)_ value.
-
#is_to_s(currentvalue) ⇒ String
Produces a pretty printing string for the given value.
-
#log(msg) ⇒ void
Emits a log message at the log level specified for the associated resource.
-
#match_all? ⇒ Boolean
Whether the Property.array_matching mode is set to ‘:all` or not.
-
#munge(value) ⇒ Object
Munges the value to internal form.
-
#name ⇒ Symbol
The name of the property as stated when the property was created.
-
#property_matches?(current, desired) ⇒ Boolean
Checks if the given current and desired values are equal.
-
#retrieve ⇒ Object
Retrieves the current value _(is)_ of this property from the provider.
-
#safe_insync?(is) ⇒ Boolean
private
Determines whether the property is in-sync or not in a way that is protected against missing value.
-
#set(value) ⇒ Object
Sets the current _(is)_ value of this property.
-
#setup_shadow(klass) ⇒ Puppet::Parameter
Sets up a shadow property for a shadowing meta-parameter.
-
#should ⇒ Array<Object>, ...
Returns the wanted _(should)_ value of this property.
-
#should=(values) ⇒ Object
Sets the wanted _(should)_ value of this property.
-
#should_to_s(newvalue) ⇒ String
Formats the given newvalue (following should type conventions) for inclusion in a string describing a change.
-
#sync ⇒ Object
Synchronizes the current value _(is)_ and the wanted value _(should)_ by calling #set.
-
#unsafe_validate(value) ⇒ void
private
Asserts that the given value is valid.
-
#validate_features_per_value(value) ⇒ void
private
Asserts that all required provider features are present for the given property value.
-
#value ⇒ Object?
Returns the wanted _(should)_ value of this property.
-
#value=(values) ⇒ Object
Sets the wanted _(should)_ value of this property.
Methods inherited from Parameter
aliasvalue, defaultto, desc, doc, #file, format_value_for_display, initvars, isnamevar, isnamevar?, #isnamevar?, isrequired, #line, #metaparam?, munge, newvalues, nodefault, #path, #pathbuilder, #provider, proxymethods, #remove, required?, #required?, #tags, #to_s, #unmunge, unmunge, #unsafe_munge, validate, #validate, #version
Methods included from Util::Docs
#desc, #dochook, #doctable, #markdown_definitionlist, #markdown_header, #nodoc?, #pad, scrub
Methods included from Util
absolute_path?, activerecord_version, benchmark, binread, chuser, classproxy, deterministic_rand, execfail, execpipe, execute, exit_on_fail, logmethods, memory, path_to_uri, pretty_backtrace, proxy, replace_file, safe_posix_fork, symbolizehash, thinmark, uri_to_path, which, withenv, withumask
Methods included from Util::POSIX
#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid
Methods included from Util::SymbolicFileMode
#normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?
Methods included from Util::MethodHelper
#requiredopts, #set_options, #symbolize_options
Methods included from Util::Logging
#clear_deprecation_warnings, #deprecation_warning, #format_exception, #get_deprecation_offender, #log_and_raise, #log_deprecations_to_file, #log_exception, #puppet_deprecation_warning, #send_log
Methods included from Util::Errors
#adderrorcontext, #devfail, #error_context, #exceptwrap, #fail
Constructor Details
#initialize(hash = {}) ⇒ Property
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
There is some special initialization when a property is not a metaparameter but Puppet::Type.metaparamclass(for this class’s name) is not nil - if that is the case a setup_shadow is performed for that class.
New properties of a type should be created via the DSL method Type.newproperty.
Initializes a Property the same way as a Parameter and handles the special case when a property is shadowing a meta-parameter.
293 294 295 296 297 298 299 |
# File 'lib/puppet/property.rb', line 293 def initialize(hash = {}) super if ! self. and klass = Puppet::Type.(self.class.name) setup_shadow(klass) end end |
Class Attribute Details
.array_matching ⇒ Symbol
The semantics of these modes are implemented by the method #insync?. That method is the default implementation and it has a backwards compatible behavior that imposes additional constraints on what constitutes a positive match. A derived property may override that method.
The ‘is` vs. `should` array matching mode; `:first`, or `:all`.
-
‘:first` This is primarily used for single value properties. When matched against an array of values a match is true if the `is` value matches any of the values in the `should` array. When the `is` value is also an array, the matching is performed against the entire array as the `is` value.
-
‘:all` : This is primarily used for multi-valued properties. When matched against an array of
`should` values, the size of `is` and `should` must be the same, and all values in `is` must match a value in `should`.
93 94 95 |
# File 'lib/puppet/property.rb', line 93 def array_matching @array_matching ||= :first end |
.name ⇒ Symbol (readonly)
Returns The name of the property as given when the property was created.
69 70 71 |
# File 'lib/puppet/property.rb', line 69 def name @name end |
.unmanaged ⇒ Object
Figure out what this is used for. Can not find any logic in the puppet code base that reads or writes this attribute.
??? Probably Unused
65 66 67 |
# File 'lib/puppet/property.rb', line 65 def unmanaged @unmanaged end |
Instance Attribute Details
#noop ⇒ Boolean
This logic is different than Parameter#noop in that the resource noop mode overrides the property’s mode - in parameter it is the other way around. Bug or feature?
Returns whether this property is in noop mode or not; if a difference between the is and should values should be acted on or not. The noop mode is a transitive setting. The mode is checked in this property, then in the _associated resource_ and finally in Puppet.
451 452 453 454 455 456 457 458 459 460 461 462 |
# File 'lib/puppet/property.rb', line 451 def noop # This is only here to make testing easier. if @resource.respond_to?(:noop?) @resource.noop? else if defined?(@noop) @noop else Puppet[:noop] end end end |
#shadow ⇒ Object (readonly)
What is this?
What is this used for?
282 283 284 |
# File 'lib/puppet/property.rb', line 282 def shadow @shadow end |
Class Method Details
.method_added(sym) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Protects against override of the #safe_insync? method.
321 322 323 |
# File 'lib/puppet/property.rb', line 321 def self.method_added(sym) raise "Puppet::Property#safe_insync? shouldn't be overridden; please override insync? instead" if sym == :safe_insync? end |
.newvalue(name, options = {}, &block) ⇒ Object
Option :event original comment says “event should be returned…”, is “returned” the correct word to use?
The original documentation states that the option ‘:method` will set the name of the generated setter method, but this is not implemented. Is the documentatin or the implementation in error? (The implementation is in Puppet::Parameter::ValueCollection#new_value).
verify that the use of :before and :after have been deprecated (or rather - never worked, and was never in use. (This means, that the option :call could be removed since calls are always :instead).
Defines a new valid value for this property. A valid value is specified as a literal (typically a Symbol), but can also be specified with a Regexp.
160 161 162 163 164 165 |
# File 'lib/puppet/property.rb', line 160 def self.newvalue(name, = {}, &block) value = value_collection.newvalue(name, , &block) define_method(value.method, &value.block) if value.method and value.block value end |
.value_name(name) ⇒ Symbol, Regexp
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Looks up a value’s name among valid values, to enable option lookup with result as a key.
111 112 113 114 115 |
# File 'lib/puppet/property.rb', line 111 def self.value_name(name) if value = value_collection.match?(name) value.name end end |
.value_option(name, option) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Guessing on result of passing a non supported option (it performs send(option)).
Returns the value of the given option (set when a valid value with the given “name” was defined).
125 126 127 128 129 |
# File 'lib/puppet/property.rb', line 125 def self.value_option(name, option) if value = value_collection.value(name) value.send(option) end end |
Instance Method Details
#call_provider(value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Calls the provider setter method for this property with the given value as argument.
173 174 175 176 177 178 179 |
# File 'lib/puppet/property.rb', line 173 def call_provider(value) method = self.class.name.to_s + "=" unless provider.respond_to? method self.fail "The #{provider.class.name} provider can not handle attribute #{self.class.name}" end provider.send(method, value) end |
#call_valuemethod(name, value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
The check for a valid value option called ‘:method` does not seem to be fully supported as it seems that this option is never consulted when the method is dynamically created. Needs to be investigated. (Bug, or documentation needs to be changed).
Sets the value of this property to the given value by calling the dynamically created setter method associated with the “valid value” referenced by the given name.
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/puppet/property.rb', line 194 def call_valuemethod(name, value) if method = self.class.value_option(name, :method) and self.respond_to?(method) begin self.send(method) rescue Puppet::Error raise rescue => detail error = Puppet::ResourceError.new("Could not set '#{value}' on #{self.class.name}: #{detail}", @resource.line, @resource.file, detail) error.set_backtrace detail.backtrace Puppet.log_exception(detail, error.) raise error end elsif block = self.class.value_option(name, :block) # FIXME It'd be better here to define a method, so that # the blocks could return values. self.instance_eval(&block) else devfail "Could not find method for value '#{name}'" end end |
#change_to_s(current_value, newvalue) ⇒ String
If called with equal values, this is reported as a change.
Formats a message for a property change from the given ‘current_value` to the given `newvalue`.
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/puppet/property.rb', line 220 def change_to_s(current_value, newvalue) begin if current_value == :absent return "defined '#{name}' as #{self.class.format_value_for_display should_to_s(newvalue)}" elsif newvalue == :absent or newvalue == [:absent] return "undefined '#{name}' from #{self.class.format_value_for_display is_to_s(current_value)}" else return "#{name} changed #{self.class.format_value_for_display is_to_s(current_value)} to #{self.class.format_value_for_display should_to_s(newvalue)}" end rescue Puppet::Error, Puppet::DevError raise rescue => detail = "Could not convert change '#{name}' to string: #{detail}" Puppet.log_exception(detail, ) raise Puppet::DevError, , detail.backtrace end end |
#event ⇒ Puppet::Transaction::Event
What is the intent of this method? What is the meaning of the :source_description passed in the options to the created event?
Produces an event describing a change of this property. In addition to the event attributes set by the resource type, this method adds:
-
‘:name` - the event_name
-
‘:desired_value` - a.k.a should or _wanted value_
-
‘:property` - reference to this property
-
‘:source_description` - the path (?? See todo)
-
‘:invalidate_refreshes` - if scheduled refreshes should be invalidated
272 273 274 275 276 277 278 |
# File 'lib/puppet/property.rb', line 272 def event attrs = { :name => event_name, :desired_value => should, :property => self, :source_description => path } if should and value = self.class.value_collection.match?(should) attrs[:invalidate_refreshes] = true if value.invalidate_refreshes end resource.event attrs end |
#event_name ⇒ String
Produces the name of the event to use to describe a change of this property’s value. The produced event name is either the event name configured for this property, or a generic event based on the name of the property with suffix ‘_changed`, or if the property is `:ensure`, the name of the resource type and one of the suffixes `_created`, `_removed`, or `_changed`.
244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/puppet/property.rb', line 244 def event_name value = self.should event_name = self.class.value_option(value, :event) and return event_name name == :ensure or return (name.to_s + "_changed").to_sym return (resource.type.to_s + case value when :present; "_created" when :absent; "_removed" else "_changed" end).to_sym end |
#insync?(is) ⇒ Boolean
The implementation should really do return is.zip(@should).all? {|a, b| property_matches?(a, b) } instead of using equality check and then check against an array with converted strings.
The array matching logic in this method contains backwards compatible logic that performs the comparison in ‘:all` mode by checking equality and equality of is against should converted to array of String, and that the lengths are equal, and in `:first` mode by checking if one of the should values is included in the is values. This means that the is value needs to be carefully arranged to match the should.
Checks if the current _(is)_ value is in sync with the wanted _(should)_ value. The check if the two values are in sync is controlled by the result of #match_all? which specifies a match of ‘:first` or `:all`). The matching of the is value against the entire should value or each of the should values (as controlled by #match_all? is performed by #property_matches?.
A derived property typically only needs to override the #property_matches? method, but may also override this method if there is a need to have more control over the array matching logic.
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
# File 'lib/puppet/property.rb', line 345 def insync?(is) self.devfail "#{self.class.name}'s should is not array" unless @should.is_a?(Array) # an empty array is analogous to no should values return true if @should.empty? # Look for a matching value, either for all the @should values, or any of # them, depending on the configuration of this property. if match_all? then # Emulate Array#== using our own comparison function. # A non-array was not equal to an array, which @should always is. return false unless is.is_a? Array # If they were different lengths, they are not equal. return false unless is.length == @should.length # Finally, are all the elements equal? In order to preserve the # behaviour of previous 2.7.x releases, we need to impose some fun rules # on "equality" here. # # Specifically, we need to implement *this* comparison: the two arrays # are identical if the is values are == the should values, or if the is # values are == the should values, stringified. # # This does mean that property equality is not commutative, and will not # work unless the `is` value is carefully arranged to match the should. return (is == @should or is == @should.map(&:to_s)) # When we stop being idiots about this, and actually have meaningful # semantics, this version is the thing we actually want to do. # # return is.zip(@should).all? {|a, b| property_matches?(a, b) } else return @should.any? {|want| property_matches?(is, want) } end end |
#is_to_s(currentvalue) ⇒ String
Produces a pretty printing string for the given value. This default implementation simply returns the given argument. A derived implementation may perform property specific pretty printing when the is and should values are not already in suitable form.
404 405 406 |
# File 'lib/puppet/property.rb', line 404 def is_to_s(currentvalue) currentvalue end |
#log(msg) ⇒ void
This method returns an undefined value.
Emits a log message at the log level specified for the associated resource. The log entry is associated with this property.
413 414 415 416 417 418 419 |
# File 'lib/puppet/property.rb', line 413 def log(msg) Puppet::Util::Log.create( :level => resource[:loglevel], :message => msg, :source => self ) end |
#match_all? ⇒ Boolean
Returns whether the array_matching mode is set to ‘:all` or not.
422 423 424 |
# File 'lib/puppet/property.rb', line 422 def match_all? self.class.array_matching == :all end |
#munge(value) ⇒ Object
Incomprehensible ! The concept of “meta-parameter-shadowing” needs to be explained.
This method should not be overridden. Use the DSL method #munge to define a munging method if required.
Munges the value to internal form. This implementation of ‘munge` provides exception handling around the specified munging of this parameter. If this property is a meta-parameter shadow, the shadow’s munge is also called.
430 431 432 433 434 |
# File 'lib/puppet/property.rb', line 430 def munge(value) self.shadow.munge(value) if self.shadow super end |
#name ⇒ Symbol
A property class (just like a parameter class) describes one specific property and can only be used once within one type’s inheritance chain.
Returns the name of the property as stated when the property was created.
439 440 441 |
# File 'lib/puppet/property.rb', line 439 def name self.class.name end |
#property_matches?(current, desired) ⇒ Boolean
Checks if the given current and desired values are equal. This default implementation performs this check in a backwards compatible way where the equality of the two values is checked, and then the equality of current with desired converted to a string.
A derived implementation may override this method to perform a property specific equality check.
The intent of this method is to provide an equality check suitable for checking if the property value is in sync or not. It is typically called from #insync?.
392 393 394 395 396 397 |
# File 'lib/puppet/property.rb', line 392 def property_matches?(current, desired) # This preserves the older Puppet behaviour of doing raw and string # equality comparisons for all equality. I am not clear this is globally # desirable, but at least it is not a breaking change. --daniel 2011-11-11 current == desired or current == desired.to_s end |
#retrieve ⇒ Object
Retrieves the current value _(is)_ of this property from the provider. This implementation performs this operation by calling a provider method with the same name as this property (i.e. if the property name is ‘gid’, a call to the ‘provider.gid’ is expected to return the current value.
470 471 472 |
# File 'lib/puppet/property.rb', line 470 def retrieve provider.send(self.class.name) end |
#safe_insync?(is) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
If the wanted value _(should)_ is not defined or is set to a non-true value then this is a state that can not be fixed and the property is reported to be in sync.
Do not override this method.
Determines whether the property is in-sync or not in a way that is protected against missing value.
309 310 311 312 313 314 315 |
# File 'lib/puppet/property.rb', line 309 def safe_insync?(is) # If there is no @should value, consider the property to be in sync. return true unless @should # Otherwise delegate to the (possibly derived) insync? method. insync?(is) end |
#set(value) ⇒ Object
In older versions (before 20081031) it was possible to specify the call types ‘:before` and `:after` which had the effect that both the provider method and the _valid value_ block were called. This is no longer supported.
Sets the current _(is)_ value of this property. The value is set using the provider’s setter method for this property (#call_provider) if nothing else has been specified. If the _valid value_ for the given value defines a ‘:call` option with the value `:instead`, the value is set with #call_valuemethod which invokes a block specified for the valid value.
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 |
# File 'lib/puppet/property.rb', line 491 def set(value) # Set a name for looking up associated options like the event. name = self.class.value_name(value) call = self.class.value_option(name, :call) || :none if call == :instead call_valuemethod(name, value) elsif call == :none # They haven't provided a block, and our parent does not have # a provider, so we have no idea how to handle this. self.fail "#{self.class.name} cannot handle values of type #{value.inspect}" unless @resource.provider call_provider(value) else # LAK:NOTE 20081031 This is a change in behaviour -- you could # previously specify :call => [;before|:after], which would call # the setter *in addition to* the block. I'm convinced this # was never used, and it makes things unecessarily complicated. # If you want to specify a block and still call the setter, then # do so in the block. devfail "Cannot use obsolete :call value '#{call}' for property '#{self.class.name}'" end end |
#setup_shadow(klass) ⇒ Puppet::Parameter
Sets up a shadow property for a shadowing meta-parameter. This construct allows the creation of a property with the same name as a meta-parameter. The metaparam will only be stored as a shadow.
521 522 523 |
# File 'lib/puppet/property.rb', line 521 def setup_shadow(klass) @shadow = klass.new(:resource => self.resource) end |
#should ⇒ Array<Object>, ...
This method will potentially return different values than the original values as they are converted via munging/unmunging. If the original values are wanted, call #shouldorig.
Returns the wanted _(should)_ value of this property. If the _array matching mode_ #match_all? is true, an array of the wanted values in unmunged format is returned, else the first value in the array of wanted values in unmunged format is returned.
538 539 540 541 542 543 544 545 546 547 548 |
# File 'lib/puppet/property.rb', line 538 def should return nil unless defined?(@should) self.devfail "should for #{self.class.name} on #{resource.name} is not an array" unless @should.is_a?(Array) if match_all? return @should.collect { |val| self.unmunge(val) } else return self.unmunge(@should[0]) end end |
#should=(values) ⇒ Object
Sets the wanted _(should)_ value of this property. If the given value is not already an Array, it will be wrapped in one before being set. This method also sets the cached original should values returned by #shouldorig.
558 559 560 561 562 563 564 565 |
# File 'lib/puppet/property.rb', line 558 def should=(values) values = [values] unless values.is_a?(Array) @shouldorig = values values.each { |val| validate(val) } @should = values.collect { |val| self.munge(val) } end |
#should_to_s(newvalue) ⇒ String
Formats the given newvalue (following should type conventions) for inclusion in a string describing a change.
571 572 573 |
# File 'lib/puppet/property.rb', line 571 def should_to_s(newvalue) [newvalue].flatten.join(" ") end |
#sync ⇒ Object
The implementation of this method is somewhat inefficient as it computes the should array twice.
Synchronizes the current value _(is)_ and the wanted value _(should)_ by calling #set.
579 580 581 582 |
# File 'lib/puppet/property.rb', line 579 def sync devfail "Got a nil value for should" unless should set(should) end |
#unsafe_validate(value) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Asserts that the given value is valid. If the developer uses a ‘validate’ hook, this method will get overridden.
590 591 592 593 |
# File 'lib/puppet/property.rb', line 590 def unsafe_validate(value) super validate_features_per_value(value) end |
#validate_features_per_value(value) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Asserts that all required provider features are present for the given property value.
600 601 602 603 604 605 606 |
# File 'lib/puppet/property.rb', line 600 def validate_features_per_value(value) if features = self.class.value_option(self.class.value_name(value), :required_features) features = Array(features) needed_features = features.collect { |f| f.to_s }.join(", ") raise ArgumentError, "Provider must have features '#{needed_features}' to set '#{self.class.name}' to '#{value}'" unless provider.satisfies?(features) end end |
#value ⇒ Object?
Returns the wanted _(should)_ value of this property.
609 610 611 |
# File 'lib/puppet/property.rb', line 609 def value self.should end |
#value=(values) ⇒ Object
Sets the wanted _(should)_ value of this property. If the given value is not already an Array, it will be wrapped in one before being set. This method also sets the cached original should values returned by #shouldorig.
614 615 616 |
# File 'lib/puppet/property.rb', line 614 def value=(values) self.should = values end |