class Specular

Constants

MESSAGES
MESSAGE_EVENTS
REF_DEFAULT
STATUS_LABEL

Constants ============================================================

Attributes

results[R]

Properties ===========================================================

Public Class Methods

new(results, **context) click to toggle source

Instance Methods =====================================================

# File lib/specular.rb, line 44
def initialize(results, **context)
  @results = results
  @context = context

  if (@context[:repo] and !@context[:repo].end_with?('/'))
    @context[:repo] = '%s/' % @context[:repo]
  end

  @context[:result] = self.failures? ? :failed : :passed

  @context[:messages] = MESSAGES.keys.to_h do |type|
    [
      type,
      MESSAGE_EVENTS.to_h do |event|
        [
          event,
          @context.dig(:messages, type, event) || MESSAGES.dig(type, event)
        ]
      end
    ]
  end
end
version() click to toggle source
# File lib/specular/version.rb, line 2
def self.version
  File.readlines(File.expand_path('../../VERSION', __dir__)).first.chomp
end

Public Instance Methods

create_issue!(services = %i[ github ]) click to toggle source
# File lib/specular.rb, line 159
def create_issue!(services = %i[ github ])
  @context[:created_issues] = services.to_h do |service|
    [
      service,
      Specular::Integration.for(service, @context).create_issue!(
        title: self.message(service: service),
        body: self.report
      )
    ]
  end
end
examples() click to toggle source
# File lib/specular.rb, line 84
def examples
  if (@context.dig(:show, :all))
    @results[:examples]
  else
    @results[:examples].select do |example|
      example[:status] == 'failed'
    end
  end
end
failures?() click to toggle source
# File lib/specular.rb, line 73
def failures?
  @results.dig(:summary, :failure_count) > 0
end
git_ref() click to toggle source
# File lib/specular.rb, line 67
def git_ref
  @context[:ref] ||= Open3.popen3('git', 'rev-parse', 'HEAD') do |_sin, sout, _serr, _proc|
    sout.readlines.first.chomp
  end
end
message(service: :github) click to toggle source
# File lib/specular.rb, line 77
def message(service: :github)
  Liquid::Template.parse(
    @context.dig(:messages, service, @context[:result]) ||
      @context.dig(:messages, service, :default)
  ).render(Specular::Support.stringify_keys(@context))
end
post_message!(services = %i[ slack ]) click to toggle source
# File lib/specular.rb, line 171
def post_message!(services = %i[ slack ])
  @context[:posted_messages] = services.to_h do |service|
    [
      service,
      Specular::Integration.for(service, @context).post_message!(
        message: self.message(service: service)
      )
    ]
  end
end
report(title: false) click to toggle source
# File lib/specular.rb, line 128
def report(title: false)
  [
    *(title ? ("<!-- %s -->\n" % self.message(service: :github)) : ()),
    "## Test Results\n",
    self.examples.map do |example|
      case (example[:status])
      when 'failed'
        "### %s\n\n**Status:** %s\n**Source:** %s\n\n%s" % [
          example[:full_description],
          status_label(example[:status]),
          source_link(example[:file_path], example[:line_number]),
          result_format(example.dig(:exception, :message))
        ]
      else
        "### %s\n\n**Status:** %s\n**Source:** %s\n\n" % [
          example[:full_description],
          status_label(example[:status]),
          source_link(example[:file_path], example[:line_number])
        ]
      end
    end,
    "## Summary\n\n**Duration:** %.2fs\n**Failures:** %d\n" % [
      @results.dig(:summary, :duration),
      @results.dig(:summary, :failure_count)
    ],
    "## Git Context\n**Ref:** %s" % [
      self.git_ref
    ]
  ].join("\n")
end
result_format(result) click to toggle source
# File lib/specular.rb, line 119
def result_format(result)
  return unless (result)

  "```\n%s%s```\n" % [
    result,
    result.end_with?("\n") ? "" : "\n"
  ]
end
status_label(status) click to toggle source
# File lib/specular.rb, line 94
def status_label(status)
  STATUS_LABEL[status.to_sym] || status
end