Skip to content

Commit 1b39bf5

Browse files
committedMar 18, 2025·
Added Prerelase and BuildMetadata getters for Version and RelaxedVersion
1 parent 3fe95ad commit 1b39bf5

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed
 

‎relaxed_version.go

+36
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,39 @@ func (v *RelaxedVersion) SortableString() string {
118118
}
119119
return ":" + string(v.customversion)
120120
}
121+
122+
// IsPrerelase returns true if the version is valid semver and has a pre-release part
123+
// otherwise it returns false.
124+
func (v *RelaxedVersion) IsPrerelase() bool {
125+
if v.version == nil {
126+
return false
127+
}
128+
return v.version.IsPrerelase()
129+
}
130+
131+
// Prerelease returns the pre-release part of the version if the version is valid semver
132+
// otherwise it returns an empty string.
133+
func (v *RelaxedVersion) Prerelease() string {
134+
if v.version == nil {
135+
return ""
136+
}
137+
return v.version.Prerelease()
138+
}
139+
140+
// HasBuildMetadata returns true if the version is valid semver and has a build metadata part
141+
// otherwise it returns false.
142+
func (v *RelaxedVersion) HasBuildMetadata() bool {
143+
if v.version == nil {
144+
return false
145+
}
146+
return v.version.HasBuildMetadata()
147+
}
148+
149+
// BuildMetadata returns the build metadata part of the version if the version is valid semver
150+
// otherwise it returns an empty string.
151+
func (v *RelaxedVersion) BuildMetadata() string {
152+
if v.version == nil {
153+
return ""
154+
}
155+
return v.version.BuildMetadata()
156+
}

‎version.go

+26
Original file line numberDiff line numberDiff line change
@@ -494,3 +494,29 @@ func (v *Version) SortableString() string {
494494
add(prerelease[start:])
495495
return res
496496
}
497+
498+
// IsPrerelase returns true if the version has a pre-release part
499+
func (v *Version) IsPrerelase() bool {
500+
return v.prerelease != v.patch
501+
}
502+
503+
// Prerelease returns the pre-release part of the version
504+
func (v *Version) Prerelease() string {
505+
if !v.IsPrerelase() {
506+
return ""
507+
}
508+
return v.raw[v.patch+1 : v.prerelease]
509+
}
510+
511+
// HasBuildMetadata returns true if the version has a build metadata part
512+
func (v *Version) HasBuildMetadata() bool {
513+
return v.build != v.prerelease
514+
}
515+
516+
// BuildMetadata returns the build metadata part of the version
517+
func (v *Version) BuildMetadata() string {
518+
if !v.HasBuildMetadata() {
519+
return ""
520+
}
521+
return v.raw[v.prerelease+1 : v.build]
522+
}

‎version_test.go

+56
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,59 @@ func TestCompareNumbers(t *testing.T) {
305305
testGreater("10", "1")
306306
testGreater("10", "2")
307307
}
308+
309+
func TestVersionGetters(t *testing.T) {
310+
type test struct {
311+
version string
312+
prerelease string
313+
build string
314+
}
315+
tests := []test{
316+
{"", "", ""},
317+
{"0", "", ""},
318+
{"1", "", ""},
319+
{"0.1", "", ""},
320+
{"1.1", "", ""},
321+
{"0.2.3", "", ""},
322+
{"1.2.3-aaa", "aaa", ""},
323+
{"0.2-aaa", "aaa", ""},
324+
{"1-aaa", "aaa", ""},
325+
{"0.2.3+bbb", "", "bbb"},
326+
{"1.3+bbb", "", "bbb"},
327+
{"0+bbb", "", "bbb"},
328+
{"1.2.3-aaa+bbb", "aaa", "bbb"},
329+
{"0.2-aaa+bbb", "aaa", "bbb"},
330+
{"1-aaa+bbb", "aaa", "bbb"},
331+
{"0.2.3-aaa.4.5.6+bbb.7.8.9", "aaa.4.5.6", "bbb.7.8.9"},
332+
}
333+
for _, tt := range tests {
334+
v := MustParse(tt.version)
335+
require.Equal(t, tt.version, v.String())
336+
require.Equal(t, tt.prerelease != "", v.IsPrerelase())
337+
require.Equal(t, tt.prerelease, v.Prerelease())
338+
require.Equal(t, tt.build != "", v.HasBuildMetadata())
339+
require.Equal(t, tt.build, v.BuildMetadata())
340+
r := ParseRelaxed(tt.version)
341+
require.Equal(t, tt.version, r.String())
342+
require.Equal(t, tt.prerelease != "", r.IsPrerelase())
343+
require.Equal(t, tt.prerelease, r.Prerelease())
344+
require.Equal(t, tt.build != "", r.HasBuildMetadata())
345+
require.Equal(t, tt.build, r.BuildMetadata())
346+
}
347+
relaxedTests := []test{
348+
{"asd", "", ""},
349+
{"123.123.123.123-123", "", ""},
350+
{"1.2.3-a@very@fancy@version", "", ""},
351+
}
352+
for _, tt := range relaxedTests {
353+
v, err := Parse(tt.version)
354+
require.Error(t, err, "should not parse %s", tt.version)
355+
require.Nil(t, v)
356+
r := ParseRelaxed(tt.version)
357+
require.Equal(t, tt.version, r.String())
358+
require.Equal(t, tt.prerelease != "", r.IsPrerelase())
359+
require.Equal(t, tt.prerelease, r.Prerelease())
360+
require.Equal(t, tt.build != "", r.HasBuildMetadata())
361+
require.Equal(t, tt.build, r.BuildMetadata())
362+
}
363+
}

0 commit comments

Comments
 (0)
Please sign in to comment.