Skip to content

Commit 053a13e

Browse files
committed
adding json support for constraints and version
this change adds support to marshal and unmarshal version constraints and versions to JSON.
1 parent c2de231 commit 053a13e

File tree

4 files changed

+156
-0
lines changed

4 files changed

+156
-0
lines changed

constraint.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package version
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"reflect"
67
"regexp"
@@ -202,3 +203,24 @@ func constraintPessimistic(v, c *Version) bool {
202203
// If nothing has rejected the version by now, it's valid
203204
return true
204205
}
206+
207+
// MarshalJSON implements the json.Marshaler interface
208+
func (c *Constraints) MarshalJSON() ([]byte, error) {
209+
return json.Marshal(c.String())
210+
}
211+
212+
// UnmarshalJSON implements the json.Unmarshaler interface
213+
func (c *Constraints) UnmarshalJSON(data []byte) error {
214+
var csStr string
215+
if err := json.Unmarshal(data, &csStr); err != nil {
216+
return err
217+
}
218+
219+
nc, err := NewConstraint(csStr)
220+
if err != nil {
221+
return err
222+
}
223+
*c = nc
224+
225+
return nil
226+
}

constraint_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package version
22

33
import (
4+
"encoding/json"
45
"testing"
56
)
67

@@ -124,3 +125,58 @@ func TestConstraintsString(t *testing.T) {
124125
}
125126
}
126127
}
128+
129+
func TestConstraintsMarshalJSON(t *testing.T) {
130+
cases := []struct {
131+
constraint string
132+
result string
133+
}{
134+
{">= 1.0, < 1.2", `"\u003e= 1.0, \u003c 1.2"`},
135+
{"~> 1.0.7", `"~\u003e 1.0.7"`},
136+
}
137+
138+
for _, tc := range cases {
139+
c, err := NewConstraint(tc.constraint)
140+
if err != nil {
141+
t.Fatalf("err: %s", err)
142+
}
143+
144+
actual, err := json.Marshal(&c)
145+
if err != nil {
146+
t.Fatalf("err: %s", err)
147+
}
148+
149+
expected := tc.result
150+
if string(actual) != expected {
151+
t.Fatalf("Constraint: %s\nExpected: %s\nActual: %s",
152+
tc.constraint, expected, actual)
153+
}
154+
}
155+
}
156+
157+
func TestConstraintsUnmarshalJSON(t *testing.T) {
158+
cases := []struct {
159+
constraint string
160+
result string
161+
}{
162+
{`">= 1.0, < 1.2"`, ">= 1.0, < 1.2"},
163+
{`"~> 1.0.7"`, "~> 1.0.7"},
164+
}
165+
166+
for _, tc := range cases {
167+
var actual Constraints
168+
if err := json.Unmarshal([]byte(tc.constraint), &actual); err != nil {
169+
t.Fatalf("err: %s", err)
170+
}
171+
172+
expected, err := NewConstraint(tc.result)
173+
if err != nil {
174+
t.Fatalf("err: %s", err)
175+
}
176+
177+
if actual.String() != expected.String() {
178+
t.Fatalf("Constraint: %s\nExpected: %s\nActual: %s",
179+
tc.result, expected, actual)
180+
}
181+
}
182+
}

version.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package version
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"fmt"
67
"reflect"
78
"regexp"
@@ -390,3 +391,24 @@ func (v *Version) String() string {
390391
func (v *Version) Original() string {
391392
return v.original
392393
}
394+
395+
// MarshalJSON implements the json.Marshaler interface
396+
func (v *Version) MarshalJSON() ([]byte, error) {
397+
return json.Marshal(v.original)
398+
}
399+
400+
// UnmarshalJSON implements the json.Unmarshaler interface
401+
func (v *Version) UnmarshalJSON(data []byte) error {
402+
var vStr string
403+
if err := json.Unmarshal(data, &vStr); err != nil {
404+
return err
405+
}
406+
407+
nv, err := NewVersion(vStr)
408+
if err != nil {
409+
return err
410+
}
411+
*v = *nv
412+
413+
return nil
414+
}

version_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package version
22

33
import (
4+
"encoding/json"
45
"reflect"
56
"testing"
67
)
@@ -654,3 +655,58 @@ func TestLessThanOrEqual(t *testing.T) {
654655
}
655656
}
656657
}
658+
659+
func TestVersionMarshalJSON(t *testing.T) {
660+
cases := []struct {
661+
version string
662+
result string
663+
}{
664+
{"1.7rc2", `"1.7rc2"`},
665+
{"1.2.0", `"1.2.0"`},
666+
}
667+
668+
for _, tc := range cases {
669+
v, err := NewVersion(tc.version)
670+
if err != nil {
671+
t.Fatalf("err: %s", err)
672+
}
673+
674+
actual, err := json.Marshal(&v)
675+
if err != nil {
676+
t.Fatalf("err: %s", err)
677+
}
678+
679+
expected := tc.result
680+
if string(actual) != expected {
681+
t.Fatalf("Version: %s\nExpected: %s\nActual: %s",
682+
tc.version, expected, actual)
683+
}
684+
}
685+
}
686+
687+
func TestVersionUnmarshalJSON(t *testing.T) {
688+
cases := []struct {
689+
version string
690+
result string
691+
}{
692+
{`"1.7rc2"`, "1.7rc2"},
693+
{`"1.2.0"`, "1.2.0"},
694+
}
695+
696+
for _, tc := range cases {
697+
var actual Version
698+
if err := json.Unmarshal([]byte(tc.version), &actual); err != nil {
699+
t.Fatalf("err: %s", err)
700+
}
701+
702+
expected, err := NewVersion(tc.result)
703+
if err != nil {
704+
t.Fatalf("err: %s", err)
705+
}
706+
707+
if !reflect.DeepEqual(&actual, expected) {
708+
t.Fatalf("Constraint: %s\nExpected: %#v\nActual: %#v",
709+
tc.result, expected, actual)
710+
}
711+
}
712+
}

0 commit comments

Comments
 (0)