v0.3.0
A structural + correctness release covering 28 PRs since v0.2.8. The supported top-level API (gem.parse, gem.ParsedMatch, gem.find_player, …) is unchanged.
Highlights
- Package reorganization — internals grouped into focused subpackages (
binary/,schema/,state/,combat/,extractors/,analysis/,catalog/,results/,reports/,replays/), each with its ownREADME.md. - Source-based combat attribution — damage/healing attributed to the damage source (matching OpenDota);
tower_damage~exact offline (up from ~87%); unmapped combat-log types no longer inflate damage aggregates. - Correctness fixes (multi-pass adversarial bug hunt) — day/night cycle (10-min, night at 5:00), ward lifespans (observer 6 min / sentry 7 min), teamfight gold/XP attribution, Roshan-conversion window double-count, reincarnation death counting, coach-index K/D/A remap for HLTV replays.
- New fields —
CombatLogEntry.damage_source_name,CombatLogEntry.will_reincarnate, and a backward-compatibleCombatLogTypeenum.
Removed
- Root-level compatibility shims (
gem.reader,gem.models,gem.combatlog,gem.entities, …). Use the top-levelgem.*API or grouped subpackages.gem.__all__is unaffected.
Full detail in CHANGELOG.md.
📦 Published to PyPI: gem-dota==0.3.0