Skip to content

4.7.12: facade unwrap (T/Page<T>), Fallout-generated CI, publish enhancements, public-API tests#10

Merged
ChrisonSimtian merged 7 commits into
mainfrom
feat/facade-unwrap-v4.7.12
Jul 23, 2026
Merged

4.7.12: facade unwrap (T/Page<T>), Fallout-generated CI, publish enhancements, public-API tests#10
ChrisonSimtian merged 7 commits into
mainfrom
feat/facade-unwrap-v4.7.12

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator

Fast-follow to 4.7.11. Ships as 4.7.12 (tag v4.7.12).

Client ergonomics — envelope unwrap

  • Overlay strips TheTVDB's { data, status, links } envelope; EnvelopeUnwrappingHandler peels it at runtime. Clients now return the entity T / ICollection<T> instead of ResponseNN wrappers.
  • The 8 paginated endpoints expose a generic Page<T> (Items + Links + HasNext/TotalItems/…) via GetPageAsync extensions, backed by an ambient link-capture the handler fills.
  • All integer params coerced numberlong.

CI / build (Fallout-owned)

  • build.yml is now genuinely Fallout-generated (was hand-edited): pinned Fallout.GlobalTool 10.3.49, aligned Fallout.Common/Components to 10.3.49, and a proper bat/sh polyglot build.cmd so the generated ./build.cmd Test Pack runs on ubuntu.
  • publish.yml stays hand-written — the one documented exception (the published Fallout tool lacks the 11.x custom-step API for the uses:-based OIDC/Release steps; Fallout's own repo also hand-writes publish). See CLAUDE.md.

Publishing enhancements (publish.yml)

  • Adds GitHub Packages push + a GitHub Release with the .nupkg files attached and label-categorized release notes (.github/release.yml), alongside the existing nuget.org OIDC push.

Tests (Fallout spec convention)

  • xUnit + FluentAssertions + Verify + NetArchTest + Mockly. 12 specs: architecture fitness, envelope unwrapping, paging, a Mockly client spec, and public-API snapshots (PublicApiGenerator + Verify) for all three packages.

Docs

  • Project CLAUDE.md (Fallout owns workflows, in-stack tooling, 3-project architecture, testing/versioning/publishing conventions). README: Built-with-Fallout badge + Building section.

Also filed: #9 (optional caching via DI — future).

🤖 Generated with Claude Code

ChrisonSimtian and others added 7 commits July 24, 2026 00:37
…lection<T>

Implements the agreed facade-unwrap (option 2). The codegen overlay now strips
TheTVDB's { data, status, links } envelope from every response schema, so the
generated clients return the entity (T) or collection (ICollection<T>) directly
instead of NSwag ResponseNN wrappers. At runtime, EnvelopeUnwrappingHandler
(outermost in the HttpClient pipeline) peels `data` off successful JSON responses;
non-JSON, error, and already-unwrapped bodies pass through.

- build/Build.cs: StripDataEnvelope overlay (66 responses).
- Handlers/EnvelopeUnwrappingHandler.cs + Bootstrapper registration.
- Regenerated clients/models with unwrapped return types.
- EnvelopeUnwrappingSpecs (4 specs) via InternalsVisibleTo; all pass.
- README: fix stale Fallout link → Fallout-build/Fallout.

Note: the 8 paginated list endpoints currently return ICollection<T> (links
dropped). Page<T> with pagination links is the remaining step.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Completes the unwrap: the paginated list endpoints now surface a generic Page<T>
(Items + Links + Status + HasNext/HasPrevious/TotalItems/PageSize) instead of a
bare collection that dropped the pagination links.

- Page<T> (Abstractions).
- TvdbResponseContext: an async-flow-local capture the EnvelopeUnwrappingHandler
  fills with links/status; the mutable capture flows down into the handler and is
  read back by the wrapper (keeps generated clients returning plain collections).
- TvdbPagingExtensions: `GetPageAsync` overloads for the 8 paged clients
  (series/movies/episodes/people/lists/seasons/companies + updates).
- Overlay now coerces ALL integer params (page/year/since/… not just path ids)
  number → long; no float params exist in the API.
- Specs: PagingSpecs (end-to-end links capture) + a Mockly-backed SeriesClientSpecs
  (client deserialization). 9 specs pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ized notes

The publish lane now, on a version tag:
- pushes to nuget.org (OIDC, as before),
- pushes to GitHub Packages (GITHUB_TOKEN),
- creates a GitHub Release with the .nupkg files attached and auto-generated,
  label-categorized notes (softprops/action-gh-release + .github/release.yml
  mapping PR labels → Features / Fixes / Docs / Maintenance / Other).

Adds contents:write + packages:write to the job. Static version fallback → 4.7.12.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bakes in the key conventions so they aren't forgotten — most importantly:
GitHub workflows are GENERATED by Fallout from [GitHubActions] attributes on
build/Build.cs and must never be hand-edited. Also: in-stack tooling only,
generated codegen (don't hand-edit), the 3-project architecture + arch tests,
the Fallout spec test convention (no CPM), versioning, and publishing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ited

Per the CLAUDE.md rule (Fallout owns the workflows). Fixes:
- Pin Fallout.GlobalTool 10.3.49 (nuget.org) and align Fallout.Common/Components
  to 10.3.49 (they were 11.0.18, mismatched with the tool).
- Make build.cmd the proper bat/sh polyglot (dispatches to build.sh on Linux,
  build.ps1 on Windows) + add build.sh, so the tool's generated `./build.cmd`
  run step runs on the ubuntu runner. Verified locally: `./build.cmd Test`.
- Flip the build [GitHubActions] attribute back to AutoGenerate (drop the earlier
  hand-edit) and regenerate build.yml → `./build.cmd Test Pack`.
- Tools roll forward (net10 CI).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…exception

- PublicApiSpecs (PublicApiGenerator + Verify) snapshots the public surface of all
  three packages; committed .verified.txt baselines. Any accidental surface change
  now fails until re-accepted. Chosen over Roslyn PublicApiAnalyzers to reuse the
  Verify already in the Fallout test stack. 12 specs pass.
- CLAUDE.md: document that publish.yml is the one hand-written workflow (the
  published Fallout tool 10.3.49 lacks the 11.x custom-step API to model the
  uses:-based OIDC/Release steps — as Fallout's own repo also hand-writes publish).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Doc-comment cleanup after reverting the (10.3.49-incompatible) publish
[GitHubActions] attempt; regenerated .fallout/build.schema.json.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisonSimtian ChrisonSimtian added the enhancement New feature or request label Jul 23, 2026
@ChrisonSimtian
ChrisonSimtian merged commit 55285d2 into main Jul 23, 2026
1 check passed
@ChrisonSimtian
ChrisonSimtian deleted the feat/facade-unwrap-v4.7.12 branch July 23, 2026 13:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant