Skip to content

Commit 94c721d

Browse files
authored
Merge pull request #1029 from LandonTClipp/LandonTClipp/issue_1019
Fix mockery reading auto-generated files
2 parents 5367bbf + 6debd3a commit 94c721d

File tree

10 files changed

+154
-22
lines changed

10 files changed

+154
-22
lines changed

.mockery_testify.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,19 @@ packages:
7474
github.com/vektra/mockery/v3/internal/fixtures/example_project:
7575
github.com/vektra/mockery/v3/internal/fixtures/index_list_expr:
7676
github.com/vektra/mockery/v3/internal/fixtures/iface_new_type:
77+
github.com/vektra/mockery/v3/internal/fixtures/auto_generated_skip:
7778
github.com/vektra/mockery/v3/internal/fixtures/type_alias:
7879
io:
7980
config:
8081
all: True
8182
dir: internal/fixtures/
8283
pkgname: test
84+
filename: mocks_io_test.go
8385
net/http:
8486
config:
8587
all: false
8688
dir: internal/fixtures/
8789
pkgname: test
90+
filename: mocks_net_http_test.go
8891
interfaces:
8992
ResponseWriter:

config/config.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package config
88

99
import (
10-
"bufio"
1110
"bytes"
1211
"context"
1312
"fmt"
@@ -568,24 +567,6 @@ func (c *Config) ShouldExcludeSubpkg(pkgPath string) bool {
568567
return false
569568
}
570569

571-
func IsAutoGenerated(path *pathlib.Path) (bool, error) {
572-
file, err := path.OpenFile(os.O_RDONLY)
573-
if err != nil {
574-
return false, stackerr.NewStackErr(err)
575-
}
576-
defer file.Close()
577-
scanner := bufio.NewScanner(file)
578-
for scanner.Scan() {
579-
text := scanner.Text()
580-
if strings.Contains(text, "DO NOT EDIT") {
581-
return true, nil
582-
} else if strings.HasPrefix(text, "package ") {
583-
break
584-
}
585-
}
586-
return false, nil
587-
}
588-
589570
var ErrInfiniteLoop = fmt.Errorf("infinite loop in template variables detected")
590571

591572
// ParseTemplates parses various templated strings

internal/fixtures/auto_generated_skip/auto_generated.go

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package autogeneratedskip
2+
3+
type Foo interface {
4+
Get() string
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package autogeneratedskip
2+
3+
import (
4+
"testing"
5+
6+
"github.com/chigopher/pathlib"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestFooExists(t *testing.T) {
12+
mockFile := pathlib.NewPath("./mocks_testify_autogeneratedskip_test.go")
13+
mockContents, err := mockFile.ReadFile()
14+
require.NoError(t, err)
15+
16+
assert.NotContains(t, string(mockContents), "func NewMockBar", "mock for type Bar was generated when it shouldn't have been because it's in an auto-generated file.")
17+
assert.Contains(t, string(mockContents), "func NewMockFoo")
18+
}

internal/fixtures/auto_generated_skip/mocks_testify_autogeneratedskip_test.go

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.
File renamed without changes.

internal/parse.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package internal
22

33
import (
4+
"bufio"
45
"context"
56
"errors"
7+
"fmt"
68
"go/ast"
79
"go/types"
10+
"os"
11+
"regexp"
812
"strings"
913

14+
"github.com/chigopher/pathlib"
1015
"github.com/rs/zerolog"
16+
"github.com/vektra/mockery/v3/internal/stackerr"
1117
"golang.org/x/tools/go/packages"
1218
)
1319

20+
var autoGeneratedRegex = regexp.MustCompile(`^\/\/ Code generated by .*; DO NOT EDIT(\.?)( )*$`)
21+
1422
type Parser struct {
1523
parserPackages []*types.Package
1624
conf packages.Config
@@ -61,6 +69,16 @@ func (p *Parser) ParsePackages(ctx context.Context, packageNames []string) ([]*I
6169
for fileIdx, file := range pkg.GoFiles {
6270
fileLog := pkgLog.With().Str("file", file).Logger()
6371
fileLog.Debug().Msg("found file")
72+
isGenerated, err := isAutoGenerated(pathlib.NewPath(file))
73+
if err != nil {
74+
return nil, fmt.Errorf("determining if file is auto-generated: %w", err)
75+
}
76+
if isGenerated {
77+
fileLog.Debug().Msg("file is auto-generated, skipping.")
78+
continue
79+
}
80+
fileLog.Debug().Msg("file is not auto-generated.")
81+
6482
fileCtx := fileLog.WithContext(pkgCtx)
6583

6684
fileSyntax := pkg.Syntax[fileIdx]
@@ -110,3 +128,21 @@ func (p *Parser) ParsePackages(ctx context.Context, packageNames []string) ([]*I
110128
}
111129
return interfaces, nil
112130
}
131+
132+
func isAutoGenerated(path *pathlib.Path) (bool, error) {
133+
file, err := path.OpenFile(os.O_RDONLY)
134+
if err != nil {
135+
return false, stackerr.NewStackErr(err)
136+
}
137+
defer file.Close()
138+
scanner := bufio.NewScanner(file)
139+
for scanner.Scan() {
140+
text := scanner.Text()
141+
if autoGeneratedRegex.MatchString(text) {
142+
return true, nil
143+
} else if strings.HasPrefix(text, "package ") {
144+
break
145+
}
146+
}
147+
return false, nil
148+
}

template/method_scope.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ type MethodScope struct {
2727
// scope. This includes import qualifiers, type names etc. This is used to prevent naming
2828
// collisions.
2929
visibleNames map[string]any
30-
imports map[string]*Package
3130
}
3231

3332
func NewMethodScope(r *Registry) *MethodScope {
@@ -36,7 +35,6 @@ func NewMethodScope(r *Registry) *MethodScope {
3635
vars: []*Var{},
3736
conflicted: map[string]bool{},
3837
visibleNames: map[string]any{},
39-
imports: map[string]*Package{},
4038
}
4139
for key := range r.importQualifiers {
4240
m.AddName(key)
@@ -214,7 +212,6 @@ func (m *MethodScope) NameExists(name string) bool {
214212
func (m *MethodScope) addImport(ctx context.Context, pkg TypesPackage, imports map[string]*Package) {
215213
imprt := m.registry.addImport(ctx, pkg)
216214
imports[pkg.Path()] = imprt
217-
m.imports[pkg.Path()] = imprt
218215
m.AddName(imprt.Qualifier())
219216
}
220217

@@ -226,7 +223,9 @@ func (m *MethodScope) populateImportNamedType(
226223
},
227224
imports map[string]*Package,
228225
) {
226+
log := zerolog.Ctx(ctx)
229227
if pkg := t.Obj().Pkg(); pkg != nil {
228+
log.Debug().Str("method", "populateImportNamedType").Str("pkg-path", pkg.Path()).Msg("adding import from var")
230229
m.addImport(ctx, pkg, imports)
231230
}
232231
// The imports of a Type with a TypeList must be added to the imports list

0 commit comments

Comments
 (0)