Commit Graph

252 Commits

Author SHA1 Message Date
cal
4392f6c07f Merge pull request 'fix: add @pytest.mark.asyncio to async test methods (#21)' (#30) from ai/paper-dynasty-card-creation#21 into main 2026-03-23 13:25:11 +00:00
cal
424b7da78d Merge branch 'main' into ai/paper-dynasty-card-creation#21 2026-03-23 13:24:40 +00:00
cal
461a469374 Merge pull request 'feat: implement tweak_archetype() and manual_adjustments() (#12)' (#49) from ai/paper-dynasty-card-creation-12 into main 2026-03-23 12:42:00 +00:00
Cal Corum
962b9cf6f1 feat: implement tweak_archetype() and manual_adjustments() (#12)
Closes #12

- tweak_archetype(): prompts user for updated archetype stats (avg/obp/slg/bb%/k% vs L and R, power and batted-ball profile, baserunning for batters), then recalculates D20 card ratings via the existing calculator
- manual_adjustments(): prompts user to choose a split (vs L or vs R), displays all 22 D20 chance fields with running total, accepts field-number + value edits, and warns if total deviates from 108

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:41:46 -05:00
cal
f2f70bfce5 Merge pull request 'fix: use archetype role ratings in pitcher card creation (#11)' (#46) from ai/paper-dynasty-card-creation#11 into main 2026-03-23 12:41:20 +00:00
Cal Corum
50ee2d0446 fix: use archetype role ratings in pitcher card creation (#11)
Closes #11

`starter_rating`, `relief_rating`, and `closer_rating` were hardcoded
stubs (5/5/None) in `create_pitching_card`. The chosen `PitcherArchetype`
already carries these values; now they are propagated through `card_data`
when the pitcher workflow builds its initial dict and consumed correctly
when writing the pitching card record to the database.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:41:07 -05:00
cal
7286fd2203 Merge pull request 'fix: derive SEASON_PCT from date range instead of hardcoding half-season (#9)' (#36) from ai/paper-dynasty-card-creation#9 into main 2026-03-23 12:40:47 +00:00
Cal Corum
63a30bd434 fix: derive SEASON_PCT from date range instead of hardcoding half-season (#9)
Closes #9

Previously SEASON_PCT was hardcoded to 81/162 (~0.5) while END_DATE was
set to 20050731 (~65% through the season). Running retrosheet_data.py
directly (without the CLI which overrides SEASON_PCT at runtime) would
silently generate cards using half-season normalizations on stats covering
a larger portion of the season.

Fix: move START_DATE/END_DATE before SEASON_PCT and derive SEASON_PCT
from the date range using SEASON_END_DATE (2005 regular season end).
Now changing END_DATE automatically produces the correct SEASON_PCT.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:40:35 -05:00
cal
770f296938 Merge pull request 'fix: remove import-time derived globals in retrosheet_data.py (#14)' (#48) from ai/paper-dynasty-card-creation#14 into main 2026-03-23 12:37:59 +00:00
Cal Corum
d43927258a fix: remove import-time derived globals in retrosheet_data.py (#14)
Closes #14

Five globals (MIN_PA_VL, MIN_PA_VR, MIN_TBF_VL, MIN_TBF_VR, CARDSET_ID)
were derived from PLAYER_DESCRIPTION at module load time, creating a
hidden ordering dependency: any value baked in before the CLI overrides
PLAYER_DESCRIPTION would be silently wrong if a caller relied on the
derived relationship. The CLI explicitly sets all of them anyway, so
replacing with scalar defaults makes the module self-contained and safe.

Also collapses LAST_WEEK_RATIO dead ternary (both branches were 0.0).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:37:46 -05:00
cal
fd142c27d2 Merge pull request 'fix: replace wildcard import from db_calls_card_creation (#13)' (#34) from ai/paper-dynasty-card-creation-13 into main 2026-03-23 12:37:29 +00:00
Cal Corum
df6e96bc76 fix: replace wildcard import from db_calls_card_creation (#13)
Closes #13

Replace `from db_calls_card_creation import *` with an explicit
`from db_calls_card_creation import PitcherData`. Only PitcherData
is referenced in creation_helpers.py; the wildcard was also
pulling in all Peewee ORM internals via a transitive
`from peewee import *`, polluting the namespace.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:37:16 -05:00
cal
dd42f35674 Merge pull request 'fix: use logger.exception() in calculate_pitcher_ratings error handler' (#33) from ai/paper-dynasty-card-creation#17 into main 2026-03-23 12:35:47 +00:00
Cal Corum
9e48616274 fix: use logger.exception() in calculate_pitcher_ratings error handler
Replaces logger.error() with logger.exception() so the full stack trace
is captured when a pitcher card fails to generate, making it possible to
diagnose the root cause rather than just seeing the error message.

Closes #17

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:35:31 -05:00
cal
deaa43432b Merge pull request 'fix: correct Dict[str, any] to Dict[str, Any] in type annotations (#15)' (#31) from ai/paper-dynasty-card-creation-15 into main 2026-03-23 12:12:28 +00:00
cal
3fd07b6d89 Merge branch 'main' into ai/paper-dynasty-card-creation-15 2026-03-23 12:12:18 +00:00
cal
55f2eda888 Merge pull request 'chore: pin peewee and polars to exact versions (#24)' (#32) from ai/paper-dynasty-card-creation-24 into main 2026-03-23 12:12:07 +00:00
cal
a432d37850 Merge branch 'main' into ai/paper-dynasty-card-creation-24 2026-03-23 12:11:56 +00:00
dde163e2fb Merge pull request 'fix: narrow swallowed exception in get_pitching_peripherals() (#10)' (#35) from ai/paper-dynasty-card-creation#10 into main 2026-03-23 03:53:18 +00:00
f485241dd7 Merge branch 'main' into ai/paper-dynasty-card-creation#10 2026-03-23 03:53:10 +00:00
6d0497431f Merge pull request 'fix: remove dead LAST_WEEK_RATIO ternary — both branches are 0.0 (#19)' (#45) from ai/paper-dynasty-card-creation-19 into main 2026-03-23 03:52:58 +00:00
f5cb72cc26 Merge branch 'main' into ai/paper-dynasty-card-creation-19 2026-03-23 03:52:52 +00:00
f67d111a66 Merge pull request 'fix: remove test_positions_df non-test that always passes (#16)' (#43) from ai/paper-dynasty-card-creation-16 into main 2026-03-23 03:52:48 +00:00
230f3e79ce Merge branch 'main' into ai/paper-dynasty-card-creation-16 2026-03-23 03:52:41 +00:00
ecc62a0521 Merge pull request 'fix: correct get_of() opposite-field direction for switch hitters' (#40) from ai/paper-dynasty-card-creation#5 into main 2026-03-23 03:52:38 +00:00
992feba79e Merge branch 'main' into ai/paper-dynasty-card-creation#5 2026-03-23 03:52:32 +00:00
57c379a8e0 Merge branch 'main' into ai/paper-dynasty-card-creation#10 2026-03-23 03:52:23 +00:00
e413fd5cc8 Merge pull request 'fix: return default 8 on XBT% parse error in running() (#8)' (#37) from ai/paper-dynasty-card-creation#8 into main 2026-03-23 03:52:19 +00:00
6a6767f5d8 Merge branch 'main' into ai/paper-dynasty-card-creation#8 2026-03-23 03:52:13 +00:00
2b955dd8f7 Merge pull request 'fix: resolve unreachable duplicate elif 'DO*' branch in result_string() (#6)' (#39) from ai/paper-dynasty-card-creation#6 into main 2026-03-23 03:51:33 +00:00
0e66ff71e7 Merge branch 'main' into ai/paper-dynasty-card-creation-19 2026-03-23 03:51:06 +00:00
b55820eec8 Merge branch 'main' into ai/paper-dynasty-card-creation-16 2026-03-23 03:51:01 +00:00
b4a3e4b865 Merge branch 'main' into ai/paper-dynasty-card-creation#5 2026-03-23 03:50:56 +00:00
bb546c6ded Merge branch 'main' into ai/paper-dynasty-card-creation#10 2026-03-23 03:50:51 +00:00
5c7c613813 Merge branch 'main' into ai/paper-dynasty-card-creation#8 2026-03-23 03:50:47 +00:00
cbfcba5e26 Merge branch 'main' into ai/paper-dynasty-card-creation#6 2026-03-23 03:50:40 +00:00
006b48e60f Merge pull request 'fix: use player_id instead of key_bbref in create_pit_position() (#7)' (#38) from ai/paper-dynasty-card-creation#7 into main 2026-03-23 03:50:38 +00:00
5e135ff554 Merge branch 'main' into ai/paper-dynasty-card-creation#7 2026-03-23 03:50:35 +00:00
602151fb16 Merge pull request 'Remove hardcoded secrets, load API token from env' (#29) from fix/2-3-security-hardcoded-secrets into main 2026-03-23 03:50:07 +00:00
6c20f93901 Merge branch 'main' into fix/2-3-security-hardcoded-secrets 2026-03-23 03:50:00 +00:00
Cal Corum
937620e2e9 fix: remove dead LAST_WEEK_RATIO ternary — both branches are 0.0 (#19)
Closes #19

The conditional `0.0 if PLAYER_DESCRIPTION == 'Live' else 0.0` is dead
code: both branches evaluate to the same value. Simplified to a direct
assignment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 07:03:38 -05:00
Cal Corum
5b8d027d46 fix: remove test_positions_df non-test that always passes (#16)
Closes #16

Deleted test_positions_df which called an async function synchronously
(returning a coroutine, not a DataFrame) and asserted True == True.
Zero coverage. Also removed the now-unused pd_positions_df import.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 02:02:10 -05:00
Cal Corum
a2e374cd4f fix: correct get_of() opposite-field direction for switch hitters
Switch hitters batting vs LHP hit right-handed (pull=lf, oppo=rf).
Switch hitters batting vs RHP hit left-handed (pull=rf, oppo=lf).
Copy-paste error had both pull_side branches returning the same value.

Closes #5

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 00:02:01 -05:00
Cal Corum
b52c5418db fix: resolve unreachable duplicate elif 'DO*' branch in result_string() (#6)
The second `elif "DO*" in data_string` was dead code — the first always
matched, so `spaces -= 2` for the DO** variant was silently skipped.
Fix: check "DO**" first (spaces -= 2), then "DO*" (spaces -= 1).

Closes #6

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 23:33:06 -05:00
Cal Corum
1d96223c78 fix: use player_id instead of key_bbref in create_pit_position() (#7)
Closes #7

The fallback branch of create_pit_position() used `int(df_data["key_bbref"])`
which always raises ValueError for string IDs like 'verlaju01'. The exception
was silently swallowed, causing pitchers without defensive stats to receive no
position record at all.

Fix: use `int(float(df_data["player_id"]))` to match the pattern used in
create_pitching_card() on the same file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 23:03:43 -05:00
Cal Corum
8e24b4e686 fix: return default 8 on XBT% parse error in running() (#8)
Closes #8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 21:32:14 -05:00
Cal Corum
46fdde3d02 fix: narrow swallowed exception in get_pitching_peripherals() (#10)
Closes #10

Replace `except Exception: pass` with `except KeyError: pass` so only
the expected missing-attribute case (`cell["data-append-csv"]` not
present) is silently skipped. Network errors, encoding issues, and
other unexpected exceptions will now propagate instead of being hidden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 20:02:55 -05:00
Cal Corum
09cb942435 chore: pin peewee and polars to exact versions (#24)
Closes #24

Pins the two unpinned dependencies in requirements.txt:
- peewee (unversioned → 3.19.0)
- polars (unversioned → 1.36.1)

All other dependencies were already pinned with ==.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 16:33:00 -05:00
Cal Corum
b39d3283fd fix: correct Dict[str, any] to Dict[str, Any] in type annotations (#15)
Closes #15

`any` (lowercase) refers to the builtin function, not `typing.Any`.
Added `Any` to the `typing` imports in both files and updated the
`cardset` parameter annotation accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 16:03:45 -05:00
Cal Corum
ee4dae0985 fix: add @pytest.mark.asyncio to async test methods (#21)
Closes #21

All 14 async test methods in tests/test_automated_data_fetcher.py were
missing @pytest.mark.asyncio. Without it, pytest collects them and
silently passes without executing the coroutine body, providing no
coverage.

Added explicit @pytest.mark.asyncio to each async def test_* method.
This makes the async intent unambiguous and is robust against any
future asyncio_mode configuration changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 14:33:52 -05:00