Skip to content

Release 0.11.0 — Abstractions 0.18.1 adoption - #254

Merged
Chris-Wolfgang merged 18 commits into
mainfrom
vNext
Jul 28, 2026
Merged

Release 0.11.0 — Abstractions 0.18.1 adoption#254
Chris-Wolfgang merged 18 commits into
mainfrom
vNext

Conversation

@Chris-Wolfgang

@Chris-Wolfgang Chris-Wolfgang commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Release 0.11.0 (MINOR) — adopts the Wolfgang.Etl.Abstractions 0.18 error hook (built against 0.18.1) and closes the earlier-version contract-coverage gaps. New public API only; no breaking change. PackageValidation baseline stays 0.10.1.

Highlights

0.18 — per-item error hook

  • FaultyExtractor<T> / FaultyLoader<T> / FaultyTransformer<T> gain SkipErrors(), HandleErrorsWith(policy), CapturedErrors — an injected ThrowAt fault routes through the base HandleItemError (Skip → counts CurrentErrorItemCount, continues; Abort → rethrow; no policy → fail-fast, unchanged).
  • ErrorHandlingContractTests<TSut> + ErrorHandlingOutcome — opt-in base verifying the hook.

0.17 — disposability

  • DisposableStageContractTests<TSut> — verifies ObjectDisposedException after Dispose()/DisposeAsync() and idempotent double-dispose.

0.14 — progress timing

  • The doubles' CreateProgressReport() surfaces StartedAt/Elapsed (→ ItemsPerSecond); the extractor doubles set TotalItemCount from a known ICollection<T> source (→ PercentComplete/EstimatedRemaining).

0.16 — pipeline

  • Sample composes the doubles via EtlPipeline.Create().From().Through().To().RunAsync(), incl. a SkipErrors() error-hook pipeline.

Contract-test completeness

Verification

Full multi-TFM Release build clean (net462→net10.0); all tests green on net10.0 and net48.

Closes #248
Closes #49

Chris-Wolfgang and others added 16 commits July 26, 2026 20:57
0.10.1 is published to NuGet; make the ABI gate compare the next
release against it rather than the now-superseded 0.10.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ubles + contract base

- FaultyExtractor/Loader/Transformer<T> gain SkipErrors(), HandleErrorsWith(policy),
  and CapturedErrors: an injected ThrowAt fault is routed through the base
  HandleItemError hook, counting the item as an error (CurrentErrorItemCount) and
  continuing on Skip, or re-throwing on Abort. No policy = fail-fast (unchanged).
- New ErrorHandlingContractTests<TSut> + ErrorHandlingOutcome verify a stage's
  error-hook: Skip completes + counts the failure as an error kept distinct from the
  intentional-skip count; Abort re-throws and counts no error.
- 39 tests (21 doubles + 18 contract, wired via the Faulty* doubles).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…antees

Verifies a stage throws ObjectDisposedException after Dispose()/DisposeAsync()
(0.17 use-after-dispose guard) and that double-dispose is a harmless no-op.
Consumer self-reports via InvokeReportsObjectDisposedAsync (no SUT parameter, so
no CA1062 in the override). Wired against TestExtractor/Loader/Transformer (15
tests), which inherit the guard from the Abstractions base.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
All six doubles' CreateProgressReport now echoes the base's StartedAt/Elapsed
instrumentation into the Report, so ItemsPerSecond is computed for reported
progress instead of the timing fields always being empty. No public API change.
Adds DoubleReportTimingTests (TestExtractor as representative).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…18 error hook

Adds two sample tests: Extract→Transform→Load wired with EtlPipeline.Create().
From().Through().To().RunAsync(), and a pipeline where a FaultyTransformer with
SkipErrors() discards a bad item (counted as an error) while the run completes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…sts (#248)

Adds to ExtractorBaseContractTests, LoaderBaseContractTests, and
TransformerBaseContractTests: CurrentItemCount/CurrentSkippedItemCount default-zero
tests and a skip-count-reflects test, so every downstream library inherits skip-count
coverage for free. +9 tests.

Closes #248

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…al contract bases

Adds README usage sections for SkipErrors()/HandleErrorsWith()/CapturedErrors on the
Faulty* doubles, ErrorHandlingContractTests<TSut>, and DisposableStageContractTests<TSut>,
plus Features-table rows. Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ct-248

test(xunit): CurrentSkippedItemCount contract tests (#248)
The 0.10.0/0.10.1 release never moved these already-shipped entries out of
Unshipped: TestLoader<T>.IsDryRun (core) and SupportsDryRunContractTests<TSut>
(xunit). Promote them to Shipped so Unshipped holds only the unreleased 0.11
surface. No code change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… extractor doubles

TestExtractor<T> and FaultyExtractor<T> now set TotalItemCount in CreateProgressReport
when the source is a materialized ICollection<T>, so PercentComplete / EstimatedRemaining
compute for reported progress. Enumerator- and factory-backed sources have no known total
(TotalItemCount stays null). +2 tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…hipped

chore: promote stranded 0.10.x public API to Shipped
feat: Report.TotalItemCount for collection-backed extractor doubles
docs(readme): 0.11 error hook + new contract bases
…contract tests

- CurrentErrorItemCount_defaults_to_zero on all three base contract classes (the new 0.18
  counter, parallel to the #248 skipped-count default-zero tests).
- No-over-read contract tests (#49) on all three bases: a stage must stop pulling from its
  source once MaximumItemCount is reached (<= M+1 reads) or the run is cancelled, and a
  pre-cancelled token must read nothing. An internal PullCounter wraps the source. Extractors
  opt in via a new virtual CreateSutOverSource factory (no-op by default), wired for the
  TestExtractor doubles.
- CHANGELOG: document the #248 counter tests and #49.

+12 tests. Full multi-TFM build clean; 295 xunit tests pass on net10.0 and net48.

Closes #49

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ver-read

test(xunit): CurrentErrorItemCount default + no-over-read (#49) contract tests
Copilot AI review requested due to automatic review settings July 27, 2026 22:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…gMethodException)

The doubles surfaced Report.StartedAt/Elapsed/TotalItemCount via the object-initializer
(init) form. On .NET 6/7 a consumer loads TestKit's netstandard2.0 assembly but resolves
Abstractions' modern assembly at runtime, so the init-setter IsExternalInit modreq did not
match -> MissingMethodException. Use the plain Report(int, DateTimeOffset?, TimeSpan, int?)
constructor added in Abstractions 0.18.1, whose signature is identical across every TFM.
Bump the Abstractions reference 0.18.0 -> 0.18.1.

Verified: the previously-failing net6.0 tests pass against Abstractions 0.18.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants