diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c1de72..fe1b0c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: test: strategy: matrix: - go-version: [ 1.20.x, 1.21.x ] + go-version: [ 1.20.x, 1.21.x, 1.22.x ] platform: [ ubuntu-latest, macos-latest, windows-latest ] runs-on: ${{ matrix.platform }} steps: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7924c6c..2a9902c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,12 +19,13 @@ jobs: uses: actions/setup-go@v5 with: go-version-file: 'go.mod' - - - name: Docker Login - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} +# Disabled until we figure out docker hub publishing +# - +# name: Docker Login +# uses: docker/login-action@v1 +# with: +# username: ${{ secrets.DOCKERHUB_USERNAME }} +# password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Run GoReleaser uses: goreleaser/goreleaser-action@v5 diff --git a/.gitignore b/.gitignore index 4286ad6..f79a524 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,6 @@ # OS X .DS_Store -.history \ No newline at end of file +.history + +/dist diff --git a/.goreleaser.yml b/.goreleaser.yml index 3435725..8612538 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -3,6 +3,9 @@ before: hooks: - go mod download +universal_binaries: + - replace: true + builds: - binary: reinforcer main: ./cmd/reinforcer/main.go @@ -16,17 +19,20 @@ builds: - darwin goarch: - amd64 + - arm64 + ignore: + - goos: linux + goarch: arm + - goos: windows + goarch: arm64 archives: - - replacements: - darwin: Darwin - linux: Linux - windows: Windows - 386: i386 - amd64: x86_64 - files: + - files: - README.md - LICENSE + format_overrides: + - goos: windows + format: zip checksum: name_template: "checksum.txt" @@ -37,30 +43,33 @@ snapshot: changelog: sort: asc -dockers: - - goos: linux - goarch: amd64 - ids: - - reinforcer - image_templates: - - 'clear-street/reinforcer:{{ .Tag }}' - - 'clear-street/reinforcer:v{{ .Major }}' - - 'clear-street/reinforcer:v{{ .Major }}.{{ .Minor }}' - - 'clear-street/reinforcer:latest' - build_flag_templates: - - "--pull" - - "--label=org.opencontainers.image.created={{.Date}}" - - "--label=org.opencontainers.image.name={{.ProjectName}}" - - "--label=org.opencontainers.image.revision={{.FullCommit}}" - - "--label=org.opencontainers.image.version={{.Version}}" - - "--label=org.opencontainers.image.source={{.GitURL}}" +# Disabled until we figure out docker hub publishing +#dockers: +# - goos: linux +# goarch: amd64 +# ids: +# - reinforcer +# image_templates: +# - 'clear-street/reinforcer:{{ .Tag }}' +# - 'clear-street/reinforcer:v{{ .Major }}' +# - 'clear-street/reinforcer:v{{ .Major }}.{{ .Minor }}' +# - 'clear-street/reinforcer:latest' +# build_flag_templates: +# - "--pull" +# - "--label=org.opencontainers.image.created={{.Date}}" +# - "--label=org.opencontainers.image.name={{.ProjectName}}" +# - "--label=org.opencontainers.image.revision={{.FullCommit}}" +# - "--label=org.opencontainers.image.version={{.Version}}" +# - "--label=org.opencontainers.image.source={{.GitURL}}" + -brews: - - homepage: https://github.com/clear-street/reinforcer - description: "Codegen tool for easy adoption of resiliency patterns in Go" - tap: - owner: clear-street - name: homebrew-reinforcer - folder: Formula - test: | - system "#{bin}/reinforcer --version" +# Disabled until we figure out brew publishing +#brews: +# - homepage: https://github.com/clear-street/reinforcer +# description: "Codegen tool for easy adoption of resiliency patterns in Go" +# tap: +# owner: clear-street +# name: homebrew-reinforcer +# folder: Formula +# test: | +# system "#{bin}/reinforcer --version" diff --git a/internal/generator/generator.go b/internal/generator/generator.go index df61a13..1eabbea 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -77,17 +77,10 @@ type statement interface { Statement() (*jen.Statement, error) } -type fileMeta struct { - fileConfig *FileConfig - methods []*method.Method -} - // Generated contains the code generation out for all the processed types type Generated struct { // Common is the golang code that is shared across all generated types Common string - // Constants is the golang code that holds constants for compile-time safe references to the proxied methods - Constants string // Files is the golang code that was generated for every type that was processed Files []*GeneratedFile } @@ -107,8 +100,6 @@ func Generate(cfg Config) (*Generated, error) { Common: c, } - var fileMethods []*fileMeta - for _, fileConfig := range cfg.Files { methods := fileConfig.methods s, err := generateFile(cfg.OutPkg, cfg.IgnoreNoReturnMethods, fileConfig, methods) @@ -119,15 +110,8 @@ func Generate(cfg Config) (*Generated, error) { TypeName: fileConfig.outTypeName, Contents: s, }) - fileMethods = append(fileMethods, &fileMeta{fileConfig: fileConfig, methods: methods}) } - consts, err := generateConstants(cfg.OutPkg, fileMethods) - if err != nil { - return nil, err - } - gen.Constants = consts - return gen, nil } @@ -137,6 +121,25 @@ func generateFile(outPkg string, ignoreNoReturnMethods bool, fileCfg *FileConfig f := jen.NewFile(outPkg) f.HeaderComment(fileHeader) + // Compile-time constants + var fields []jen.Code + var constantAssign []jen.Code + for _, m := range methods { + fields = append(fields, jen.Id(m.Name).Id("string")) + constantAssign = append(constantAssign, jen.Id(m.Name).Op(":").Lit(m.Name).Op(",")) + } + + constObjName := fmt.Sprintf("%sMethods", fileCfg.outTypeName) + log.Debug().Msgf("Adding constants for type %s", fileCfg.outTypeName) + f.Add(jen.Comment(fmt.Sprintf("%s are the methods in %s", constObjName, fileCfg.outTypeName))) + f.Add( + jen.Var().Id(constObjName).Op("=").Struct( + fields..., + ).Block( + constantAssign..., + ), + ) + // Declare the target interface we are proxying var declMethods []jen.Code for _, meth := range methods { @@ -251,33 +254,6 @@ func generateCommon(outPkg string) (string, error) { return renderToString(f) } -func generateConstants(outPkg string, meta []*fileMeta) (string, error) { - f := jen.NewFile(outPkg) - f.HeaderComment(fileHeader) - - for _, fm := range meta { - var fields []jen.Code - var constantAssign []jen.Code - for _, m := range fm.methods { - fields = append(fields, jen.Id(m.Name).Id("string")) - constantAssign = append(constantAssign, jen.Id(m.Name).Op(":").Lit(m.Name).Op(",")) - } - - constObjName := fmt.Sprintf("%sMethods", fm.fileConfig.outTypeName) - log.Debug().Msgf("Adding constants for type %s", fm.fileConfig.outTypeName) - f.Add(jen.Comment(fmt.Sprintf("%s are the methods in %s", constObjName, fm.fileConfig.outTypeName))) - f.Add( - jen.Var().Id(constObjName).Op("=").Struct( - fields..., - ).Block( - constantAssign..., - ), - ) - } - - return renderToString(f) -} - func renderToString(f *jen.File) (string, error) { b := &bytes.Buffer{} if err := f.Render(b); err != nil { diff --git a/internal/generator/generator_test.go b/internal/generator/generator_test.go index fb94b64..6b5d08d 100644 --- a/internal/generator/generator_test.go +++ b/internal/generator/generator_test.go @@ -75,10 +75,15 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import "context" + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { A string @@ -87,15 +92,6 @@ var GeneratedServiceMethods = struct { A: "A", B: "B", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import "context" type targetService interface { A(ctx context.Context) error @@ -220,10 +216,18 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import ( + "context" + unresilient "github.com/clear-street/fake/unresilient" +) + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { A string @@ -240,18 +244,6 @@ var GeneratedServiceMethods = struct { GetUserID2: "GetUserID2", HasVariadic: "HasVariadic", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import ( - "context" - unresilient "github.com/clear-street/fake/unresilient" -) type targetService interface { A() @@ -420,10 +412,15 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import "context" + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { A string @@ -432,15 +429,6 @@ var GeneratedServiceMethods = struct { A: "A", B: "B", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import "context" type targetService interface { A() @@ -544,17 +532,6 @@ func WithRetryableErrorPredicate(fn func(string, error) bool) Option { func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context) error) error { return b.runnerFactory.GetRunner(name).Run(ctx, fn) } -`, - Constants: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -// GeneratedServiceMethods are the methods in GeneratedService -var GeneratedServiceMethods = struct { - SaveUser string -}{ - SaveUser: "SaveUser", -} `, Files: []*generator.GeneratedFile{ { @@ -568,6 +545,13 @@ import ( unresilient "github.com/clear-street/fake/unresilient" ) +// GeneratedServiceMethods are the methods in GeneratedService +var GeneratedServiceMethods = struct { + SaveUser string +}{ + SaveUser: "SaveUser", +} + type targetService interface { SaveUser(arg0 *unresilient.T) error } @@ -664,10 +648,15 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import "context" + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { ReceiveDir string @@ -678,15 +667,6 @@ var GeneratedServiceMethods = struct { SendDir: "SendDir", SendReceiveDir: "SendReceiveDir", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import "context" type targetService interface { ReceiveDir(arg0 <-chan error) error @@ -817,25 +797,21 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import "context" + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { SayHello string }{ SayHello: "SayHello", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import "context" type targetService interface { SayHello(arg0 string) error @@ -933,10 +909,15 @@ func (b *base) run(ctx context.Context, name string, fn func(ctx context.Context return b.runnerFactory.GetRunner(name).Run(ctx, fn) } `, - Constants: `// Code generated by reinforcer, DO NOT EDIT. + Files: []*generator.GeneratedFile{ + { + TypeName: "GeneratedService", + Contents: `// Code generated by reinforcer, DO NOT EDIT. package resilient +import "context" + // GeneratedServiceMethods are the methods in GeneratedService var GeneratedServiceMethods = struct { DoNothing string @@ -945,15 +926,6 @@ var GeneratedServiceMethods = struct { DoNothing: "DoNothing", SayHello: "SayHello", } -`, - Files: []*generator.GeneratedFile{ - { - TypeName: "GeneratedService", - Contents: `// Code generated by reinforcer, DO NOT EDIT. - -package resilient - -import "context" type targetService[T any] interface { DoNothing() @@ -1025,7 +997,6 @@ func (g *GeneratedService[T]) SayHello(arg0 T) error { require.NoError(t, err) require.NotNil(t, got) - require.Equal(t, tt.outCode.Constants, got.Constants) require.Equal(t, tt.outCode.Common, got.Common) for idx, genFile := range got.Files { diff --git a/internal/writer/writer.go b/internal/writer/writer.go index 9162811..5f317f8 100644 --- a/internal/writer/writer.go +++ b/internal/writer/writer.go @@ -33,10 +33,6 @@ func (w *Writer) Write(outputDirectory string, generated *generator.Generated) e return err } - if err := w.writeTo(path.Join(outputDirectory, "reinforcer_constants.go"), generated.Constants); err != nil { - return err - } - for _, codegen := range generated.Files { filePath := path.Join(outputDirectory, w.fileNameStrategy.GenerateFileName(codegen.TypeName)+".go") if err := w.writeTo(filePath, codegen.Contents); err != nil { diff --git a/internal/writer/writer_test.go b/internal/writer/writer_test.go index 36d3179..f193d46 100644 --- a/internal/writer/writer_test.go +++ b/internal/writer/writer_test.go @@ -19,12 +19,6 @@ func TestWriter_Write(t *testing.T) { package mytestpackage // Common Code Here -`, - Constants: `// Code generated by reinforcer, DO NOT EDIT. - -package mytestpackage - -// Constants Here `, Files: []*generator.GeneratedFile{ { @@ -33,6 +27,8 @@ package mytestpackage package mytestpackage +// Constants Here + // Proxy Code Here `, }, @@ -50,10 +46,6 @@ package mytestpackage package mytestpackage // Constants Here -`, bop.Buffers["testing/reinforcer_constants.go"].String()) - require.Equal(t, `// Code generated by reinforcer, DO NOT EDIT. - -package mytestpackage // Proxy Code Here `, bop.Buffers["testing/generated_service.go"].String())