Skip to content

association 4.0.1

Choose a tag to compare

@jeffknupp jeffknupp released this 18 Sep 04:19
· 1220 commits to master since this release
  • A narrowed game_log or player_stat question over a season whose box
    scores ESPN served empty no longer says the games do not exist.
    Both read
    _no_narrowed_games when their guard leaves nothing, and it used to check
    only for a recorded (or rebuilt) box score - so a stat outside
    REBUILT_STATS (turnovers, fouls, 3PM, plusMinus) sent the read back to
    the fetched lines, which are empty for every 2013-2018 Chicago or New
    Orleans game, and the answer became "No 2015 regular season games found for
    Anthony Davis" of a man who played 68. It now checks whether the games exist
    with an empty box score before saying they do not exist at all - "Anthony
    Davis played 68 games in the 2015 regular season, but the box score is empty
    for all of them" - the mirror-image bug AGENTS.md describes, in
    single_game_high's own shape.
  • player_stat narrowed by opponent, venue or without now reads a line
    rebuilt from play-by-play in place of an empty ESPN box score, for a stat the
    rebuild gets right.
    It never did before, even for points - the one stat
    measured most accurate - so "Anthony Davis points vs the Lakers in 2015"
    answered the same wrong-cause refusal as a stat the rebuild does not trust.
    game_log already read rebuilt lines for its own narrowed span; this brings
    player_stat in line with it. A shooting percentage still never widens to a
    rebuilt line - its attempts are outside what the rebuild was measured for.
  • A power-index answer whose snapshot carries no rating now says so, rather
    than dropping the line. The power index is that answer's headline, so the old
    behavior left a reader with a record, a projection and chances and no sign
    that the number they asked for was missing. ESPN's 2026 regular-season
    snapshot is the live case - all 30 teams NULL in bpi, bpioffense and
    bpidefense while their records and projections are populated, and the only
    one of the table's 21 season/season-type groups with any NULL rating - and it
    is the snapshot a 2026 regular-season question now reads.
  • A regular-season BPI question now reads the regular-season power-index
    snapshot outright
    , instead of whichever pre-playoff snapshot ESPN stamped
    last. Once the paging fix gave every snapshot all 30 teams, the play-in
    snapshot (season type 5) started postdating the regular-season one in 2023,
    2025 and 2026, so the same question named a different snapshot depending on
    the season - "how good were the Knicks in the 2026 regular season" answered
    from the play-in view. team_outlook (query/templates/teams.py) now finds
    the season_type == 2 snapshot directly and only falls back to the latest
    other pre-playoff snapshot, then the postseason one, where no
    regular-season snapshot holds the team - true of no season the warehouse
    holds today (2017-2026), measured read-only. See ISSUES.md, "A
    regular-season BPI question answers from the play-in snapshot in 2023, 2025
    and 2026" (#88).
  • ESPNClient.get_collection now warns when the first page of a collection
    cannot be read at all
    , instead of quietly returning []. _request_json
    returns None for a 400 or 404, which used to hit
    if not isinstance(data, dict): break with expected still None, so the
    existing declared-vs-fetched warning had no count to compare against and
    never fired - an endpoint that started rejecting limit=1000 with a 400
    would have reproduced the original 25-row power-index bug with nothing in
    the log. A 200 whose body is not the paged-collection shape (no items
    list) is the same failure and now warns the same way. A later page failing
    is unaffected: page one's count is already on record by then, so the
    declared-vs-fetched warning already covers it, and a genuinely empty
    collection (count: 0, one page, no items) still logs nothing.
  • The web page's games count no longer counts rows that are not games.
    games carries 151 of its 43,504 rows that were never played - placeholders,
    team-slots naming an id no franchise has, phantoms and a duplicate - so the
    health line said 43,504 where 43,353 were played. It reads real_games now,
    falling back to games for a warehouse loaded before that view existed,
    which is the same check conditions.box_source makes for the filled box.