Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@
COMMIT_ACTIVITY_PENDING = 'pending'
COMMIT_ACTIVITY_FAILED = 'failed'
GITHUB_REPO_STEP_TIMEOUT = 90
COVERAGE_BADGE_COLOR_THRESHOLDS = (
(90, 'brightgreen'),
(70, 'green'),
(50, 'yellowgreen'),
(30, 'yellow'),
(10, 'orange'),
)


def update_aur(aur_repos: list):
Expand Down Expand Up @@ -86,6 +93,30 @@ def fetch_coverage_trend_for_repo(base_url: str, repo_name: str, headers: dict)
return coverage_trend_data


def _coverage_badge_color(coverage: float) -> str:
for minimum, color in COVERAGE_BADGE_COLOR_THRESHOLDS:
if coverage >= minimum:
return color
return 'red'


def _get_codecov_coverage(data: dict) -> float:
try:
return float((data.get('totals') or {}).get('coverage', 0) or 0)
except (TypeError, ValueError):
return 0.0


def _build_codecov_shields_badge(data: dict) -> dict:
coverage = _get_codecov_coverage(data)
return {
'schemaVersion': 1,
'label': 'codecov',
'message': f'{coverage:g}%',
'color': _coverage_badge_color(coverage),
}


def update_codecov():
"""
Get code coverage data from Codecov API.
Expand Down Expand Up @@ -135,6 +166,9 @@ def update_codecov():
file_path = os.path.join(BASE_DIR, 'codecov', repo['name'])
helpers.write_json_files(file_path=file_path, data=data)

badge_path = os.path.join(BASE_DIR, 'shields', 'codecov', repo['name'])
helpers.write_json_files(file_path=badge_path, data=_build_codecov_shields_badge(data))

# Get coverage trend data
coverage_trend_data = fetch_coverage_trend_for_repo(base_url, repo["name"], headers)

Expand Down
34 changes: 34 additions & 0 deletions tests/unit/test_updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,39 @@ def fake_get(url, headers, params):
assert calls == [1, 2]


@pytest.mark.parametrize(('coverage', 'color'), [
(100, 'brightgreen'),
(90, 'brightgreen'),
(89.9, 'green'),
(70, 'green'),
(69.9, 'yellowgreen'),
(50, 'yellowgreen'),
(49.9, 'yellow'),
(30, 'yellow'),
(29.9, 'orange'),
(10, 'orange'),
(9.9, 'red'),
])
def test_coverage_badge_color(coverage, color):
assert updater._coverage_badge_color(coverage) == color


def test_build_codecov_shields_badge():
assert updater._build_codecov_shields_badge({'totals': {'coverage': 81.5}}) == {
'schemaVersion': 1,
'label': 'codecov',
'message': '81.5%',
'color': 'green',
}

assert updater._build_codecov_shields_badge({'totals': {'coverage': 'bad'}}) == {
'schemaVersion': 1,
'label': 'codecov',
'message': '0%',
'color': 'red',
}


def test_update_codecov_success(monkeypatch, tmp_path):
base = tmp_path / 'gh-pages'
repos_file = base / 'github' / 'repos.json'
Expand All @@ -176,6 +209,7 @@ def fake_get(url, headers):

assert any('active-repo' in path for path, _ in writes)
assert not any('archived-repo' in path for path, _ in writes)
assert any(path.endswith(('shields\\codecov\\active-repo', 'shields/codecov/active-repo')) for path, _ in writes)
assert any(path.endswith('active-repo_coverage_trend') for path, _ in writes)


Expand Down
Loading