Add two public DAM price endpoints, annual samples, and ESR snapshots - #2
Open
kvkenyon wants to merge 1 commit into
Open
Add two public DAM price endpoints, annual samples, and ESR snapshots#2kvkenyon wants to merge 1 commit into
kvkenyon wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TinyERCOT had no opt-in client backed by verified current public responses. This PR adds bounded retrieval for two DAM price endpoints, public annual DAM samples, and the rolling website ESR feed. All three legacy runtime files remain byte-identical to the audit base. This PR stacks on #1 (
feat/public-foundation,4b26c8a91efbba668dbbc40f564bbe812d4ae792). Keep both PRs unmerged.Exact coverage
Generated typed API coverage is 2 operations in 2 products out of 243 observed public data paths across 98 product namespaces. NP4-190-CD is one narrow verified slice. NP4-188-CD is the second. The two website adapters are separate from this API denominator. The legacy 102 endpoints do not count as current verified coverage.
docs/public-retrieval.mdenumerates all 39 audited public/conditional/restricted/unavailable source families and their EMIL or website IDs.coverage()exposes all 257 observed operations and those family states offline. No whole broad family is marked covered. Current field pins, fixture transformations, exact public response hashes, and installed-client receipts are committed in compact form.Behavior and limits
New imports live under
tinyercot.public. The new clients use separate row models and errors. They have explicit credentials, synchronized token acquisition, a 60-second expiry margin, one 401 reacquisition, bounded retry/pacing, and request/byte limits. Default imports and metadata require no credentials. Annual downloads require a public listing entry and receipt cache; decoding selects one worksheet and at most 1,000 rows. Source publication time, retrieval time, and local market fields remain separate. Unknown/null API row schemas fail closed. No as-of revision or full-filter/schema-epoch contract is claimed.Authorized ERCOT Public API authentication did occur in this expanded milestone. Credential and token values were not printed or retained in source, fixtures, receipts, commits, or PR text. Only two selected annual files were downloaded, once during discovery and once through the installed adapter; subsequent probes used the cache. No historical bulk extraction, restricted request, paid access, forecaster work, no-mistakes run, or merge occurred. Foundation PR #1 remains public-metadata-only and unmerged.
Primary sources: ERCOT current API export, authentication guide, known limits, public annual DAM product, and ESR website feed.
Validation
941 passed, 1 skipped on Python 3.14.0 and 3.11.14. The normal suite blocks sockets; the real integration entry point is opt-in and skipped by default. Both generators reproduce pinned output. Scoped Ruff and format checks pass for 26 authored Python files. Build and isolated installed-wheel smoke checks pass, including offline metadata without the XLSX extra. The installed wheel separately passed real current/historical API, token reacquisition, ESR, and annual-file/cache checks.
Exact commands:
Reviewed git status, staged diff, and remote PR base before push. Existing unrelated example/frozen-file Ruff findings stay excluded as documented in Stage 0. No unrelated work was discarded or reformatted. Google-style Python documentation was reviewed. Deferred limits include async retrieval, automatic polling, all-history extraction, other source families, schema epochs, as-of revisions, and package-wide PEP 561 typing. No blocker remains for this bounded milestone.