chore(release): 0.4.0 - #59
Merged
Merged
Conversation
Kilerd
force-pushed
the
release/0.4.0
branch
4 times, most recently
from
August 2, 2026 05:07
c59cb66 to
fee7ddd
Compare
Bumps all three crates and the internal dependency ranges to 0.4.0, plus the README and the examples that pin a version. 0.4 completes Tiers 0-2 of the maturation roadmap (#41): the framework shell (config, errors, state, tasks, messager) is trustworthy, and the OpenAPI output covers components/$ref, error responses, spec customization, field metadata, validation-driven constraints and header/cookie parameters. Co-Authored-By: Claude Opus 4.8 <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.
Version bump for the 0.4.0 release: all three crates, the internal dependency ranges, the README, and the examples that pin a version.
What 0.4 contains
Tiers 0, 1 and 2 of the maturation roadmap (#41) are complete.
axum 0.8 (#73)
{id}instead of:id— axum 0.8 rejects the old form at startup, so every application must edit its routes. It also removes work from gotcha:{id}is what OpenAPI already used, so the framework no longer translates between the two syntaxes.gotcha::axum::…:Form,Multipart,Sse/Event/KeepAlive,WebSocketUpgrade/WebSocket,middleware,MatchedPath,OriginalUri. (FormandMultipartwere already supported internally — only the re-export was missing.)GotchaRouter::fallback_servicehandles unmatched requests with aServicerather than a handler.Documentation, made real (#71)
http1), so#[api],Schematic,Operableand the entire OpenAPI layer were invisible on docs.rs.#![deny(missing_docs)], and the 64 public items that needed documenting.Configuration, redesigned (#60)
[server]section.#[config]makes the application's config extractable asState<Config>;State<ServerConfig>covers the bind settings.APP_SERVER__PORT=8080), and__is the path separator so snake_case fields are addressable ([config] Environment overrides only work for string fields #61, EnvironmentSource: typed fields can't be overridden, and snake_case keys are unaddressable mofa#2).Feature flags, trimmed (#70)
messageis gone — the message system is always available.cors/static_fileswere broken, not redundant:tower-httpwas declared with both sub-features, so wanting CORS also compiled the whole static-file stack. Each now enables only its own half.Correctness / trust (Tier 0)
DateTimeformat,Vecrequiredness, primitive names,serde_json::Value([schematic] Derive/schema correctness bugs #37, BUG: openapi of serde_json::Value should not be Record<String, never> #18)skip/default/skip_serializing_if([schematic] serde compatibility gaps: skip / default / skip_serializing_if #38)#[state]makesState<T>extraction actually compile ([state] State<S> handler extraction doesn't compile — no FromRef<GotchaContext> for S #26)Messagerwith application-state access ([cleanup] Remove or implement stub modules: empty state.rs, non-functional Messager #29)type: "void"([openapi] Handlers returning nothing don't compile, and()documents as an invalidtype: "void"#62)Framework identity (Tier 1)
GotchaApptrait and theGotchabuilder ([api] Unify the trait (GotchaApp) and builder (Gotcha) APIs #30)GotchaError+GotchaResultwithIntoResponse, replacing panics/unwraps ([error] Introduce a coherent framework error type (GotchaError + IntoResponse) #31)OpenAPI (Tier 2)
components/$refinstead of inlining — recursive types now produce a finite spec ([openapi] Emit components/$ref instead of inlining every schema #32)Result<T, E>is documented ([openapi] Document error / non-200 responses (Result<T, E>) #33).openapi(|spec| ..)to customize Info / servers / security ([openapi] Make top-level Info/servers/security customizable #34)#[schematic(...)]documentation metadata ([schematic] Make the #[schematic(...)] field attribute actually work #35)#[api(summary/deprecated/security)]plus header/cookie parameters —TypedHeader<T>,Header<T>/Cookie<T>,HeaderMap,Option<T>([api] No header / cookie parameter support in ParameterProvider #36)Validation (Tier 3, landed early)
Valid<Json<T>>backed by thevalidatorcrate; rejects with422and readable messages#[validate(..)]drives both the runtime check and the schema keywords — written once (builtin validator for json request #9)Breaking changes since 0.3.0
Two require an edit in every application, and both are covered step by step in
MIGRATION.md::id→{id}(axum 0.8 rejects the old form)[application]to the top level,[basic]→[server]; nested env overrides use__Also:
features = ["message"]should be droppedResponsible for Result<T, E>requiresE: ErrorResponsible(blanket-implemented forE: Schematicand(StatusCode, Json<E>))FromRequest/FromRequestPartsimpl drops#[async_trait](axum-core 0.5)Operablegainedsummaryandsecurityfieldsvalidator,axum-extra;mofa0.1 → 0.2Verification
Locally: every feature combination builds and tests,
gotcha_coreandgotcha_macrosuites, doctests,cargo clippy --all-features --workspace,cargo fmt --check, and a nightly--cfg docsrsdoc build with no warnings.Publishing (
gotcha_macro→gotcha_core→gotcha) and thev0.4.0tag happen after this merges.🤖 Generated with Claude Code