Skip to content

Commit aad9264

Browse files
authored
refactor: replace BumpNextFunc/BumpByLabelFunc globals with VersionBumper interface (#221)
1 parent 96f839b commit aad9264

7 files changed

Lines changed: 122 additions & 58 deletions

File tree

internal/commands/bump/auto.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ import (
2020
var (
2121
tryInferBumpTypeFromCommitParserPluginFn = tryInferBumpTypeFromCommitParserPlugin
2222
tryInferBumpTypeFromChangelogParserPluginFn = tryInferBumpTypeFromChangelogParserPlugin
23+
24+
// newVersionBumper creates the VersionBumper used for auto bump operations.
25+
// Tests can override this to inject mock bumpers.
26+
newVersionBumper = func() semver.VersionBumper {
27+
return semver.NewDefaultBumper()
28+
}
2329
)
2430

2531
// autoCmd returns the "auto" subcommand.
@@ -155,7 +161,8 @@ func runSingleModuleAuto(ctx context.Context, cmd *cli.Command, cfg *config.Conf
155161
return fmt.Errorf("failed to read version: %w", err)
156162
}
157163

158-
next, err := getNextVersion(registry, current, label, disableInfer, since, until, isPreserveMeta)
164+
bumper := newVersionBumper()
165+
next, err := getNextVersion(bumper, registry, current, label, disableInfer, since, until, isPreserveMeta)
159166
if err != nil {
160167
return err
161168
}
@@ -213,6 +220,7 @@ func runSingleModuleAuto(ctx context.Context, cmd *cli.Command, cfg *config.Conf
213220
// commit inference, or default bump logic. It returns an error if bumping fails
214221
// or if an invalid label is specified.
215222
func getNextVersion(
223+
bumper semver.VersionBumper,
216224
registry *plugins.PluginRegistry,
217225
current semver.SemVersion,
218226
label string,
@@ -225,7 +233,7 @@ func getNextVersion(
225233

226234
switch label {
227235
case "patch", "minor", "major":
228-
next, err = semver.BumpByLabelFunc(current, label)
236+
next, err = bumper.BumpByLabel(current, label)
229237
if err != nil {
230238
return semver.SemVersion{}, fmt.Errorf("failed to bump version with label: %w", err)
231239
}
@@ -244,15 +252,15 @@ func getNextVersion(
244252
if current.PreRelease != "" {
245253
return promotePreRelease(current, preserveMeta), nil
246254
}
247-
next, err = semver.BumpByLabelFunc(current, inferred)
255+
next, err = bumper.BumpByLabel(current, inferred)
248256
if err != nil {
249257
return semver.SemVersion{}, fmt.Errorf("failed to bump inferred version: %w", err)
250258
}
251259
return next, nil
252260
}
253261
}
254262

255-
next, err = semver.BumpNextFunc(current)
263+
next, err = bumper.BumpNext(current)
256264
if err != nil {
257265
return semver.SemVersion{}, fmt.Errorf("failed to determine next version: %w", err)
258266
}

internal/commands/bump/bump_auto_test.go

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -248,16 +248,36 @@ func TestCLI_BumpAutoCmd_PromotePreReleaseWithPreserveMeta(t *testing.T) {
248248
}
249249
}
250250

251+
// mockBumper is a VersionBumper for testing that returns configurable results.
252+
type mockBumper struct {
253+
bumpNextErr error
254+
bumpByLabelErr error
255+
}
256+
257+
func (m mockBumper) BumpNext(v semver.SemVersion) (semver.SemVersion, error) {
258+
if m.bumpNextErr != nil {
259+
return semver.SemVersion{}, m.bumpNextErr
260+
}
261+
return semver.BumpNext(v)
262+
}
263+
264+
func (m mockBumper) BumpByLabel(v semver.SemVersion, label string) (semver.SemVersion, error) {
265+
if m.bumpByLabelErr != nil {
266+
return semver.SemVersion{}, m.bumpByLabelErr
267+
}
268+
return semver.BumpByLabel(v, label)
269+
}
270+
251271
func TestCLI_BumpAutoCmd_InferredBumpFails(t *testing.T) {
252272
tmp := t.TempDir()
253273
versionPath := testutils.WriteTempVersionFile(t, tmp, "1.2.3")
254274

255-
originalBumpByLabel := semver.BumpByLabelFunc
275+
originalBumperFactory := newVersionBumper
256276
originalInferFunc := tryInferBumpTypeFromCommitParserPluginFn
257277

258-
// Force BumpByLabelFunc to fail
259-
semver.BumpByLabelFunc = func(v semver.SemVersion, label string) (semver.SemVersion, error) {
260-
return semver.SemVersion{}, fmt.Errorf("forced inferred bump failure")
278+
// Force BumpByLabel to fail via mock bumper
279+
newVersionBumper = func() semver.VersionBumper {
280+
return mockBumper{bumpByLabelErr: fmt.Errorf("forced inferred bump failure")}
261281
}
262282

263283
// Force inference to return something
@@ -266,7 +286,7 @@ func TestCLI_BumpAutoCmd_InferredBumpFails(t *testing.T) {
266286
}
267287

268288
t.Cleanup(func() {
269-
semver.BumpByLabelFunc = originalBumpByLabel
289+
newVersionBumper = originalBumperFactory
270290
tryInferBumpTypeFromCommitParserPluginFn = originalInferFunc
271291
})
272292

@@ -435,12 +455,12 @@ func TestCLI_BumpAutoCmd_BumpNextFails(t *testing.T) {
435455
tmp := t.TempDir()
436456
versionPath := testutils.WriteTempVersionFile(t, tmp, "1.2.3")
437457

438-
original := semver.BumpNextFunc
439-
semver.BumpNextFunc = func(v semver.SemVersion) (semver.SemVersion, error) {
440-
return semver.SemVersion{}, fmt.Errorf("forced BumpNext failure")
458+
originalBumperFactory := newVersionBumper
459+
newVersionBumper = func() semver.VersionBumper {
460+
return mockBumper{bumpNextErr: fmt.Errorf("forced BumpNext failure")}
441461
}
442462
t.Cleanup(func() {
443-
semver.BumpNextFunc = original
463+
newVersionBumper = originalBumperFactory
444464
})
445465

446466
// Prepare and run the CLI command
@@ -524,12 +544,12 @@ func TestCLI_BumpAutoCmd_BumpByLabelFails(t *testing.T) {
524544
tmp := t.TempDir()
525545
versionPath := testutils.WriteTempVersionFile(t, tmp, "1.2.3")
526546

527-
original := semver.BumpByLabelFunc
528-
semver.BumpByLabelFunc = func(v semver.SemVersion, label string) (semver.SemVersion, error) {
529-
return semver.SemVersion{}, fmt.Errorf("boom")
547+
originalBumperFactory := newVersionBumper
548+
newVersionBumper = func() semver.VersionBumper {
549+
return mockBumper{bumpByLabelErr: fmt.Errorf("boom")}
530550
}
531551
t.Cleanup(func() {
532-
semver.BumpByLabelFunc = original
552+
newVersionBumper = originalBumperFactory
533553
})
534554

535555
// Prepare and run the CLI command
@@ -652,7 +672,8 @@ func TestGetNextVersion(t *testing.T) {
652672
for _, tt := range tests {
653673
t.Run(tt.name, func(t *testing.T) {
654674
registry := plugins.NewPluginRegistry()
655-
result, err := getNextVersion(registry, tt.current, tt.label, tt.disableInfer, "", "", false)
675+
bumper := semver.NewDefaultBumper()
676+
result, err := getNextVersion(bumper, registry, tt.current, tt.label, tt.disableInfer, "", "", false)
656677
if tt.expectError {
657678
if err == nil {
658679
t.Error("expected error, got nil")

internal/commands/bump/multimodule.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ func runMultiModuleBump(
2626
preserveMetadata bool,
2727
) error {
2828
fs := core.NewOSFileSystem()
29-
operation := operations.NewBumpOperation(fs, bumpType, preRelease, metadata, preserveMetadata)
29+
bumper := newVersionBumper()
30+
operation := operations.NewBumpOperation(fs, bumper, bumpType, preRelease, metadata, preserveMetadata)
3031

3132
// Create executor with options from flags
3233
parallel := cmd.Bool("parallel")

internal/operations/bump.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ const (
2525
// BumpOperation performs a version bump on a module.
2626
type BumpOperation struct {
2727
fs core.FileSystem
28+
bumper semver.VersionBumper
2829
bumpType BumpType
2930
preRelease string
3031
metadata string
3132
preserveMetadata bool
3233
}
3334

3435
// NewBumpOperation creates a new bump operation.
35-
func NewBumpOperation(fs core.FileSystem, bumpType BumpType, preRelease, metadata string, preserveMetadata bool) *BumpOperation {
36+
func NewBumpOperation(fs core.FileSystem, bumper semver.VersionBumper, bumpType BumpType, preRelease, metadata string, preserveMetadata bool) *BumpOperation {
3637
return &BumpOperation{
3738
fs: fs,
39+
bumper: bumper,
3840
bumpType: bumpType,
3941
preRelease: preRelease,
4042
metadata: metadata,
@@ -135,7 +137,7 @@ func (op *BumpOperation) bumpRelease(current semver.SemVersion) semver.SemVersio
135137
}
136138

137139
func (op *BumpOperation) bumpAuto(current semver.SemVersion) (semver.SemVersion, error) {
138-
newVer, err := semver.BumpNextFunc(current)
140+
newVer, err := op.bumper.BumpNext(current)
139141
if err != nil {
140142
return semver.SemVersion{}, fmt.Errorf("auto bump failed: %w", err)
141143
}

0 commit comments

Comments
 (0)