Skip to content

Commit 2523cfd

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 59da58c commit 2523cfd

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"
@@ -382,3 +383,24 @@ func (v *Version) String() string {
382383
func (v *Version) Original() string {
383384
return v.original
384385
}
386+
387+
// MarshalJSON implements the json.Marshaler interface
388+
func (v *Version) MarshalJSON() ([]byte, error) {
389+
return json.Marshal(v.original)
390+
}
391+
392+
// UnmarshalJSON implements the json.Unmarshaler interface
393+
func (v *Version) UnmarshalJSON(data []byte) error {
394+
var vStr string
395+
if err := json.Unmarshal(data, &vStr); err != nil {
396+
return err
397+
}
398+
399+
nv, err := NewVersion(vStr)
400+
if err != nil {
401+
return err
402+
}
403+
*v = *nv
404+
405+
return nil
406+
}

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
)
@@ -622,3 +623,58 @@ func TestLessThanOrEqual(t *testing.T) {
622623
}
623624
}
624625
}
626+
627+
func TestVersionMarshalJSON(t *testing.T) {
628+
cases := []struct {
629+
version string
630+
result string
631+
}{
632+
{"1.7rc2", `"1.7rc2"`},
633+
{"1.2.0", `"1.2.0"`},
634+
}
635+
636+
for _, tc := range cases {
637+
v, err := NewVersion(tc.version)
638+
if err != nil {
639+
t.Fatalf("err: %s", err)
640+
}
641+
642+
actual, err := json.Marshal(&v)
643+
if err != nil {
644+
t.Fatalf("err: %s", err)
645+
}
646+
647+
expected := tc.result
648+
if string(actual) != expected {
649+
t.Fatalf("Version: %s\nExpected: %s\nActual: %s",
650+
tc.version, expected, actual)
651+
}
652+
}
653+
}
654+
655+
func TestVersionUnmarshalJSON(t *testing.T) {
656+
cases := []struct {
657+
version string
658+
result string
659+
}{
660+
{`"1.7rc2"`, "1.7rc2"},
661+
{`"1.2.0"`, "1.2.0"},
662+
}
663+
664+
for _, tc := range cases {
665+
var actual Version
666+
if err := json.Unmarshal([]byte(tc.version), &actual); err != nil {
667+
t.Fatalf("err: %s", err)
668+
}
669+
670+
expected, err := NewVersion(tc.result)
671+
if err != nil {
672+
t.Fatalf("err: %s", err)
673+
}
674+
675+
if !reflect.DeepEqual(&actual, expected) {
676+
t.Fatalf("Constraint: %s\nExpected: %#v\nActual: %#v",
677+
tc.result, expected, actual)
678+
}
679+
}
680+
}

0 commit comments

Comments
 (0)