Skip to content

Commit 7531afa

Browse files
committed
feat: limit flag
1 parent 61dd700 commit 7531afa

File tree

2 files changed

+96
-35
lines changed

2 files changed

+96
-35
lines changed

pkg/cmd/time-entry/report/util/report.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type ReportFlags struct {
2727
util.OutputFlags
2828

2929
FillMissingDates bool
30+
Limit int
3031

3132
Billable bool
3233
NotBillable bool
@@ -43,6 +44,13 @@ func (rf ReportFlags) Check() error {
4344
return err
4445
}
4546

47+
if err := cmdutil.XorFlag(map[string]bool{
48+
"limit": rf.Limit > 0,
49+
"fill-missing-dates": rf.FillMissingDates,
50+
}); err != nil {
51+
return err
52+
}
53+
4654
return cmdutil.XorFlag(map[string]bool{
4755
"billable": rf.Billable,
4856
"not-billable": rf.NotBillable,
@@ -52,6 +60,7 @@ func (rf ReportFlags) Check() error {
5260
// NewReportFlags helps creating a util.ReportFlags for report commands
5361
func NewReportFlags() ReportFlags {
5462
return ReportFlags{
63+
Limit: 0,
5564
OutputFlags: util.OutputFlags{
5665
TimeFormat: timehlp.FullTimeFormat,
5766
},
@@ -65,8 +74,10 @@ func AddReportFlags(
6574
util.AddPrintTimeEntriesFlags(cmd, &rf.OutputFlags)
6675
util.AddPrintMultipleTimeEntriesFlags(cmd)
6776

77+
cmd.Flags().IntVarP(&rf.Limit, "limit", "L", 0,
78+
"Only look for this quantity of time entries")
6879
cmd.Flags().BoolVarP(&rf.FillMissingDates, "fill-missing-dates", "e", false,
69-
"add empty lines for dates without time entries")
80+
"Add empty lines for dates without time entries")
7081
cmd.Flags().StringVarP(&rf.Description, "description", "d", "",
7182
"will filter time entries that contains this on the description field")
7283
cmd.Flags().StringSliceVarP(&rf.Projects, "project", "p", []string{},
@@ -157,6 +168,14 @@ func ReportWithRange(
157168
wg := errgroup.Group{}
158169
logs := make([][]dto.TimeEntry, len(rf.Projects))
159170

171+
pages := api.AllPages()
172+
if rf.Limit > 0 {
173+
pages = api.PaginationParam{
174+
Page: 1,
175+
PageSize: rf.Limit,
176+
}
177+
}
178+
160179
for i := range rf.Projects {
161180
i := i
162181
wg.Go(func() error {
@@ -169,7 +188,7 @@ func ReportWithRange(
169188
Description: rf.Description,
170189
ProjectID: rf.Projects[i],
171190
TagIDs: rf.TagIDs,
172-
PaginationParam: api.AllPages(),
191+
PaginationParam: pages,
173192
})
174193

175194
return err
@@ -195,6 +214,10 @@ func ReportWithRange(
195214
)
196215
})
197216

217+
if rf.Limit > 0 && len(log) > rf.Limit {
218+
log = log[0:rf.Limit]
219+
}
220+
198221
if rf.FillMissingDates && len(log) > 0 {
199222
l := log
200223
log = make([]dto.TimeEntry, 0, len(l))

pkg/cmd/time-entry/report/util/report_flag_test.go

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,80 @@ import (
77
"github.com/stretchr/testify/assert"
88
)
99

10-
func TestReportBillableFlagsChecks(t *testing.T) {
11-
rf := util.NewReportFlags()
12-
rf.Billable = true
13-
rf.NotBillable = true
14-
15-
err := rf.Check()
16-
if assert.Error(t, err) {
17-
assert.Regexp(t,
18-
"can't be used together.*billable.*not-billable", err.Error())
19-
}
20-
21-
rf.Billable = false
22-
rf.NotBillable = true
23-
24-
assert.NoError(t, rf.Check())
10+
func TestReportFlags_Check(t *testing.T) {
11+
tts := map[string]struct {
12+
rf util.ReportFlags
13+
err string
14+
}{
15+
"just billable": {
2516

26-
rf.Billable = true
27-
rf.NotBillable = false
28-
29-
assert.NoError(t, rf.Check())
30-
}
31-
32-
func TestReportProjectFlagsChecks(t *testing.T) {
33-
rf := util.NewReportFlags()
34-
rf.Client = "me"
35-
rf.Projects = []string{}
36-
37-
assert.NoError(t, rf.Check())
17+
rf: util.ReportFlags{
18+
Billable: true,
19+
NotBillable: false,
20+
},
21+
},
22+
"just not-billable": {
23+
rf: util.ReportFlags{
24+
Billable: false,
25+
NotBillable: true,
26+
},
27+
},
28+
"only one billable": {
29+
rf: util.ReportFlags{
30+
Billable: true,
31+
NotBillable: true,
32+
},
33+
err: "can't be used together.*billable.*not-billable",
34+
},
35+
"just client": {
36+
rf: util.ReportFlags{
37+
Client: "me",
38+
},
39+
},
40+
"just projects": {
41+
rf: util.ReportFlags{
42+
Projects: []string{"mine"},
43+
},
44+
},
45+
"client and project": {
46+
rf: util.ReportFlags{
47+
Client: "me",
48+
Projects: []string{"mine"},
49+
},
50+
},
51+
"fill missing dates": {
52+
rf: util.ReportFlags{
53+
FillMissingDates: true,
54+
},
55+
},
56+
"limit": {
57+
rf: util.ReportFlags{
58+
Limit: 10,
59+
},
60+
},
61+
"only limit or fill missing": {
62+
rf: util.ReportFlags{
63+
Limit: 10,
64+
FillMissingDates: true,
65+
},
66+
err: "can't be used together.*fill-missing-dates.*limit",
67+
},
68+
}
3869

39-
rf.Client = ""
40-
rf.Projects = []string{"mine"}
70+
for name, tt := range tts {
71+
t.Run(name, func(t *testing.T) {
72+
err := tt.rf.Check()
4173

42-
assert.NoError(t, rf.Check())
74+
if tt.err == "" {
75+
assert.NoError(t, err)
76+
return
77+
}
4378

44-
rf.Client = "me"
45-
rf.Projects = []string{"mine"}
79+
if !assert.Error(t, err) {
80+
return
81+
}
4682

47-
assert.NoError(t, rf.Check())
83+
assert.Regexp(t, tt.err, err.Error())
84+
})
85+
}
4886
}

0 commit comments

Comments
 (0)