Skip to content

Release: v1.0 preview — core rewrite, CI/CD, docs, and test suite overhaul#159

Merged
petesramek merged 2096 commits intopreview/1.0from
develop/1.0
Apr 3, 2026
Merged

Release: v1.0 preview — core rewrite, CI/CD, docs, and test suite overhaul#159
petesramek merged 2096 commits intopreview/1.0from
develop/1.0

Conversation

@petesramek
Copy link
Copy Markdown
Owner

@petesramek petesramek commented Apr 3, 2026

Overview

Promotes develop/1.0 to preview/1.0 in preparation for the 1.0 preview release. This batch brings in a full rewrite of the library's core, docs, CI/CD pipeline, and test suite accumulated since the last preview snapshot.

What's included

🏗️ CI/CD & Workflows

📚 Documentation

  • New /docs developer guides: local development, testing conventions, benchmarks, composite actions catalogue, CI workflow reference, branch strategy, versioning pipeline, API doc generation, extensibility guide (docs: add developer documentation under /docs #155)
  • Updated API reference YAMLs for version 1.0
  • Fixed grammar, TOC typo, and outdated API references in docs
  • Updated CONTRIBUTING.md with links to all new docs articles
  • Flushed PublicAPI.Unshipped.txt

🔧 Source (library)

  • Refactored internal structure: CoordinateDelta, CoordinateVariance, Pow10, Defaults, ExceptionGuard, logging helpers
  • Updated PolylineEncoder, PolylineDecoder, PolylineEncoding, PolylineEncodingOptions, PolylineEncodingOptionsBuilder
  • Public API cleanup; .editorconfig updated (primary constructors disabled)

✅ Tests

  • Reorganized test files into proper namespace folders (Abstraction/, Extensions/, Internal/)
  • Added new test classes for CoordinateDelta, CoordinateVariance, Pow10, ExceptionGuard, LogDebugExtensions, LogWarningExtensions, InvalidPolylineException, PolylineEncodingOptionsBuilder, and encoder/decoder extensions
  • Removed stale/duplicate test files

🛠️ Build & Config

  • Cleaned up PolylineAlgorithm.slnx, Directory.Build.props, benchmarks config
  • Updated .gitignore to exclude dynamically generated api-reference/_docs/
  • Misc cleanup (removed junk files, updated AGENTS.md)

petesramek and others added 30 commits August 23, 2025 14:41
Promote develop/1.0 to preview/1.0

---------

Co-authored-by: Pete Sramek <me@petesramek.com>
Co-authored-by: Pete Sramek <petr.sramek@dropoutcoder.com>
Bumps
[actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact)
from 3 to 4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/upload-pages-artifact/releases">actions/upload-pages-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v4.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Potentially breaking change: hidden files (specifically dotfiles)
will not be included in the artifact by <a
href="https://github.com/tsusdere"><code>@​tsusdere</code></a> in <a
href="https://redirect.github.com/actions/upload-pages-artifact/pull/102">actions/upload-pages-artifact#102</a>
If you need to include dotfiles in your artifact: instead of using this
action, create your own artifact according to these requirements <a
href="https://github.com/actions/upload-pages-artifact?tab=readme-ov-file#artifact-validation">https://github.com/actions/upload-pages-artifact?tab=readme-ov-file#artifact-validation</a></li>
<li>Pin <code>actions/upload-artifact</code> to SHA by <a
href="https://github.com/heavymachinery"><code>@​heavymachinery</code></a>
in <a
href="https://redirect.github.com/actions/upload-pages-artifact/pull/127">actions/upload-pages-artifact#127</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/upload-pages-artifact/compare/v3.0.1...v4.0.0">https://github.com/actions/upload-pages-artifact/compare/v3.0.1...v4.0.0</a></p>
<h2>v3.0.1</h2>
<h1>Changelog</h1>
<ul>
<li>Group tar's output to prevent it from messing up action logs <a
href="https://github.com/SilverRainZ"><code>@​SilverRainZ</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/94">#94</a>)</li>
<li>Update README.md <a
href="https://github.com/uiolee"><code>@​uiolee</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/88">#88</a>)</li>
<li>Bump the non-breaking-changes group with 1 update <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/92">#92</a>)</li>
<li>Update Dependabot config to group non-breaking changes <a
href="https://github.com/JamesMGreene"><code>@​JamesMGreene</code></a>
(<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/91">#91</a>)</li>
<li>Bump actions/checkout from 3 to 4 <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> (<a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/76">#76</a>)</li>
</ul>
<p>See details of <a
href="https://github.com/actions/upload-pages-artifact/compare/v3.0.0...v3.0.1">all
code changes</a> since previous release.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/7b1f4a764d45c48632c6b24a0339c27f5614fb0b"><code>7b1f4a7</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/127">#127</a>
from heavymachinery/pin-sha</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/4cc19c7d3f3e6c87c68366501382a03c8b1ba6db"><code>4cc19c7</code></a>
Pin <code>actions/upload-artifact</code> to SHA</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/2d163be3ddce01512f3eea7ac5b7023b5d643ce1"><code>2d163be</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/107">#107</a>
from KittyChiu/main</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/c70484322b1c476728dcd37fac23c4dea2a0c51a"><code>c704843</code></a>
fix: linted README</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/9605915f1d2fc79418cdce4d5fbe80511c457655"><code>9605915</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/106">#106</a>
from KittyChiu/kittychiu/update-readme-1</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/e59cdfe6d6b061aab8f0619e759cded914f3ab03"><code>e59cdfe</code></a>
Update README.md</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/a2d67043267d885050434d297d3dd3a3a14fd899"><code>a2d6704</code></a>
doc: updated usage section in readme</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/984864e7b70fb5cb764344dc9c4b5c087662ef50"><code>984864e</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/105">#105</a>
from actions/Jcambass-patch-1</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/45dc78884ca148c05eddcd8ac0a804d3365e9014"><code>45dc788</code></a>
Add workflow file for publishing releases to immutable action
package</li>
<li><a
href="https://github.com/actions/upload-pages-artifact/commit/efaad07812d4b9ad2e8667cd46426fdfb7c22e22"><code>efaad07</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-pages-artifact/issues/102">#102</a>
from actions/hidden-files</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/upload-pages-artifact/compare/v3...v4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-pages-artifact&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
petesramek and others added 25 commits March 29, 2026 11:48
XML comments were inconsistent: abbreviated inline param/exception docs
mixed with full expanded blocks, missing `<typeparam>` on generic types,
empty `<exception>` tags, broken `<see cref>` and `<paramref>`
references, a missing copyright header, and a typo.

## Changes

- **`AbstractPolylineDecoder`** — Added `<typeparam>` docs; expanded the
abbreviated `Decode(polyline, CancellationToken)` overload to full form
including `OperationCanceledException`; added `<param>`/`<exception>` to
`ValidateFormat`; added full docs to abstract `GetReadOnlyMemory` and
`CreateCoordinate`; simplified private helper summaries to single
sentences
- **`AbstractPolylineEncoder`** — Added `<typeparam>` docs; removed
incorrect `<exception cref="InternalBufferOverflowException"/>` (wrong
type); added description to empty `<exception
cref="InvalidOperationException"/>`
- **`PolylineEncodingOptionsBuilder`** — Standardized all three builder
`<returns>` to `"The current PolylineEncodingOptionsBuilder instance for
method chaining."`; simplified `WithPrecision` summary
- **`PolylineEncoding`** — Removed stale `<paramref name="rounding"/>`
(no such parameter on `Normalize`); fixed `<see cref="GetCharCount"/>` →
`<see cref="GetRequiredBufferSize"/>`
- **`PolylineEncoderExtensions`** — Added missing copyright header;
added `<typeparam>` docs; updated method summaries/returns to reference
`TCoordinate`/`TPolyline` rather than concrete types; added
`<exception>` for null `coordinates`
- **`PolylineDecoderExtensions`** — Added `<exception
cref="ArgumentNullException">` for null `polyline` on `string` and
`char[]` overloads
- **`CoordinateDelta`** — Removed blank lines between closing doc tags
and method declarations; moved second `<summary>` sentence to
`<remarks>`
- **`Defaults`** — Added missing `<summary>` on `Coordinate` nested
class; fixed typo `"vakues"` → `"values"`; added missing trailing period

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
- [x] Fix stale XML comments and restore PolylineEncoderBenchmark
(previous commit)
- [x] Add `AbstractPolylineEncoderTests.cs` — constructor paths, Encode
valid/empty/cancelled, heap-alloc path, Options property
- [x] Add `PolylineEncoderExtensionsTests.cs` — List and Array overloads
(null encoder, null coordinates, valid)
- [x] Expand `AbstractPolylineDecoderTests.cs` — valid decode, options
constructor null check, Options property, custom options, cancellation
- [x] Add `InvalidPolylineExceptionTests.cs` — default constructor and
message+innerException constructor
- [x] All 214 tests pass, build clean, CodeQL: 0 alerts

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
- [x] Fix broken default-version fallback in extract-version composite
action

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
Pull request created by AI Agent

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
…154)

The release-to-main promotion was manual and error-prone, with no way to
determine which `release/**` branch is "latest" without scanning all of
them. Additionally, there was no automated way to start a new
major/minor version cycle or enforce push restrictions on protected
branches.

## merge-to-main (automatic)
- Added `merge-to-main` job to `release.yml`, runs only on `release/**`
after GitHub Release is created
- Finds the highest `release/**` branch via `git ls-remote | sort -V |
tail -1`
- Normalizes both versions to `M.m` before comparing — only the latest
branch triggers a PR to `main`
- Skips silently with a step summary note if not the latest (e.g. hotfix
on an older branch)

## bump-version workflow
- New `workflow_dispatch` workflow (`bump-type: minor | major`), must
run from `main`
- Auto-detects current version from highest `release/**` branch;
calculates next `M.m`
- Creates `develop/M.m` from `main`
- **Major bump**: resets all `PublicAPI.Shipped.txt` and
`PublicAPI.Unshipped.txt` to `#nullable enable` — fresh API surface for
breaking-change cycles
- **Minor bump**: preserves API files — existing shipped API remains the
baseline

## Branch locking
- New composite actions: `branch-protection/lock` (sets PR-required + no
force-push + no deletions via GitHub API) and `branch-protection/unlock`
(removes protection)
- `promote-branch.yml` now locks newly created `preview/**` and
`release/**` branches immediately after the initial push
- Added `administration: write` permission to `promote-branch.yml`

## promote-branch source-branch enforcement
- Previously, any `develop/**` or `support/**` branch could be promoted
directly to `release/**`
- Now validates per promotion type: `preview` ←
`develop/**`/`support/**`; `release` ← `preview/**` only

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
Adds a `/docs` folder with developer-focused guides covering the areas
of the project that lack written explanation: composite actions, testing
conventions, benchmarks, CI workflows, branching/versioning pipeline,
API doc generation, and extensibility.

## New files

- **`docs/README.md`** — index linking all sections
- **`docs/local-development.md`** — build/test/format commands with
correct config caveats (e.g. always use Release for tests)
- **`docs/testing.md`** — project layout, MSTest conventions,
data-driven tests, abstract-class testing pattern
- **`docs/benchmarks.md`** — BenchmarkDotNet structure, writing
benchmarks, full CLI flag reference, CI trigger variables
- **`docs/composite-actions.md`** — catalogue of all 14 composite
actions with inputs, outputs, usage context, and a template for adding
new ones
- **`docs/workflows.md`** — all 6 workflows with job-dependency tables,
triggers, shared env vars, and a flow diagram showing how they chain
- **`docs/branch-strategy.md`** — branch types, lifecycle diagram,
protection rules, environment mapping
- **`docs/versioning.md`** — branch naming → two-step `extract-version`
/ `format-version` pipeline with all output formulas and worked examples
- **`docs/api-documentation.md`** — two DocFX manifests explained,
publishing flow, how to add a new version to the site, local preview
- **`docs/extensibility.md`** — how to subclass
`AbstractPolylineEncoder` / `AbstractPolylineDecoder` for custom
coordinate/polyline types, with examples drawn from existing benchmark
code

## Updated

- **`CONTRIBUTING.md`** — new *Developer Documentation* section with
links to all `/docs` articles

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
…elease workflows (#156)

- [x] Update `docs/branch-strategy.md`: change back-merge step from
optional to mandatory, update descriptions of `main` and `release/X.Y`
accordingly

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
…te (#157)

- [x] Add docs-versioning template (layout/_master.tmpl +
version-switcher.js)
- [x] Add versions.json manifest (latest: null, versions: [])
- [x] Add `api-reference/_docs/` to `.gitignore` and untrack it from git
- [x] `api-reference.json` — version content sections removed from repo
(populated dynamically by CI)
- [x] `toc.yml` — Reference dropdown removed from repo (populated
dynamically by CI)
- [x] Fix versioning job output name bug (`friendly-version` →
`version`)
- [x] Add `dotnet-sdk-version: '10.x'` env to
`publish-documentation.yml`
- [x] Rewrite `generate-docs` job: regenerate metadata, patch
api-reference.json/versions.json/toc.yml, inline docfx build
- [x] Fix `docfx-build` action: remove internal checkout, fix
dotnet-version input reference

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…#158)

`administration` is not a valid scope for the GitHub Actions
`permissions` key, causing a workflow parse failure before any jobs run.

## Change

- Removed `administration: write` from the top-level `permissions` block
in `.github/workflows/release.yml`

The branch-protection lock action already passes `github.token` directly
to `gh api`, so no additional workflow-level permission entry is needed
or valid here.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Pete Sramek <2333452+petesramek@users.noreply.github.com>
Co-authored-by: Pete Sramek <petr.sramek@dropoutcoder.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@petesramek petesramek changed the title Develop/1.0 Release: v1.0 preview — core rewrite, CI/CD, docs, and test suite overhaul Apr 3, 2026
@petesramek petesramek merged commit f252fa7 into preview/1.0 Apr 3, 2026
8 checks passed
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.

2 participants