Skip to content

Fix TypeError, division by zero, and KeyError in leaderboard calculations#165

Merged
redreceipt merged 3 commits intomainfrom
copilot/fix-filter-condition-and-division-error
Dec 24, 2025
Merged

Fix TypeError, division by zero, and KeyError in leaderboard calculations#165
redreceipt merged 3 commits intomainfrom
copilot/fix-filter-condition-and-division-error

Conversation

Copy link
Contributor

Copilot AI commented Dec 24, 2025

Addresses runtime errors in _build_index_context() that occur when processing leaderboard entries with missing slugs, zero completed issues, or unmapped contributors.

Changes

  • Leaderboard filtering: Use walrus operator to check slug is not None before membership test, preventing TypeError when external contributors have no slug

    # Before: fails when slug is None
    entry for entry in leaderboard_entries if entry.get("slug") in apollos_team_slugs
    
    # After: safely handles None
    if (slug := entry.get("slug")) is not None and slug in apollos_team_slugs
  • Division by zero: Calculate total_completed_issues once and guard against zero denominator in priority_percentage calculation

    "priority_percentage": int(
        len(completed_priority_bugs) / total_completed_issues * 100
    ) if total_completed_issues else 0,
  • KeyError prevention: Replace direct display_name_overrides[slug] access with .get(slug, fallback) in 5 locations:

    • Issue assignee processing (line 262)
    • PR reviewer scoring (line 300)
    • PR author scoring (line 331)
    • Cycle lead points (line 360)
    • Cycle member points (line 393)

    Each uses appropriate fallback: display_name for assignees, format_display_name(username) for GitHub users and project participants.

Original prompt
Please apply the following diffs and create a pull request.
Once the PR is ready, give it a title based on the messages of the fixes being applied.

