Regenerate against the gateway 0.7.0 spec - #25
Merged
Merged
Conversation
The snapshot moves from gateway 0.6.0 to 0.7.0: 155 paths and 238 operations, up from 151 and 233. A fault trigger collection appears on apps with three operations, two docs routes appear, and no path is removed, so the TypeScript client needs no source change. Twelve lifecycle operation ids lose their plural form - getAppsStatus is getAppStatus, and the four transitions follow, on apps and components. The generated modules are renamed with them, so the re-export named modules that no longer exist and importing that group raised ImportError. Three generated endpoints were reachable in the generated tree and nowhere in the package: the two capability description endpoints 0.7.0 adds to the server group, and get_app_area, which predates this release. A new group is noticed because its file is missing; an operation added to an existing group was not, so a test now compares each generated group against what its re-export lists, and another imports every group and checks each name it exports is bound. The suite did not touch ros2_medkit_client.api at all before, so both failure shapes this release had used to pass here and surface in a consumer instead. /auth/authorize and /auth/token now accept application/x-www-form-urlencoded beside application/json, as RFC 6749 requires of a token endpoint. openapi-python-client types a body carrying one schema under two content types as `Schema | Unset = UNSET` while importing only the UNSET sentinel, so both modules raise NameError on import and take the whole authentication group with them. 0.29.1 emits the same thing and its content_type_overrides setting does not add the import, so generate.sh adds the missing name after generation, matching the shape rather than those two files by name. servers carried whichever port the exporting gateway was bound to, which is a property of one run rather than of the API. export-spec.sh pins it to the documented default, replacing only the port in the authority so an IPv6 literal keeps its brackets and userinfo survives. Both packages go to 0.7.0, including the TypeScript lockfile's own version, which npm ci does not compare and which had drifted two releases behind. The README named 0.5.0 as the gateway release the spec comes from, and documented a pip install from a package index that nothing publishes to - the Python client ships as a wheel on a GitHub release.
bburda
force-pushed
the
release/spec-0.7.0
branch
from
September 1, 2026 15:18
70f7382 to
30865fa
Compare
mfaferek93
approved these changes
Sep 2, 2026
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.
Pull Request
Summary
Moves the spec snapshot from gateway 0.6.0 to 0.7.0 and makes both clients follow it.
The spec. Exported from a gateway built at the released
0.7.0tag. It grows from 151 paths and 233 operations to 155 and 238: a fault trigger collection on apps with three operations, and two docs routes. No path was removed, so the TypeScript client needed no source change.Lifecycle. Twelve operation ids lost their plural form.
getAppsStatusis nowgetAppStatus, and the four transitions follow, on apps and components. The generated modules are renamed with them, so the re-export named modules that no longer exist and importing that group raisedImportError.Endpoints with no way through. Three generated endpoints were reachable in the generated tree and nowhere in the package: the two capability description endpoints 0.7.0 adds to the server group, and
get_app_area, which predates this release. A new group is noticed because its file is missing; an operation added to an existing group was not, so a test now compares each generated group against what its re-export lists.Fault triggers. New group, so it gets a re-export like the others. It sits apart from the existing triggers API: a trigger there watches a resource on any entity type, while these fire on the faults of one app and the gateway exposes them on apps only.
The auth import.
/auth/authorizeand/auth/tokennow acceptapplication/x-www-form-urlencodedbesideapplication/json, which RFC 6749 requires of a token endpoint.openapi-python-clienttypes a body that has one schema under two content types asSchema | Unset = UNSET, but the import line it writes brings in only theUNSETsentinel, not theUnsetclass the annotation names:Importing either module raises
NameError, which takes the wholeauthenticationgroup with it. 0.29.1 is the newest release and emits the same thing; itscontent_type_overridessetting collapses the duplicated union member but does not add the import.generate.shnow adds the missing name after generation, looking for the shape rather than for those two files by name.How many modules it repairs depends on where it runs. openapi-python-client runs its own formatting hooks after generation, and
pipx rungives it an environment whereruffis not on PATH - the CI log says so. Without those hooks the import line is left short in far more places, so CI repairs 81 modules while a local run that has ruff available repairs the two auth ones. The generated code is the same either way once the step has run.The exporting gateway's port.
serverscarried whichever port the gateway that produced the export was bound to. That is a property of one run, not of the API, and it reaches everyone who reads the committed spec.export-spec.shnow pins it to the documented default and says when it changed something. Nothing depends on the value - neither generated client readsservers, both take the base URL from their caller - so the host stays as the gateway reports it and only the port is pinned.Docs and versions. Both packages go to 0.7.0. The README named 0.5.0 as the gateway release the spec comes from, and told readers to
pip installfrom a package index. No workflow publishes to one; the Python client ships as a wheel attached to a GitHub release, so the documented command could never work.Issue
Type
Testing
The gateway was built from the released
0.7.0tag, whose tree is identical to the commit the spec was exported from, so the snapshot here is the released one.Python client:
pytestpasses 124 tests. 34 are new: every api group is imported and every name it re-exports is checked to be bound, and every generated group is compared against its re-export so an unreachable endpoint fails here. The suite did not touchros2_medkit_client.apibefore, so both failure shapes this release had used to pass here and fail in a consumer instead. Reverting the lifecycle names fails withImportError, undoing the Unset repair fails withNameError, and dropping one name from a re-export fails with the list of what is unreachable.ruff check src/ tests/andruff format --check src/ tests/are clean.ros2_medkit_client-0.7.0-py3-none-any.whl.TypeScript client:
npm run build,npm test(54 tests),npm run lintandnpm run typecheckare all clean.Spec and scripts:
shellcheckis clean on both scripts. Runningexport-spec.shagainst a gateway deliberately bound to a spare port printsNormalized server URL port 9611 -> 8080and writes the default.Against a running 0.7.0 gateway, not a mock:
get_capability_descriptionanswers 200 andget_app_areaanswers 200 through the re-exports they were missing, andlist_fault_triggersreaches the gateway and gets its own answer.@selfpatch/ros2-medkit-client-ts@0.7.0was installed into the web UI on its own branch: typecheck, lint and build are clean, 736 unit tests pass, and its Playwright suite passes 21 tests against the live gateway.The publish jobs derive the tag from the package version, so this produces
py-v0.7.0/ros2_medkit_client-0.7.0-py3-none-any.whland@selfpatch/ros2-medkit-client-ts@0.7.0, which is what the two dependent PRs pin.Checklist