Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit b0e3b27

Browse files
authored
Merge pull request #976 from darkowlzz/status-constraint-version-fix
fix(status): fix `Constraint` & `Version` json output
2 parents d13e867 + c6b462b commit b0e3b27

File tree

3 files changed

+229
-42
lines changed

3 files changed

+229
-42
lines changed

cmd/dep/status.go

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,10 @@ func (out *tableOutput) BasicFooter() {
8989
}
9090

9191
func (out *tableOutput) BasicLine(bs *BasicStatus) {
92-
var constraint string
93-
if v, ok := bs.Constraint.(gps.Version); ok {
94-
constraint = formatVersion(v)
95-
} else {
96-
constraint = bs.Constraint.String()
97-
}
98-
if bs.hasOverride {
99-
constraint += " (override)"
100-
}
10192
fmt.Fprintf(out.w,
10293
"%s\t%s\t%s\t%s\t%s\t%d\t\n",
10394
bs.ProjectRoot,
104-
constraint,
95+
bs.getConsolidatedConstraint(),
10596
formatVersion(bs.Version),
10697
formatVersion(bs.Revision),
10798
formatVersion(bs.Latest),
@@ -127,20 +118,20 @@ func (out *tableOutput) MissingFooter() {
127118

128119
type jsonOutput struct {
129120
w io.Writer
130-
basic []*BasicStatus
121+
basic []*rawStatus
131122
missing []*MissingStatus
132123
}
133124

134125
func (out *jsonOutput) BasicHeader() {
135-
out.basic = []*BasicStatus{}
126+
out.basic = []*rawStatus{}
136127
}
137128

138129
func (out *jsonOutput) BasicFooter() {
139130
json.NewEncoder(out.w).Encode(out.basic)
140131
}
141132

142133
func (out *jsonOutput) BasicLine(bs *BasicStatus) {
143-
out.basic = append(out.basic, bs)
134+
out.basic = append(out.basic, bs.marshalJSON())
144135
}
145136

146137
func (out *jsonOutput) MissingHeader() {
@@ -177,11 +168,7 @@ func (out *dotOutput) BasicFooter() {
177168
}
178169

179170
func (out *dotOutput) BasicLine(bs *BasicStatus) {
180-
version := formatVersion(bs.Revision)
181-
if bs.Version != nil {
182-
version = formatVersion(bs.Version)
183-
}
184-
out.g.createNode(bs.ProjectRoot, version, bs.Children)
171+
out.g.createNode(bs.ProjectRoot, bs.getConsolidatedVersion(), bs.Children)
185172
}
186173

187174
func (out *dotOutput) MissingHeader() {}
@@ -243,6 +230,15 @@ func (cmd *statusCommand) Run(ctx *dep.Ctx, args []string) error {
243230
return nil
244231
}
245232

233+
type rawStatus struct {
234+
ProjectRoot string
235+
Constraint string
236+
Version string
237+
Revision gps.Revision
238+
Latest gps.Version
239+
PackageCount int
240+
}
241+
246242
// BasicStatus contains all the information reported about a single dependency
247243
// in the summary/list status output mode.
248244
type BasicStatus struct {
@@ -256,6 +252,42 @@ type BasicStatus struct {
256252
hasOverride bool
257253
}
258254

255+
func (bs *BasicStatus) getConsolidatedConstraint() string {
256+
var constraint string
257+
if bs.Constraint != nil {
258+
if v, ok := bs.Constraint.(gps.Version); ok {
259+
constraint = formatVersion(v)
260+
} else {
261+
constraint = bs.Constraint.String()
262+
}
263+
}
264+
265+
if bs.hasOverride {
266+
constraint += " (override)"
267+
}
268+
269+
return constraint
270+
}
271+
272+
func (bs *BasicStatus) getConsolidatedVersion() string {
273+
version := formatVersion(bs.Revision)
274+
if bs.Version != nil {
275+
version = formatVersion(bs.Version)
276+
}
277+
return version
278+
}
279+
280+
func (bs *BasicStatus) marshalJSON() *rawStatus {
281+
return &rawStatus{
282+
ProjectRoot: bs.ProjectRoot,
283+
Constraint: bs.getConsolidatedConstraint(),
284+
Version: formatVersion(bs.Version),
285+
Revision: bs.Revision,
286+
Latest: bs.Latest,
287+
PackageCount: bs.PackageCount,
288+
}
289+
}
290+
259291
// MissingStatus contains information about all the missing packages in a project.
260292
type MissingStatus struct {
261293
ProjectRoot string

cmd/dep/status_test.go

Lines changed: 178 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package main
77
import (
88
"bytes"
99
"testing"
10+
"text/tabwriter"
1011

1112
"strings"
1213

@@ -32,36 +33,190 @@ func TestStatusFormatVersion(t *testing.T) {
3233
}
3334

3435
func TestBasicLine(t *testing.T) {
35-
3636
project := dep.Project{}
37+
aSemverConstraint, _ := gps.NewSemverConstraint("1.2.3")
3738

38-
var tests = []struct {
39-
status BasicStatus
40-
expected string
39+
tests := []struct {
40+
name string
41+
status BasicStatus
42+
wantDotStatus []string
43+
wantJSONStatus []string
44+
wantTableStatus []string
4145
}{
42-
{BasicStatus{
43-
Version: nil,
44-
Revision: gps.Revision("flooboofoobooo"),
45-
}, `[label="\nflooboo"];`},
46-
{BasicStatus{
47-
Version: gps.NewVersion("1.0.0"),
48-
Revision: gps.Revision("flooboofoobooo"),
49-
}, `[label="\n1.0.0"];`},
46+
{
47+
name: "BasicStatus with ProjectRoot only",
48+
status: BasicStatus{
49+
ProjectRoot: "github.com/foo/bar",
50+
},
51+
wantDotStatus: []string{`[label="github.com/foo/bar"];`},
52+
wantJSONStatus: []string{`"Version":""`, `"Revision":""`},
53+
wantTableStatus: []string{`github.com/foo/bar 0`},
54+
},
55+
{
56+
name: "BasicStatus with Revision",
57+
status: BasicStatus{
58+
ProjectRoot: "github.com/foo/bar",
59+
Revision: gps.Revision("flooboofoobooo"),
60+
},
61+
wantDotStatus: []string{`[label="github.com/foo/bar\nflooboo"];`},
62+
wantJSONStatus: []string{`"Version":""`, `"Revision":"flooboofoobooo"`, `"Constraint":""`},
63+
wantTableStatus: []string{`github.com/foo/bar flooboo 0`},
64+
},
65+
{
66+
name: "BasicStatus with Version and Revision",
67+
status: BasicStatus{
68+
ProjectRoot: "github.com/foo/bar",
69+
Version: gps.NewVersion("1.0.0"),
70+
Revision: gps.Revision("flooboofoobooo"),
71+
},
72+
wantDotStatus: []string{`[label="github.com/foo/bar\n1.0.0"];`},
73+
wantJSONStatus: []string{`"Version":"1.0.0"`, `"Revision":"flooboofoobooo"`, `"Constraint":""`},
74+
wantTableStatus: []string{`github.com/foo/bar 1.0.0 flooboo 0`},
75+
},
76+
{
77+
name: "BasicStatus with Constraint, Version and Revision",
78+
status: BasicStatus{
79+
ProjectRoot: "github.com/foo/bar",
80+
Constraint: aSemverConstraint,
81+
Version: gps.NewVersion("1.0.0"),
82+
Revision: gps.Revision("revxyz"),
83+
},
84+
wantDotStatus: []string{`[label="github.com/foo/bar\n1.0.0"];`},
85+
wantJSONStatus: []string{`"Revision":"revxyz"`, `"Constraint":"1.2.3"`, `"Version":"1.0.0"`},
86+
wantTableStatus: []string{`github.com/foo/bar 1.2.3 1.0.0 revxyz 0`},
87+
},
5088
}
5189

5290
for _, test := range tests {
53-
var buf bytes.Buffer
91+
t.Run(test.name, func(t *testing.T) {
92+
var buf bytes.Buffer
5493

55-
out := &dotOutput{
56-
p: &project,
57-
w: &buf,
58-
}
59-
out.BasicHeader()
60-
out.BasicLine(&test.status)
61-
out.BasicFooter()
94+
dotout := &dotOutput{
95+
p: &project,
96+
w: &buf,
97+
}
98+
dotout.BasicHeader()
99+
dotout.BasicLine(&test.status)
100+
dotout.BasicFooter()
62101

63-
if ok := strings.Contains(buf.String(), test.expected); !ok {
64-
t.Fatalf("Did not find expected node label: \n\t(GOT) %v \n\t(WNT) %v", buf.String(), test.status)
65-
}
102+
for _, wantStatus := range test.wantDotStatus {
103+
if ok := strings.Contains(buf.String(), wantStatus); !ok {
104+
t.Errorf("Did not find expected node status: \n\t(GOT) %v \n\t(WNT) %v", buf.String(), wantStatus)
105+
}
106+
}
107+
108+
buf.Reset()
109+
110+
jsonout := &jsonOutput{w: &buf}
111+
112+
jsonout.BasicHeader()
113+
jsonout.BasicLine(&test.status)
114+
jsonout.BasicFooter()
115+
116+
for _, wantStatus := range test.wantJSONStatus {
117+
if ok := strings.Contains(buf.String(), wantStatus); !ok {
118+
t.Errorf("Did not find expected JSON status: \n\t(GOT) %v \n\t(WNT) %v", buf.String(), wantStatus)
119+
}
120+
}
121+
122+
buf.Reset()
123+
124+
tabw := tabwriter.NewWriter(&buf, 0, 4, 2, ' ', 0)
125+
126+
tableout := &tableOutput{w: tabw}
127+
128+
tableout.BasicHeader()
129+
tableout.BasicLine(&test.status)
130+
tableout.BasicFooter()
131+
132+
for _, wantStatus := range test.wantTableStatus {
133+
if ok := strings.Contains(buf.String(), wantStatus); !ok {
134+
t.Errorf("Did not find expected Table status: \n\t(GOT) %v \n\t(WNT) %v", buf.String(), wantStatus)
135+
}
136+
}
137+
})
138+
}
139+
}
140+
141+
func TestBasicStatusGetConsolidatedConstraint(t *testing.T) {
142+
aSemverConstraint, _ := gps.NewSemverConstraint("1.2.1")
143+
144+
testCases := []struct {
145+
name string
146+
basicStatus BasicStatus
147+
wantConstraint string
148+
}{
149+
{
150+
name: "empty BasicStatus",
151+
basicStatus: BasicStatus{},
152+
wantConstraint: "",
153+
},
154+
{
155+
name: "BasicStatus with Any Constraint",
156+
basicStatus: BasicStatus{
157+
Constraint: gps.Any(),
158+
},
159+
wantConstraint: "*",
160+
},
161+
{
162+
name: "BasicStatus with Semver Constraint",
163+
basicStatus: BasicStatus{
164+
Constraint: aSemverConstraint,
165+
},
166+
wantConstraint: "1.2.1",
167+
},
168+
{
169+
name: "BasicStatus with Override",
170+
basicStatus: BasicStatus{
171+
Constraint: aSemverConstraint,
172+
hasOverride: true,
173+
},
174+
wantConstraint: "1.2.1 (override)",
175+
},
176+
}
177+
178+
for _, tc := range testCases {
179+
t.Run(tc.name, func(t *testing.T) {
180+
if tc.basicStatus.getConsolidatedConstraint() != tc.wantConstraint {
181+
t.Errorf("unexpected consolidated constraint: \n\t(GOT) %v \n\t(WNT) %v", tc.basicStatus.getConsolidatedConstraint(), tc.wantConstraint)
182+
}
183+
})
184+
}
185+
}
186+
187+
func TestBasicStatusGetConsolidatedVersion(t *testing.T) {
188+
testCases := []struct {
189+
name string
190+
basicStatus BasicStatus
191+
wantVersion string
192+
}{
193+
{
194+
name: "empty BasicStatus",
195+
basicStatus: BasicStatus{},
196+
wantVersion: "",
197+
},
198+
{
199+
name: "BasicStatus with Version and Revision",
200+
basicStatus: BasicStatus{
201+
Version: gps.NewVersion("1.0.0"),
202+
Revision: gps.Revision("revxyz"),
203+
},
204+
wantVersion: "1.0.0",
205+
},
206+
{
207+
name: "BasicStatus with only Revision",
208+
basicStatus: BasicStatus{
209+
Revision: gps.Revision("revxyz"),
210+
},
211+
wantVersion: "revxyz",
212+
},
213+
}
214+
215+
for _, tc := range testCases {
216+
t.Run(tc.name, func(t *testing.T) {
217+
if tc.basicStatus.getConsolidatedVersion() != tc.wantVersion {
218+
t.Errorf("unexpected consolidated version: \n\t(GOT) %v \n\t(WNT) %v", tc.basicStatus.getConsolidatedVersion(), tc.wantVersion)
219+
}
220+
})
66221
}
67222
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"ProjectRoot":"github.com/sdboyer/deptest","Children":null,"Constraint":{},"Version":{},"Revision":"ff2948a2ac8f538c4ecd55962e919d1e13e74baf","Latest":"3f4c3bea144e112a69bbe5d8d01c1b09a544253f","PackageCount":1},{"ProjectRoot":"github.com/sdboyer/deptestdos","Children":null,"Constraint":{},"Version":{},"Revision":"5c607206be5decd28e6263ffffdcee067266015e","Latest":"5c607206be5decd28e6263ffffdcee067266015e","PackageCount":1}]
1+
[{"ProjectRoot":"github.com/sdboyer/deptest","Constraint":"^0.8.0","Version":"v0.8.0","Revision":"ff2948a2ac8f538c4ecd55962e919d1e13e74baf","Latest":"3f4c3bea144e112a69bbe5d8d01c1b09a544253f","PackageCount":1},{"ProjectRoot":"github.com/sdboyer/deptestdos","Constraint":"*","Version":"v2.0.0","Revision":"5c607206be5decd28e6263ffffdcee067266015e","Latest":"5c607206be5decd28e6263ffffdcee067266015e","PackageCount":1}]

0 commit comments

Comments
 (0)