Skip to content

Commit 0ce4a93

Browse files
author
Christopher Ludden
committed
fix: makes code generation deterministic
1 parent d78fd23 commit 0ce4a93

File tree

6 files changed

+72
-55
lines changed

6 files changed

+72
-55
lines changed

example/example_temporal.pb.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/simple/simple_temporal.pb.go

Lines changed: 27 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/plugin/activities.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
func (svc *Service) genActivitiesInterface(f *g.File) {
1313
f.Comment("Activities describes available worker activites")
1414
f.Type().Id("Activities").InterfaceFunc(func(methods *g.Group) {
15-
for activity := range svc.activities {
15+
for _, activity := range svc.activitiesOrdered {
1616
method := svc.methods[activity]
1717
methods.Comment(strings.TrimSuffix(method.Comments.Leading.String(), "\n"))
1818
hasInput := !isEmpty(method.Input)
@@ -43,7 +43,7 @@ func (svc *Service) genRegisterActivities(f *g.File) {
4343
g.Id("activities").Id("Activities"),
4444
).
4545
BlockFunc(func(fn *g.Group) {
46-
for activity := range svc.activities {
46+
for _, activity := range svc.activitiesOrdered {
4747
fn.Id(fmt.Sprintf("Register%s", activity)).Call(
4848
g.Id("r"), g.Id("activities").Dot(activity),
4949
)

internal/plugin/client.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import (
1515
func (svc *Service) genClientInterface(f *g.File) {
1616
f.Commentf("Client describes a client for a %s worker", svc.GoName)
1717
f.Type().Id("Client").InterfaceFunc(func(methods *g.Group) {
18-
for workflow, opts := range svc.workflows {
18+
for _, workflow := range svc.workflowsOrdered {
19+
opts := svc.workflows[workflow]
1920
// generate Execute<Workflow> method
2021
method := svc.methods[workflow]
2122
hasInput := !isEmpty(method.Input)
@@ -77,7 +78,7 @@ func (svc *Service) genClientInterface(f *g.File) {
7778
}
7879

7980
// add <Query> methods
80-
for query := range svc.queries {
81+
for _, query := range svc.queriesOrdered {
8182
handler := svc.methods[query]
8283
hasInput := !isEmpty(handler.Input)
8384
methods.Commentf("% sends a %s query to an existing workflow", query, query)
@@ -97,7 +98,7 @@ func (svc *Service) genClientInterface(f *g.File) {
9798
}
9899

99100
// add <Signal> methods
100-
for signal := range svc.signals {
101+
for _, signal := range svc.signalsOrdered {
101102
handler := svc.methods[signal]
102103
hasInput := !isEmpty(handler.Input)
103104
methods.Commentf("% sends a %s signal to an existing workflow", signal, signal)

internal/plugin/service.go

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package plugin
22

33
import (
44
"fmt"
5+
"sort"
56

67
temporalv1 "github.com/cludden/protoc-gen-go-temporal/gen/temporal/v1"
78
g "github.com/dave/jennifer/jen"
@@ -24,12 +25,16 @@ const (
2425
type Service struct {
2526
*protogen.Plugin
2627
*protogen.Service
27-
opts *temporalv1.ServiceOptions
28-
activities map[string]*temporalv1.ActivityOptions
29-
methods map[string]*protogen.Method
30-
queries map[string]*temporalv1.QueryOptions
31-
signals map[string]*temporalv1.SignalOptions
32-
workflows map[string]*temporalv1.WorkflowOptions
28+
opts *temporalv1.ServiceOptions
29+
activitiesOrdered []string
30+
activities map[string]*temporalv1.ActivityOptions
31+
methods map[string]*protogen.Method
32+
queriesOrdered []string
33+
queries map[string]*temporalv1.QueryOptions
34+
signalsOrdered []string
35+
signals map[string]*temporalv1.SignalOptions
36+
workflowsOrdered []string
37+
workflows map[string]*temporalv1.WorkflowOptions
3338
}
3439

3540
// parseService extracts a Service from a protogen.Service value
@@ -54,20 +59,28 @@ func parseService(p *protogen.Plugin, service *protogen.Service) *Service {
5459

5560
if opts, ok := proto.GetExtension(method.Desc.Options(), temporalv1.E_Activity).(*temporalv1.ActivityOptions); ok && opts != nil {
5661
svc.activities[name] = opts
62+
svc.activitiesOrdered = append(svc.activitiesOrdered, name)
5763
}
5864

5965
if opts, ok := proto.GetExtension(method.Desc.Options(), temporalv1.E_Query).(*temporalv1.QueryOptions); ok && opts != nil {
6066
svc.queries[name] = opts
67+
svc.queriesOrdered = append(svc.queriesOrdered, name)
6168
}
6269

6370
if opts, ok := proto.GetExtension(method.Desc.Options(), temporalv1.E_Signal).(*temporalv1.SignalOptions); ok && opts != nil {
6471
svc.signals[name] = opts
72+
svc.signalsOrdered = append(svc.signalsOrdered, name)
6573
}
6674

6775
if opts, ok := proto.GetExtension(method.Desc.Options(), temporalv1.E_Workflow).(*temporalv1.WorkflowOptions); ok && opts != nil {
6876
svc.workflows[name] = opts
77+
svc.workflowsOrdered = append(svc.workflowsOrdered, name)
6978
}
7079
}
80+
sort.Strings(svc.activitiesOrdered)
81+
sort.Strings(svc.queriesOrdered)
82+
sort.Strings(svc.signalsOrdered)
83+
sort.Strings(svc.workflowsOrdered)
7184
return &svc
7285
}
7386

@@ -81,7 +94,8 @@ func (svc *Service) render(f *g.File) {
8194
svc.genClientConstructor(f)
8295

8396
// generate client workflow methods
84-
for workflow, opts := range svc.workflows {
97+
for _, workflow := range svc.workflowsOrdered {
98+
opts := svc.workflows[workflow]
8599
svc.genClientWorkflowExecute(f, workflow)
86100
svc.genClientWorkflowGet(f, workflow)
87101
for _, signal := range opts.GetSignal() {
@@ -92,17 +106,18 @@ func (svc *Service) render(f *g.File) {
92106
}
93107

94108
// generate client query methods
95-
for query := range svc.queries {
109+
for _, query := range svc.queriesOrdered {
96110
svc.genClientQueryMethod(f, query)
97111
}
98112

99113
// generate client signal methods
100-
for signal := range svc.signals {
114+
for _, signal := range svc.signalsOrdered {
101115
svc.genClientSignalMethod(f, signal)
102116
}
103117

104118
// generate <Workflow>Run interfaces and implementations used by client
105-
for workflow, opts := range svc.workflows {
119+
for _, workflow := range svc.workflowsOrdered {
120+
opts := svc.workflows[workflow]
106121
svc.genClientWorkflowRunInterface(f, workflow)
107122
svc.genClientWorkflowRun(f, workflow)
108123
svc.genClientWorkflowRunIDMethod(f, workflow)
@@ -125,7 +140,7 @@ func (svc *Service) render(f *g.File) {
125140
svc.genRegisterWorkflows(f)
126141

127142
// generate workflow types, methods, functions
128-
for workflow := range svc.workflows {
143+
for _, workflow := range svc.workflowsOrdered {
129144
svc.genRegisterWorkflow(f, workflow)
130145
svc.genWorkflowWorkerBuilderFunction(f, workflow)
131146
svc.genWorkflowWorker(f, workflow)
@@ -142,7 +157,7 @@ func (svc *Service) render(f *g.File) {
142157
}
143158

144159
// generate signal types, methods, functions
145-
for signal := range svc.signals {
160+
for _, signal := range svc.signalsOrdered {
146161
svc.genWorkerSignal(f, signal)
147162
svc.genWorkerSignalReceive(f, signal)
148163
svc.genWorkerSignalReceiveAsync(f, signal)
@@ -153,7 +168,7 @@ func (svc *Service) render(f *g.File) {
153168
// generate activities
154169
svc.genActivitiesInterface(f)
155170
svc.genRegisterActivities(f)
156-
for activity := range svc.activities {
171+
for _, activity := range svc.activitiesOrdered {
157172
svc.genRegisterActivity(f, activity)
158173
svc.genActivityFuture(f, activity)
159174
svc.genActivityFutureGetMethod(f, activity)
@@ -169,7 +184,7 @@ func (svc *Service) genConstants(f *g.File) {
169184
if len(svc.workflows) > 0 {
170185
f.Commentf("%s workflow names", svc.GoName)
171186
f.Const().DefsFunc(func(defs *g.Group) {
172-
for workflow := range svc.workflows {
187+
for _, workflow := range svc.workflowsOrdered {
173188
method := svc.methods[workflow]
174189
defs.Id(fmt.Sprintf("%sName", workflow)).Op("=").Lit(string(method.Desc.FullName()))
175190
}
@@ -178,7 +193,8 @@ func (svc *Service) genConstants(f *g.File) {
178193

179194
// add id prefixes
180195
workflowsIdPrefixes := map[string]string{}
181-
for workflow, opts := range svc.workflows {
196+
for _, workflow := range svc.workflowsOrdered {
197+
opts := svc.workflows[workflow]
182198
if prefix := opts.GetDefaultOptions().GetIdPrefix(); prefix != "" {
183199
workflowsIdPrefixes[workflow] = prefix
184200
}
@@ -196,7 +212,7 @@ func (svc *Service) genConstants(f *g.File) {
196212
if len(svc.queries) > 0 {
197213
f.Commentf("%s query names", svc.GoName)
198214
f.Const().DefsFunc(func(defs *g.Group) {
199-
for query := range svc.queries {
215+
for _, query := range svc.queriesOrdered {
200216
method := svc.methods[query]
201217
defs.Id(fmt.Sprintf("%sName", query)).Op("=").Lit(string(method.Desc.FullName()))
202218
}
@@ -207,7 +223,7 @@ func (svc *Service) genConstants(f *g.File) {
207223
if len(svc.signals) > 0 {
208224
f.Commentf("%s signal names", svc.GoName)
209225
f.Const().DefsFunc(func(defs *g.Group) {
210-
for signal := range svc.signals {
226+
for _, signal := range svc.signalsOrdered {
211227
method := svc.methods[signal]
212228
defs.Id(fmt.Sprintf("%sName", signal)).Op("=").Lit(string(method.Desc.FullName()))
213229
}
@@ -218,7 +234,7 @@ func (svc *Service) genConstants(f *g.File) {
218234
if len(svc.activities) > 0 {
219235
f.Commentf("%s activity names", svc.GoName)
220236
f.Const().DefsFunc(func(defs *g.Group) {
221-
for activity := range svc.activities {
237+
for _, activity := range svc.activitiesOrdered {
222238
method := svc.methods[activity]
223239
defs.Id(fmt.Sprintf("%sName", activity)).Op("=").Lit(string(method.Desc.FullName()))
224240
}

internal/plugin/worker.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func (svc *Service) genWorkflowsInterface(f *g.File) {
1212
// generate workflows interface
1313
f.Commentf("Workflows provides methods for initializing new %s workflow values", svc.GoName)
1414
f.Type().Id("Workflows").InterfaceFunc(func(methods *g.Group) {
15-
for workflow := range svc.workflows {
15+
for _, workflow := range svc.workflowsOrdered {
1616
// method := svc.methods[workflow]
1717
methods.Commentf("%s initializes a new %sWorkflow value", workflow, workflow).Line().
1818
Id(workflow).
@@ -39,7 +39,7 @@ func (svc *Service) genRegisterWorkflows(f *g.File) {
3939
g.Id("workflows").Id("Workflows"),
4040
).
4141
BlockFunc(func(fn *g.Group) {
42-
for workflow := range svc.workflows {
42+
for _, workflow := range svc.workflowsOrdered {
4343
fn.Id(fmt.Sprintf("Register%s", workflow)).Call(
4444
g.Id("r"), g.Id("workflows").Dot(workflow),
4545
)

0 commit comments

Comments
 (0)