tag:github.com,2008:https://github.com/zero-sum-seattle/python-mlb-statsapi/releasesRelease notes from python-mlb-statsapi2026-01-14T03:25:28Ztag:github.com,2008:Repository/535875567/v0.7.12026-01-14T03:34:22Zv0.7.1<h1>Release Notes v0.7.1</h1>
<h2>๐ Major Changes</h2>
<h3>Removed Key Transformation Layer</h3>
<p>Removed the <code>_transform_keys_in_data()</code> function that was lowercasing all API response keys. Models now directly use the MLB Stats API's native <code>camelCase</code> format, simplifying the codebase and ensuring accurate representation of API responses.</p>
<h3>Complete Pydantic Migration</h3>
<p>This release includes the complete migration from Python dataclasses to Pydantic v2 models across the entire codebase (from v0.7.1). All models now use Pydantic for validation, serialization, and data handling.</p>
<p><strong>Key Benefits:</strong></p>
<ul>
<li>Automatic data validation with clear error messages</li>
<li>Built-in serialization with <code>model_dump()</code> and <code>model_dump_json()</code></li>
<li>Pythonic <code>snake_case</code> field names while maintaining API <code>camelCase</code> compatibility</li>
<li>Better type safety and IDE support</li>
</ul>
<h2>๐ Breaking Changes</h2>
<p><g-emoji class="g-emoji" alias="warning">โ ๏ธ</g-emoji> <strong>This is a major version release with breaking changes:</strong></p>
<ol>
<li>
<p><strong>Field Access</strong>: All model fields now use <code>snake_case</code> instead of <code>camelCase</code>:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# Before
game.gamedata.weather
# After
game.game_data.weather"><pre><span class="pl-c"># Before</span>
<span class="pl-s1">game</span>.<span class="pl-c1">gamedata</span>.<span class="pl-c1">weather</span>
<span class="pl-c"># After</span>
<span class="pl-s1">game</span>.<span class="pl-c1">game_data</span>.<span class="pl-c1">weather</span></pre></div>
</li>
<li>
<p><strong>Validation Errors</strong>: Invalid data now raises <code>pydantic.ValidationError</code> instead of <code>TypeError</code></p>
</li>
<li>
<p><strong>Serialization</strong>: Use Pydantic methods for serialization:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# New methods
model.model_dump()
model.model_dump_json()"><pre><span class="pl-c"># New methods</span>
<span class="pl-s1">model</span>.<span class="pl-c1">model_dump</span>()
<span class="pl-s1">model</span>.<span class="pl-c1">model_dump_json</span>()</pre></div>
</li>
</ol>
<h2>๐ง Model Updates</h2>
<h3>Core Models</h3>
<ul>
<li>All models migrated to Pydantic <code>MLBBaseModel</code></li>
<li>Field aliases updated to match actual API <code>camelCase</code> format</li>
<li>Optional fields properly marked for fields that may be missing</li>
</ul>
<h3>Specific Model Fixes</h3>
<ul>
<li><strong>Game Models</strong>: <code>gamePk</code>, <code>gameData</code>, <code>liveData</code>, <code>metaData</code> aliases corrected</li>
<li><strong>HomeRunDerby</strong>: <code>homeRun</code>, <code>tieBreaker</code>, <code>isHomeRun</code>, <code>isTieBreaker</code> aliases fixed</li>
<li><strong>Stats Models</strong>: <code>wobaCon</code>, <code>pitchArsenal</code> aliases corrected</li>
<li><strong>Schedule Models</strong>: <code>calendarEventId</code> made optional</li>
<li><strong>Standings Models</strong>: <code>wildcardGamesBack</code>, <code>wildcardEliminationNumber</code> made optional</li>
</ul>
<h2>๐ Bug Fixes</h2>
<ul>
<li>Fixed missing fields in various stat models</li>
<li>Added <code>age</code> and <code>caughtstealingpercentage</code> to <code>SimplePitchingSplit</code></li>
<li>Fixed <code>flyballpercentage</code> field in <code>AdvancedPitchingSplit</code></li>
<li>Updated models for new MLB API fields</li>
<li>Fixed missing keys in live feed data</li>
</ul>
<h2>๐ Documentation</h2>
<ul>
<li>Updated README with Pydantic migration examples</li>
<li>Added "Working with Pydantic Models" section</li>
<li>Added Contributing section to README</li>
<li>Updated all code examples to use <code>snake_case</code> field names</li>
</ul>
<h2>๐ Migration Guide</h2>
<p>If you're upgrading from v0.5.x or v0.6.x:</p>
<ol>
<li>
<p><strong>Update field access</strong>: Change all <code>camelCase</code> field names to <code>snake_case</code></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# Old
game.gamedata.weather
stat.totalsplits
# New
game.game_data.weather
stat.total_splits"><pre><span class="pl-c"># Old</span>
<span class="pl-s1">game</span>.<span class="pl-c1">gamedata</span>.<span class="pl-c1">weather</span>
<span class="pl-s1">stat</span>.<span class="pl-c1">totalsplits</span>
<span class="pl-c"># New</span>
<span class="pl-s1">game</span>.<span class="pl-c1">game_data</span>.<span class="pl-c1">weather</span>
<span class="pl-s1">stat</span>.<span class="pl-c1">total_splits</span></pre></div>
</li>
<li>
<p><strong>Update error handling</strong>: Catch <code>ValidationError</code> instead of <code>TypeError</code></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="from pydantic import ValidationError
try:
game = Game(**data)
except ValidationError as e:
# Handle validation error"><pre><span class="pl-k">from</span> <span class="pl-s1">pydantic</span> <span class="pl-k">import</span> <span class="pl-v">ValidationError</span>
<span class="pl-k">try</span>:
<span class="pl-s1">game</span> <span class="pl-c1">=</span> <span class="pl-en">Game</span>(<span class="pl-c1">**</span><span class="pl-s1">data</span>)
<span class="pl-k">except</span> <span class="pl-v">ValidationError</span> <span class="pl-k">as</span> <span class="pl-s1">e</span>:
<span class="pl-c"># Handle validation error</span></pre></div>
</li>
<li>
<p><strong>Use Pydantic serialization</strong>: Replace <code>__dict__</code> access with <code>model_dump()</code></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="# Old
data = game.__dict__
# New
data = game.model_dump()"><pre><span class="pl-c"># Old</span>
<span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-s1">game</span>.<span class="pl-c1">__dict__</span>
<span class="pl-c"># New</span>
<span class="pl-s1">data</span> <span class="pl-c1">=</span> <span class="pl-s1">game</span>.<span class="pl-c1">model_dump</span>()</pre></div>
</li>
</ol>
<h2>๐ฆ Dependencies</h2>
<ul>
<li>Added <code>pydantic>=2.0</code> as a core dependency</li>
<li>Migrated from setuptools to Poetry for dependency management</li>
</ul>
<h2>๐งช Testing</h2>
<ul>
<li>Removed all mock tests (22,370+ lines)</li>
<li>External tests updated and passing</li>
<li>CI/CD pipelines updated to remove mock test runs</li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/zero-sum-seattle/python-mlb-statsapi/compare/v0.5.3...v0.7.0"><tt>v0.5.3...v0.7.0</tt></a></p>Mattsfacetag:github.com,2008:Repository/535875567/v0.5.32023-01-09T23:29:50Zv0.5.3<p>v0.5.3 of python-mlb-statsapi</p>Mattsface