Repository navigation
(MAJOR): Release 2.0 - #147
Merged
Merged
Conversation
**Targets `release/2.0`**, the staging branch for the 2.0 major release, not `main`. ## Cause Since #73, `PatchClassBuilder`'s cache is static, so every instance resolves a source type to the same generated patch type. Constructing your own builder buys nothing over `PatchClassBuilder.Instance` except an allocation. The public constructor was kept only for compatibility, marked `[Obsolete]` and pointing at this issue for the next major version. ## Fix - `PatchClassBuilder()` is now `internal`, and its `[Obsolete]` attribute is gone. `PatchClassBuilder.Instance` is the only way for callers to get a builder. - The `CS0618` suppression around `Instance`'s initializer is removed, since it is no longer needed. - `RoslynPatchClassBuilderTest.GetPatchClassFor_SharesGeneratedTypesAcrossBuilders` still constructs two builders, to show that the static cache is shared. Its `CS0618` suppression is removed. The test project already had `InternalsVisibleTo` from `PTrampert.SimplePatch.csproj`, so no project change was needed. - AGENTS.md now says the constructor is internal, not obsolete. README.md and `docs/` never mentioned the constructor. This is a **breaking change**: callers of `new PatchClassBuilder()` no longer compile, and existing binaries get a `MissingMethodException`. Hence `(MAJOR)`. The type of `Instance` (#135), the Roslyn builder and `UseExperimentalDynamicClassBuilder` (#126), and target frameworks (#76) are out of scope and unchanged here. ## Alternatives rejected - **Make the constructor `private`.** That would break the shared-cache test. The test is still worth keeping while the cache is static and per-type rather than per-instance. - **Make the class `static`.** That would remove the `IPatchClassBuilder` implementation and `Instance`, which is a much larger break than the issue asks for. - **Delete the shared-cache test.** Making the constructor internal doesn't change the guarantee that the test checks. ## Test results - `dotnet build`: 0 errors and 21 warnings, the same count as the base branch. - `dotnet test`: PTrampert.SimplePatch.Test 129/129, Swashbuckle.Test 18/18, OpenApi.Test 12/12, all passing. The net8.0 test hosts were run with `DOTNET_ROLL_FORWARD=Major`, because only the .NET 10 runtime is installed locally. Closes #75 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Cause The repository straddled two target frameworks: the core, Schema, Swashbuckle, Sample and most test projects were `net8.0`, while `PTrampert.SimplePatch.OpenApi` (and its tests) were `net10.0` because `OpenApiSchemaTransformerContext.GetOrCreateSchemaAsync` only exists from .NET 10. .NET 8 reaches end of support in November 2026. ## Fix - Every project, including `Test.External` and the Sample, now targets `net10.0` only. - `System.CodeDom` 9.0.8 → 10.0.12, the framework-aligned version for the new TFM. - Dropped the `System.Text.Json` package reference: it is in the net10.0 shared framework, so the package was redundant. - Removed the now-stale csproj comments in Schema and OpenApi that explained the TFM split. - The net10.0 analyzers raised one new warning, CA2264 on `ArgumentNullException.ThrowIfNull(left)` in `Optional<T>.operator ==`. `Optional<T>` is a `record struct`, so boxing it never gives null and the call never threw. I removed it, so behaviour is unchanged. - No `#if NET8_0`-style conditionals existed, so there were none to remove. - CI: `dotnet-library.yml` uses the shared workflow, which reads the SDK from `global.json` (already 10.0.x). Nothing in `.github/workflows/` assumes a TFM. - Docs: README has a new **Requirements** section (.NET 10 or later; .NET 8/9 users stay on 1.x) and drops the "(.NET 10+)" qualifier on the OpenApi heading. `docs/getting-started.md` loses its ".NET 10 and later" qualifier too. The OpenAPI proposal is a design record, so I left its §3/§4 tables alone and added a note that they describe 1.x. The AGENTS.md Layout table drops its Target column and now says that everything targets net10.0. Breaking: consumers on .NET 8 or .NET 9 can't take 2.x, including `PTrampert.SimplePatch.Swashbuckle`, which today gives them full OpenAPI support. ## Alternatives rejected - **Multi-target `net8.0;net10.0`.** This would keep .NET 8/9 consumers on new releases, but it doubles the build and test matrix for a runtime that is weeks from end of support. It also keeps the OpenApi package an asymmetric exception. The issue's goal is one TFM. - **Keep the System.Text.Json package at 10.x.** On net10.0 it is redundant with the shared framework and only adds a dependency to the nuspec. - **Suppress CA2264.** The flagged call was dead code, so removing it is cleaner than suppressing the warning. ## Open question for the maintainer The issue asks whether the net8.0 line gets a maintenance branch (for example `release/1.x`) for security fixes until .NET 8 reaches end of support. This PR doesn't create one. That's your call. ## Test results `dotnet build` gave 0 errors and 21 warnings, the same unique warning set as `release/2.0` (14 distinct warnings, compared before and after with a clean `--no-incremental` build). `dotnet test`, all on net10.0: - PTrampert.SimplePatch.Test: 129 passed, 0 failed - PTrampert.SimplePatch.Swashbuckle.Test: 18 passed, 0 failed - PTrampert.SimplePatch.OpenApi.Test: 12 passed, 0 failed Closes #76 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…make PatchClassBuilder static (#141) ## Cause #133 made `PatchClassBuilder` a facade over the internal `RoslynPatchClassBuilder`, and #95 added `UseExperimentalDynamicClassBuilder`, which the facade's `GetPatchClassFor` read on every call. Both kept `PatchClassBuilder.Instance` typed as `PatchClassBuilder`, because changing a property's type breaks binary compatibility. This is the 2.0 change that #135 deferred. Once `Instance` hands out the selected internal builder, nothing hands out a `PatchClassBuilder` any more. Its instance surface (the obsolete constructor, instance `GetPatchClassFor`, and its `IPatchClassBuilder` implementation) only forwards to `Instance` and is dead weight (#143). The two changes are one PR because a static class can't be a property type, so #143 can't compile without #135. ## Fix **Retype `Instance` (#135)** - `public static IPatchClassBuilder Instance` returns the selected builder itself: `EmitPatchClassBuilder.Instance` when the flag is on, otherwise `RoslynPatchClassBuilder.Instance`. Both internal builders already had static `Instance` singletons. - `Instance` is a computed property (`=>`), not an initialised one, so it honours the flag at read time. The flag is a settable static, and the tests flip it back and forth. - Call sites (`PatchJsonConverterFactory`, the Swashbuckle filter, the OpenAPI transformer) already call `PatchClassBuilder.Instance.GetPatchClassFor(...)` on each use, so they compile and behave unchanged against the new type. None of them caches the builder. **Make `PatchClassBuilder` static (#143)** - `public static class PatchClassBuilder` now holds only `Instance` and `UseExperimentalDynamicClassBuilder`. - The constructor, instance `GetPatchClassFor` and the `IPatchClassBuilder` implementation are removed. - The XML docs worth keeping moved. The description of the generated class (its properties, its `Patch` method, sealed and public, the `.Optionals` namespace) is now in the class remarks. The `NotSupportedException` conditions are now in `Instance`'s remarks. `IPatchClassBuilder.GetPatchClassFor` keeps its builder-neutral contract. `RoslynPatchClassBuilder.GetPatchClassFor` had `<inheritdoc cref="PatchClassBuilder.GetPatchClassFor"/>` and now has its own summary and exception docs. - `RoslynPatchClassBuilderTest.GetPatchClassFor_SharesGeneratedTypesAcrossBuilders` constructed `PatchClassBuilder` twice. It is now `GetPatchClassFor_CachesTheGeneratedType`, which calls `RoslynPatchClassBuilder.Instance` twice and still checks that `PatchClassBuilder.Instance` agrees with it while the flag is off. The internal builders have private constructors, so a second instance can't be constructed. **Docs:** `README.md` and `docs/getting-started.md` note that `Instance` returns the selected builder, so you should read it where you use it and not keep it. `AGENTS.md` describes the static class. **Breaking:** - Binaries compiled against `PatchClassBuilder PatchClassBuilder.Instance { get; }` fail with `MissingMethodException`. - `new PatchClassBuilder()` (obsolete since 1.x) and instance `GetPatchClassFor` are gone. - `PatchClassBuilder` no longer implements `IPatchClassBuilder`, and can't be used as a variable, parameter or generic argument type. ## Coordination with sibling PRs into `release/2.0` - **#139 (#75) makes the constructor internal.** This PR deletes the constructor, which supersedes that change. When the two meet, resolve the conflict by deleting the constructor. - **#142 (#126)** makes Emit the only runtime builder and removes the flag. Once it lands, `Instance` collapses to `EmitPatchClassBuilder.Instance`. - **#140 (#76)** changes TFMs. They are unchanged here. ## Alternatives rejected - **Initialise `Instance` once (`{ get; } = ...`).** This would freeze whatever builder the flag selected at type initialisation and ignore later changes to the flag. - **Keep returning the facade, typed as the interface.** This would avoid the read-time caveat, but it keeps the per-call forwarding that #135 asks to remove. It also leaves `Instance` as the one thing that hands out a `PatchClassBuilder`. - **Keep `PatchClassBuilder` non-static, with the constructor internal (#75 alone).** Nothing would construct it, so its instance members would be unreachable dead code. - **Ship #143 as a separate PR stacked on this one.** The maintainer chose to fold it in, because #143 can't compile without the retype. ## Tests New tests in `UseExperimentalDynamicClassBuilderTest`: - `Instance_IsTheRoslynBuilderWhenOff` - `Instance_IsTheEmitBuilderWhenOn` - `Instance_FollowsTheFlagWhenItIsTurnedBackOff` Against the old `PatchClassBuilder.cs`, the NUnit analyzer rejects all three with NUnit2020 (a `SameAs` that always fails because the types are mutually exclusive), so they fail before the fix. CI's build pipeline doesn't run on PRs that target a branch other than `main`, so these results are local only: - `dotnet build`: 0 errors, 21 warnings, the same count as the base commit. - `dotnet test`: all passed. Core 132/132, Swashbuckle 18/18, OpenApi 12/12. The net8.0 test hosts ran with `DOTNET_ROLL_FORWARD=Major`, because only the .NET 10 runtime is installed locally. Closes #135 Closes #143 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
) Closes #126 ## Cause Since #130 and #136 the library has had two builders for the same patch class. One is the original builder, which generates C# with CodeDom and compiles it with Roslyn. The other is a Reflection.Emit builder, behind the experimental `PatchClassBuilder.UseExperimentalDynamicClassBuilder` flag that shipped in v1.5.0. The process-wide switch adds runtime complexity, and the Roslyn path has limits that the Emit path doesn't have. It can't patch internal write models, and it breaks under single-file publishing because it builds metadata references from `Assembly.Location`. ## Fix - `PatchClassBuilder.GetPatchClassFor` now always delegates to `EmitPatchClassBuilder.Instance`. Emit is the only builder used at runtime. - `PatchClassBuilder.UseExperimentalDynamicClassBuilder` is removed outright, and so are its tests. Its `GetPatchClassFor` `<exception>` docs now describe when Emit throws. - **`RoslynPatchClassBuilder` is kept as internal, unused, tested code, pending #144.** That issue decides whether it becomes a compile-time source generator. This departs from #126's scope, which asked for the Roslyn path to be deleted, because the maintainer wants it kept until #144 is decided. - The class remarks say it isn't used at runtime and is kept pending #144. - Its "not public" error no longer mentions the removed flag. - **The `Microsoft.CodeAnalysis.CSharp` and `System.CodeDom` package references remain, so consumers still get them transitively.** The `.csproj` has a comment explaining why. - Tests: - `PatchClassBuilderTest` is still parameterized over both builders through `PatchClassBuilders`, calling the internal builders directly, so the two can't drift apart. - `RoslynPatchClassBuilderTest` is kept. Its shared-cache test, which asserted that `PatchClassBuilder` hands out Roslyn types, is now a plain Roslyn cache test. - New `PatchClassBuilderDelegationTest` covers the public entry point: - `PatchClassBuilder` (including the obsolete constructor) hands out the Emit builder's types. - An internal model round-trips through `IPatchObject<T>` with validation. - A private nested type throws `NotSupportedException`. - `EmitPatchClassBuilderTest` gains a concurrent-first-use test. - The Swashbuckle and OpenApi `ExperimentalDynamicClassBuilderTest` files are renamed to `InternalWriteModelTest`, without the flag, `TearDown` or `[NonParallelizable]`. - Docs: - README: "Non-public write models (experimental)" is now "Internal write models", and there is a new "Deployment" section. - `docs/getting-started.md` matches the README. - `AGENTS.md` "How it works" describes Emit as the runtime builder, and the Roslyn builder as unused, tested code pending #144. ### Single-file publishing (investigated, as #126 asks) I published `PTrampert.SimplePatch.Sample` with `-r linux-x64 --self-contained false -p:PublishSingleFile=true` and sent a PATCH to `/People/1`: - **`release/2.0` (Roslyn):** HTTP 500. `CS0518: Predefined type 'System.Object' is not defined or imported` and `CS0234` for `IPatchObject<>`. Roslyn gets no metadata references because the bundled assemblies have no `Location`. - **This branch (Emit):** HTTP 200 with the patched person. I re-checked this after restoring the Roslyn builder. The Roslyn assemblies are still bundled, but nothing on the runtime path calls into them. The README's new Deployment section says single-file publishing is supported, and that Native AOT and trimming aren't. **I didn't add an automated single-file test or sample.** It would need a publish-and-run step in CI, which is a larger change than this PR should carry. ## Observable behaviour changes for consumers - `PatchClassBuilder.UseExperimentalDynamicClassBuilder` is gone. Code that sets it no longer compiles, and existing binaries fail with `MissingMethodException`. - Generated types change: - They are named `<Namespace>.Optionals.<Type>_Optionals`, without the random suffix. - They live in a dynamic assembly named `PTrampert.SimplePatch.Emitted`, so `Assembly.IsDynamic` is true and there is no `Location`. - Internal write models now work when their assembly declares `[InternalsVisibleTo("PTrampert.SimplePatch.Emitted")]`. Without that grant, they still throw `NotSupportedException`, and the message names the grant and the assembly that needs it. - Private and protected nested types still throw `NotSupportedException`. - If generation fails, the error surfaces from Reflection.Emit (`TypeLoadException` / `InvalidProgramException`), not as Roslyn diagnostics. - Single-file published apps now work. - **Unchanged:** `Microsoft.CodeAnalysis.*` and `System.CodeDom` still arrive transitively, until #144 is decided. ## Alternatives rejected - **Delete the Roslyn builder and its dependencies now, as #126 originally scoped.** I did this in this PR's first commit, then reverted it, because the maintainer wants the code kept until #144 decides whether it becomes a source generator. - **Keep `UseExperimentalDynamicClassBuilder` as an `[Obsolete]` no-op.** #126 rules this out. The removal ships in the same major as the other breaking changes, and a compile error is the clearest signal. - **Keep the flag so the Roslyn builder stays selectable.** That would keep the process-wide switch and the unsupported single-file path reachable. The dead code is exercised by tests instead. ## Coordination with parallel 2.0 PRs - **#135** (retype `PatchClassBuilder.Instance` to `IPatchClassBuilder`): this PR leaves `Instance` and its type alone. When both land, #135's `Instance` getter will need to resolve to `EmitPatchClassBuilder.Instance`. - **#75** (constructor visibility): this PR doesn't touch the obsolete public constructor. `PatchClassBuilderDelegationTest` calls it under `#pragma warning disable CS0618`, and will keep compiling if the constructor becomes internal, because the test project has `InternalsVisibleTo`. ## Test results - `dotnet build`: 0 errors, 21 warnings, the same count as `release/2.0`. - `dotnet test`: - `PTrampert.SimplePatch.Test` (net8.0): 128 passed. That is 129 on `release/2.0`, minus 5 flag tests, plus 4 new ones. - `PTrampert.SimplePatch.Swashbuckle.Test` (net8.0): 18 passed. - `PTrampert.SimplePatch.OpenApi.Test` (net10.0): 12 passed. - Only the .NET 10 runtime is installed locally, so I ran the net8.0 test hosts with `DOTNET_ROLL_FORWARD=Major`. - **CI won't run these tests on this PR.** The main pipeline only runs on PRs to `main`, so PRs into `release/2.0` get only the title check. The net8.0 suites will first run in CI when `release/2.0` is merged to `main`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
✅ PR Title Formatted CorrectlyThe title of this PR has been updated to match the correct format. Thank you! |
This was referenced Oct 4, 2026
PaulTrampert
added a commit
that referenced
this pull request
Oct 4, 2026
…152) Closes #151 ## Cause The 2.0 release PR (#147) had a format worth repeating for every staged `release/<major>` branch, but nothing recorded it. ## Fix The release-branch bullet in `AGENTS.md` now gives the release PR's title, `(MAJOR): Release <major>`, and the sections of its description, modelled on #147: - the **Rebase and merge** note; - the included PRs and the issues they close; - the breaking changes; - the branch state; - anything postponed; - the tests. It also records two things learnt from #147: - Merges into a release branch don't close issues, so the release PR has to. - GitHub links only the first issue number after a closing keyword, so each issue needs its own keyword. ## Rejected alternatives - **A `.github/PULL_REQUEST_TEMPLATE` for release PRs:** GitHub applies one template to every PR unless it's chosen with a query parameter, and the release PR is rare. A note in `AGENTS.md` is where agents opening it will look. ## Tests Documentation only. No build or test changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
PaulTrampert
pushed a commit
to PaulTrampert/PacmanManager
that referenced
this pull request
Oct 6, 2026
Updated [PTrampert.SimplePatch](https://github.com/PaulTrampert/PTrampert.SimplePatch) from 1.3.6 to 2.0.3. <details> <summary>Release notes</summary> _Sourced from [PTrampert.SimplePatch's releases](https://github.com/PaulTrampert/PTrampert.SimplePatch/releases)._ ## 2.0.3 ## Changes - (PATCH): Drop the Roslyn patch class builder's own cache ([#154](PaulTrampert/PTrampert.SimplePatch#154)) ## 2.0.2 ## Changes - (PATCH): Route PatchClassBuilder.Instance through CachingPatchClassBuilder ([#155](PaulTrampert/PTrampert.SimplePatch#155)) ## 2.0.1 ## Changes - (PATCH): Add an internal CachingPatchClassBuilder decorator ([#153](PaulTrampert/PTrampert.SimplePatch#153)) - (PATCH): Document the release PR format for staged release branches ([#152](PaulTrampert/PTrampert.SimplePatch#152)) ## 2.0.0 ## Changes - (MAJOR): Release 2.0 ([#147](PaulTrampert/PTrampert.SimplePatch#147)) - (PATCH): Build PRs into release/** branches and document the release flow ([#146](PaulTrampert/PTrampert.SimplePatch#146)) ## 1.5.0 ## What's Changed * (MINOR): Add PatchClassBuilder.UseExperimentalDynamicClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#136 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.4.0...v1.5.0 ## 1.4.0 ## What's Changed * (MINOR): Add IPatchClassBuilder, with PatchClassBuilder delegating to an internal RoslynPatchClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#133 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.8...v1.4.0 ## 1.3.8 ## What's Changed * (PATCH): Add an internal Reflection.Emit patch class builder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#130 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.7...v1.3.8 ## 1.3.7 ## What's Changed * (PATCH): Bump the csharp-deps group with 6 updates by @dependabot[bot] in PaulTrampert/PTrampert.SimplePatch#81 * (PATCH): Add AGENTS.md, CLAUDE.md symlink and /implement-unblocked by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#125 * (PATCH): Extract the patch class model from PatchClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#129 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.6...v1.3.7 Commits viewable in [compare view](PaulTrampert/PTrampert.SimplePatch@v1.3.6...v2.0.3). </details> Updated [PTrampert.SimplePatch.Swashbuckle](https://github.com/PaulTrampert/PTrampert.SimplePatch) from 1.3.6 to 2.0.3. <details> <summary>Release notes</summary> _Sourced from [PTrampert.SimplePatch.Swashbuckle's releases](https://github.com/PaulTrampert/PTrampert.SimplePatch/releases)._ ## 2.0.3 ## Changes - (PATCH): Drop the Roslyn patch class builder's own cache ([#154](PaulTrampert/PTrampert.SimplePatch#154)) ## 2.0.2 ## Changes - (PATCH): Route PatchClassBuilder.Instance through CachingPatchClassBuilder ([#155](PaulTrampert/PTrampert.SimplePatch#155)) ## 2.0.1 ## Changes - (PATCH): Add an internal CachingPatchClassBuilder decorator ([#153](PaulTrampert/PTrampert.SimplePatch#153)) - (PATCH): Document the release PR format for staged release branches ([#152](PaulTrampert/PTrampert.SimplePatch#152)) ## 2.0.0 ## Changes - (MAJOR): Release 2.0 ([#147](PaulTrampert/PTrampert.SimplePatch#147)) - (PATCH): Build PRs into release/** branches and document the release flow ([#146](PaulTrampert/PTrampert.SimplePatch#146)) ## 1.5.0 ## What's Changed * (MINOR): Add PatchClassBuilder.UseExperimentalDynamicClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#136 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.4.0...v1.5.0 ## 1.4.0 ## What's Changed * (MINOR): Add IPatchClassBuilder, with PatchClassBuilder delegating to an internal RoslynPatchClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#133 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.8...v1.4.0 ## 1.3.8 ## What's Changed * (PATCH): Add an internal Reflection.Emit patch class builder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#130 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.7...v1.3.8 ## 1.3.7 ## What's Changed * (PATCH): Bump the csharp-deps group with 6 updates by @dependabot[bot] in PaulTrampert/PTrampert.SimplePatch#81 * (PATCH): Add AGENTS.md, CLAUDE.md symlink and /implement-unblocked by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#125 * (PATCH): Extract the patch class model from PatchClassBuilder by @PaulTrampert in PaulTrampert/PTrampert.SimplePatch#129 **Full Changelog**: PaulTrampert/PTrampert.SimplePatch@v1.3.6...v1.3.7 Commits viewable in [compare view](PaulTrampert/PTrampert.SimplePatch@v1.3.6...v2.0.3). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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.
Ships the 2.0 major release from
release/2.0.Important
Merge with Rebase and merge, never squash. Release notes are built from the commit subjects since
v1.5.0, so a rebase merge gives each PR below its own line. A squash would collapse them into one.Included
PatchClassBuilder's constructor internal (closes Make PatchClassBuilder's constructor internal #75)PatchClassBuilder.InstancetoIPatchClassBuilderand makePatchClassBuilderstatic (closes Retype PatchClassBuilder.Instance to IPatchClassBuilder #135, closes Make PatchClassBuilder a static class #143)Breaking changes
PatchClassBuilderis a static class.PatchClassBuilder.Instanceis typedIPatchClassBuilder, and the constructor is gone.UseExperimentalDynamicClassBuilderis removed. Reflection.Emit is the only runtime builder. Internal write models are supported when their assembly declares[InternalsVisibleTo("PTrampert.SimplePatch.Emitted")]. The Roslyn builder is kept but unused at runtime, pending Generate patch classes at compile time with a source generator #144.Branch state
release/2.0has no commits behindmainand no merge commits. All four commits are(MAJOR), so the version calculation produces 2.0.0.Postponed until after 2.0: #96 and #102, with open questions noted on each.
Tests
Each included PR passed the CI build and tests against
release/2.0. This PR's build runs the full suite on the combined branch.🤖 Generated with Claude Code