class Puppet::Pops::Validation::DiagnosticProducer
A producer of diagnostics. An producer of diagnostics is given each issue occurrence as they are found by a diagnostician/validator. It then produces a Diagnostic
, which it passes on to a configured Acceptor
.
This class exists to aid a diagnostician/validator which will typically first check if a particular issue will be accepted at all (before checking for an occurrence of the issue; i.e. to perform check avoidance for expensive checks). A validator passes an instance of Issue, the semantic object (the “culprit”), a hash with arguments, and an optional exception. The semantic object is used to determine the location of the occurrence of the issue (file/line), and it sets keys in the given argument hash that may be used in the formatting of the issue message.
Attributes
A producer of labels for objects involved in the issue @return [LabelProvider]
A producer of severity for a given issue @return [SeverityProducer]
Public Class Methods
Initializes this producer.
@param acceptor [Acceptor] a sink/collector of diagnostic results @param severity_producer
[SeverityProducer] the severity producer to use to determine severity of a given issue @param label_provider
[LabelProvider] a provider of model element type to human readable label
# File lib/puppet/pops/validation.rb 187 def initialize(acceptor, severity_producer, label_provider) 188 @acceptor = acceptor 189 @severity_producer = severity_producer 190 @label_provider = label_provider 191 end
Public Instance Methods
# File lib/puppet/pops/validation.rb 193 def accept(issue, semantic, arguments={}, except=nil) 194 return unless will_accept? issue 195 196 # Set label provider unless caller provided a special label provider 197 arguments[:label] ||= @label_provider 198 arguments[:semantic] ||= semantic 199 200 # A detail message is always provided, but is blank by default. 201 # TODO: this support is questionable, it requires knowledge that :detail is special 202 arguments[:detail] ||= '' 203 204 # Accept an Error as semantic if it supports methods #file(), #line(), and #pos() 205 if semantic.is_a?(StandardError) 206 unless semantic.respond_to?(:file) && semantic.respond_to?(:line) && semantic.respond_to?(:pos) 207 raise Puppet::DevError, _("Issue %{issue_code}: Cannot pass a %{class_name} as a semantic object when it does not support #pos(), #file() and #line()") % 208 { issue_code: issue.issue_code, class_name: semantic.class } 209 end 210 end 211 212 source_pos = semantic 213 file = semantic.file unless semantic.nil? 214 215 severity = @severity_producer.severity(issue) 216 @acceptor.accept(Diagnostic.new(severity, issue, file, source_pos, arguments, except)) 217 end
# File lib/puppet/pops/validation.rb 219 def will_accept? issue 220 @severity_producer.should_report? issue 221 end