Skip to content

Commit 947a2f3

Browse files
authored
Merge pull request #16 from bugst/yamlsupport
Added YAML support
2 parents 8151b13 + 4fe18c9 commit 947a2f3

File tree

5 files changed

+165
-12
lines changed

5 files changed

+165
-12
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,7 @@ The `Version` and `RelaxedVersion` have the JSON un/marshaler implemented so the
9191
## Binary/GOB encoding support
9292

9393
The `Version` and `RelaxedVersion` provides optimized `MarshalBinary`/`UnmarshalBinary` methods for binary encoding.
94+
95+
## Yaml parsable with `gopkg.in/yaml.v3`
96+
97+
The `Version` and `RelaxedVersion` have the YAML un/marshaler implemented so they can be YAML decoded/encoded with the excellent `gopkg.in/yaml.v3` library.

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ module go.bug.st/relaxed-semver
22

33
go 1.17
44

5-
require github.com/stretchr/testify v1.7.1
5+
require (
6+
github.com/stretchr/testify v1.7.1
7+
gopkg.in/yaml.v3 v3.0.0
8+
)
69

710
require (
811
github.com/davecgh/go-spew v1.1.1 // indirect
912
github.com/pmezard/go-difflib v1.0.0 // indirect
10-
gopkg.in/yaml.v3 v3.0.0 // indirect
1113
)

