Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 16 additions & 1 deletion .github/workflows/publish-csharp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ jobs:
steps:
- uses: actions/checkout@v4

# The tag must name the version the manifest commits: these workflows publish the
# manifest's version whatever tag started them (scripts/check-release-tag.mjs).
- name: Tag matches the manifest version
env:
VERSION_INPUT: ${{ github.event.inputs.version }}
run: node scripts/check-release-tag.mjs csharp "$VERSION_INPUT"

# A final version is not published while the eject pending list has entries
# (ADR-0034 Amendment 8). A release candidate passes, which is why the `version`
# input is read first.
Expand Down Expand Up @@ -75,9 +82,17 @@ jobs:
with:
user: ${{ secrets.NUGET_USER }}

# --skip-duplicate lets a re-run finish a push that failed part way. A run that pushed
# NOTHING, because every package was already on nuget.org, is a re-run of a published
# version and fails rather than reporting green.
- name: NuGet push
run: |
set -o pipefail
dotnet nuget push "artifacts/*.nupkg" \
--api-key ${{ steps.login.outputs.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
--skip-duplicate | tee push.log
if ! grep -q "Your package was pushed" push.log; then
echo "::error::nothing was pushed: every package is already on nuget.org at this version"
exit 1
fi
5 changes: 5 additions & 0 deletions .github/workflows/publish-java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ jobs:
steps:
- uses: actions/checkout@v4

# The tag must name the version the manifest commits: these workflows publish the
# manifest's version whatever tag started them (scripts/check-release-tag.mjs).
- name: Tag matches the manifest version
run: node scripts/check-release-tag.mjs java

# A final version is not published while the eject pending list has entries
# (ADR-0034 Amendment 8). A release candidate passes.
- name: Eject release gate
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/publish-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ jobs:
steps:
- uses: actions/checkout@v4

# The tag must name the version the manifest commits: these workflows publish the
# manifest's version whatever tag started them (scripts/check-release-tag.mjs).
- name: Tag matches the manifest version
run: node scripts/check-release-tag.mjs npm

# A final version is not published while the eject pending list has entries
# (ADR-0034 Amendment 8). A release candidate passes.
- name: Eject release gate
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/publish-python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ jobs:
steps:
- uses: actions/checkout@v4

# The tag must name the version the manifest commits: these workflows publish the
# manifest's version whatever tag started them (scripts/check-release-tag.mjs).
- name: Tag matches the manifest version
run: node scripts/check-release-tag.mjs python

# A final version is not published while the eject pending list has entries
# (ADR-0034 Amendment 8). A release candidate passes.
- name: Eject release gate
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ PyPI has had no product change since `0.25.0` — nothing is broken.
- **Kotlin** — `codegen-kotlin` (KotlinPoet on JVM): entity + Exposed table + Spring controller + payload + relations + filter allowlist + validator + stored-proc + output-parser generators. `integration-tests-kotlin` runs the persistence-conformance corpus through Exposed against Testcontainers Postgres.

**Cross-port conformance corpora** (every port runs the shared corpus):
- Metamodel: `fixtures/conformance/` (395 fixtures; 29 shared corpora in total — per-corpus counts + the corpus x port matrix live in `docs/CONFORMANCE.md`). TS / C# / Java / Python all green.
- Metamodel: `fixtures/conformance/` (410 fixtures; 30 shared corpora in total — per-corpus counts + the corpus x port matrix live in `docs/CONFORMANCE.md`). TS / C# / Java / Python all green.
- Render: `fixtures/render-conformance/`. TS / C# / Java / Kotlin / Python byte-identical.
- Persistence: `fixtures/persistence-conformance/`. **Query** scenarios run on every port (TS / C# / Java / Kotlin / Python), each provisioning its test DB by executing the committed, TS-produced `canonical/schema.postgres.sql` (Postgres only — Derby dropped for the cross-port query corpus, ADR-0015; the FR-044 `report-*` scenarios also run on SQLite, MySQL and D1 where a port has the engine, see [docs/CONFORMANCE.md](docs/CONFORMANCE.md)). The **migration** scenarios are exercised by **TS only** (TS owns schema migrations). **The corpus now gates WRITES, not just reads (SP-H):** an `op: roundtrip` scenario type INSERTs through each port's runtime/ORM write codec (NOT raw SQL), reads the row back, and asserts the wire-normalized value. The `AllTypes` entity (`roundtrip-all-types.yaml`) carries one field of **every** persistable `field.*` subtype — string/int/long/double/float/decimal/boolean/date/time/timestamp(+tz)/currency/enum/uuid/object — plus an **array-of-VO** `field.object @isArray @storage:jsonb` column (`labels`, written as 2-element / empty-`[]` / single-element arrays across the three rows) — so every subtype write+read (incl. the array-of-value-object jsonb codec) round-trips through every port against Testcontainers PG. (`field.byte`/`field.short`/`field.class` were cut as non-functional registration-only stubs — the matrix tracks only genuinely-supported subtypes; see `fixtures/registry-conformance/README.md` → "Per-subtype write-round-trip matrix".)
- API-contract: `fixtures/api-contract-conformance/`. TS / C# / Java / Kotlin / Python all green — each port runs **two lanes**: a hand-rolled reference server AND its **generated** API artifact booted over HTTP (the deployed controller/routes; TS+C# full-stack vs Testcontainers PG, Java/Kotlin/Python generated controller + in-memory repo behind the consumer seam). The generated fan-out found 10 real deployment bugs golden snapshots missed. Three sub-corpora run the **generated lane only, on all five ports** — `write-through/`, `projection/` (F22: a view-only `object.projection` serves GET list + GET by id and answers every write verb with `405 {"error": "method_not_allowed"}`) and `report/` (FR-044: a view-backed `object.report` serves GET list, answers `POST` with that same `405`, and mounts no `/{id}` route). That is deliberate, not a gap: what is under test is whether a port's GENERATOR emits those routes, and a hand-rolled reference server would answer every scenario by construction. The `m2m/` sub-corpus also gates **TPH x M:N together** (base-declared, subtype-declared, abstract-mid-declared, a non-subtype source onto a subtype TARGET, and the cross-subtype source id answering `200 []`) — the two corpora were originally built disjoint (`tph/` had no relationships, `m2m/` no discriminators), which is precisely how that defect class survived.
Expand Down
Loading
Loading