Repository navigation
fix: apply a field's @nexus.default to an optional resource method parameter in Python - #408
Merged
Merged
Conversation
A resource with `@nexus.type-parameter "<alias>"` is generic in Python, TypeScript and .NET. An operation that returns it, or that its method binds, takes a runtime type for each type parameter of its output, so a response decodes its generic values.
The kept fixtures cover an undeclared type parameter, a generic resource in a record field or in a result with no proto message, and a language that refuses it. The others test directive syntax, rare name clashes or another copy of a kept check.
Co-authored-by: Tim Conley <timothy.conley@temporal.io>
A resource that uses a type parameter, also through its records, is generic in it, as a record is. So a resource needs no annotation, and `@nexus.type-parameter` is valid only on a type alias again.
Only a returned resource gives its type parameters, as the guide says, so a parameter or field that holds one doesn't. The declaration order doesn't change when a method moves.
A list, map, tuple, result or variant case builds the resource from the record's message too, so it gets no type argument either.
The old reason said a proto message holds the type arguments, which it doesn't.
Two type parameters such as `body` and `body-t` give the same runtime type name, and a method can take it too. Either one makes a duplicate parameter or member.
The typed hook of a generic response took only the request, so the terminal decoded `ReadRecordsResponse[Turn]` with the plain class and lost `Turn`.
C# generics are invariant, so the `<object>` checks refused a `Stream<Turn>` call. The dispatch now compares generic type definitions and keeps the call's types.
A subclass such as `class TurnStream(Stream[Turn])` has no `__orig_class__`, so the handle reads `__orig_bases__` too. A factory tests `body_type is None`, since a class can be falsy.
The TypeScript stream test now decodes a body with a runtime type. The Python test decodes to the bare handle class, since a generic alias fails for another reason.
No release has the Python constructor change, so it belongs with the added entry. The fixed entry now describes the System Nexus dispatch fixes.
A few comments used "name" as a verb, ran over two lines or over 100 columns. The guide's first paragraph read as one long sentence.
Drop the tests that repeat another test or restate generated code, and keep the ones that guard behavior. Shorten the guide section and the comments.
Python can't subscript a function, so each generic call is an object whose subscript binds the types, as in `client.get_stream[Turn](ref=ref)`. A factory's optional field defaults to `None`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.close` marks the method that ends a resource. Python calls it at the end of `async with`, and a call that returns the resource returns a `ResourceCall`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.varargs` makes a resource method take a list's items as positional arguments, and a list of a flattened one-field record takes that field's values. The Stream's publish takes values and returns the last offset. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Workflow code gets a handle on an existing Stream with `get_stream[T]`, from the fields of its ref, with no call. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Each client call and client resource method takes `rpc_metadata` and `rpc_timeout`, and passes them to the `start_operation` of its Nexus client. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
`@nexus.flatten-in-api` on a request field makes that call take the fields of the field's record, and the models keep the record. The Stream create takes the id, the owner and the backend of its ref this way, and the other Stream calls keep `ref`. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
A field can leave the API of one target and take a source in another. A call of a target that omits a required list sends it empty. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
The docs of both `producer` fields match the API's WIT, which has the two optional parameters. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
The API gave `append` an optional `sequence`, so a caller can number a batch and the Store can dedupe a resent one. The optional `producer` parameter still waits for the generator change. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
The sync gave `append` its optional `sequence`, and this branch puts it after `producer` as the API's WIT does. The generated samples were rebuilt, not merged by hand.
The API now says that two offsets of one Stream compare bytewise. It also says that Workflow code on a Store writes through a Local Activity. Only comments changed, so the samples only move in docs. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
The sync brings the API's new offset and Workflow Producer comments, which this branch also needs. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
This was referenced Nov 13, 2026
Closed
…409) The SDK's `Client` inherits the generated extension, so `temporalio.client` imports the generated package. A run-time import back made importing the package first a circular import. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
A resource method passed an optional parameter as it was and dropped the default of the field. A source is a helper value and never an argument, so it no longer fills an optional parameter.
A resource method hands an optional parameter to its operation, which applies the field's default. A source is a helper value and never an argument, so it no longer fills an optional parameter.
The stream sample's resource methods go through the options type, which applies the default. A source is a helper value and never an argument, so it no longer fills an optional parameter.
A default is an omittable argument, which the optional `producer` of `append` and `close` needs. The guide and the changelog describe the default rule for resource methods. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
Collaborator
|
This Doesn't make sense to me. That's what @nexus.default is for. |
The import cycle fix landed on this branch while the default rework was built on the commit before it. The result is the tree that the checks ran on. Co-authored-by: Tim Conley <timothy.conley@temporal.io>
@nexus.source as the default of an optional method parameter@nexus.default to an optional resource method parameter in Python
Contributor
Author
|
I thought the same, and was working on it. Reworked it onto |
moetemp
marked this pull request as ready for review
November 13, 2026 18:46
tconley1428
approved these changes
Nov 13, 2026
moetemp
enabled stacked auto-merge (squash)
November 13, 2026 18:56
moetemp
disabled stacked auto-merge
November 13, 2026 18:56
moetemp
enabled stacked auto-merge (squash)
November 13, 2026 18:56
tconley1428
disabled stacked auto-merge
November 13, 2026 19:03
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.
This PR makes a Python resource method apply a request field's
@nexus.defaultto an optional parameter with the field's name.The method passed the parameter as it was, so a call with no value sent none. TypeScript and .NET already apply the default in the operation.
record append-records-request { /// @nexus.default targets="client" python="_support.default_producer()" ... producer: producer, } append: func(records: list<append-record>, producer: option<producer>, sequence: option<s64>) -> append-records-response;The stream sample's
appendandclosetake an optionalproducerthis way. Its twoproducerfields have a default now, not a source.