json_test.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,15 @@ func TestJSONParseVersion(t *testing.T) {
2323
fmt.Println(string(data))
2424
require.NoError(t, err)
2525

26-
dump := fmt.Sprintf("%s,%s,%s,%s,%v,%s",
27-
v.major, v.minor, v.patch,
28-
v.prerelases, v.numericPrereleases,
29-
v.builds)
30-
require.Equal(t, "1,2,3,[aaa 4 5 6],[false true true true],[bbb 7 8 9]", dump)
31-
3226
var u Version
3327
err = json.Unmarshal(data, &u)
3428
require.NoError(t, err)
35-
36-
require.Equal(t, testVersion, v.String())
29+
dump := fmt.Sprintf("%s,%s,%s,%s,%v,%s",
30+
u.major, u.minor, u.patch,
31+
u.prerelases, u.numericPrereleases,
32+
u.builds)
33+
require.Equal(t, "1,2,3,[aaa 4 5 6],[false true true true],[bbb 7 8 9]", dump)
34+
require.Equal(t, testVersion, u.String())
3735

3836
err = json.Unmarshal([]byte(`"invalid"`), &u)
3937
require.Error(t, err)
@@ -53,8 +51,7 @@ func TestJSONParseRelaxedVersion(t *testing.T) {
5351
var u RelaxedVersion
5452
err = json.Unmarshal(data, &u)
5553
require.NoError(t, err)
56-
57-
require.Equal(t, testVersion, v.String())
54+
require.Equal(t, testVersion, u.String())
5855

5956
err = json.Unmarshal([]byte(`"invalid"`), &u)
6057
require.NoError(t, err)

yaml.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// Copyright 2018-2022 Cristian Maglie. All rights reserved.
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
//
6+
7+
package semver
8+
9+
import (
10+
"gopkg.in/yaml.v3"
11+
)
12+
13+
// MarshalYAML implements yaml.Marshaler
14+
func (v *Version) MarshalYAML() (interface{}, error) {
15+
return v.String(), nil
16+
}
17+
18+
// UnmarshalYAML implements yaml.Unmarshaler
19+
func (v *Version) UnmarshalYAML(node *yaml.Node) error {
20+
var versionString string
21+
if err := node.Decode(&versionString); err != nil {
22+
return err
23+
}
24+
parsed, err := Parse(versionString)
25+
if err != nil {
26+
return err
27+
}
28+
29+
v.major = parsed.major
30+
v.minor = parsed.minor
31+
v.patch = parsed.patch
32+
v.prerelases = parsed.prerelases
33+
v.numericPrereleases = parsed.numericPrereleases
34+
v.builds = parsed.builds
35+
return nil
36+
}
37+
38+
// MarshalYAML implements yaml.Marshaler
39+
func (v *RelaxedVersion) MarshalYAML() (interface{}, error) {
40+
return v.String(), nil
41+
}
42+
43+
// UnmarshalYAML implements yaml.Unmarshaler
44+
func (v *RelaxedVersion) UnmarshalYAML(node *yaml.Node) error {
45+
var versionString string
46+
if err := node.Decode(&versionString); err != nil {
47+
return err
48+
}
49+
parsed := ParseRelaxed(versionString)
50+
51+
v.customversion = parsed.customversion
52+
v.version = parsed.version
53+
return nil
54+
}

yaml_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
//
2+
// Copyright 2018-2022 Cristian Maglie. All rights reserved.
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
//
6+
7+
package semver
8+
9+
import (
10+
"fmt"
11+
"testing"
12+
13+
"github.com/stretchr/testify/require"
14+
"gopkg.in/yaml.v3"
15+
)
16+
17+
func TestYAMLParseVersion(t *testing.T) {
18+
var versionIsYamlUnmarshaler yaml.Unmarshaler = MustParse("1.0.0")
19+
var versionIsYamlMarshaler yaml.Marshaler = MustParse("1.0.0")
20+
_ = versionIsYamlUnmarshaler
21+
_ = versionIsYamlMarshaler
22+
23+
testVersion := "1.2.3-aaa.4.5.6+bbb.7.8.9"
24+
v, err := Parse(testVersion)
25+
require.NoError(t, err)
26+
27+
data, err := yaml.Marshal(v)
28+
require.Equal(t, "1.2.3-aaa.4.5.6+bbb.7.8.9\n", string(data))
29+
require.NoError(t, err)
30+
31+
var u Version
32+
err = yaml.Unmarshal(data, &u)
33+
require.NoError(t, err)
34+
35+
dump := fmt.Sprintf("%s,%s,%s,%s,%v,%s",
36+
u.major, u.minor, u.patch,
37+
u.prerelases, u.numericPrereleases,
38+
u.builds)
39+
require.Equal(t, "1,2,3,[aaa 4 5 6],[false true true true],[bbb 7 8 9]", dump)
40+
41+
require.Equal(t, testVersion, u.String())
42+
43+
err = yaml.Unmarshal([]byte(`"invalid"`), &u)
44+
require.Error(t, err)
45+
46+
err = yaml.Unmarshal([]byte(`invalid:`), &u)
47+
require.Error(t, err)
48+
}
49+
50+
func TestYAMLParseRelaxedVersion(t *testing.T) {
51+
var relaxedVersionIsYamlUnmarshaler yaml.Unmarshaler = ParseRelaxed("1.0.0")
52+
var relaxedVersionIsYamlMarshaler yaml.Marshaler = ParseRelaxed("1.0.0")
53+
_ = relaxedVersionIsYamlUnmarshaler
54+
_ = relaxedVersionIsYamlMarshaler
55+
56+
testVersion := "1.2.3-aaa.4.5.6+bbb.7.8.9"
57+
58+
v := ParseRelaxed(testVersion)
59+
60+
data, err := yaml.Marshal(v)
61+
require.NoError(t, err)
62+
require.Equal(t, "1.2.3-aaa.4.5.6+bbb.7.8.9\n", string(data))
63+
64+
var u RelaxedVersion
65+
err = yaml.Unmarshal(data, &u)
66+
require.NoError(t, err)
67+
68+
require.Equal(t, testVersion, u.String())
69+
70+
err = yaml.Unmarshal([]byte(`"invalid"`), &u)
71+
require.NoError(t, err)
72+
require.Equal(t, "invalid", u.String())
73+
74+
err = yaml.Unmarshal([]byte(`invalid:`), &u)
75+
require.Error(t, err)
76+
}
77+
78+
func BenchmarkYAMLDecoding(b *testing.B) {
79+
testVersion := "1.2.3-aaa.4.5.6+bbb.7.8.9"
80+
v, _ := Parse(testVersion)
81+
data, _ := yaml.Marshal(v)
82+
var u Version
83+
for i := 0; i < b.N; i++ {
84+
yaml.Unmarshal(data, &u)
85+
}
86+
}
87+
88+
func BenchmarkYAMLDecodingRelaxed(b *testing.B) {
89+
testVersion := "1.2.3-aaa.4.5.6+bbb.7.8.9"
90+
v := ParseRelaxed(testVersion)
91+
data, _ := yaml.Marshal(v)
92+
var u RelaxedVersion
93+
for i := 0; i < b.N; i++ {
94+
yaml.Unmarshal(data, &u)
95+
}
96+
}

0 commit comments

Comments
 (0)