[{"message":"The filter condition will fail when entry.get(\"slug\") returns None (for external contributors). Using 'in' with None will raise a TypeError. Should check if slug is not None before the membership test.","fixFiles":[{"filePath":"app.py","diff":"diff --git a/app.py b/app.py\n--- a/app.py\n+++ b/app.py\n@@ -433,7 +433,9 @@\n     )\n \n     leaderboard_entries = [\n-        entry for entry in leaderboard_entries if entry.get(\"slug\") in apollos_team_slugs\n+        entry\n+        for entry in leaderboard_entries\n+        if (slug := entry.get(\"slug\")) is not None and slug in apollos_team_slugs\n     ]\n \n     leaderboard_entries.sort(key=lambda entry: entry[\"score\"], reverse=True)\n"}]},{"message":"Division by zero error will occur if the total number of completed issues is zero. Should add a check to handle the case where the denominator is zero.","fixFiles":[{"filePath":"app.py","diff":"diff --git a/app.py b/app.py\n--- a/app.py\n+++ b/app.py\n@@ -438,6 +438,10 @@\n \n     leaderboard_entries.sort(key=lambda entry: entry[\"score\"], reverse=True)\n \n+    total_completed_issues = len(\n+        completed_bugs + completed_new_features + completed_technical_changes\n+    )\n+\n     return {\n         \"days\": days,\n         \"priority_issues\": sorted(\n@@ -445,14 +449,8 @@\n         ),\n         \"issue_count\": len(created_priority_bugs),\n         \"priority_percentage\": int(\n-            len(completed_priority_bugs)\n-            / len(\n-                completed_bugs\n-                + completed_new_features\n-                + completed_technical_changes\n-            )\n-            * 100\n-        ),\n+            len(completed_priority_bugs) / total_completed_issues * 100\n+        ) if total_completed_issues else 0,\n         \"leaderboard_entries\": leaderboard_entries,\n         \"all_issues\": created_priority_bugs + open_priority_bugs,\n         \"issues_by_platform\": by_platform(created_priority_bugs),\n"}]},{"message":"Potential KeyError if slug is not in display_name_overrides dictionary. The code assumes every slug has a corresponding entry in display_name_overrides, but this might not always be true.","fixFiles":[{"filePath":"app.py","diff":"diff --git a/app.py b/app.py\n--- a/app.py\n+++ b/app.py\n@@ -259,7 +259,10 @@\n         category_key = PRIORITY_BREAKDOWN_KEYS.get(priority)\n         if slug:\n             scores_by_slug[slug] = scores_by_slug.get(slug, 0) + points\n-            names_by_slug.setdefault(slug, display_name or display_name_overrides[slug])\n+            names_by_slug.setdefault(\n+                slug,\n+                display_name or display_name_overrides.get(slug, display_name),\n+            )\n             if category_key:\n                 record_breakdown(\n                     points_breakdown_by_slug,\n"}]},{"message":"Potential KeyError if slug is not in display_name_overrides dictionary. Should use .get() method with a fallback value instead of direct dictionary access.","fixFiles":[{"filePath":"app.py","diff":"diff --git a/app.py b/app.py\n--- a/app.py\n+++ b/app.py\n@@ -294,7 +294,7 @@\n         slug = github_to_slug.get(normalize_identity(reviewer))\n         if slug:\n             scores_by_slug[slug] = scores_by_slug.get(slug, 0) + review_points\n-            names_by_slug.setdefault(slug, display_name_overrides[slug])\n+            names_by_slug.setdefault(slug, display_name_overrides.get(slug))\n             record_breakdown(\n                 points_breakdown_by_slug,\n                 count_breakdown_by_slug,\n"}]},{"message":"Potential KeyError if slug is not in display_name_overrides dictionary. Should use .get() method with a fallback value instead of direct dictionary access.","fixFiles":[{"filePath":"app.py","diff":"diff --git a/app.py b/app.py\n--- a/app.py\n+++ b/app.py\n@@ -294,7 +294,7 @@\n         slug = github_to_slug.get(normalize_identity(reviewer))\n         if slug:\n             scores_by_slug[slug] = scores_by_slug.get(slug, 0) + review_points\n-            names_by_slug.setdefault(slug, display_name_overrides[slug])\n+            names_by_slug.setdefault(slug, display_name_overrides.get(slug, format_display_name(reviewer)))\n             record_breakdown(\n                 points_breakdown_by_slug,\n                 count_breakdown_by_slug,\n@@ -325,7 +325,7 @@\n         slug = github_to_slug.get(normalize_identity(author))\n         if slug:\n             scores_by_slug[slug] = scores_by_slug.get(slug, 0) + pr_points\n-            names_by_slug.setdefault(slug, display_name_overrides[slug])\n+            names_by_slug.setdefault(slug, display_name_overrides.get(slug, format_display_name(author)))\n             record_breakdown(\n                 points_breakdown_by_slug,\n                 count_breakdown_by_slug,\n@@ -354,7 +354,7 @@\n     ...

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Co-authored-by: redreceipt <2659478+redreceipt@users.noreply.github.com>
@redreceipt redreceipt temporarily deployed to bug-board-copilot-fix-f-yrwhip December 24, 2025 05:28 Inactive
Co-authored-by: redreceipt <2659478+redreceipt@users.noreply.github.com>
@redreceipt redreceipt temporarily deployed to bug-board-copilot-fix-f-yrwhip December 24, 2025 05:29 Inactive
Copilot AI changed the title [WIP] Fix filter condition and handle division by zero error Fix TypeError, division by zero, and KeyError in leaderboard calculations Dec 24, 2025
Copilot AI requested a review from redreceipt December 24, 2025 05:31
@redreceipt redreceipt marked this pull request as ready for review December 24, 2025 05:45
@redreceipt redreceipt merged commit 698b176 into main Dec 24, 2025
7 checks passed
@redreceipt redreceipt deleted the copilot/fix-filter-condition-and-division-error branch December 24, 2025 05:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants