Skip to content

release: v0.3.4 — Tier-2 cleanup from v0.3.3 code-review pass#233

Merged
Chris-Wolfgang merged 16 commits into
mainfrom
vNext
Jun 30, 2026
Merged

release: v0.3.4 — Tier-2 cleanup from v0.3.3 code-review pass#233
Chris-Wolfgang merged 16 commits into
mainfrom
vNext

Conversation

@Chris-Wolfgang

Copy link
Copy Markdown
Owner

Summary

PATCH bump (0.3.3 → 0.3.4). All five Tier-2 sub-issues filed during the v0.3.3 AI code-review pass have been resolved. No public API or runtime behaviour change in Wolfgang.TryPattern.

What ships in 0.3.4

Area Change PR Closes
Docs (README) Database example converted to Try.RunAsync with ExecuteReaderAsync / OpenAsync / ReadAsync + CancellationToken; sibling example renamed #226 #221
Perf (benchmarks) csproj <TargetFramework> net8.0 → net10.0; benchmarks.yaml SDK install bumped to 10.0.x #227 #220
Fix (PublicAPI) Result<T>.Value.get moved into per-TFM split (modern: T?, legacy: T); top-level entry was silently wrong against modern builds #228 #219
Chore (tests) xunit.runner.visualstudio 3.0.0 → 3.1.5 (latest GA; xunit core 2.9.3 stays — runner 3.x supports xunit 2.x) #229 #218
Chore (tests) Directory + csproj + assembly + namespace all aligned under Wolfgang.TryPattern.Tests.Unit #231 #222
Fix (CI script) scripts/build-pr.ps1 -UseBasicParsing restored (merged direct to main) #230

