Skip to content

Commit a1b4d2b

Browse files
committed
Fix InterfaceDirRelative at top-level
Relates to #1133. This parameter, if provided at the package-level config or above, could cause mockery to crash. This happened because mockery was parsing the config templates for the package-level config even though none of these values were used. The solution was simple enough: just don't parse package-level configs.
1 parent 79c5300 commit a1b4d2b

File tree

11 files changed

+66
-34
lines changed

11 files changed

+66
-34
lines changed

.mockery_matryer.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
template: matryer
22
structname: "Moq{{.InterfaceName}}"
33
filename: "mocks_matryer_{{.SrcPackageName}}_test.go"
4-
54
all: true
65
template-data:
76
skip-ensure: False

.mockery_testify.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,8 @@ packages:
139139
configs:
140140
- structname: FunServerWithDifferentFile
141141
- structname: AnotherFunServerWithDifferentFile
142-
github.com/vektra/mockery/v3/internal/fixtures/constraint_ifaces:
142+
github.com/vektra/mockery/v3/internal/fixtures/constraint_ifaces:
143+
github.com/vektra/mockery/v3/internal/fixtures/interface_dir_relative:
144+
config:
145+
dir: '{{.InterfaceDir}}/{{ replaceAll "internal/" "" (index (splitAfterN "/" 2 .InterfaceDirRelative) 0) }}/mocks/{{index (splitAfterN "/" 2 .InterfaceDirRelative) 1}}'
146+
filename: "mocks_{{.InterfaceName}}.go"

config/config.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,13 @@ func (c *Config) ParseTemplates(
653653
workingDir = filepath.ToSlash(workingDir)
654654
ifaceFilePath = filepath.ToSlash(filepath.Clean(ifaceFilePath))
655655
interfaceDirPath := filepath.ToSlash(filepath.Dir(ifaceFilePath))
656-
interfaceDirRelativePath, err := filepath.Rel(filepath.FromSlash(workingDir), filepath.FromSlash(interfaceDirPath))
656+
configPathAbs, err := filepath.Abs(*c.ConfigFile)
657+
if err != nil {
658+
return fmt.Errorf("getting absolute path of config file: %w", err)
659+
}
660+
configPathDir := filepath.ToSlash(filepath.Dir(configPathAbs))
661+
662+
interfaceDirRelativePath, err := filepath.Rel(filepath.FromSlash(configPathDir), filepath.FromSlash(interfaceDirPath))
657663

658664
var interfaceDirRelative string
659665

@@ -663,6 +669,7 @@ func (c *Config) ParseTemplates(
663669
Str("working-dir", workingDir).
664670
Str("interfaceDirPath", interfaceDirPath).
665671
Str("interface-dir-relative-path", interfaceDirRelativePath).
672+
Str("iface-file-path", ifaceFilePath).
666673
Msg("can't make path relative to working dir, setting to './'")
667674
interfaceDirRelative = "."
668675
} else {
@@ -672,7 +679,7 @@ func (c *Config) ParseTemplates(
672679
Str("interfaceDirPath", interfaceDirPath).
673680
Str("interface-dir-relative-path", interfaceDirRelativePath).
674681
Msg("found relative path")
675-
interfaceDirRelative = interfaceDirRelativePath
682+
interfaceDirRelative = interfaceDirRelativePath + "/"
676683
}
677684

678685
// data is the struct sent to the template parser
@@ -723,6 +730,7 @@ func (c *Config) ParseTemplates(
723730
}
724731
var parsedBuffer bytes.Buffer
725732

733+
log.Debug().Str("template-data", fmt.Sprintf("%+v", data)).Msg("executing template with data")
726734
if err := attributeTempl.Execute(&parsedBuffer, data); err != nil {
727735
return fmt.Errorf("failed to execute %s template: %w", name, err)
728736
}

internal/cmd/mockery.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -304,18 +304,20 @@ func (r *RootApp) Run() error {
304304
ifaceConfig.InPackage,
305305
*ifaceConfig.RequireTemplateSchemaExists,
306306
)
307-
log.Debug().Str("file-path", filePath).Msg("creating new interface collection")
307+
ifaceLog.Debug().Str("file-path", filePath).Msg("creating new interface collection")
308308
}
309+
ifaceWithTypes := internal.NewInterface(
310+
iface.Name,
311+
iface.TypeSpec,
312+
iface.GenDecl,
313+
iface.FilePath,
314+
iface.FileSyntax,
315+
iface.Pkg,
316+
ifaceConfig)
317+
ifaceLog.Debug().Str("ifaceWithTypes", fmt.Sprintf("%+v", ifaceWithTypes)).Msg("created iface with types")
309318
if err := mockFileToInterfaces[filePath].Append(
310319
ctx,
311-
internal.NewInterface(
312-
iface.Name,
313-
iface.TypeSpec,
314-
iface.GenDecl,
315-
iface.FilePath,
316-
iface.FileSyntax,
317-
iface.Pkg,
318-
ifaceConfig),
320+
ifaceWithTypes,
319321
); err != nil {
320322
return err
321323
}
@@ -326,15 +328,10 @@ func (r *RootApp) Run() error {
326328
fileLog := log.With().Str("file", outFilePath).Logger()
327329
fileCtx := fileLog.WithContext(ctx)
328330

329-
fileLog.Debug().Int("interfaces-in-file-len", len(collection.interfaces)).Msgf("%v", collection)
330-
331331
packageConfig, err := r.Config.GetPackageConfig(fileCtx, collection.config.SrcPkgPath)
332332
if err != nil {
333333
return err
334334
}
335-
if err := packageConfig.Config.ParseTemplates(ctx, "", "", collection.srcPkg); err != nil {
336-
return err
337-
}
338335

339336
interfacesInFileDir := filepath.ToSlash(filepath.Dir(collection.config.OutFilePath))
340337
generator, err := pkg.NewTemplateGenerator(

internal/fixtures/directive_comments/mocks_matryer_directive_comments_test.go

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

internal/fixtures/directive_comments/mocks_testify_directive_comments_test.go

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

internal/fixtures/directive_comments/server_with_different_file.go

Lines changed: 2 additions & 1 deletion
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 interfacedirrelative
2+
3+
type Foo interface {
4+
Bar() string
5+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package interfacedirrelative
2+
3+
import (
4+
"testing"
5+
6+
mocks "github.com/vektra/mockery/v3/internal/fixtures/interface_dir_relative/mocks/fixtures/interface_dir_relative"
7+
)
8+
9+
func TestFoo(t *testing.T) {
10+
m := mocks.NewMockFoo(t)
11+
m.EXPECT().Bar().Return("foo")
12+
if m.Bar() != "foo" {
13+
t.Errorf("expected foo but got %s", m.Bar())
14+
}
15+
}

internal/fixtures/recursive_generation/subpkg_with_only_autogenerated_files/mocks_testify_subpkg_with_only_autogenerated_files_test.go renamed to internal/fixtures/interface_dir_relative/mocks/fixtures/interface_dir_relative/mocks_Foo.go

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

0 commit comments

Comments
 (0)