Skip to content

Commit c4040c5

Browse files
authored
add more ways to specify "today" in date range (#85)
1 parent c0aa94f commit c4040c5

File tree

4 files changed

+71
-37
lines changed

4 files changed

+71
-37
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
### Changed
11+
12+
- Removed limit on range limit for stats and log
13+
- Missing end date in date range implies today (eg. 2025/08/12...)
14+
- "today" can be used in date range (eg. 2025/08/12...today)
15+
816
## [v0.5.0] - Feb 22, 2025
917

1018
### Added

cmd/root.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ Accepts an argument, which can be one of the following:
327327
3d for a report on the last 3 days (default)
328328
week for a report on the current week
329329
date for a report for a specific date (eg. "2024/06/08")
330-
range for a report for a date range (eg. "2024/06/08...2024/06/12", for a maximum of %d days)
330+
range for a report for a date range (eg. "2024/06/08...2024/06/12", "2024/06/08...today", "2024/06/08..."; shouldn't be greater than %d days)
331331
332332
Note: If a task log continues past midnight in your local timezone, it
333333
will be reported on the day it ends.
@@ -374,7 +374,7 @@ Accepts an argument, which can be one of the following:
374374
3d for log entries from the last 3 days
375375
week for log entries from the current week
376376
date for log entries from a specific date (eg. "2024/06/08")
377-
range for log entries from a specific date range (eg. "2024/06/08...2024/06/12")
377+
range for log entries for a date range (eg. "2024/06/08...2024/06/12", "2024/06/08...today", "2024/06/08...")
378378
379379
Note: If a task log continues past midnight in your local timezone, it'll
380380
appear in the log for the day it ends.
@@ -415,7 +415,7 @@ Accepts an argument, which can be one of the following:
415415
3d show stats for the last 3 days (default)
416416
week show stats for the current week
417417
date show stats for a specific date (eg. "2024/06/08")
418-
range show stats for a specific date range (eg. "2024/06/08...2024/06/12")
418+
range show stats for a date range (eg. "2024/06/08...2024/06/12", "2024/06/08...today", "2024/06/08...")
419419
all show stats for all log entries
420420
421421
Note: If a task log continues past midnight in your local timezone, it'll

internal/types/date_helpers.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,33 +24,39 @@ var (
2424
errTimePeriodTooLarge = errors.New("time period is too large")
2525
)
2626

27-
func parseDateRange(dateRangeStr string) (DateRange, error) {
27+
func parseDateRange(rangeStr string, now time.Time) (DateRange, error) {
2828
var dr DateRange
29+
var err error
2930

30-
elements := strings.Split(dateRangeStr, "...")
31+
elements := strings.Split(rangeStr, "...")
3132
if len(elements) != 2 {
32-
return dr, fmt.Errorf("%w: date range needs to be of the format: %s...%s", errDateRangeIncorrect, dateFormat, dateFormat)
33+
return dr, fmt.Errorf("%w: date range needs to be of the format: %s...%s (the second date can be left empty for today)", errDateRangeIncorrect, dateFormat, dateFormat)
3334
}
3435

3536
start, err := time.ParseInLocation(string(dateFormat), elements[0], time.Local)
3637
if err != nil {
3738
return dr, fmt.Errorf("%w: %s", errStartDateIncorrect, err.Error())
3839
}
3940

40-
end, err := time.ParseInLocation(string(dateFormat), elements[1], time.Local)
41-
if err != nil {
42-
return dr, fmt.Errorf("%w: %s", errEndDateIncorrect, err.Error())
41+
var end time.Time
42+
if elements[1] == "" || elements[1] == "today" {
43+
end = now
44+
} else {
45+
end, err = time.ParseInLocation(string(dateFormat), elements[1], time.Local)
46+
if err != nil {
47+
return dr, fmt.Errorf("%w: %s", errEndDateIncorrect, err.Error())
48+
}
4349
}
4450

4551
if end.Sub(start) <= 0 {
4652
return dr, fmt.Errorf("%w", errEndDateIsNotAfterStartDate)
4753
}
4854

49-
dr.Start = start
50-
dr.End = end
51-
dr.NumDays = int(end.Sub(start).Hours()/24) + 1
52-
53-
return dr, nil
55+
return DateRange{
56+
Start: start,
57+
End: end,
58+
NumDays: int(end.Sub(start).Hours()/24) + 1,
59+
}, nil
5460
}
5561

5662
func GetDateRangeFromPeriod(period string, now time.Time, fullWeek bool, maxDaysAllowed *int) (DateRange, error) {
@@ -93,7 +99,7 @@ func GetDateRangeFromPeriod(period string, now time.Time, fullWeek bool, maxDays
9399

94100
if strings.Contains(period, "...") {
95101
var dr DateRange
96-
dr, err = parseDateRange(period)
102+
dr, err = parseDateRange(period, now)
97103
if err != nil {
98104
return dr, fmt.Errorf("%w: %s", errTimePeriodNotValid, err.Error())
99105
}

internal/types/date_helpers_test.go

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

33
import (
4+
"fmt"
45
"testing"
56
"time"
67

@@ -9,13 +10,18 @@ import (
910
)
1011

1112
func TestParseDateRange(t *testing.T) {
13+
start := time.Date(2024, 6, 28, 0, 0, 0, 0, time.Local)
14+
now := time.Date(2024, 6, 30, 0, 0, 0, 0, time.Local)
15+
rangeWithoutEnd := fmt.Sprintf("%s...", start.Format(dateFormat))
16+
rangeEndingToday := fmt.Sprintf("%s...today", start.Format(dateFormat))
17+
1218
testCases := []struct {
1319
name string
1420
input string
1521
expectedStartStr string
1622
expectedEndStr string
1723
expectedNumDays int
18-
err error
24+
expectedErr error
1925
}{
2026
// success
2127
{
@@ -39,45 +45,59 @@ func TestParseDateRange(t *testing.T) {
3945
expectedEndStr: "2025/06/29 00:00",
4046
expectedNumDays: 366,
4147
},
48+
{
49+
name: "a range without end",
50+
input: rangeWithoutEnd,
51+
expectedStartStr: start.Format(timeFormat),
52+
expectedEndStr: now.Format(timeFormat),
53+
expectedNumDays: 3,
54+
},
55+
{
56+
name: "a range ending today",
57+
input: rangeEndingToday,
58+
expectedStartStr: start.Format(timeFormat),
59+
expectedEndStr: now.Format(timeFormat),
60+
expectedNumDays: 3,
61+
},
4262
// failures
4363
{
44-
name: "empty string",
45-
input: "",
46-
err: errDateRangeIncorrect,
64+
name: "empty string",
65+
input: "",
66+
expectedErr: errDateRangeIncorrect,
4767
},
4868
{
49-
name: "only one date",
50-
input: "2024/06/10",
51-
err: errDateRangeIncorrect,
69+
name: "only one date",
70+
input: "2024/06/10",
71+
expectedErr: errDateRangeIncorrect,
5272
},
5373
{
54-
name: "badly formatted start date",
55-
input: "2024/0610...2024/06/10",
56-
err: errStartDateIncorrect,
74+
name: "badly formatted start date",
75+
input: "2024/0610...2024/06/10",
76+
expectedErr: errStartDateIncorrect,
5777
},
5878
{
59-
name: "badly formatted end date",
60-
input: "2024/06/10...2024/0610",
61-
err: errEndDateIncorrect,
79+
name: "badly formatted end date",
80+
input: "2024/06/10...2024/0610",
81+
expectedErr: errEndDateIncorrect,
6282
},
6383
{
64-
name: "a range of 0 days",
65-
input: "2024/06/10...2024/06/10",
66-
err: errEndDateIsNotAfterStartDate,
84+
name: "a range of 0 days",
85+
input: "2024/06/10...2024/06/10",
86+
expectedErr: errEndDateIsNotAfterStartDate,
6787
},
6888
{
69-
name: "end date before start date",
70-
input: "2024/06/10...2024/06/08",
71-
err: errEndDateIsNotAfterStartDate,
89+
name: "end date before start date",
90+
input: "2024/06/10...2024/06/08",
91+
expectedErr: errEndDateIsNotAfterStartDate,
7292
},
7393
}
7494

7595
for _, tt := range testCases {
7696
t.Run(tt.name, func(t *testing.T) {
77-
got, err := parseDateRange(tt.input)
97+
got, err := parseDateRange(tt.input, now)
7898

79-
if tt.err != nil {
80-
assert.ErrorIs(t, err, tt.err)
99+
if tt.expectedErr != nil {
100+
require.ErrorIs(t, err, tt.expectedErr)
81101
return
82102
}
83103

0 commit comments

Comments
 (0)