From 04ace5cb05238637a5b8ab60858c7b76cd1353aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Thu, 8 Aug 2024 18:30:15 +0200 Subject: [PATCH] refactor: interface for versioning strategy --- cmd/rp/cmd/run.go | 2 +- versioning.go | 6 +- versioning_test.go | 207 ++++++++++++++++++++++----------------------- 3 files changed, 106 insertions(+), 109 deletions(-) diff --git a/cmd/rp/cmd/run.go b/cmd/rp/cmd/run.go index 4b7c9e2..365c7e9 100644 --- a/cmd/rp/cmd/run.go +++ b/cmd/rp/cmd/run.go @@ -232,7 +232,7 @@ func reconcileReleasePR(ctx context.Context, forge rp.Forge, changesets []rp.Cha } versionBump := rp.VersionBumpFromChangesets(changesets) - nextVersion, err := releases.NextVersion(versionBump, releaseOverrides.NextVersionType) + nextVersion, err := rp.SemVerNextVersion(releases, versionBump, releaseOverrides.NextVersionType) if err != nil { return err } diff --git a/versioning.go b/versioning.go index 126e06f..77bb96f 100644 --- a/versioning.go +++ b/versioning.go @@ -13,7 +13,11 @@ type Releases struct { Stable *Tag } -func (r Releases) NextVersion(versionBump conventionalcommits.VersionBump, nextVersionType NextVersionType) (string, error) { +type VersioningStrategy = func(Releases, conventionalcommits.VersionBump, NextVersionType) (string, error) + +var _ VersioningStrategy = SemVerNextVersion + +func SemVerNextVersion(r Releases, versionBump conventionalcommits.VersionBump, nextVersionType NextVersionType) (string, error) { latest, err := parseSemverWithDefault(r.Latest) if err != nil { return "", fmt.Errorf("failed to parse latest version: %w", err) diff --git a/versioning_test.go b/versioning_test.go index 9319c63..d1846d8 100644 --- a/versioning_test.go +++ b/versioning_test.go @@ -10,23 +10,23 @@ import ( func TestReleases_NextVersion(t *testing.T) { type args struct { + releases Releases versionBump conventionalcommits.VersionBump nextVersionType NextVersionType } tests := []struct { - name string - releases Releases - args args - want string - wantErr assert.ErrorAssertionFunc + name string + args args + want string + wantErr assert.ErrorAssertionFunc }{ { name: "simple bump (major)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -35,12 +35,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "simple bump (minor)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -49,12 +48,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "simple bump (patch)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -63,12 +61,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "normal to prerelease (major)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeRC, }, @@ -77,12 +74,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "normal to prerelease (minor)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeRC, }, @@ -91,12 +87,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "normal to prerelease (patch)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeRC, }, @@ -105,11 +100,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease bump (major)", - releases: Releases{ - Latest: &Tag{Name: "v2.0.0-rc.0"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v2.0.0-rc.0"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeRC, }, @@ -118,11 +113,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease bump (minor)", - releases: Releases{ - Latest: &Tag{Name: "v1.2.0-rc.0"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.2.0-rc.0"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeRC, }, @@ -131,11 +126,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease bump (patch)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.2-rc.0"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.2-rc.0"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeRC, }, @@ -144,11 +139,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease different bump (major)", - releases: Releases{ - Latest: &Tag{Name: "v1.2.0-rc.0"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.2.0-rc.0"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeRC, }, @@ -157,11 +152,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease different bump (minor)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.2-rc.0"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.2-rc.0"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeRC, }, @@ -170,11 +165,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease to prerelease", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-alpha.2"}, - Stable: &Tag{Name: "v1.1.0"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-alpha.2"}, + Stable: &Tag{Name: "v1.1.0"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeRC, }, @@ -183,11 +178,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease to normal (explicit)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-alpha.2"}, - Stable: &Tag{Name: "v1.1.0"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-alpha.2"}, + Stable: &Tag{Name: "v1.1.0"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeNormal, }, @@ -196,11 +191,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "prerelease to normal (implicit)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-alpha.2"}, - Stable: &Tag{Name: "v1.1.0"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-alpha.2"}, + Stable: &Tag{Name: "v1.1.0"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -209,11 +204,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil tag (major)", - releases: Releases{ - Latest: nil, - Stable: nil, - }, args: args{ + releases: Releases{ + Latest: nil, + Stable: nil, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -222,11 +217,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil tag (minor)", - releases: Releases{ - Latest: nil, - Stable: nil, - }, args: args{ + releases: Releases{ + Latest: nil, + Stable: nil, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -235,11 +230,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil tag (patch)", - releases: Releases{ - Latest: nil, - Stable: nil, - }, args: args{ + releases: Releases{ + Latest: nil, + Stable: nil, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -248,11 +243,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil stable release (major)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-rc.0"}, - Stable: nil, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-rc.0"}, + Stable: nil, + }, versionBump: conventionalcommits.MajorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -261,12 +256,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil stable release (minor)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-rc.0"}, - Stable: nil, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-rc.0"}, + Stable: nil, + }, versionBump: conventionalcommits.MinorVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -275,12 +269,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "nil stable release (patch)", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-rc.0"}, - Stable: nil, - }, args: args{ - + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-rc.0"}, + Stable: nil, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeUndefined, }, @@ -290,11 +283,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "error on invalid tag semver", - releases: Releases{ - Latest: &Tag{Name: "foodazzle"}, - Stable: &Tag{Name: "foodazzle"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "foodazzle"}, + Stable: &Tag{Name: "foodazzle"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeRC, }, @@ -303,11 +296,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "error on invalid tag prerelease", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1-rc.foo"}, - Stable: &Tag{Name: "v1.1.1-rc.foo"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1-rc.foo"}, + Stable: &Tag{Name: "v1.1.1-rc.foo"}, + }, versionBump: conventionalcommits.PatchVersion, nextVersionType: NextVersionTypeRC, }, @@ -316,11 +309,11 @@ func TestReleases_NextVersion(t *testing.T) { }, { name: "error on invalid bump", - releases: Releases{ - Latest: &Tag{Name: "v1.1.1"}, - Stable: &Tag{Name: "v1.1.1"}, - }, args: args{ + releases: Releases{ + Latest: &Tag{Name: "v1.1.1"}, + Stable: &Tag{Name: "v1.1.1"}, + }, versionBump: conventionalcommits.UnknownVersion, nextVersionType: NextVersionTypeUndefined, @@ -331,11 +324,11 @@ func TestReleases_NextVersion(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := tt.releases.NextVersion(tt.args.versionBump, tt.args.nextVersionType) - if !tt.wantErr(t, err, fmt.Sprintf("Releases(%v, %v).NextVersion(%v, %v)", tt.releases.Latest, tt.releases.Stable, tt.args.versionBump, tt.args.nextVersionType)) { + got, err := SemVerNextVersion(tt.args.releases, tt.args.versionBump, tt.args.nextVersionType) + if !tt.wantErr(t, err, fmt.Sprintf("SemVerNextVersion(Releases(%v, %v), %v, %v)", tt.args.releases.Latest, tt.args.releases.Stable, tt.args.versionBump, tt.args.nextVersionType)) { return } - assert.Equalf(t, tt.want, got, "Releases(%v, %v).NextVersion(%v, %v)", tt.releases.Latest, tt.releases.Stable, tt.args.versionBump, tt.args.nextVersionType) + assert.Equalf(t, tt.want, got, "SemVerNextVersion(Releases(%v, %v), %v, %v)", tt.args.releases.Latest, tt.args.releases.Stable, tt.args.versionBump, tt.args.nextVersionType) }) } }