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:



569
570
571
572
# File 'lib/henitai/reporter.rb', line 569

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.



590
591
592
# File 'lib/henitai/reporter.rb', line 590

def 
  @metadata_provider
end

Class Method Details

.project_from_git_url(url) ⇒ String?

Parameters:

  • (String, nil)

Returns:

  • (String, nil)


583
584
585
# File 'lib/henitai/reporter.rb', line 583

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

Instance Method Details

#api_keyString?

Returns:

  • (String, nil)


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

def api_key = .api_key

#base_urlString

Returns:

  • (String)


637
638
639
# File 'lib/henitai/reporter.rb', line 637

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

#build_request(result, uri) ⇒ Object

Parameters:

Returns:

  • (Object)


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

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)


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

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)


645
646
647
# File 'lib/henitai/reporter.rb', line 645

def encoded_version
  URI.encode_www_form_component(version.to_s)
end

#projectString?

Returns:

  • (String, nil)


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

def project = .project

#project_pathString

Returns:

  • (String)


641
642
643
# File 'lib/henitai/reporter.rb', line 641

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

#ready?Boolean

Returns:

  • (Boolean)


596
597
598
# File 'lib/henitai/reporter.rb', line 596

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

#report(result) ⇒ void

This method returns an undefined value.

Parameters:



574
575
576
577
578
579
580
# File 'lib/henitai/reporter.rb', line 574

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])


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

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)


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

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)


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

def version = .version