diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 551f3ce..bb59176 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest env: GO_VERSION: stable - GOLANGCI_LINT_VERSION: v1.62.0 + GOLANGCI_LINT_VERSION: v2.3.0 CGO_ENABLED: 0 steps: diff --git a/.golangci.yml b/.golangci.yml index 4bdaa01..e95ffb9 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,65 +1,65 @@ +version: "2" + run: timeout: 10m -linters-settings: - govet: - enable-all: true - disable: - - fieldalignment - gocyclo: - min-complexity: 15 - goconst: - min-len: 5 - min-occurrences: 3 - misspell: - locale: US - funlen: - lines: -1 - statements: 50 - godox: - keywords: - - FIXME - gofumpt: - extra-rules: true - depguard: - rules: - main: - deny: - - pkg: "github.com/instana/testify" - desc: not allowed - - pkg: "github.com/pkg/errors" - desc: Should be replaced by standard lib errors package - gocritic: - enabled-tags: - - diagnostic - - style - - performance - disabled-checks: - - sloppyReassign - - rangeValCopy - - octalLiteral - - paramTypeCombine # already handle by gofumpt.extra-rules - - unnamedResult - - hugeParam - tagliatelle: - case: +linters: + settings: + govet: + enable-all: true + disable: + - fieldalignment + gocyclo: + min-complexity: 15 + goconst: + min-len: 5 + min-occurrences: 3 + misspell: + locale: US + funlen: + lines: -1 + statements: 50 + godox: + keywords: + - FIXME + depguard: rules: - json: pascal - gosec: - excludes: - - G304 - - G306 + main: + deny: + - pkg: "github.com/instana/testify" + desc: not allowed + - pkg: "github.com/pkg/errors" + desc: Should be replaced by standard lib errors package + gocritic: + enabled-tags: + - diagnostic + - style + - performance + disabled-checks: + - sloppyReassign + - rangeValCopy + - octalLiteral + - paramTypeCombine # already handle by gofumpt.extra-rules + - unnamedResult + - hugeParam + tagliatelle: + case: + rules: + json: pascal + gosec: + excludes: + - G304 + - G306 -linters: - enable-all: true + default: all disable: - - exportloopref # deprecated - sqlclosecheck # not relevant (SQL) - rowserrcheck # not relevant (SQL) - cyclop # duplicate of gocyclo - lll - dupl - wsl + - wsl_v5 - nlreturn - mnd - err113 @@ -78,17 +78,25 @@ linters: - errchkjson - contextcheck + exclusions: + warn-unused: true + rules: + - text: fmt.Sprintf can be replaced with string + linters: + - perfsprint + issues: - exclude-use-default: false max-issues-per-linter: 0 max-same-issues: 0 - exclude: - - 'fmt.Sprintf can be replaced with string' - exclude-rules: - - path: .*_test.go - linters: - - funlen - - noctx + +formatters: + enable: + - gci + - gofumpt + + settings: + gofumpt: + extra-rules: true output: show-stats: true diff --git a/Makefile b/Makefile index 97b7323..0c366d5 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ default: clean lint test build lint: - golangci-lint run + go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.0 run clean: rm -rf cover.out diff --git a/go.mod b/go.mod index 9e66051..183661a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/traefik/mocktail -go 1.23.0 +go 1.24 require ( github.com/ettle/strcase v0.2.0 diff --git a/mocktail.go b/mocktail.go index 8370945..e45bb13 100644 --- a/mocktail.go +++ b/mocktail.go @@ -4,6 +4,7 @@ package main import ( "bufio" "bytes" + "context" "flag" "fmt" "go/format" @@ -42,7 +43,9 @@ type InterfaceDesc struct { } func main() { - info, err := getModuleInfo(os.Getenv("MOCKTAIL_TEST_PATH")) + ctx := context.Background() + + info, err := getModuleInfo(ctx, os.Getenv("MOCKTAIL_TEST_PATH")) if err != nil { log.Fatal("get module path", err) } diff --git a/mocktail_test.go b/mocktail_test.go index c6968bc..b99445f 100644 --- a/mocktail_test.go +++ b/mocktail_test.go @@ -29,7 +29,7 @@ func TestMocktail(t *testing.T) { t.Setenv("MOCKTAIL_TEST_PATH", filepath.Join(testRoot, entry.Name())) - output, err := exec.Command("go", "run", ".").CombinedOutput() + output, err := exec.CommandContext(t.Context(), "go", "run", ".").CombinedOutput() t.Log(string(output)) require.NoError(t, err) @@ -61,7 +61,7 @@ func TestMocktail(t *testing.T) { continue } - cmd := exec.Command("go", "test", "-v", "./...") + cmd := exec.CommandContext(t.Context(), "go", "test", "-v", "./...") cmd.Dir = filepath.Join(testRoot, entry.Name()) output, err := cmd.CombinedOutput() @@ -88,7 +88,7 @@ func TestMocktail_exported(t *testing.T) { t.Setenv("MOCKTAIL_TEST_PATH", filepath.Join(testRoot, entry.Name())) - output, err := exec.Command("go", "run", ".", "-e").CombinedOutput() + output, err := exec.CommandContext(t.Context(), "go", "run", ".", "-e").CombinedOutput() t.Log(string(output)) require.NoError(t, err) @@ -120,7 +120,7 @@ func TestMocktail_exported(t *testing.T) { continue } - cmd := exec.Command("go", "test", "-v", "./...") + cmd := exec.CommandContext(t.Context(), "go", "test", "-v", "./...") cmd.Dir = filepath.Join(testRoot, entry.Name()) output, err := cmd.CombinedOutput() diff --git a/mod.go b/mod.go index 11f58b3..e642f5c 100644 --- a/mod.go +++ b/mod.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -16,9 +17,9 @@ type modInfo struct { Main bool `json:"Main"` } -func getModuleInfo(dir string) (modInfo, error) { +func getModuleInfo(ctx context.Context, dir string) (modInfo, error) { // https://github.com/golang/go/issues/44753#issuecomment-790089020 - cmd := exec.Command("go", "list", "-m", "-json") + cmd := exec.CommandContext(ctx, "go", "list", "-m", "-json") if dir != "" { cmd.Dir = dir } diff --git a/syrup.go b/syrup.go index a070135..7d9f6a0 100644 --- a/syrup.go +++ b/syrup.go @@ -98,6 +98,36 @@ type Syrup struct { Signature *types.Signature } +// Call generates mock.Call wrapper. +func (s Syrup) Call(writer io.Writer, methods []*types.Func) error { + err := s.callBase(writer) + if err != nil { + return err + } + + err = s.typedReturns(writer) + if err != nil { + return err + } + + err = s.returnsFn(writer) + if err != nil { + return err + } + + err = s.typedRun(writer) + if err != nil { + return err + } + + err = s.callMethodsOn(writer, methods) + if err != nil { + return err + } + + return s.callMethodOnRaw(writer, methods) +} + // MockMethod generates method mocks. func (s Syrup) MockMethod(writer io.Writer) error { err := s.mockedMethod(writer) @@ -312,36 +342,6 @@ func (s Syrup) methodOnRaw(writer io.Writer) error { return w.Err() } -// Call generates mock.Call wrapper. -func (s Syrup) Call(writer io.Writer, methods []*types.Func) error { - err := s.callBase(writer) - if err != nil { - return err - } - - err = s.typedReturns(writer) - if err != nil { - return err - } - - err = s.returnsFn(writer) - if err != nil { - return err - } - - err = s.typedRun(writer) - if err != nil { - return err - } - - err = s.callMethodsOn(writer, methods) - if err != nil { - return err - } - - return s.callMethodOnRaw(writer, methods) -} - func (s Syrup) callBase(writer io.Writer) error { base := template.New("templateCallBase").Funcs(template.FuncMap{ "ToGoCamel": strcase.ToGoCamel,