Skip to content

(MAJOR): Release 2.0 - #147

Merged
PaulTrampert merged 4 commits into
mainfrom
release/2.0
Oct 4, 2026
Merged

PaulTrampert merged 4 commits into
mainfrom
release/2.0

Conversation

@PaulTrampert

@PaulTrampert PaulTrampert commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

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

Breaking changes

  • .NET 10 or later only. .NET 8 and 9 consumers stay on 1.x.
  • PatchClassBuilder is a static class. PatchClassBuilder.Instance is typed IPatchClassBuilder, and the constructor is gone.
  • UseExperimentalDynamicClassBuilder is 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.0 has no commits behind main and 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

PaulTrampert and others added 4 commits October 4, 2026 17:31
**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>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown

✅ PR Title Formatted Correctly

The title of this PR has been updated to match the correct format. Thank you!

@PaulTrampert
PaulTrampert merged commit ae1f858 into main Oct 4, 2026
9 checks passed
@PaulTrampert
PaulTrampert deleted the release/2.0 branch October 4, 2026 22:10
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant