Class: Puppet::Pops::Validation::Checker4_0
- Defined in:
- lib/puppet/pops/validation/checker4_0.rb
Overview
A Validator validates a model.
Validation is performed on each model element in isolation. Each method should validate the model element’s state but not validate its referenced/contained elements except to check their validity in their respective role. The intent is to drive the validation with a tree iterator that visits all elements in a model.
TODO: Add validation of multiplicities - this is a general validation that can be checked for all
Model objects via their metamodel. (I.e an extra call to multiplicity check in polymorph check).
This is however mostly valuable when validating model to model transformations, and is therefore T.B.D
Constant Summary collapse
- Issues =
Puppet::Pops::Issues
- Model =
Puppet::Pops::Model
- RESERVED_TYPE_NAMES =
{ 'type' => true, 'any' => true, 'unit' => true, 'scalar' => true, 'boolean' => true, 'numeric' => true, 'integer' => true, 'float' => true, 'collection' => true, 'array' => true, 'hash' => true, 'tuple' => true, 'struct' => true, 'variant' => true, 'optional' => true, 'enum' => true, 'regexp' => true, 'pattern' => true, 'runtime' => true, }
- FUTURE_RESERVED_WORDS =
{ 'application' => true, 'produces' => true, 'consumes' => true }
- RESERVED_PARAMETERS =
{ 'name' => true, 'title' => true, }
Instance Attribute Summary collapse
- #acceptor ⇒ Object readonly
- #migration_checker ⇒ Object readonly
Instance Method Summary collapse
-
#assign(o, via_index = false) ⇒ Object
Checks the LHS of an assignment (is it assignable?).
- #assign_AccessExpression(o, via_index) ⇒ Object
- #assign_LiteralList(o, via_index) ⇒ Object
- #assign_Object(o, via_index) ⇒ Object
-
#assign_VariableExpression(o, via_index) ⇒ Object
—ASSIGNMENT CHECKS.
-
#check(o) ⇒ Object
Performs regular validity check.
- #check_AccessExpression(o) ⇒ Object
- #check_AssignmentExpression(o) ⇒ Object
-
#check_AttributeOperation(o) ⇒ Object
Checks that operation with :+> is contained in a ResourceOverride or Collector.
- #check_AttributesOperation(o) ⇒ Object
- #check_BinaryExpression(o) ⇒ Object
- #check_BlockExpression(o) ⇒ Object
- #check_CallNamedFunctionExpression(o) ⇒ Object
- #check_CapabilityMapping(o) ⇒ Object
- #check_CaseExpression(o) ⇒ Object
- #check_CaseOption(o) ⇒ Object
- #check_CollectExpression(o) ⇒ Object
- #check_EppExpression(o) ⇒ Object
- #check_Factory(o) ⇒ Object
- #check_FunctionDefinition(o) ⇒ Object
- #check_HostClassDefinition(o) ⇒ Object
- #check_IfExpression(o) ⇒ Object
- #check_KeyedEntry(o) ⇒ Object
- #check_LambdaExpression(o) ⇒ Object
- #check_LiteralList(o) ⇒ Object
- #check_MethodCallExpression(o) ⇒ Object
-
#check_NamedAccessExpression(o) ⇒ Object
Only used for function names, grammar should not be able to produce something faulty, but check anyway if model is created programatically (it will fail in transformation to AST for sure).
-
#check_NamedDefinition(o) ⇒ Object
for ‘class’, ‘define’, and function.
- #check_NodeDefinition(o) ⇒ Object
-
#check_Object(o) ⇒ Object
—CHECKS.
- #check_Parameter(o) ⇒ Object
-
#check_QualifiedName(o) ⇒ Object
No checking takes place - all expressions using a QualifiedName need to check.
-
#check_QualifiedReference(o) ⇒ Object
Checks that the value is a valid UpperCaseWord (a CLASSREF), and optionally if it contains a hypen.
- #check_QueryExpression(o) ⇒ Object
-
#check_RelationshipExpression(o) ⇒ Object
relationship_side: resource | resourceref | collection | variable | quotedtext | selector | casestatement | hasharrayaccesses.
- #check_ReservedWord(o) ⇒ Object
- #check_ResourceBody(o) ⇒ Object
- #check_ResourceDefaultsExpression(o) ⇒ Object
- #check_ResourceExpression(o) ⇒ Object
- #check_ResourceOverrideExpression(o) ⇒ Object
- #check_ResourceTypeDefinition(o) ⇒ Object
- #check_SelectorEntry(o) ⇒ Object
- #check_SelectorExpression(o) ⇒ Object
- #check_UnaryExpression(o) ⇒ Object
- #check_UnlessExpression(o) ⇒ Object
-
#check_VariableExpression(o) ⇒ Object
Checks that variable is either strictly 0, or a non 0 starting decimal number, or a valid VAR_NAME.
-
#ends_with_idem(o) ⇒ Object
Returns the last expression in a block, or the expression, if that expression is idem.
-
#hostname(o, semantic) ⇒ Object
Performs check if this is a vaid hostname expression.
-
#hostname_Array(o, semantic) ⇒ Object
Transforms Array of host matching expressions into a (Ruby) array of AST::HostName.
- #hostname_ConcatenatedString(o, semantic) ⇒ Object
- #hostname_LiteralDefault(o, semantic) ⇒ Object
- #hostname_LiteralNumber(o, semantic) ⇒ Object
- #hostname_LiteralRegularExpression(o, semantic) ⇒ Object
- #hostname_LiteralValue(o, semantic) ⇒ Object
- #hostname_Object(o, semantic) ⇒ Object
- #hostname_QualifiedName(o, semantic) ⇒ Object
- #hostname_QualifiedReference(o, semantic) ⇒ Object
- #hostname_String(o, semantic) ⇒ Object
-
#idem(o) ⇒ Boolean
Checks if the expression has side effect (‘idem’ is latin for ‘the same’, here meaning that the evaluation state is known to be unchanged after the expression has been evaluated).
- #idem_AccessExpression(o) ⇒ Object
- #idem_AssignmentExpression(o) ⇒ Object
- #idem_BinaryExpression(o) ⇒ Object
- #idem_BlockExpression(o) ⇒ Object
-
#idem_CaseExpression(o) ⇒ Object
Case expression is idem, if test, and all options are idem.
-
#idem_CaseOption(o) ⇒ Object
An option is idem if values and the then_expression are idem.
-
#idem_ConcatenatedString(o) ⇒ Object
Returns true even though there may be interpolated expressions that have side effect.
- #idem_Factory(o) ⇒ Object
-
#idem_HeredocExpression(o) ⇒ Object
Heredoc is just a string, but may contain interpolated string (which may have side effects).
- #idem_IfExpression(o) ⇒ Object
- #idem_Literal(o) ⇒ Object
- #idem_LiteralHash(o) ⇒ Object
- #idem_LiteralList(o) ⇒ Object
- #idem_NilClass(o) ⇒ Object
- #idem_Nop(o) ⇒ Object
-
#idem_Object(o) ⇒ Object
–IDEM CHECK.
-
#idem_ParenthesizedExpression(o) ⇒ Object
Allow (no-effect parentheses) to be used around a productive expression.
- #idem_RelationshipExpression(o) ⇒ Object
- #idem_RenderExpression(o) ⇒ Object
- #idem_RenderStringExpression(o) ⇒ Object
-
#idem_SelectorExpression(o) ⇒ Object
May technically have side effects inside the Selector, but this is bad design - treat as idem.
-
#idem_UnaryExpression(o) ⇒ Object
Handles UnaryMinusExpression, NotExpression, VariableExpression.
-
#initialize(diagnostics_producer) ⇒ Checker4_0
constructor
Initializes the validator with a diagnostics producer.
- #internal_check_capture_last(o) ⇒ Object
- #internal_check_no_capture(o, container = o) ⇒ Object
- #internal_check_no_idem_last(o) ⇒ Object
- #internal_check_reserved_params(o) ⇒ Object
-
#query(o) ⇒ Object
Performs check if this is valid as a query.
-
#query_BooleanExpression(o) ⇒ Object
Allows AND, OR, and checks if left/right are allowed in query.
-
#query_ComparisonExpression(o) ⇒ Object
Puppet AST only allows == and !=.
- #query_LiteralBoolean(o) ⇒ Object
- #query_LiteralNumber(o) ⇒ Object
- #query_LiteralString(o) ⇒ Object
-
#query_Object(o) ⇒ Object
Anything not explicitly allowed is flagged as error.
- #query_ParenthesizedExpression(o) ⇒ Object
- #query_QualifiedName(o) ⇒ Object
- #query_VariableExpression(o) ⇒ Object
-
#relation(o) ⇒ Object
Performs check if this is valid as a relationship side.
- #relation_CollectExpression(o) ⇒ Object
- #relation_Object(o) ⇒ Object
- #relation_RelationshipExpression(o) ⇒ Object
-
#rvalue(o) ⇒ Object
Performs check if this is valid as a rvalue.
- #rvalue_CollectExpression(o) ⇒ Object
- #rvalue_Definition(o) ⇒ Object
-
#rvalue_Expression(o) ⇒ Object
By default, all expressions are reported as being rvalues Implement specific rvalue checks for those that are not.
- #rvalue_NodeDefinition(o) ⇒ Object
- #rvalue_UnaryExpression(o) ⇒ Object
-
#top(o, definition) ⇒ Object
Performs check if this is valid as a container of a definition (class, define, node).
- #top_BlockExpression(o, definition) ⇒ Object
- #top_HostClassDefinition(o, definition) ⇒ Object
-
#top_LambdaExpression(o, definition) ⇒ Object
A LambdaExpression is a BlockExpression, and this method is needed to prevent the polymorph method for BlockExpression to accept a lambda.
-
#top_NilClass(o, definition) ⇒ Object
—TOP CHECK.
- #top_Object(o, definition) ⇒ Object
- #top_Program(o, definition) ⇒ Object
-
#validate(model) ⇒ Object
Validates the entire model by visiting each model element and calling ‘check`.
-
#varname_to_s(o) ⇒ Object
Produces string part of something named, or nil if not a QualifiedName or QualifiedReference.
Constructor Details
#initialize(diagnostics_producer) ⇒ Checker4_0
Initializes the validator with a diagnostics producer. This object must respond to ‘:will_accept?` and `:accept`.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 22 def initialize(diagnostics_producer) @@check_visitor ||= Puppet::Pops::Visitor.new(nil, "check", 0, 0) @@rvalue_visitor ||= Puppet::Pops::Visitor.new(nil, "rvalue", 0, 0) @@hostname_visitor ||= Puppet::Pops::Visitor.new(nil, "hostname", 1, 2) @@assignment_visitor ||= Puppet::Pops::Visitor.new(nil, "assign", 0, 1) @@query_visitor ||= Puppet::Pops::Visitor.new(nil, "query", 0, 0) @@top_visitor ||= Puppet::Pops::Visitor.new(nil, "top", 1, 1) @@relation_visitor ||= Puppet::Pops::Visitor.new(nil, "relation", 0, 0) @@idem_visitor ||= Puppet::Pops::Visitor.new(self, "idem", 0, 0) @acceptor = diagnostics_producer # Use null migration checker unless given in context @migration_checker = (Puppet.lookup(:migration_checker) { Puppet::Pops::Migration::MigrationChecker.new() }) end |
Instance Attribute Details
#acceptor ⇒ Object (readonly)
16 17 18 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 16 def acceptor @acceptor end |
#migration_checker ⇒ Object (readonly)
17 18 19 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 17 def migration_checker @migration_checker end |
Instance Method Details
#assign(o, via_index = false) ⇒ Object
Checks the LHS of an assignment (is it assignable?). If args is true, assignment via index is checked.
82 83 84 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 82 def assign(o, via_index = false) @@assignment_visitor.visit_this_1(self, o, via_index) end |
#assign_AccessExpression(o, via_index) ⇒ Object
123 124 125 126 127 128 129 130 131 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 123 def assign_AccessExpression(o, via_index) # Are indexed assignments allowed at all ? $x[x] = '...' if acceptor.will_accept? Issues::ILLEGAL_INDEXED_ASSIGNMENT acceptor.accept(Issues::ILLEGAL_INDEXED_ASSIGNMENT, o) else # Then the left expression must be assignable-via-index assign(o.left_expr, true) end end |
#assign_LiteralList(o, via_index) ⇒ Object
133 134 135 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 133 def assign_LiteralList(o, via_index) o.values.each {|x| assign(x) } end |
#assign_Object(o, via_index) ⇒ Object
137 138 139 140 141 142 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 137 def assign_Object(o, via_index) # Can not assign to anything else (differentiate if this is via index or not) # i.e. 10 = 'hello' vs. 10['x'] = 'hello' (the root is reported as being in error in both cases) # acceptor.accept(via_index ? Issues::ILLEGAL_ASSIGNMENT_VIA_INDEX : Issues::ILLEGAL_ASSIGNMENT, o) end |
#assign_VariableExpression(o, via_index) ⇒ Object
—ASSIGNMENT CHECKS
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 107 def assign_VariableExpression(o, via_index) varname_string = varname_to_s(o.expr) if varname_string =~ Puppet::Pops::Patterns::NUMERIC_VAR_NAME acceptor.accept(Issues::ILLEGAL_NUMERIC_ASSIGNMENT, o, :varname => varname_string) end # Can not assign to something in another namespace (i.e. a '::' in the name is not legal) if acceptor.will_accept? Issues::CROSS_SCOPE_ASSIGNMENT if varname_string =~ /::/ acceptor.accept(Issues::CROSS_SCOPE_ASSIGNMENT, o, :name => varname_string) end end # TODO: Could scan for reassignment of the same variable if done earlier in the same container # Or if assigning to a parameter (more work). end |
#check(o) ⇒ Object
Performs regular validity check
49 50 51 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 49 def check(o) @@check_visitor.visit_this_0(self, o) end |
#check_AccessExpression(o) ⇒ Object
153 154 155 156 157 158 159 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 153 def check_AccessExpression(o) # Only min range is checked, all other checks are RT checks as they depend on the resulting type # of the LHS. if o.keys.size < 1 acceptor.accept(Issues::MISSING_INDEX, o) end end |
#check_AssignmentExpression(o) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 161 def check_AssignmentExpression(o) case o.operator when :'=' assign(o.left_expr) rvalue(o.right_expr) when :'+=', :'-=' acceptor.accept(Issues::APPENDS_DELETES_NO_LONGER_SUPPORTED, o, {:operator => o.operator}) else acceptor.accept(Issues::UNSUPPORTED_OPERATOR, o, {:operator => o.operator}) end end |
#check_AttributeOperation(o) ⇒ Object
Checks that operation with :+> is contained in a ResourceOverride or Collector.
Parent of an AttributeOperation can be one of:
-
CollectExpression
-
ResourceOverride
-
ResourceBody (ILLEGAL this is a regular resource expression)
-
ResourceDefaults (ILLEGAL)
181 182 183 184 185 186 187 188 189 190 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 181 def check_AttributeOperation(o) if o.operator == :'+>' # Append operator use is constrained parent = o.eContainer unless parent.is_a?(Model::CollectExpression) || parent.is_a?(Model::ResourceOverrideExpression) acceptor.accept(Issues::ILLEGAL_ATTRIBUTE_APPEND, o, {:name=>o.attribute_name, :parent=>parent}) end end rvalue(o.value_expr) end |
#check_AttributesOperation(o) ⇒ Object
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 192 def check_AttributesOperation(o) # Append operator use is constrained parent1 = o.eContainer case parent1 when Model::AbstractResource when Model::CollectExpression when Model::CapabilityMapping acceptor.accept(Issues::UNSUPPORTED_OPERATOR_IN_CONTEXT, parent1, :operator=>'* =>') else # protect against just testing a snippet that has no parent, error message will be a bit strange # but it is not for a real program. parent2 = parent1.nil? ? o : parent1.eContainer unless parent2.is_a?(Model::AbstractResource) acceptor.accept(Issues::UNSUPPORTED_OPERATOR_IN_CONTEXT, parent2, :operator=>'* =>') end end rvalue(o.expr) end |
#check_BinaryExpression(o) ⇒ Object
211 212 213 214 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 211 def check_BinaryExpression(o) rvalue(o.left_expr) rvalue(o.right_expr) end |
#check_BlockExpression(o) ⇒ Object
216 217 218 219 220 221 222 223 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 216 def check_BlockExpression(o) o.statements[0..-2].each do |statement| if idem(statement) acceptor.accept(Issues::IDEM_EXPRESSION_NOT_LAST, statement) break # only flag the first end end end |
#check_CallNamedFunctionExpression(o) ⇒ Object
225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 225 def check_CallNamedFunctionExpression(o) case o.functor_expr when Puppet::Pops::Model::QualifiedName # ok nil when Puppet::Pops::Model::RenderStringExpression # helpful to point out this easy to make Epp error acceptor.accept(Issues::ILLEGAL_EPP_PARAMETERS, o) else acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o}) end end |
#check_CapabilityMapping(o) ⇒ Object
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 238 def check_CapabilityMapping(o) ok = case o.component when Puppet::Pops::Model::QualifiedName name = o.component.value acceptor.accept(Issues::ILLEGAL_CLASSREF, o.component, {:name=>name}) unless name =~ Puppet::Pops::Patterns::CLASSREF_EXT true when Puppet::Pops::Model::AccessExpression keys = o.component.keys expr = o.component.left_expr if expr.is_a?(Puppet::Pops::Model::QualifiedReference) && keys.size == 1 key = keys[0] key.is_a?(Puppet::Pops::Model::LiteralString) || key.is_a?(Puppet::Pops::Model::QualifiedName) || key.is_a?(Puppet::Pops::Model::QualifiedReference) else false end else false end acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.component, :feature=>'capability mapping', :container => o) unless ok if o.capability !~ Puppet::Pops::Patterns::CLASSREF_EXT acceptor.accept(Issues::ILLEGAL_CLASSREF, o, {:name=>o.capability}) end end |
#check_CaseExpression(o) ⇒ Object
276 277 278 279 280 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 276 def check_CaseExpression(o) rvalue(o.test) # There should only be one LiteralDefault case option value # TODO: Implement this check end |
#check_CaseOption(o) ⇒ Object
282 283 284 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 282 def check_CaseOption(o) o.values.each { |v| rvalue(v) } end |
#check_CollectExpression(o) ⇒ Object
286 287 288 289 290 291 292 293 294 295 296 297 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 286 def check_CollectExpression(o) unless o.type_expr.is_a? Model::QualifiedReference acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.type_expr, :feature=> 'type name', :container => o) end # If a collect expression tries to collect exported resources and storeconfigs is not on # then it will not work... This was checked in the parser previously. This is a runtime checking # thing as opposed to a language thing. if acceptor.will_accept?(Issues::RT_NO_STORECONFIGS) && o.query.is_a?(Model::ExportedQuery) acceptor.accept(Issues::RT_NO_STORECONFIGS, o) end end |
#check_EppExpression(o) ⇒ Object
264 265 266 267 268 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 264 def check_EppExpression(o) if o.eContainer.is_a?(Puppet::Pops::Model::LambdaExpression) internal_check_no_capture(o.eContainer, o) end end |
#check_Factory(o) ⇒ Object
149 150 151 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 149 def check_Factory(o) check(o.current) end |
#check_FunctionDefinition(o) ⇒ Object
354 355 356 357 358 359 360 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 354 def check_FunctionDefinition(o) # TODO PUP-2080: more strict rule for top - can only be contained in Program (for now) # sticking functions in classes would create functions in the class name space # but not be special in any other way # check_NamedDefinition(o) end |
#check_HostClassDefinition(o) ⇒ Object
362 363 364 365 366 367 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 362 def check_HostClassDefinition(o) check_NamedDefinition(o) internal_check_no_capture(o) internal_check_reserved_params(o) internal_check_no_idem_last(o) end |
#check_IfExpression(o) ⇒ Object
412 413 414 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 412 def check_IfExpression(o) rvalue(o.test) end |
#check_KeyedEntry(o) ⇒ Object
416 417 418 419 420 421 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 416 def check_KeyedEntry(o) rvalue(o.key) rvalue(o.value) # In case there are additional things to forbid than non-rvalues # acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.key, :feature => 'hash key', :container => o.eContainer) end |
#check_LambdaExpression(o) ⇒ Object
423 424 425 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 423 def check_LambdaExpression(o) internal_check_capture_last(o) end |
#check_LiteralList(o) ⇒ Object
427 428 429 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 427 def check_LiteralList(o) o.values.each {|v| rvalue(v) } end |
#check_MethodCallExpression(o) ⇒ Object
270 271 272 273 274 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 270 def check_MethodCallExpression(o) unless o.functor_expr.is_a? Model::QualifiedName acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.functor_expr, :feature => 'function name', :container => o) end end |
#check_NamedAccessExpression(o) ⇒ Object
Only used for function names, grammar should not be able to produce something faulty, but check anyway if model is created programatically (it will fail in transformation to AST for sure).
301 302 303 304 305 306 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 301 def check_NamedAccessExpression(o) name = o.right_expr unless name.is_a? Model::QualifiedName acceptor.accept(Issues::ILLEGAL_EXPRESSION, name, :feature=> 'function name', :container => o.eContainer) end end |
#check_NamedDefinition(o) ⇒ Object
for ‘class’, ‘define’, and function
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 337 def check_NamedDefinition(o) top(o.eContainer, o) if o.name !~ Puppet::Pops::Patterns::CLASSREF acceptor.accept(Issues::ILLEGAL_DEFINITION_NAME, o, {:name=>o.name}) end if RESERVED_TYPE_NAMES[o.name()] acceptor.accept(Issues::RESERVED_TYPE_NAME, o, {:name => o.name}) end # This is perhaps not ideal but it's very difficult to pass a ReservedWord through # the mechanism that creates qualified names (namestack, namepop etc.) if FUTURE_RESERVED_WORDS[o.name] acceptor.accept(Issues::FUTURE_RESERVED_WORD, o, {:word => o.name}) end end |
#check_NodeDefinition(o) ⇒ Object
431 432 433 434 435 436 437 438 439 440 441 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 431 def check_NodeDefinition(o) # Check that hostnames are valid hostnames (or regular expressions) hostname(o.host_matches, o) top(o.eContainer, o) if violator = ends_with_idem(o.body) acceptor.accept(Issues::IDEM_NOT_ALLOWED_LAST, violator, {:container => o}) end unless o.parent.nil? acceptor.accept(Issues::ILLEGAL_NODE_INHERITANCE, o.parent) end end |
#check_Object(o) ⇒ Object
—CHECKS
146 147 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 146 def check_Object(o) end |
#check_Parameter(o) ⇒ Object
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 472 def check_Parameter(o) if o.name =~ /^(?:0x)?[0-9]+$/ acceptor.accept(Issues::ILLEGAL_NUMERIC_PARAMETER, o, :name => o.name) end unless o.name =~ Puppet::Pops::Patterns::PARAM_NAME acceptor.accept(Issues::ILLEGAL_PARAM_NAME, o, :name => o.name) end return unless o.value if o.value.is_a?(Puppet::Pops::Model::AssignmentExpression) [o.value] else o.value.eAllContents.select {|model| model.is_a? Puppet::Pops::Model::AssignmentExpression } end.each do |assignment| acceptor.accept(Issues::ILLEGAL_ASSIGNMENT_CONTEXT, assignment) end end |
#check_QualifiedName(o) ⇒ Object
No checking takes place - all expressions using a QualifiedName need to check. This because the rules are slightly different depending on the container (A variable allows a numeric start, but not other names). This means that (if the lexer/parser so chooses) a QualifiedName can be anything when it represents a Bare Word and evaluates to a String.
448 449 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 448 def check_QualifiedName(o) end |
#check_QualifiedReference(o) ⇒ Object
Checks that the value is a valid UpperCaseWord (a CLASSREF), and optionally if it contains a hypen. DOH: QualifiedReferences are created with LOWER CASE NAMES at parse time
453 454 455 456 457 458 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 453 def check_QualifiedReference(o) # Is this a valid qualified name? if o.value !~ Puppet::Pops::Patterns::CLASSREF acceptor.accept(Issues::ILLEGAL_CLASSREF, o, {:name=>o.value}) end end |
#check_QueryExpression(o) ⇒ Object
460 461 462 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 460 def check_QueryExpression(o) query(o.expr) if o.expr # is optional end |
#check_RelationshipExpression(o) ⇒ Object
relationship_side: resource
| resourceref
| collection
| variable
| quotedtext
| selector
| casestatement
| hasharrayaccesses
500 501 502 503 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 500 def check_RelationshipExpression(o) relation(o.left_expr) relation(o.right_expr) end |
#check_ReservedWord(o) ⇒ Object
537 538 539 540 541 542 543 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 537 def check_ReservedWord(o) if o.future acceptor.accept(Issues::FUTURE_RESERVED_WORD, o, :word => o.word) else acceptor.accept(Issues::RESERVED_WORD, o, :word => o.word) end end |
#check_ResourceBody(o) ⇒ Object
512 513 514 515 516 517 518 519 520 521 522 523 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 512 def check_ResourceBody(o) seenUnfolding = false o.operations.each do |ao| if ao.is_a?(Puppet::Pops::Model::AttributesOperation) if seenUnfolding acceptor.accept(Issues::MULTIPLE_ATTRIBUTES_UNFOLD, ao) else seenUnfolding = true end end end end |
#check_ResourceDefaultsExpression(o) ⇒ Object
525 526 527 528 529 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 525 def check_ResourceDefaultsExpression(o) if o.form && o.form != :regular acceptor.accept(Issues::NOT_VIRTUALIZEABLE, o) end end |
#check_ResourceExpression(o) ⇒ Object
505 506 507 508 509 510 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 505 def check_ResourceExpression(o) # The expression for type name cannot be statically checked - this is instead done at runtime # to enable better error message of the result of the expression rather than the static instruction. # (This can be revised as there are static constructs that are illegal, but require updating many # tests that expect the detailed reporting). end |
#check_ResourceOverrideExpression(o) ⇒ Object
531 532 533 534 535 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 531 def check_ResourceOverrideExpression(o) if o.form && o.form != :regular acceptor.accept(Issues::NOT_VIRTUALIZEABLE, o) end end |
#check_ResourceTypeDefinition(o) ⇒ Object
369 370 371 372 373 374 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 369 def check_ResourceTypeDefinition(o) check_NamedDefinition(o) internal_check_no_capture(o) internal_check_reserved_params(o) internal_check_no_idem_last(o) end |
#check_SelectorEntry(o) ⇒ Object
549 550 551 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 549 def check_SelectorEntry(o) rvalue(o.matching_expr) end |
#check_SelectorExpression(o) ⇒ Object
545 546 547 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 545 def check_SelectorExpression(o) rvalue(o.left_expr) end |
#check_UnaryExpression(o) ⇒ Object
553 554 555 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 553 def check_UnaryExpression(o) rvalue(o.expr) end |
#check_UnlessExpression(o) ⇒ Object
557 558 559 560 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 557 def check_UnlessExpression(o) rvalue(o.test) # TODO: Unless may not have an else part that is an IfExpression (grammar denies this though) end |
#check_VariableExpression(o) ⇒ Object
Checks that variable is either strictly 0, or a non 0 starting decimal number, or a valid VAR_NAME
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 563 def check_VariableExpression(o) # The expression must be a qualified name or an integer name_expr = o.expr return if name_expr.is_a?(Model::LiteralInteger) if !name_expr.is_a?(Model::QualifiedName) acceptor.accept(Issues::ILLEGAL_EXPRESSION, o, :feature => 'name', :container => o) else # name must be either a decimal string value, or a valid NAME name = o.expr.value if name[0,1] =~ /[0-9]/ unless name =~ Puppet::Pops::Patterns::NUMERIC_VAR_NAME acceptor.accept(Issues::ILLEGAL_NUMERIC_VAR_NAME, o, :name => name) end else unless name =~ Puppet::Pops::Patterns::VAR_NAME acceptor.accept(Issues::ILLEGAL_VAR_NAME, o, :name => name) end end end end |
#ends_with_idem(o) ⇒ Object
Returns the last expression in a block, or the expression, if that expression is idem
96 97 98 99 100 101 102 103 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 96 def ends_with_idem(o) if o.is_a?(Puppet::Pops::Model::BlockExpression) last = o.statements[-1] idem(last) ? last : nil else idem(o) ? o : nil end end |
#hostname(o, semantic) ⇒ Object
Performs check if this is a vaid hostname expression
55 56 57 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 55 def hostname(o, semantic) @@hostname_visitor.visit_this_1(self, o, semantic) end |
#hostname_Array(o, semantic) ⇒ Object
Transforms Array of host matching expressions into a (Ruby) array of AST::HostName
587 588 589 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 587 def hostname_Array(o, semantic) o.each {|x| hostname(x, semantic) } end |
#hostname_ConcatenatedString(o, semantic) ⇒ Object
605 606 607 608 609 610 611 612 613 614 615 616 617 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 605 def hostname_ConcatenatedString(o, semantic) # Puppet 3.1. only accepts a concatenated string without interpolated expressions if the_expr = o.segments.index {|s| s.is_a?(Model::TextExpression) } acceptor.accept(Issues::ILLEGAL_HOSTNAME_INTERPOLATION, o.segments[the_expr].expr) elsif o.segments.size() != 1 # corner case, bad model, concatenation of several plain strings acceptor.accept(Issues::ILLEGAL_HOSTNAME_INTERPOLATION, o) else # corner case, may be ok, but lexer may have replaced with plain string, this is # here if it does not hostname_String(o.segments[0], o.segments[0]) end end |
#hostname_LiteralDefault(o, semantic) ⇒ Object
631 632 633 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 631 def hostname_LiteralDefault(o, semantic) # always ok end |
#hostname_LiteralNumber(o, semantic) ⇒ Object
627 628 629 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 627 def hostname_LiteralNumber(o, semantic) # always ok end |
#hostname_LiteralRegularExpression(o, semantic) ⇒ Object
635 636 637 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 635 def hostname_LiteralRegularExpression(o, semantic) # always ok end |
#hostname_LiteralValue(o, semantic) ⇒ Object
601 602 603 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 601 def hostname_LiteralValue(o, semantic) hostname_String(o.value.to_s, o) end |
#hostname_Object(o, semantic) ⇒ Object
639 640 641 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 639 def hostname_Object(o, semantic) acceptor.accept(Issues::ILLEGAL_EXPRESSION, o, {:feature => 'hostname', :container => semantic}) end |
#hostname_QualifiedName(o, semantic) ⇒ Object
619 620 621 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 619 def hostname_QualifiedName(o, semantic) hostname_String(o.value.to_s, o) end |
#hostname_QualifiedReference(o, semantic) ⇒ Object
623 624 625 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 623 def hostname_QualifiedReference(o, semantic) hostname_String(o.value.to_s, o) end |
#hostname_String(o, semantic) ⇒ Object
591 592 593 594 595 596 597 598 599 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 591 def hostname_String(o, semantic) # The 3.x checker only checks for illegal characters - if matching /[^-\w.]/ the name is invalid, # but this allows pathological names like "a..b......c", "----" # TODO: Investigate if more illegal hostnames should be flagged. # if o =~ Puppet::Pops::Patterns::ILLEGAL_HOSTNAME_CHARS acceptor.accept(Issues::ILLEGAL_HOSTNAME_CHARS, semantic, :hostname => o) end end |
#idem(o) ⇒ Boolean
Checks if the expression has side effect (‘idem’ is latin for ‘the same’, here meaning that the evaluation state is known to be unchanged after the expression has been evaluated). The result is not 100% authoritative for negative answers since analysis of function behavior is not possible.
91 92 93 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 91 def idem(o) @@idem_visitor.visit_this_0(self, o) end |
#idem_AccessExpression(o) ⇒ Object
753 754 755 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 753 def idem_AccessExpression(o) true end |
#idem_AssignmentExpression(o) ⇒ Object
766 767 768 769 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 766 def idem_AssignmentExpression(o) # Always side effect false end |
#idem_BinaryExpression(o) ⇒ Object
757 758 759 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 757 def idem_BinaryExpression(o) true end |
#idem_BlockExpression(o) ⇒ Object
789 790 791 792 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 789 def idem_BlockExpression(o) # productive if there is at least one productive expression ! o.statements.any? {|expr| !idem(expr) } end |
#idem_CaseExpression(o) ⇒ Object
Case expression is idem, if test, and all options are idem
817 818 819 820 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 817 def idem_CaseExpression(o) return false if !idem(o.test) ! o..any? {|opt| !idem(opt) } end |
#idem_CaseOption(o) ⇒ Object
An option is idem if values and the then_expression are idem
823 824 825 826 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 823 def idem_CaseOption(o) return false if o.values.any? { |value| !idem(value) } idem(o.then_expr) end |
#idem_ConcatenatedString(o) ⇒ Object
Returns true even though there may be interpolated expressions that have side effect. Report as idem anyway, as it is very bad design to evaluate an interpolated string for its side effect only.
797 798 799 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 797 def idem_ConcatenatedString(o) true end |
#idem_Factory(o) ⇒ Object
749 750 751 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 749 def idem_Factory(o) idem(o.current) end |
#idem_HeredocExpression(o) ⇒ Object
Heredoc is just a string, but may contain interpolated string (which may have side effects). This is still bad design and should be reported as idem.
803 804 805 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 803 def idem_HeredocExpression(o) true end |
#idem_IfExpression(o) ⇒ Object
812 813 814 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 812 def idem_IfExpression(o) [o.test, o.then_expr, o.else_expr].all? {|e| idem(e) } end |
#idem_Literal(o) ⇒ Object
737 738 739 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 737 def idem_Literal(o) true end |
#idem_LiteralHash(o) ⇒ Object
745 746 747 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 745 def idem_LiteralHash(o) true end |
#idem_LiteralList(o) ⇒ Object
741 742 743 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 741 def idem_LiteralList(o) true end |
#idem_NilClass(o) ⇒ Object
733 734 735 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 733 def idem_NilClass(o) true end |
#idem_Nop(o) ⇒ Object
729 730 731 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 729 def idem_Nop(o) true end |
#idem_Object(o) ⇒ Object
–IDEM CHECK
725 726 727 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 725 def idem_Object(o) false end |
#idem_ParenthesizedExpression(o) ⇒ Object
Allow (no-effect parentheses) to be used around a productive expression
777 778 779 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 777 def idem_ParenthesizedExpression(o) idem(o.expr) end |
#idem_RelationshipExpression(o) ⇒ Object
761 762 763 764 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 761 def idem_RelationshipExpression(o) # Always side effect false end |
#idem_RenderExpression(o) ⇒ Object
781 782 783 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 781 def idem_RenderExpression(o) false end |
#idem_RenderStringExpression(o) ⇒ Object
785 786 787 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 785 def idem_RenderStringExpression(o) false end |
#idem_SelectorExpression(o) ⇒ Object
May technically have side effects inside the Selector, but this is bad design - treat as idem
808 809 810 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 808 def idem_SelectorExpression(o) true end |
#idem_UnaryExpression(o) ⇒ Object
Handles UnaryMinusExpression, NotExpression, VariableExpression
772 773 774 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 772 def idem_UnaryExpression(o) true end |
#internal_check_capture_last(o) ⇒ Object
382 383 384 385 386 387 388 389 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 382 def internal_check_capture_last(o) accepted_index = o.parameters.size() -1 o.parameters.each_with_index do |p, index| if p.captures_rest && index != accepted_index acceptor.accept(Issues::CAPTURES_REST_NOT_LAST, p, {:param_name => p.name}) end end end |
#internal_check_no_capture(o, container = o) ⇒ Object
391 392 393 394 395 396 397 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 391 def internal_check_no_capture(o, container = o) o.parameters.each do |p| if p.captures_rest acceptor.accept(Issues::CAPTURES_REST_NOT_SUPPORTED, p, {:container => container, :param_name => p.name}) end end end |
#internal_check_no_idem_last(o) ⇒ Object
376 377 378 379 380 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 376 def internal_check_no_idem_last(o) if violator = ends_with_idem(o.body) acceptor.accept(Issues::IDEM_NOT_ALLOWED_LAST, violator, {:container => o}) end end |
#internal_check_reserved_params(o) ⇒ Object
404 405 406 407 408 409 410 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 404 def internal_check_reserved_params(o) o.parameters.each do |p| if RESERVED_PARAMETERS[p.name] acceptor.accept(Issues::RESERVED_PARAMETER, p, {:container => o, :param_name => p.name}) end end end |
#query(o) ⇒ Object
Performs check if this is valid as a query
60 61 62 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 60 def query(o) @@query_visitor.visit_this_0(self, o) end |
#query_BooleanExpression(o) ⇒ Object
Allows AND, OR, and checks if left/right are allowed in query.
657 658 659 660 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 657 def query_BooleanExpression(o) query o.left_expr query o.right_expr end |
#query_ComparisonExpression(o) ⇒ Object
Puppet AST only allows == and !=
652 653 654 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 652 def query_ComparisonExpression(o) acceptor.accept(Issues::ILLEGAL_QUERY_EXPRESSION, o) unless [:'==', :'!='].include? o.operator end |
#query_LiteralBoolean(o) ⇒ Object
674 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 674 def query_LiteralBoolean(o); end |
#query_LiteralNumber(o) ⇒ Object
670 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 670 def query_LiteralNumber(o); end |
#query_LiteralString(o) ⇒ Object
672 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 672 def query_LiteralString(o); end |
#query_Object(o) ⇒ Object
Anything not explicitly allowed is flagged as error.
646 647 648 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 646 def query_Object(o) acceptor.accept(Issues::ILLEGAL_QUERY_EXPRESSION, o) end |
#query_ParenthesizedExpression(o) ⇒ Object
662 663 664 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 662 def query_ParenthesizedExpression(o) query(o.expr) end |
#query_QualifiedName(o) ⇒ Object
668 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 668 def query_QualifiedName(o); end |
#query_VariableExpression(o) ⇒ Object
666 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 666 def query_VariableExpression(o); end |
#relation(o) ⇒ Object
Performs check if this is valid as a relationship side
65 66 67 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 65 def relation(o) @@relation_visitor.visit_this_0(self, o) end |
#relation_CollectExpression(o) ⇒ Object
468 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 468 def relation_CollectExpression(o); end |
#relation_Object(o) ⇒ Object
464 465 466 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 464 def relation_Object(o) rvalue(o) end |
#relation_RelationshipExpression(o) ⇒ Object
470 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 470 def relation_RelationshipExpression(o); end |
#rvalue(o) ⇒ Object
Performs check if this is valid as a rvalue
70 71 72 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 70 def rvalue(o) @@rvalue_visitor.visit_this_0(self, o) end |
#rvalue_CollectExpression(o) ⇒ Object
683 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 683 def rvalue_CollectExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end |
#rvalue_Definition(o) ⇒ Object
685 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 685 def rvalue_Definition(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end |
#rvalue_Expression(o) ⇒ Object
By default, all expressions are reported as being rvalues Implement specific rvalue checks for those that are not.
681 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 681 def rvalue_Expression(o); end |
#rvalue_NodeDefinition(o) ⇒ Object
687 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 687 def rvalue_NodeDefinition(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end |
#rvalue_UnaryExpression(o) ⇒ Object
689 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 689 def rvalue_UnaryExpression(o) ; rvalue o.expr ; end |
#top(o, definition) ⇒ Object
Performs check if this is valid as a container of a definition (class, define, node)
75 76 77 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 75 def top(o, definition) @@top_visitor.visit_this_1(self, o, definition) end |
#top_BlockExpression(o, definition) ⇒ Object
702 703 704 705 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 702 def top_BlockExpression(o, definition) # ok, if this is a block representing the body of a class, or is top level top o.eContainer, definition end |
#top_HostClassDefinition(o, definition) ⇒ Object
707 708 709 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 707 def top_HostClassDefinition(o, definition) # ok, stop scanning parents end |
#top_LambdaExpression(o, definition) ⇒ Object
A LambdaExpression is a BlockExpression, and this method is needed to prevent the polymorph method for BlockExpression to accept a lambda. A lambda can not iteratively create classes, nodes or defines as the lambda does not have a closure.
719 720 721 722 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 719 def top_LambdaExpression(o, definition) # fail, stop scanning parents acceptor.accept(Issues::NOT_TOP_LEVEL, definition) end |
#top_NilClass(o, definition) ⇒ Object
—TOP CHECK
693 694 695 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 693 def top_NilClass(o, definition) # ok, reached the top, no more parents end |
#top_Object(o, definition) ⇒ Object
697 698 699 700 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 697 def top_Object(o, definition) # fail, reached a container that is not top level acceptor.accept(Issues::NOT_TOP_LEVEL, definition) end |
#top_Program(o, definition) ⇒ Object
711 712 713 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 711 def top_Program(o, definition) # ok end |
#validate(model) ⇒ Object
Validates the entire model by visiting each model element and calling ‘check`. The result is collected (or acted on immediately) by the configured diagnostic provider/acceptor given when creating this Checker.
42 43 44 45 46 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 42 def validate(model) # tree iterate the model, and call check for each element check(model) model.eAllContents.each {|m| check(m) } end |
#varname_to_s(o) ⇒ Object
Produces string part of something named, or nil if not a QualifiedName or QualifiedReference
832 833 834 835 836 837 838 839 840 841 |
# File 'lib/puppet/pops/validation/checker4_0.rb', line 832 def varname_to_s(o) case o when Model::QualifiedName o.value when Model::QualifiedReference o.value else nil end end |