Skip to content

Commit bc29313

Browse files
authored
Merge pull request #26 from bugst/getters
Added Prerelase and BuildMetadata getters for Version and RelaxedVersion
2 parents a3a0359 + 1b39bf5 commit bc29313

File tree

5 files changed

+150
-32
lines changed

5 files changed

+150
-32
lines changed

parser.go

-32
Original file line numberDiff line numberDiff line change
@@ -279,35 +279,3 @@ func parse(result *Version) error {
279279
}
280280
return fmt.Errorf("invalid separator: '%c'", curr)
281281
}
282-
283-
func (v *Version) majorString() string {
284-
return v.raw[:v.major]
285-
}
286-
287-
func (v *Version) minorString() string {
288-
if v.minor > v.major {
289-
return v.raw[v.major+1 : v.minor]
290-
}
291-
return ""
292-
}
293-
294-
func (v *Version) patchString() string {
295-
if v.patch > v.minor {
296-
return v.raw[v.minor+1 : v.patch]
297-
}
298-
return ""
299-
}
300-
301-
func (v *Version) prereleaseString() string {
302-
if v.prerelease > v.patch {
303-
return v.raw[v.patch+1 : v.prerelease]
304-
}
305-
return ""
306-
}
307-
308-
func (v *Version) buildString() string {
309-
if v.build > v.prerelease {
310-
return v.raw[v.prerelease+1 : v.build]
311-
}
312-
return ""
313-
}

parser_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,38 @@ import (
1313
"github.com/stretchr/testify/require"
1414
)
1515

16+
func (v *Version) majorString() string {
17+
return v.raw[:v.major]
18+
}
19+
20+
func (v *Version) minorString() string {
21+
if v.minor > v.major {
22+
return v.raw[v.major+1 : v.minor]
23+
}
24+
return ""
25+
}
26+
27+
func (v *Version) patchString() string {
28+
if v.patch > v.minor {
29+
return v.raw[v.minor+1 : v.patch]
30+
}
31+
return ""
32+
}
33+
34+
func (v *Version) prereleaseString() string {
35+
if v.prerelease > v.patch {
36+
return v.raw[v.patch+1 : v.prerelease]
37+
}
38+
return ""
39+
}
40+
41+
func (v *Version) buildString() string {
42+
if v.build > v.prerelease {
43+
return v.raw[v.prerelease+1 : v.build]
44+
}
45+
return ""
46+
}
47+
1648
func TestParser(t *testing.T) {
1749
MustParse("").CompareTo(MustParse("0+aaa"))
1850
valid := func(in, normalized, expectedDump string) {

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)