Class: OmfEc::ExperimentProperty
- Inherits:
-
Object
- Object
- OmfEc::ExperimentProperty
- Defined in:
- omf_ec/lib/omf_ec/experiment_property.rb
Overview
This class defines an Experiment Property, and also holds all of the Experiment Properties defined for a given experiment. Most of this implementation is re-used from OMF 5.4
Constant Summary
- @@properties =
Contains all the experiment properties
Hashie::Mash.new
- @@creation_observers =
Holds all observers on any Experiment Property creation
[]
Instance Attribute Summary (collapse)
-
- (Object) description
Returns the value of attribute description.
-
- (Object) id
readonly
Returns the value of attribute id.
-
- (Object) name
readonly
Returns the value of attribute name.
-
- (Object) value
readonly
Returns the value of attribute value.
Class Method Summary (collapse)
-
+ (Object) [](name)
Returns a given property - name =nameof the property to return.
- + (Object) []=(name, val)
-
+ (Object) add_observer(&proc)
Add an observer for any creation of a new Experiment Property.
-
+ (Object) create(name, value = nil, description = nil)
Return an existing Experiment Property, or create a new one.
-
+ (Object) each(sort_names = false, &block)
Iterate over all Experiment Properties.
- + (Object) length
-
+ (Object) method_missing(name, args = nil)
Handles missing method, allows to access an existing Experiment Property with the syntax 'propcontext.propname'.
-
+ (Object) names
Return the names of the all defined Experiment Properties.
-
+ (Object) to_str
Minitest needs to be able to turn this Class into a string, this is normally done through the default 'method_missing' of the Classe but we redefined that…
Instance Method Summary (collapse)
-
- (Object) *(right)
Multiplication operator for Integer and Float properties.
-
- (Object) +(right)
Addition operator for Integer, Float, and String properties.
-
- (Object) -(right)
Substraction operator for Integer and Float properties.
-
- (Object) /(right)
Division operator for Integer and Float properties.
-
- (Object) coerce(other)
Explicit Coercion for Integer, Float, and String properties (allow property to be on the right-hand of an operator such as +).
-
- (ExperimentProperty) initialize(name, value = nil, description = nil)
constructor
Create a new Experiment Property.
-
- (Object) on_change(&block)
Add a block of command to the list of actions to do when this property is being changed.
-
- (Object) set(value)
Update the value of this Experiment Property.
-
- (Object) to_f
More convenient conversion.
- - (Object) to_i
-
- (Object) to_str
(also: #to_s)
Implicit conversion to String (required for + operator).
Constructor Details
- (ExperimentProperty) initialize(name, value = nil, description = nil)
Create a new Experiment Property
-
name = name of the property to create/return
-
value = value to assign to this property
-
description = short string description for this property
136 137 138 139 140 141 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 136 def initialize(name, value = nil, description = nil) @name = name.to_s @description = description @change_observers = Array.new set(value) end |
Instance Attribute Details
- (Object) description
Returns the value of attribute description
125 126 127 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 125 def description @description end |
- (Object) id (readonly)
Returns the value of attribute id
124 125 126 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 124 def id @id end |
- (Object) name (readonly)
Returns the value of attribute name
124 125 126 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 124 def name @name end |
- (Object) value (readonly)
Returns the value of attribute value
124 125 126 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 124 def value @value end |
Class Method Details
+ (Object) [](name)
Returns a given property
-
name =nameof the property to return
- Return
-
a property
29 30 31 32 33 34 35 36 37 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 29 def self.[](name) p = @@properties[name.to_s.to_sym] if p.nil? raise OEDLCommandException.new(name, "Unknown experiment property '#{name}'\n\tKnown properties are "+ "'#{ExperimentProperty.names.join(', ')}'") end return p end |
+ (Object) []=(name, val)
39 40 41 42 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 39 def self.[]=(name, val) p = ExperimentProperty[name.to_sym] p.set(val) end |
+ (Object) add_observer(&proc)
Add an observer for any creation of a new Experiment Property
-
proc = block to execute when a new Experiment Property is created
122 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 122 def self.add_observer(&proc) @@creation_observers << proc end |
+ (Object) create(name, value = nil, description = nil)
Return an existing Experiment Property, or create a new one
-
name = name of the property to create/return
-
value = value to assign to this property
-
description = short string description for this property
- Return
-
an Experiment Property
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 90 def self.create(name, value = nil, description = nil) name = name.to_s # http://stackoverflow.com/questions/4378670/what-is-a-ruby-regex-to-match-a-function-name if /[@$"]/ =~ name.to_sym.inspect raise OEDLCommandException.new("ExperimentProperty.create", "Cannot create property '#{name}', its name is not a valid Ruby name") end p = nil name = name.to_sym if (p = @@properties[name]) != nil p.set(value) if value != nil p.description = description if description != nil else p = ExperimentProperty.new(name, value, description) @@properties[name] = p # Let the observers know that we created a new property @@creation_observers.each { |proc| proc.call(:create, p) } end return p end |
+ (Object) each(sort_names = false, &block)
Iterate over all Experiment Properties. The block will be called with the respective property as single argument
-
sort_names = if 'true' sort the properties (default: true)
-
&block = the block of commands to call
76 77 78 79 80 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 76 def self.each(sort_names = false, &block) names = @@properties.keys names = names.sort_by {|sym| sym.to_s} if (sort_names) names.each { |n| block.call(@@properties[n]) } end |
+ (Object) length
44 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 44 def self.length; @@properties.length end |
+ (Object) method_missing(name, args = nil)
Handles missing method, allows to access an existing Experiment Property with the syntax 'propcontext.propname'
56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 56 def self.method_missing(name, args = nil) name = name.to_s if setter = (name[-1] == ?=) name.chop! end p = ExperimentProperty[name.to_sym] if setter p.set(args) else return p end end |
+ (Object) names
Return the names of the all defined Experiment Properties
- Return
-
an Array with the names of all defined Experiment Properties
116 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 116 def self.names() return @@properties.keys end |
+ (Object) to_str
Minitest needs to be able to turn this Class into a string, this is normally done through the default 'method_missing' of the Classe but we redefined that… so to run minitest we need to explicitly define 'to_str' for this Class
50 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 50 def self.to_str; "ExperimentProperty" end |
Instance Method Details
- (Object) *(right)
Multiplication operator for Integer and Float properties
188 189 190 191 192 193 194 195 196 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 188 def *(right) if @value.kind_of?(Integer) || @value.kind_of?(Float) return (@value * right) else raise OEDLCommandException.new("*", "Illegal operation, "+ "the value of Experiment Property '#{@name}' is not numerical "+ "(current value is of type #{value.class})") end end |
- (Object) +(right)
Addition operator for Integer, Float, and String properties
210 211 212 213 214 215 216 217 218 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 210 def +(right) if @value.kind_of?(Integer) || @value.kind_of?(Float) || @value.kind_of?(String) return (@value + right) else raise OEDLCommandException.new("+", "Illegal operation, "+ "The value of Experiment Property '#{@name}' does not support addition "+ "(current value is of type #{value.class})") end end |
- (Object) -(right)
Substraction operator for Integer and Float properties
199 200 201 202 203 204 205 206 207 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 199 def -(right) if @value.kind_of?(Integer) || @value.kind_of?(Float) return (@value - right) else raise OEDLCommandException.new("-", "Illegal operation, "+ "the value of Experiment Property '#{@name}' is not numerical "+ "(current value is of type #{value.class})") end end |
- (Object) /(right)
Division operator for Integer and Float properties
177 178 179 180 181 182 183 184 185 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 177 def /(right) if @value.kind_of?(Integer) || @value.kind_of?(Float) return (@value / right) else raise OEDLCommandException.new("/", "Illegal operation, "+ "the value of Experiment Property '#{@name}' is not numerical "+ "(current value is of type #{value.class})") end end |
- (Object) coerce(other)
Explicit Coercion for Integer, Float, and String properties (allow property to be on the right-hand of an operator such as +)
222 223 224 225 226 227 228 229 230 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 222 def coerce(other) if @value.kind_of?(Integer) || @value.kind_of?(Float) || @value.kind_of?(String) return other, @value else raise OEDLCommandException.new("coercion", "Illegal operation, "+ "The value of Experiment Property '#{@name}' cannot be coerced to allow "+ " the requested operation (current value is of type #{value.class})") end end |
- (Object) on_change(&block)
Add a block of command to the list of actions to do when this property is being changed
-
&block = the block of command to add
149 150 151 152 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 149 def on_change (&block) debug "Somebody bound to me" @change_observers << block end |
- (Object) set(value)
Update the value of this Experiment Property
-
value = new value for this property
159 160 161 162 163 164 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 159 def set(value) @value = value info "#{name} = #{value.inspect} (#{value.class})" @change_observers.each { |proc| proc.call(value) } OmfEc.experiment.(name, value, :prop) end |
- (Object) to_f
More convenient conversion
170 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 170 def to_f() @value.to_f end |
- (Object) to_i
171 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 171 def to_i() @value.to_i end |
- (Object) to_str Also known as: to_s
Implicit conversion to String (required for + operator)
167 |
# File 'omf_ec/lib/omf_ec/experiment_property.rb', line 167 def to_str() @value.to_s end |