Skip to content

Commit e797f1e

Browse files
authored
Merge pull request #12 from bugst/normalized_string
Added NormalizedString to be used as key in maps
2 parents 518e126 + 9dd7f57 commit e797f1e

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

parser_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func TestParser(t *testing.T) {
1818
v, err := Parse(in)
1919
require.NoError(t, err, "parsing '%s'", in)
2020
require.Equal(t, in, v.String(), "printing of '%s'", in)
21+
require.Equal(t, normalized, string(v.NormalizedString()), "normalized printing of '%s'", in)
2122
dump := string(v.major) + ","
2223
dump += string(v.minor) + ","
2324
dump += string(v.patch)
@@ -194,6 +195,12 @@ func TestParser(t *testing.T) {
194195
invalid("1.2.3.")
195196
}
196197

198+
func TestNilVersionStringOutput(t *testing.T) {
199+
var nilVersion *Version
200+
require.Equal(t, "", nilVersion.String())
201+
require.Equal(t, "", string(nilVersion.NormalizedString()))
202+
}
203+
197204
func TestParseRelaxed(t *testing.T) {
198205
bad := ParseRelaxed("bad")
199206
require.Nil(t, bad.version)

relaxed_version.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ func (v *RelaxedVersion) String() string {
4242
return string(v.customversion)
4343
}
4444

45+
// NormalizedString return a string representation of the version that is
46+
// normalized (always have a major, minor and patch version when semver compliant).
47+
// This is useful to be used in maps and other places where the version is used as a key.
48+
func (v *RelaxedVersion) NormalizedString() NormalizedString {
49+
if v == nil {
50+
return ""
51+
}
52+
if v.version != nil {
53+
return v.version.NormalizedString()
54+
}
55+
return NormalizedString(v.customversion)
56+
}
57+
4558
// CompareTo compares the RelaxedVersion with the one passed as parameter.
4659
// Returns -1, 0 or 1 if the version is respectively less than, equal
4760
// or greater than the compared Version

relaxed_version_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,7 @@ func TestRelaxedCompatibleWith(t *testing.T) {
128128
func TestNilRelaxedVersionString(t *testing.T) {
129129
var nilVersion *RelaxedVersion
130130
require.Equal(t, "", nilVersion.String())
131+
require.Equal(t, "", string(nilVersion.NormalizedString()))
132+
require.Equal(t, "1.0.0", string(ParseRelaxed("1.0.0").NormalizedString()))
133+
require.Equal(t, "invalid-semver", string(ParseRelaxed("invalid-semver").NormalizedString()))
131134
}

version.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,53 @@ func (v *Version) String() string {
4646
return res
4747
}
4848

49+
// NormalizedString is a datatype to be used in maps and other places where the
50+
// version is used as a key.
51+
type NormalizedString string
52+
53+
// NormalizedString return a string representation of the version that is
54+
// normalized to always have a major, minor and patch version. This is useful
55+
// to be used in maps and other places where the version is used as a key.
56+
func (v *Version) NormalizedString() NormalizedString {
57+
if v == nil {
58+
return ""
59+
}
60+
res := NormalizedString("")
61+
if len(v.major) > 0 {
62+
res += NormalizedString(v.major)
63+
} else {
64+
res += "0"
65+
}
66+
67+
if len(v.minor) > 0 {
68+
res += "." + NormalizedString(v.minor)
69+
} else {
70+
res += ".0"
71+
}
72+
if len(v.patch) > 0 {
73+
res += "." + NormalizedString(v.patch)
74+
} else {
75+
res += ".0"
76+
}
77+
for i, prerelease := range v.prerelases {
78+
if i == 0 {
79+
res += "-"
80+
} else {
81+
res += "."
82+
}
83+
res += NormalizedString(prerelease)
84+
}
85+
for i, build := range v.builds {
86+
if i == 0 {
87+
res += "+"
88+
} else {
89+
res += "."
90+
}
91+
res += NormalizedString(build)
92+
}
93+
return res
94+
}
95+
4996
var zero = []byte("0")
5097

5198
// Normalize transforms a truncated semver version in a strictly compliant semver

0 commit comments

Comments
 (0)