Test plan

  • Local dotnet build -c Release clean (0 errors; 3 unrelated NuGet TFM-support warnings on test net5/6/7)
  • Local dotnet test -c Release -f net10.0 — 88/88 passing
  • <Version> bumped to 0.3.4 in src/Wolfgang.TryPattern.csproj
  • AssemblyVersion remains pinned at 1.0.0.0 (binding stability per C4)
  • CHANGELOG.md populated with the 0.3.4 entry
  • CI: Stage 1 Linux + Stage 2 Windows + Stage 3 macOS green
  • CI: Detect .NET Projects PASS (no protected-file diff — benchmarks.yaml already merged via admin-bypass in perf(benchmarks): bump TargetFramework net8.0 → net10.0 (#220) #227)

After merge

  1. Tag v0.3.4 via gh release create v0.3.4 --target main (release.yaml fires on release: published, not on tag push)
  2. Verify NuGet flat container: curl -sIo /dev/null -w '%{http_code}\n' https://api.nuget.org/v3-flatcontainer/wolfgang.trypattern/0.3.4/wolfgang.trypattern.0.3.4.nupkg
  3. Verify docs deploy at https://chris-wolfgang.github.io/Try-Pattern/versions/v0.3.4/
  4. Phase 7 cleanup: delete vNext branch (auto on merge if branch-deletion-on-merge is on).

The README's "Database access" example called sync ExecuteReader inside
Try.Run. The repo's own BannedSymbols.txt blocks sync I/O in library
code, and CONTRIBUTING.md's "Async-First Enforcement" section makes
async-first the documented stance. A README example that uses sync ADO
inside Try.Run signals the wrong default.

Converted the example to await Try.RunAsync with ExecuteReaderAsync /
OpenAsync / ReadAsync and a CancellationToken parameter. The following
"Async database access" example was renamed to "Async query returning a
list" to avoid two sections sharing the same name, and likewise gained
a CancellationToken parameter for parity.

Consumer code is still unbound by the banned-API rule, but the README's
examples should model the convention the library itself enforces.

Closes #221
The src project ships net10.0 as a target; benchmark numbers should
reflect what consumers on the modern runtime actually see. Bumps the
benchmarks csproj and the benchmarks.yaml SDK install to match.

The .github/workflows/benchmarks.yaml change makes this a protected-
file PR — needs admin-bypass merge per protected-file-pr-split.

Closes #220
The top-level PublicAPI.Shipped.txt held
  Wolfgang.TryPattern.Result<T>.Value.get -> T

which doesn't match the modern (net5+) signature (the getter returns
T?, not T, behind #if NET5_0_OR_GREATER in Result.cs). The analyzer
was silently accepting it because RS0017 matches on member name, not
return-type signature — so a future regression of Value's return type
would not have been caught.

Moves the entry into the existing per-TFM manifest split:
- src/Wolfgang.TryPattern/PublicAPI.Shipped.txt          — drops Value.get
- src/Wolfgang.TryPattern/PublicApi/modern/...           — adds Value.get -> T?
- src/Wolfgang.TryPattern/PublicApi/legacy/...           — adds Value.get -> T

Matches the convention already used for Try.Run<T> / Try.RunAsync<T> /
Result<T>.Failure / Result<T>.Success in the same project. See
reference_publicapi_per_tfm_split (validated on PR #211).

Release build green across all 4 src TFMs (net462/netstandard2.0/
net8.0/net10.0), 0 warnings, 0 errors.

Closes #219
…-example-v2

docs(readme): convert database example to async-first (#221)
perf(benchmarks): bump TargetFramework net8.0 → net10.0 (#220)
…fm-value

fix(api): move Result<T>.Value.get to per-TFM PublicAPI manifests (#219)
Moves the net8/9/10 ItemGroup runner from 3.0.0 to 3.1.5 (latest GA on
the 3.x line). The xunit core packages stay at 2.9.3 — runner 3.x
explicitly supports xunit 1.x / 2.x / 3.x test discovery, so the
mismatched-major shape is a non-issue on real GA releases.

Earlier round of this PR mistakenly tried to downgrade to 2.8.2 on the
basis of a CLAUDE.md note saying "3.x is incompatible with xunit v2."
The note dates from the 3.0.0-pre.* era, when v2 discovery actually
was broken; the GA 3.x line restored it. 2.8.2 is the *ceiling* of the
2.x line (no newer 2.x exists), so the alleged fix was actually
sacrificing ~14 months of runner maintenance. Upgrading instead.

Verified locally: 88/88 tests pass on net8.0, net9.0, and net10.0
with runner 3.1.5 + xunit 2.9.3.

Follow-up: CLAUDE.md's xunit runner rule needs to be updated to
reflect that 3.x GA is compatible (separate change, not in this PR).

Closes #218
chore(tests): bump xunit.runner.visualstudio 3.0.0 → 3.1.5 (#218)
…c namespace

Aligns the test project directory, csproj filename, assembly name, and
root namespace under a single Wolfgang.TryPattern.Tests.Unit identity.
Before: directory was tests/Wolfgang.TryPattern.Tests/ but csproj was
Wolfgang.TryPattern.Tests.Unit.csproj and the .cs files declared
'namespace Wolfgang.TryPattern.Tests;' — three different names for the
same project.

Changes:
- git mv tests/Wolfgang.TryPattern.Tests -> tests/Wolfgang.TryPattern.Tests.Unit
  (csproj keeps its existing Wolfgang.TryPattern.Tests.Unit.csproj name)
- TryPattern.sln L16: project path updated
- stryker-config.json L5: test-projects path updated
- Person.cs / ResultOfTTests.cs / ResultTests.cs / RunActionTests.cs /
  RunAsyncActionTests.cs / RunAsyncFuncTests.cs / RunFuncTests.cs:
  'namespace Wolfgang.TryPattern.Tests;' ->
  'namespace Wolfgang.TryPattern.Tests.Unit;'

Assembly output name unchanged (Wolfgang.TryPattern.Tests.Unit.dll —
matches csproj filename, which was already correct). Workflows / scripts
don't reference the directory by name (they glob tests/** and
TestResults/**), so no further changes needed.

Verified locally: dotnet build -c Release clean (0 errors, 3 unrelated
NuGet TFM-support warnings on test net5/6/7), dotnet test -c Release
-f net10.0 passes 88/88.

Closes #222
chore(tests): rename test dir to Wolfgang.TryPattern.Tests.Unit + sync namespace (#222)
Tier-2 cleanup round surfaced by the v0.3.3 AI code-review pass. No
public API change in Wolfgang.TryPattern itself; PATCH bump per SemVer.

Contents this release:

- Docs: README database example converted to Try.RunAsync /
  ExecuteReaderAsync (#226, closes #221)
- Perf: benchmarks project bumped net8.0 -> net10.0 + workflow SDK
  install bumped to 10.0.x (#227, closes #220)
- Fix: PublicApiAnalyzer manifest — Result<T>.Value.get moved into
  per-TFM split (modern: T?, legacy: T); the previous top-level entry
  was silently wrong against modern builds (#228, closes #219)
- Chore: xunit.runner.visualstudio bumped 3.0.0 -> 3.1.5 (latest 3.x
  GA; xunit core 2.9.3 stays put — 3.x runner supports xunit 1/2/3)
  (#229, closes #218)
- Chore: test directory + namespace aligned under single
  Wolfgang.TryPattern.Tests.Unit identity (directory, csproj,
  assembly, namespace, sln + stryker config) (#231, closes #222)
- Fix: scripts/build-pr.ps1 restored -UseBasicParsing on
  Invoke-WebRequest (#230, merged directly to main)
Chris-Wolfgang added a commit that referenced this pull request Jun 30, 2026
…-net10-sdk

ci(benchmarks): bump setup-dotnet SDK 8.0.x → 10.0.x (protected-only ahead of #233)
@Chris-Wolfgang Chris-Wolfgang merged commit f22fddf into main Jun 30, 2026
8 checks passed
@Chris-Wolfgang Chris-Wolfgang deleted the vNext branch June 30, 2026 01:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant