docs: split the README into topic pages and move the changelog out - #27
Merged
Conversation
The root README was 584 lines, 350 of them the PostgreSQL section alone, so the landing page was mostly a provider manual for one of three packages. Provider reference moves to docs/, split along the seam that already exists: PostgreSQL indexes go through the differ plus the custom generator, while temporal and exclusion constraints are rendered as design-time SqlOperations. The changelog moves to CHANGELOG.md at the root and one per package. It was the only part of the README that grew unboundedly, and it had two consumers pinned to its old home: release.yml's awk and PackagingConventionTests' baseline lookup. Both now read CHANGELOG.md, and ChangelogConsistencyTests asserts the "## x.y.z" heading style rather than merely parsing it — release.yml matches that heading literally, so a section demoted to ### would still read as documented while the release job published a blank release. Two guards for what the split newly depends on. DocumentationLinkTests: relative links resolve to real files, #anchors to real headings, and the packed READMEs under src/ carry no relative links at all — nuget.org renders PackageReadmeFile with no base URL, so a relative link is dead exactly where most consumers arrive, with nothing at pack time to notice. DocumentationApiTests: every method the docs name exists, and no provider page names another provider's exclusive API. Package validation already fails the pack on a removed public member, so what this adds is the rename fixed in source and forgotten in prose. Changelogs are out of scope — an entry saying 5.0.0 shipped HasExclusionConstraint stays true after a rename, and asserting over them would turn every rename into pressure to rewrite history. That last test went in green, and the vacuity check is why it is worth anything: emptying its allowlist showed AddDbContext missing from the result, because \b[A-Z][A-Za-z0-9]*\( never matches a generic invocation. HasTemporalForeignKey <Subscription>( is how every generic API in these docs is written, so the whole generic surface was unchecked while the test reported green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.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.
The root
README.mdwas 584 lines, 350 of them the PostgreSQL section alone — the landing page was mostly a provider manual for one of three packages. This splits it, following the arrangement in the CodoMetis.ValueRanges repository.The split
README.mddocs/postgresql-indexes.mddocs/postgresql-constraints.mddocs/sqlserver.mdCHANGELOG.md+ 3 package changelogsPostgreSQL splits in two rather than into one page because that is the seam that already exists: indexes go through the differ plus the custom generator, while temporal and exclusion constraints are rendered as design-time
SqlOperations.No
docs/architecture.md— that prose lives inCLAUDE.mdandClaudeMdConsistencyTestsguards it. A second copy is drift with no guard.The changelog move
It was the only part of the README that grew unboundedly, and it had two consumers pinned to its old home:
release.yml's awk extraction andPackagingConventionTests' baseline lookup. Both now readCHANGELOG.md.ChangelogConsistencyTestsnow asserts the## x.y.zheading style rather than merely parsing it.release.ymlmatches that heading literally to build the release notes, so a section demoted to###would still read as documented while the release job published a blank release. Verified locally: the workflow's actual awk extracts 6 lines of notes for 5.0.3 from the new file.Two new guards
The split introduces a dependency on links, which is the one defect that renders perfectly.
DocumentationLinkTests— relative links resolve to real files,#anchorsto real headings, and the packed READMEs undersrc/carry no relative links at all. nuget.org rendersPackageReadmeFilewith no base URL, so a relative link is dead exactly where most consumers arrive, and nothing at pack time notices.DocumentationApiTests— every method the docs name exists in the public surface (EF Core/Npgsql/BCL calls are an explicit allowlist), and no provider page names another provider's exclusive API. Package validation already fails the pack on a removed public member, so what this adds is the rename fixed in source and forgotten in prose, and the name simply typed wrong.Changelogs are deliberately out of scope for the API test: an entry saying 5.0.0 shipped
HasExclusionConstraintstays true after a later rename, and asserting over them would turn every rename into pressure to rewrite history.Verification
DocumentationApiTestswent in green, and the vacuity check is why it is worth anything. Emptying its allowlist — which must then report exactly the external calls — showedAddDbContextmissing from the result, because\b[A-Z][A-Za-z0-9]*\(never matches a generic invocation.HasTemporalForeignKey<Subscription>(is how every generic API in these docs is written, so the entire generic surface was unchecked while the test reported green. The regex now takes an optional type-argument list.Every guard was then broken deliberately and caught by the right test:
docs/sqlserver.mddocs/links into## 5.0.3to##### 5.0.3copy in the root READMECHANGELOG.mdHasExclusionConstrainttypo'dHasTemporalForeignKey<Subscription>typo'dHasExpressionIndexon the SQL Server pageHasExclusionConstraintin the core READMEDeleting a package changelog initially crashed four unrelated tests with
FileNotFoundExceptionand buried the actionable message, so both classes now skip a missing changelog and let the dedicated test own it.Unit suite: 202 passed.
dotnet packstill puts a README in all three nupkgs (no NU5019), with the changelogs correctly not packed. Integration not run locally — needs Docker.🤖 Generated with Claude Code