Skip to content

Commit

Permalink
weld: Filter out transitive dependencies for testing and remove dupli…
Browse files Browse the repository at this point in the history
…cates (#5)

* wip

* weld: Filter our transitive dependencies for testing

* remove dereferencing

* rebase
  • Loading branch information
andrewwormald authored Aug 29, 2024
1 parent 2c5ee3e commit 1d19711
Show file tree
Hide file tree
Showing 13 changed files with 376 additions and 34 deletions.
4 changes: 2 additions & 2 deletions internal/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func Generate(ctx context.Context, args Args) (*Result, error) {

var testingOut []byte
if args.ForTesting {
testingOut, err = execTestingTpl(tplData)
testingOut, err = execTestingTpl(tplData, specBcks)
if err != nil {
return nil, err
}
Expand All @@ -102,7 +102,7 @@ func Generate(ctx context.Context, args Args) (*Result, error) {
SpecBackends: specBcks,
SelectedNodes: selected.SelectedNodes,
TransBackends: selected.TransitiveBackends,
TplData: tplData,
TplData: &tplData,
WeldOutput: weldOut,
BackendsOutput: bcksOut,
TestingOutput: testingOut,
Expand Down
6 changes: 6 additions & 0 deletions internal/gen_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,12 @@ func TestGenerate(t *testing.T) {
Name: "variadic",
WorkDir: "example/variadic/state",
},
{
Name: "transitive-testing",
WorkDir: "example/transitive/state",
Tags: "!dev",
ForTesting: true,
},
}

for _, test := range tests {
Expand Down
41 changes: 23 additions & 18 deletions internal/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ var (
)

// execWeldTpl returns the generated source of the template data.
func execWeldTpl(data *TplData) ([]byte, error) {
func execWeldTpl(data TplData) ([]byte, error) {
var buf bytes.Buffer
err := weldTpl.Execute(&buf, data)
if err != nil {
Expand All @@ -53,7 +53,9 @@ func execWeldTpl(data *TplData) ([]byte, error) {
return src, nil
}

func execTestingTpl(data *TplData) ([]byte, error) {
func execTestingTpl(data TplData, bcks Backends) ([]byte, error) {
data.Deps = filterTransitiveDeps(data, bcks)

var buf bytes.Buffer
err := testingTpl.Execute(&buf, data)
if err != nil {
Expand All @@ -74,11 +76,7 @@ func execTestingTpl(data *TplData) ([]byte, error) {
return src, nil
}

func maybeExecBackendsTpl(tplData *TplData, bcks Backends, genBcks bool) ([]byte, error) {
if !genBcks {
return nil, nil
}

func filterTransitiveDeps(tplData TplData, bcks Backends) []TplDep {
// Remove transitive deps
var deps []TplDep
for _, dep := range tplData.Deps {
Expand All @@ -94,11 +92,18 @@ func maybeExecBackendsTpl(tplData *TplData, bcks Backends, genBcks bool) ([]byte
}
}

clone := *tplData
clone.Deps = deps
return deps
}

func maybeExecBackendsTpl(tplData TplData, bcks Backends, genBcks bool) ([]byte, error) {
if !genBcks {
return nil, nil
}

tplData.Deps = filterTransitiveDeps(tplData, bcks)

var buf bytes.Buffer
err := bcksTpl.Execute(&buf, clone)
err := bcksTpl.Execute(&buf, tplData)
if err != nil {
return nil, err
}
Expand All @@ -118,14 +123,14 @@ func maybeExecBackendsTpl(tplData *TplData, bcks Backends, genBcks bool) ([]byte
}

// makeTplData returns the template data for backends and selected nodes.
func makeTplData(in, out *packages.Package, tags string, selected NodeSelection, specBcks Backends) (*TplData, error) {
func makeTplData(in, out *packages.Package, tags string, selected NodeSelection, specBcks Backends) (TplData, error) {
pkgCache := NewPkgCache(in, out)
pkgCache.Add(specBcks.Package)

unionDeps := union(specBcks, selected.TransitiveBackends)
err := sortInDependencyOrder(unionDeps, selected.SelectedNodes, selected.UnselectedTypes)
if err != nil {
return nil, errors.Wrap(err, "error sorting in dependency order")
return TplData{}, errors.Wrap(err, "error sorting in dependency order")
}

// TODO(neil): The deps are now sorted mostly alphabetically, but also in
Expand All @@ -141,7 +146,7 @@ func makeTplData(in, out *packages.Package, tags string, selected NodeSelection,
for _, param := range selected.UnselectedTypes {
v, err := type2Param(param)
if err != nil {
return nil, err
return TplData{}, err
}
varMap[param.String()] = v
}
Expand All @@ -161,7 +166,7 @@ func makeTplData(in, out *packages.Package, tags string, selected NodeSelection,
for _, dep := range unionDeps {
d, err := makeTplDep(pkgCache, selected.SelectedNodes, dep.Getter, dep.Type, varMap)
if err != nil {
return nil, err
return TplData{}, err
}

orig := d.Var
Expand All @@ -185,20 +190,20 @@ func makeTplData(in, out *packages.Package, tags string, selected NodeSelection,

tb, err := makeTplBcks(pkgCache, selected.TransitiveBackends)
if err != nil {
return nil, err
return TplData{}, err
}

bcksTypeRef, err := makeTypeRef(pkgCache, specBcks.Type)
if err != nil {
return nil, err
return TplData{}, err
}

params, err := makeParams(pkgCache, selected.UnselectedTypes)
if err != nil {
return nil, err
return TplData{}, err
}

return &TplData{
return TplData{
Package: out.Name,
Tags: tags,
BackendsName: specBcks.Name,
Expand Down
18 changes: 4 additions & 14 deletions internal/templates/testing.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,17 @@ type Testing{{.BackendsName}} struct {
{{end}}{{end}}
}

{{range .Deps}}
{{range .Deps}}{{if not .IsDuplicate }}
func (ti *Testing{{$.BackendsName}}) {{.Getter}}() {{.Type}} {
if ti.{{.Var}} != nil {
return ti.{{.Var}}
}

return ti.{{$.BackendsName}}.{{.Getter}}()
}
{{end}}

{{if .TransBcks -}}
// Transitive dependency interface assertions.
var (
{{range .TransBcks -}}
_ {{.}} = (*Testing{{$.BackendsName}})(nil)
{{end}}
)
{{end}}

{{end}}{{end}}

{{range .Deps }}
{{range .Deps }}{{if not .IsDuplicate }}
// Set{{.Getter}}ForTesting is a runtime available override for the "{{.Var}}" dependency that should only be used for testing.
func (ti *Testing{{$.BackendsName}}) Set{{.Getter}}ForTesting(t *testing.T, {{.Var}} {{.Type}}) {
t.Cleanup(func() {
Expand All @@ -55,4 +45,4 @@ func (ti *Testing{{$.BackendsName}}) Set{{.Getter}}ForTesting(t *testing.T, {{.V

ti.{{.Var}} = {{.Var}}
}
{{end}}
{{end}}{{end}}
93 changes: 93 additions & 0 deletions internal/testdata/example/transitive/state/testing_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions internal/testdata/transitive-testing_bcksoutput.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package state

// Code generated by weld. DO NOT EDIT.

import (
transitive_ops "example/transitive/ops"
)

type Backends interface {
Foo() transitive_ops.Foo
Qux() transitive_ops.Qux
Bar() transitive_ops.Bar
Baz() transitive_ops.Baz
}
24 changes: 24 additions & 0 deletions internal/testdata/transitive-testing_graph.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Set[16]: (inline)
Set[12]: var example/backends/providers.WeldProd
Set[6]: var example/backends/providers.GRPC
Set[2]: var example/identity/users/client/grpc.Provider
Func[1]: func example/identity/users/client/grpc.New() (*example/identity/users/client/grpc.client, error)
Bind[1]: example/identity/users.Client(*example/identity/users/client/grpc.client)
Set[2]: var example/identity/email/client/grpc.Provider
Func[1]: func example/identity/email/client/grpc.New() (*example/identity/email/client/grpc.client, error)
Bind[1]: example/identity/email.Client(*example/identity/email/client/grpc.client)
Set[2]: var example/exchange/client/grpc.Provider
Func[1]: func example/exchange/client/grpc.New() (*example/exchange/client/grpc.client, error)
Bind[1]: example/exchange.Client(*example/exchange/client/grpc.client)
Set[3]: var example/backends/providers.DB
Func[1]: func example/identity/email/db.Connect() (*example/identity/email/db.EmailDB, error)
Func[1]: func example/identity/users/db.Connect() (*example/identity/users/db.UsersDB, error)
Func[1]: func example/exchange/db.Connect() (*example/exchange/db.ExchangeDB, error)
Set[3]: var example/backends/providers.External
Func[1]: func example/external/mail.New(opts ...example/external/mail.option) (*example/external/mail.Mailer, error)
Func[1]: func example/external/mail/mail.New() (*example/external/mail/mail.MailerLegacy, error)
Func[1]: func example/external/versioned.New() *example/external/versioned/v1.Service
Func[1]: func example/transitive/ops.NewFoo() (example/transitive/ops.Foo, error)
Func[1]: func example/transitive/ops.NewBar(foo example/transitive/ops.Foo) example/transitive/ops.Bar
Func[1]: func example/transitive/ops.NewBaz(bar example/transitive/ops.Bar, qux example/transitive/ops.Qux) example/transitive/ops.Baz
Func[1]: func example/transitive/ops.NewQux() (example/transitive/ops.Qux, error)
4 changes: 4 additions & 0 deletions internal/testdata/transitive-testing_selected.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Func[1]: func example/transitive/ops.NewBar(foo example/transitive/ops.Foo) example/transitive/ops.Bar
Func[1]: func example/transitive/ops.NewBaz(bar example/transitive/ops.Bar, qux example/transitive/ops.Qux) example/transitive/ops.Baz
Func[1]: func example/transitive/ops.NewFoo() (example/transitive/ops.Foo, error)
Func[1]: func example/transitive/ops.NewQux() (example/transitive/ops.Qux, error)
1 change: 1 addition & 0 deletions internal/testdata/transitive-testing_specBack.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
example/transitive/state.Backends[4]: example/transitive/ops.Bar, example/transitive/ops.Baz, example/transitive/ops.Foo, example/transitive/ops.Qux
Loading

0 comments on commit 1d19711

Please sign in to comment.