diff --git a/graph/workflows/pr-review-paper-dynasty-database50-none-guard-in-pitcher-sor-38e778.md b/graph/workflows/pr-review-paper-dynasty-database50-none-guard-in-pitcher-sor-38e778.md new file mode 100644 index 00000000000..2c5403ec16f --- /dev/null +++ b/graph/workflows/pr-review-paper-dynasty-database50-none-guard-in-pitcher-sor-38e778.md @@ -0,0 +1,29 @@ +--- +id: 38e7784c-1250-4123-9a20-1a75ad1e37d8 +type: workflow +title: "PR review: paper-dynasty-database#50 — None guard in pitcher sorting (APPROVED)" +tags: [pr-reviewer, paper-dynasty-database, python, peewee, fastapi, fix, none-guard] +importance: 0.4 +confidence: 0.8 +created: "2026-03-04T02:18:09.362984+00:00" +updated: "2026-03-04T02:18:09.362984+00:00" +--- + +## PR #50: fix: guard against None rating objects in pitcher sorting functions + +**Verdict:** APPROVED (posted as COMMENT — Gitea prevents self-approval) + +### Files Reviewed +- `app/routers_v2/teams.py` + +### Summary +Fixed `AttributeError` crash in two `get_total_ops` inner functions when `PitchingCardRatings.get_or_none()` returns `None` for vs-L or vs-R ratings. Both locations patched: `sort_pitchers()` (~line 593) and `sort_starters()` closure inside `get_team_sp()` (~line 670). + +### Key Points +- `float("inf")` used as sentinel — correct since sort is ascending (lower OPS = better pitcher), so missing-ratings pitchers sort to end +- Explicit None check is cleaner than try/except for get_or_none() contract +- Slight inconsistency with DH path (uses try/except AttributeError) but acceptable +- The two `get_total_ops` implementations are nearly identical — potential consolidation opportunity noted as suggestion + +### Pattern +paper-dynasty-database uses `get_or_none()` throughout for safe DB lookups; callers must always guard the return value before attribute access.