Class: Henitai::Reporter::Dashboard

Inherits:
Base
  • Object
show all
Defined in:
lib/henitai/reporter.rb,
sig/henitai.rbs

Overview

Dashboard reporter. Delegates project/version/api-key resolution to DashboardMetadataProvider so it never touches real ENV or git itself.

Constant Summary collapse

DEFAULT_BASE_URL =

Returns:

  • (String)
"https://dashboard.stryker-mutator.io"
HTTP_TIMEOUT_SECONDS =

Returns:

  • (Integer)
30

Instance Attribute Summary collapse

Attributes inherited from Base

#config, #history_store

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#authoritative?, #canonical_path

Constructor Details

#initialize(config:, history_store: nil, metadata_provider: nil) ⇒ Dashboard

Returns a new instance of Dashboard.

Parameters:



579
580
581
582
# File 'lib/henitai/reporter.rb', line 579

def initialize(config:, history_store: nil, metadata_provider: nil)
  super(config:, history_store:)
  @metadata_provider =  || DashboardMetadataProvider.new(dashboard_config: config.dashboard)
end

Instance Attribute Details

#metadata_providerDashboardMetadataProvider (readonly)

Returns the value of attribute metadata_provider.



600
601
602
# File 'lib/henitai/reporter.rb', line 600

def 
  @metadata_provider
end

Class Method Details

.project_from_git_url(url) ⇒ String?

Parameters:

  • (String, nil)

Returns:

  • (String, nil)


593
594
595
# File 'lib/henitai/reporter.rb', line 593

def project_from_git_url(url)
  DashboardMetadataProvider.project_from_git_url(url)
end

Instance Method Details

#api_keyString?

Returns:

  • (String, nil)


604
# File 'lib/henitai/reporter.rb', line 604

def api_key = .api_key

#base_urlString

Returns:

  • (String)


647
648
649
# File 'lib/henitai/reporter.rb', line 647

def base_url
  config.dashboard[:base_url] || DEFAULT_BASE_URL
end

#build_request(result, uri) ⇒ Object

Parameters:

Returns:

  • (Object)


610
611
612
613
614
# File 'lib/henitai/reporter.rb', line 610

def build_request(result, uri)
  request = Net::HTTP::Put.new(uri.request_uri, request_headers)
  request.body = JSON.generate(result.to_stryker_schema)
  request
end

#dashboard_uriObject

Returns:

  • (Object)


634
635
636
637
638
639
640
641
642
643
644
645
# File 'lib/henitai/reporter.rb', line 634

def dashboard_uri
  uri = URI.parse(base_url)
  # @type var segments: Array[String]
  base_path = uri.path.to_s.chomp("/").delete_prefix("/")
  segments = []
  segments << base_path unless base_path.empty?
  segments += ["api", "reports", project_path, encoded_version]
  uri.path = "/#{segments.join('/')}"
  uri
rescue URI::InvalidURIError
  URI.parse(DEFAULT_BASE_URL)
end

#encoded_versionString

Returns:

  • (String)


655
656
657
# File 'lib/henitai/reporter.rb', line 655

def encoded_version
  URI.encode_www_form_component(version.to_s)
end

#projectString?

Returns:

  • (String, nil)


602
# File 'lib/henitai/reporter.rb', line 602

def project = .project

#project_pathString

Returns:

  • (String)


651
652
653
# File 'lib/henitai/reporter.rb', line 651

def project_path
  project.to_s.split("/").map { |segment| URI.encode_www_form_component(segment) }.join("/")
end

#ready?Boolean

Returns:

  • (Boolean)


606
607
608
# File 'lib/henitai/reporter.rb', line 606

def ready?
  !project.nil? && !version.nil? && !api_key.nil?
end

#report(result) ⇒ void

This method returns an undefined value.

Parameters:



584
585
586
587
588
589
590
# File 'lib/henitai/reporter.rb', line 584

def report(result)
  return unless ready?

  uri = dashboard_uri
  request = build_request(result, uri)
  send_request(uri, request)
end

#request_headersHash[String, String]

Returns:

  • (Hash[String, String])


616
617
618
619
620
621
# File 'lib/henitai/reporter.rb', line 616

def request_headers
  {
    "Content-Type" => "application/json",
    "X-Api-Key" => api_key.to_s
  }
end

#send_request(uri, request) ⇒ Object

Parameters:

  • (Object)
  • (Object)

Returns:

  • (Object)


623
624
625
626
627
628
629
630
631
632
# File 'lib/henitai/reporter.rb', line 623

def send_request(uri, request)
  Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
    http.open_timeout = HTTP_TIMEOUT_SECONDS
    http.read_timeout = HTTP_TIMEOUT_SECONDS
    http.request(request)
  end
rescue StandardError => e
  warn("Dashboard reporter upload failed: #{e.message}")
  nil
end

#versionString?

Returns:

  • (String, nil)


603
# File 'lib/henitai/reporter.rb', line 603

def version = .version