From 0ad3d3b3533bc2d510057d77655cba9bf68f5731 Mon Sep 17 00:00:00 2001 From: Chris Novakovic Date: Wed, 21 Apr 2021 14:05:18 +0100 Subject: [PATCH 1/2] Implement go-yaml's Marshaler and Unmarshaler interfaces Implement the `yaml.Marshaler` and `yaml.Unmarshaler` interfaces from `gopkg.in/yaml.v2` in `Version`. --- go.mod | 2 ++ go.sum | 3 +++ version.go | 25 +++++++++++++++++++++++++ version_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 go.sum diff --git a/go.mod b/go.mod index 658233c..51e13f3 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/Masterminds/semver/v3 go 1.12 + +require gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7534661 --- /dev/null +++ b/go.sum @@ -0,0 +1,3 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/version.go b/version.go index 4283d39..5cc9d92 100644 --- a/version.go +++ b/version.go @@ -436,6 +436,31 @@ func (v Version) MarshalJSON() ([]byte, error) { return json.Marshal(v.String()) } +// UnmarshalYAML implements go-yaml's yaml.Unmarshaler interface. +func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + temp, err := NewVersion(s) + if err != nil { + return err + } + v.major = temp.major + v.minor = temp.minor + v.patch = temp.patch + v.pre = temp.pre + v.metadata = temp.metadata + v.original = temp.original + temp = nil + return nil +} + +// MarshalYAML implements go-yaml's yaml.Marshaler interface. +func (v *Version) MarshalYAML() (interface{}, error) { + return v.String(), nil +} + // Scan implements the SQL.Scanner interface. func (v *Version) Scan(value interface{}) error { var s string diff --git a/version_test.go b/version_test.go index 0f690f4..374bbc4 100644 --- a/version_test.go +++ b/version_test.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "testing" + + "gopkg.in/yaml.v2" ) func TestStrictNewVersion(t *testing.T) { @@ -615,3 +617,49 @@ func TestValidateMetadata(t *testing.T) { } } } + +func TestYAMLMarshal(t *testing.T) { + sVer := "1.2.3-beta" + x, err := NewVersion(sVer) + if err != nil { + t.Errorf("Error creating version: %s", err) + } + out, err2 := yaml.Marshal(x) + if err2 != nil { + t.Errorf("Error marshaling version: %s", err2) + } + got := string(out) + want := fmt.Sprintf("%s\n", sVer) + if got != want { + t.Errorf("Error marshaling unexpected marshaled string: got=%q want=%q", got, want) + } + + str := struct { + Version *Version + }{ + Version: x, + } + out, err3 := yaml.Marshal(&str) + if err3 != nil { + t.Errorf("Error marshaling version: %s", err3) + } + got = string(out) + want = fmt.Sprintf("version: %s\n", sVer) + if got != want { + t.Errorf("Error marshaling unexpected marshaled struct: got=%q want=%q", got, want) + } +} + +func TestYAMLUnmarshal(t *testing.T) { + sVer := "1.2.3" + ver := &Version{} + err := yaml.Unmarshal([]byte(fmt.Sprintf("%q", sVer)), ver) + if err != nil { + t.Errorf("Error unmarshaling version: %s", err) + } + got := ver.String() + want := sVer + if got != want { + t.Errorf("Error unmarshaling unexpected object content: got=%q want=%q", got, want) + } +} From 61ea0cc6eb7b78cdcef40cda70c1d4b0df998e61 Mon Sep 17 00:00:00 2001 From: Chris Novakovic Date: Sat, 16 Apr 2022 18:32:03 +0100 Subject: [PATCH 2/2] Implement generic text encoding interfaces instead --- go.mod | 2 -- go.sum | 3 --- version.go | 43 ++++++++----------------------------------- version_test.go | 48 ------------------------------------------------ 4 files changed, 8 insertions(+), 88 deletions(-) delete mode 100644 go.sum diff --git a/go.mod b/go.mod index 51e13f3..658233c 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,3 @@ module github.com/Masterminds/semver/v3 go 1.12 - -require gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum deleted file mode 100644 index 7534661..0000000 --- a/go.sum +++ /dev/null @@ -1,3 +0,0 @@ -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/version.go b/version.go index 5cc9d92..95a43f0 100644 --- a/version.go +++ b/version.go @@ -3,7 +3,6 @@ package semver import ( "bytes" "database/sql/driver" - "encoding/json" "errors" "fmt" "regexp" @@ -412,53 +411,27 @@ func (v *Version) Compare(o *Version) int { return comparePrerelease(ps, po) } -// UnmarshalJSON implements JSON.Unmarshaler interface. -func (v *Version) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - temp, err := NewVersion(s) +// UnmarshalText unmarshals the textual representation of a semantic version into +// this Version. +func (v *Version) UnmarshalText(text []byte) error { + temp, err := NewVersion(string(text)) if err != nil { return err } - v.major = temp.major - v.minor = temp.minor - v.patch = temp.patch - v.pre = temp.pre - v.metadata = temp.metadata - v.original = temp.original - return nil -} -// MarshalJSON implements JSON.Marshaler interface. -func (v Version) MarshalJSON() ([]byte, error) { - return json.Marshal(v.String()) -} - -// UnmarshalYAML implements go-yaml's yaml.Unmarshaler interface. -func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { - var s string - if err := unmarshal(&s); err != nil { - return err - } - temp, err := NewVersion(s) - if err != nil { - return err - } v.major = temp.major v.minor = temp.minor v.patch = temp.patch v.pre = temp.pre v.metadata = temp.metadata v.original = temp.original - temp = nil + return nil } -// MarshalYAML implements go-yaml's yaml.Marshaler interface. -func (v *Version) MarshalYAML() (interface{}, error) { - return v.String(), nil +// MarshalText returns the textual representation of the Version. +func (v Version) MarshalText() ([]byte, error) { + return []byte(v.String()), nil } // Scan implements the SQL.Scanner interface. diff --git a/version_test.go b/version_test.go index 374bbc4..0f690f4 100644 --- a/version_test.go +++ b/version_test.go @@ -5,8 +5,6 @@ import ( "encoding/json" "fmt" "testing" - - "gopkg.in/yaml.v2" ) func TestStrictNewVersion(t *testing.T) { @@ -617,49 +615,3 @@ func TestValidateMetadata(t *testing.T) { } } } - -func TestYAMLMarshal(t *testing.T) { - sVer := "1.2.3-beta" - x, err := NewVersion(sVer) - if err != nil { - t.Errorf("Error creating version: %s", err) - } - out, err2 := yaml.Marshal(x) - if err2 != nil { - t.Errorf("Error marshaling version: %s", err2) - } - got := string(out) - want := fmt.Sprintf("%s\n", sVer) - if got != want { - t.Errorf("Error marshaling unexpected marshaled string: got=%q want=%q", got, want) - } - - str := struct { - Version *Version - }{ - Version: x, - } - out, err3 := yaml.Marshal(&str) - if err3 != nil { - t.Errorf("Error marshaling version: %s", err3) - } - got = string(out) - want = fmt.Sprintf("version: %s\n", sVer) - if got != want { - t.Errorf("Error marshaling unexpected marshaled struct: got=%q want=%q", got, want) - } -} - -func TestYAMLUnmarshal(t *testing.T) { - sVer := "1.2.3" - ver := &Version{} - err := yaml.Unmarshal([]byte(fmt.Sprintf("%q", sVer)), ver) - if err != nil { - t.Errorf("Error unmarshaling version: %s", err) - } - got := ver.String() - want := sVer - if got != want { - t.Errorf("Error unmarshaling unexpected object content: got=%q want=%q", got, want) - } -}