Class: FeatureMap::Private::CodeCov

Inherits:
Object
  • Object
show all
Defined in:
lib/feature_map/private/code_cov.rb

Overview

This class is responsible for all interactions with the CodeCov platform.

Defined Under Namespace

Classes: ApiError, ConfigurationError

Constant Summary collapse

CODE_COV_API_BASE_URL =
'https://api.codecov.io/api/v2/'

Class Method Summary collapse

Class Method Details

.build_coverage_status(commit_details) ⇒ Object

Raises:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/feature_map/private/code_cov.rb', line 28

def self.build_coverage_status(commit_details)
  file_coverage_details = commit_details.dig('report', 'files')
  raise ApiError, 'No file coverage information retruned from CodeCov.' unless file_coverage_details

  file_coverage_details.each_with_object({}) do |file_coverage, coverage_stats|
    file_path = file_coverage['name']
    file_coverage_stats = file_coverage['totals']

    next if !file_path || !file_coverage_stats

    coverage_stats[file_path] = {
      'lines' => file_coverage_stats['lines'],
      'hits' => file_coverage_stats['hits'],
      'misses' => file_coverage_stats['misses']
    }
  end
end

.connObject



62
63
64
65
66
67
# File 'lib/feature_map/private/code_cov.rb', line 62

def self.conn
  @conn ||= Faraday.new(url: CODE_COV_API_BASE_URL) do |f|
    f.request :json
    f.response :json
  end
end

.fetch_commit_details(commit_sha, api_token) ⇒ Object



22
23
24
25
26
# File 'lib/feature_map/private/code_cov.rb', line 22

def self.fetch_commit_details(commit_sha, api_token)
  conn.get("#{service}/#{owner}/repos/#{repo}/commits/#{commit_sha}",
           {},
           { 'Authorization' => "Bearer #{api_token}" })
end

.fetch_coverage_stats(commit_sha, api_token) ⇒ Object

Raises:



15
16
17
18
19
20
# File 'lib/feature_map/private/code_cov.rb', line 15

def self.fetch_coverage_stats(commit_sha, api_token)
  commit_details_response = fetch_commit_details(commit_sha, api_token)
  raise ApiError, "Failed to retrieve CodeCov stats for commit #{commit_sha}. Response: #{commit_details_response.status} - #{commit_details_response.body}" unless commit_details_response.success?

  build_coverage_status(commit_details_response.body)
end

.ownerObject



52
53
54
55
# File 'lib/feature_map/private/code_cov.rb', line 52

def self.owner
  Private.configuration.code_cov['owner'] ||
    (raise ConfigurationError, 'Missing CodeCov configuration: owner')
end

.repoObject



57
58
59
60
# File 'lib/feature_map/private/code_cov.rb', line 57

def self.repo
  Private.configuration.code_cov['repo'] ||
    (raise ConfigurationError, 'Missing CodeCov configuration: repo')
end

.serviceObject

TODO: Move these values to config.



47
48
49
50
# File 'lib/feature_map/private/code_cov.rb', line 47

def self.service
  Private.configuration.code_cov['service'] ||
    (raise ConfigurationError, 'Missing CodeCov configuration: service')
end