8000 add statuses API + Go/Python/TypeScript SDK support by vito · Pull Request #9327 · dagger/dagger · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

add statuses API + Go/Python/TypeScript SDK support #9327

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 34 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
145cab2
add OTel span API + Go/Python SDK support
vito Jan 7, 2025
9c9bd30
go: switch to dag.Span(name).Start(ctx)
vito Jan 7, 2025
58efed8
support configuring spans before starting them
vito Jan 7, 2025
ad2745b
fix module compatibility for span ending
vito Jan 7, 2025
9a9bfd9
fix another void return case
vito Jan 7, 2025
d704dd9
appease linter
vito Jan 8, 2025
2684c5b
remove Query.SpanContext
vito Jan 8, 2025
8039e30
remove Span.query - not needed anymore
vito Jan 8, 2025
7a0cd9d
remove SpanContext type, tidy API
vito Jan 8, 2025
d4790ca
fix lint
vito Jan 9, 2025
6a3abb4
fix python lint
vito Jan 9, 2025
6fe231e
typescript: implement higher level span API
vito Jan 9, 2025
32f974c
add golden tests for spans + nesting
vito Jan 9, 2025
1f81fbc
fix ts lint
vito Jan 10, 2025
f3d437e
typescript: handle non-Error thrown values
vito Jan 10, 2025
1b89a7b
refactor: split Span impl out of Query
vito Feb 16, 2025
ea008b3
support span passthrough, add reveal shorthand
vito Feb 17, 2025
ae07782
sdk/typescript: add opentelemetry dependency
vito Jun 25, 2025
c6a7964
regen
vito Jun 25, 2025
0ac64ff
lint: ignore all of viztest
vito Jun 25, 2025
80c2069
Revert "sdk/typescript: add opentelemetry dependency"
vito Jun 26, 2025
42b602b
restore python otel imports
vito Jun 26, 2025
6c3d729
update TestTelemetry gold
vito Jun 26, 2025
688aafe
fix janky debug logs
vito Jun 26, 2025
8c45e78
feat: update typescript span.run with utility function to simplify de…
TomChv Jun 26, 2025
2925d37
chore: fix imports in client/module index.ts
TomChv Jun 26, 2025
3d68dc7
regen docs
vito Jun 26, 2025
cc2c753
skip viztest module when linting
vito Jun 27, 2025
3aa5908
Span -> Status
vito Jun 27, 2025
e879bdd
revise API
vito Jun 27, 2025
2e33cc8
regen, update tests for Span => Status
vito Jun 27, 2025
8f6a416
add Status.display helper
vito Jun 27, 2025
ee48220
regen
vito Jun 27, 2025
0718ba9
viztest: use new Display API
vito Jun 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .dagger/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func New(
if strings.HasPrefix(module, "core/integration/") {
continue
}
if strings.HasPrefix(module, "dagql/idtui/viztest/broken") {
if strings.HasPrefix(module, "dagql/idtui/viztest/") {
continue
}
if strings.HasPrefix(module, "modules/evaluator/") {
Expand Down Expand Up @@ -120,7 +120,7 @@ func (dev *DaggerDev) Lint(
if strings.HasPrefix(pkg, "core/integration/") {
continue
}
if strings.HasPrefix(pkg, "dagql/idtui/viztest/broken") {
if strings.HasPrefix(pkg, "dagql/idtui/viztest/") {
continue
}
if strings.HasPrefix(pkg, "modules/evaluator/") {
Expand Down
209 changes: 130 additions & 79 deletions cmd/codegen/generator/go/templates/src/_types/object.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
type {{ .Name | FormatName }} struct {
{{- with .Directives.SourceMap -}} // {{ .Module }} ({{ .Filelink | ModuleRelPath }}) {{- end }}
query *querybuilder.Selection
client graphql.Client

{{ range $field := .Fields }}
{{- if $field.TypeRef.IsScalar }}
{{ $field.Name }} *{{ $field.TypeRef | FormatOutputType }}
{{- end }}
{{ range $field := .Fields }}
{{- if $field.TypeRef.IsScalar }}
{{ $field.Name }} *{{ $field.TypeRef | FormatOutputType }}
{{- end }}
{{- end }}
}
{{- end }}
Expand All @@ -28,12 +29,64 @@ func (r *{{ $.Name | FormatName }}) With(f With{{ .Name | FormatName }}Func) *{{
func (r *{{ .Name | FormatName }}) WithGraphQLQuery(q *querybuilder.Selection) *{{ $.Name | FormatName }} {
return &{{ .Name | FormatName }}{
query: q,
{{- if eq .Name "Query" }}
client: r.client,
{{ end }}
}
}

{{- if eq .Name "Status" }}
func (r *Status) Context(ctx context.Context) (context.Context, *Status) {
started, err := r.Start(ctx)
if err != nil {
panic(err)
}
spanIDHex, err := started.InternalID(ctx)
if err != nil {
panic(err)
}
spanID, err := trace.SpanIDFromHex(spanIDHex)
if err != nil {
panic(err)
}
spanCtx := trace.SpanContextFromContext(ctx)
return trace.ContextWithSpanContext(ctx, trace.NewSpanContext(trace.SpanContextConfig{
TraceID: spanCtx.TraceID(),
SpanID: spanID,
Remote: true,
TraceFlags: spanCtx.TraceFlags(),
TraceState: spanCtx.TraceState(),
})), started
}

{{- $supportsVoid := CheckVersionCompatibility "v0.12.0" }}
func (r *Status) Run(ctx context.Context, cb func(context.Context) error) error {
ctx, status := r.Context(ctx)
err := cb(ctx)
var endErr error
if err != nil {
errClient := &Client{
query: querybuilder.Query().Client(r.client),
client: r.client,
}
{{- if $supportsVoid }}
endErr = status.End(ctx, StatusEndOpts{
Error: errClient.Error(err.Error()),
})
{{- else }}
_, endErr = status.End(ctx, StatusEndOpts{
Error: errClient.Error(err.Error()),
})
{{- end }}
} else {
{{- if $supportsVoid }}
endErr = status.End(ctx)
{{- else }}
_, endErr = status.End(ctx)
{{- end }}
}
return errors.Join(err, endErr)
}
{{- end }}

{{ range $field := .Fields }}
{{- if HasOptionals $field.Args }}
// {{ $field | FieldOptionsStructName }} contains options for {{ $.Name | FormatName }}.{{ $field.Name | FormatName }}
Expand Down Expand Up @@ -75,32 +128,32 @@ type {{ $field | FieldOptionsStructName }} struct {
{{ FieldFunction $field false $supportsVoid }} {
{{- with .Directives.SourceMap -}} // {{ .Module }} ({{ .Filelink | ModuleRelPath }}) {{- end }}
{{- range $arg := $field.Args }}
{{- if and (IsPointer $arg) (not (IsArgOptional $arg)) }}
assertNotNil("{{ $arg.Name}}", {{ $arg.Name }})
{{- end }}
{{- end }}

{{- if and ($field.TypeRef.IsScalar) (ne $field.ParentObject.Name "Query") (not $convertID) }}
if r.{{ $field.Name }} != nil {
{{- if and $supportsVoid $field.TypeRef.IsVoid }}
return nil
{{- else }}
return *r.{{ $field.Name }}, nil
{{- end }}
}
{{- end }}
{{- if and (IsPointer $arg) (not (IsArgOptional $arg)) }}
assertNotNil("{{ $arg.Name}}", {{ $arg.Name }})
{{- end }}
{{- end }}

{{- if and ($field.TypeRef.IsScalar) (ne $field.ParentObject.Name "Query") (not $convertID) }}
if r.{{ $field.Name }} != nil {
{{- if and $supportsVoid $field.TypeRef.IsVoid }}
return nil
{{- else }}
return *r.{{ $field.Name }}, nil
{{- end }}
}
{{- end }}
q := r.query.Select("{{ $field.Name }}")

{{- if HasOptionals $field.Args }}
for i := len(opts) - 1; i >= 0; i-- {
{{- range $arg := $field.Args }}
{{- if IsArgOptional $arg }}
// `{{ $arg.Name }}` optional argument
if !querybuilder.IsZeroValue(opts[i].{{ $arg.Name | FormatName }}) {
q = q.Arg("{{ $arg.Name }}", opts[i].{{ $arg.Name | FormatName }})
}
{{- end }}
{{- end }}
{{- range $arg := $field.Args }}
{{- if IsArgOptional $arg }}
// `{{ $arg.Name }}` optional argument
if !querybuilder.IsZeroValue(opts[i].{{ $arg.Name | FormatName }}) {
q = q.Arg("{{ $arg.Name }}", opts[i].{{ $arg.Name | FormatName }})
}
{{- end }}
{{- end }}
}
{{- end }}

Expand All @@ -112,7 +165,7 @@ type {{ $field | FieldOptionsStructName }} struct {
{{- end }}
{{- $typeName := $field.TypeRef | FormatOutputType }}
{{ if and $supportsVoid $field.TypeRef.IsVoid }}
return q.Execute(ctx)
return q.Execute(ctx)
{{- else if $convertID }}
var id {{ $typeName }}
if err := q.Bind(&id).Execute(ctx); err != nil {
Expand All @@ -125,57 +178,55 @@ type {{ $field | FieldOptionsStructName }} struct {
{{- else if $field.TypeRef.IsObject }}
return &{{ $typeName }} {
query: q,
{{- if eq $typeName "Client" }}
client: r.client,
{{ end }}
}

{{- else if or $field.TypeRef.IsScalar $field.TypeRef.IsList }}
{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}
q = q.Select("{{ range $i, $v := $field | GetArrayField }}{{ if $i }} {{ end }}{{ $v.Name }}{{ end }}")

type {{ $field.Name | ToLowerCase }} struct {
{{ range $v := $field | GetArrayField }}
{{ $v.Name | ToUpperCase }} {{ $v.TypeRef | FormatOutputType }}
{{- end }}
}

{{$eleType := $field.TypeRef | InnerType}}
convert := func(fields []{{ $field.Name | ToLowerCase }}) {{ $field.TypeRef | FormatOutputType }} {
out := {{ $field.TypeRef | FormatOutputType }}{}

for i := range fields {
val := {{ $field.TypeRef | FormatOutputType | FormatArrayToSingleType }}{{"{"}}{{ $field | GetArrayField | FormatArrayField }}{{"}"}}
{{- if $eleType | IsIDableObject }}
val.query = q.Root().Select("load{{$eleType | ObjectName}}FromID").Arg("id", fields[i].Id)
{{- end }}
out = append(out, val)
}

return out
}
{{- end }}

{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}
{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}
q = q.Select("{{ range $i, $v := $field | GetArrayField }}{{ if $i }} {{ end }}{{ $v.Name }}{{ end }}")

type {{ $field.Name | ToLowerCase }} struct {
{{ range $v := $field | GetArrayField }}
{{ $v.Name | ToUpperCase }} {{ $v.TypeRef | FormatOutputType }}
{{- end }}
}

{{$eleType := $field.TypeRef | InnerType}}
convert := func(fields []{{ $field.Name | ToLowerCase }}) {{ $field.TypeRef | FormatOutputType }} {
out := {{ $field.TypeRef | FormatOutputType }}{}

for i := range fields {
val := {{ $field.TypeRef | FormatOutputType | FormatArrayToSingleType }}{{"{"}}{{ $field | GetArrayField | FormatArrayField }}{{"}"}}
{{- if $eleType | IsIDableObject }}
val.query = q.Root().Select("load{{$eleType | ObjectName}}FromID").Arg("id", fields[i].Id)
{{- end }}
out = append(out, val)
}

return out
}
{{- end }}

{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}
var response []{{ $field.Name | ToLowerCase }}
{{- else }}
{{- else }}
var response {{ $field.TypeRef | FormatOutputType }}
{{- end }}
{{- end }}

q = q.Bind(&response)
{{- $typeName := $field.TypeRef | FormatOutputType }}
{{- if ne $typeName "Client" }}
{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}
{{- if and $field.TypeRef.IsList (IsListOfObject $field.TypeRef) }}

err := q.Execute(ctx)
if err != nil {
return nil, err
return nil, err
}

return convert(response), nil
{{- else }}
{{- else }}
return response, q.Execute(ctx)
{{- end }}
{{- end }}
{{- else }}
return response, q.Execute(ctx, r.gql)
{{- end }}
Expand All @@ -195,30 +246,30 @@ func (r *{{ $.Name | FormatName }}) XXX_GraphQLIDType() string {

// XXX_GraphQLID is an internal function. It returns the underlying type ID
func (r *{{ $.Name | FormatName }}) XXX_GraphQLID(ctx context.Context) (string, error) {
id, err := r.ID(ctx)
if err != nil {
return "", err
}
id, err := r.ID(ctx)
if err != nil {
return "", err
}
return string(id), nil
}

func (r *{{ $.Name | FormatName }}) MarshalJSON() ([]byte, error) {
id, err := r.ID(marshalCtx)
if err != nil {
return nil, err
}
return json.Marshal(id)
id, err := r.ID(marshalCtx)
if err != nil {
return nil, err
}
return json.Marshal(id)
}

{{- if IsModuleCode }}
func (r *{{ $.Name | FormatName }}) UnmarshalJSON(bs []byte) error {
var id string
err := json.Unmarshal(bs, &id)
if err != nil {
return err
}
*r = *dag.Load{{ $.Name | FormatName }}FromID({{$.Name | FormatName}}ID(id))
return nil
var id string
err := json.Unmarshal(bs, &id)
if err != nil {
return err
}
*r = *dag.Load{{ $.Name | FormatName }}FromID({{$.Name | FormatName}}ID(id))
return nil
}
{{- end }}

Expand Down
7 changes: 4 additions & 3 deletions cmd/codegen/generator/typescript/templates/src/header.ts.gtpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ inherited by futures objects and common types.
* Do not make direct changes to the file.
*/
{{- if IsBundle }}
import { Context } from "./core.js"
import { Context, runWithSpan } from "./core.js"
{{- else if (not IsClientOnly)}}
import { Context } from "../common/context.js"
import { runWithSpan } from "../telemetry/index.js"
{{- else }}
import { Context, connect as _connect, connection as _connection, ConnectOpts, CallbackFct } from "@dagger.io/dagger"
import { Context, connect as _connect, connection as _connection, ConnectOpts, CallbackFct, runWithSpan } from "@dagger.io/dagger"
{{- end }}

{{ if IsClientOnly }}
Expand All @@ -24,7 +25,7 @@ async function serveModuleDependencies(client: Client): Promise<void> {
{{- range $i, $dep := $dependencies -}}
{{- if eq $dep.Kind "GIT_SOURCE" }}
await client.moduleSource(
"{{ $dep.Source }}",
"{{ $dep.Source }}",
{ refPin: "{{ $dep.Pin }}" },
)
.withName("{{ $dep.Name }}")
Expand Down
21 changes: 21 additions & 0 deletions cmd/codegen/generator/typescript/templates/src/object.ts.gtpl
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,27 @@ export class {{ .Name | QueryToClient | FormatName }} extends BaseClient { {{- w
{{- end }}
{{- end }}

{{- if eq .Name "Status" }}

public async run<T>(fn: (span: Status) => Promise<T>) {
const started = await this.start()
const spanIdHex = await started.internalId()

let spanError: Error | undefined = undefined
try {
return await runWithSpan(fn, this, started, spanIdHex)
} catch (e: unknown) {
if (e instanceof globalThis.Error) {
spanError = dag.error(e.message)
} else {
spanError = dag.error(`Unknown error: ${e}`)
}
throw e
} finally {
await started.end({ error: spanError })
}
}
{{- end }}
{{- if . | IsSelfChainable }}
{{""}}
/**
Expand Down
Loading
Loading
0