diff options
| author | Taras Madan <tarasmadan@google.com> | 2024-08-30 12:02:30 +0200 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2024-09-16 12:31:08 +0000 |
| commit | c673ca06b23cea94091ab496ef62c3513e434585 (patch) | |
| tree | 417c77ae484cb6aa9e77ce45b1d6ead9d6768290 /pkg/coveragedb | |
| parent | 49cf07733c7f8914ab688a3ff1effb82565030dd (diff) | |
dashboard/app: add file coverage page
It directly uses the coverage signals from BigQuery.
There is no need to wait for the coverage_batch cron jobs.
Looks good for debugging.
Limitations:
1. It is slow. I know how to speed up but want to stabilize the UI first.
2. It is expensive because of the direct BQ requests. Limited to admin only because of it.
3. It merges only the commits reachable on github because of the gitweb throttling.
After the UI stabilization I'll save all the required artifacts to spanner and make this page publicly available.
To merge all the commits, not the github reachable only, http git caching instance is needed.
Diffstat (limited to 'pkg/coveragedb')
| -rw-r--r-- | pkg/coveragedb/time_period.go | 36 | ||||
| -rw-r--r-- | pkg/coveragedb/time_period_test.go | 16 |
2 files changed, 40 insertions, 12 deletions
diff --git a/pkg/coveragedb/time_period.go b/pkg/coveragedb/time_period.go index bfa1b2789..4e17e4273 100644 --- a/pkg/coveragedb/time_period.go +++ b/pkg/coveragedb/time_period.go @@ -5,6 +5,7 @@ package coveragedb import ( "errors" + "fmt" "slices" "sort" @@ -16,6 +17,23 @@ type TimePeriod struct { Days int } +// DatesFromTo returns the closed range [fromDate, toDate]. +func (tp *TimePeriod) DatesFromTo() (civil.Date, civil.Date) { + return tp.DateTo.AddDays(-tp.Days + 1), tp.DateTo +} + +func MakeTimePeriod(targetDate civil.Date, periodType string) (TimePeriod, error) { + pOps, err := PeriodOps(periodType) + if err != nil { + return TimePeriod{}, err + } + tp := TimePeriod{DateTo: targetDate, Days: pOps.PointedPeriodDays(targetDate)} + if !pOps.IsValidPeriod(tp) { + return TimePeriod{}, fmt.Errorf("date %s doesn't point the period(%s) end", targetDate.String(), periodType) + } + return tp, nil +} + const ( DayPeriod = "day" MonthPeriod = "month" @@ -53,15 +71,15 @@ func PeriodOps(periodType string) (periodOps, error) { type periodOps interface { IsValidPeriod(p TimePeriod) bool lastPeriodDate(d civil.Date) civil.Date - pointedPeriodDays(d civil.Date) int + PointedPeriodDays(d civil.Date) int } func GenNPeriodsTill(n int, d civil.Date, po periodOps) []TimePeriod { var res []TimePeriod for i := 0; i < n; i++ { d = po.lastPeriodDate(d) - res = append(res, TimePeriod{DateTo: d, Days: po.pointedPeriodDays(d)}) - d = d.AddDays(-po.pointedPeriodDays(d)) + res = append(res, TimePeriod{DateTo: d, Days: po.PointedPeriodDays(d)}) + d = d.AddDays(-po.PointedPeriodDays(d)) } slices.Reverse(res) return res @@ -77,7 +95,7 @@ func (dpo *DayPeriodOps) IsValidPeriod(p TimePeriod) bool { return p.Days == 1 } -func (dpo *DayPeriodOps) pointedPeriodDays(d civil.Date) int { +func (dpo *DayPeriodOps) PointedPeriodDays(d civil.Date) int { return 1 } @@ -95,7 +113,7 @@ func (m *MonthPeriodOps) IsValidPeriod(p TimePeriod) bool { return lmd == p.DateTo && p.Days == lmd.Day } -func (m *MonthPeriodOps) pointedPeriodDays(d civil.Date) int { +func (m *MonthPeriodOps) PointedPeriodDays(d civil.Date) int { return m.lastPeriodDate(d).Day } @@ -103,7 +121,7 @@ type QuarterPeriodOps struct{} func (q *QuarterPeriodOps) IsValidPeriod(p TimePeriod) bool { lmd := q.lastPeriodDate(p.DateTo) - return lmd == p.DateTo && p.Days == q.pointedPeriodDays(lmd) + return lmd == p.DateTo && p.Days == q.PointedPeriodDays(lmd) } func (q *QuarterPeriodOps) lastPeriodDate(d civil.Date) civil.Date { @@ -112,12 +130,12 @@ func (q *QuarterPeriodOps) lastPeriodDate(d civil.Date) civil.Date { return (&MonthPeriodOps{}).lastPeriodDate(d) } -func (q *QuarterPeriodOps) pointedPeriodDays(d civil.Date) int { +func (q *QuarterPeriodOps) PointedPeriodDays(d civil.Date) int { d = q.lastPeriodDate(d) d.Day = 1 res := 0 for i := 0; i < 3; i++ { - res += (&MonthPeriodOps{}).pointedPeriodDays(d) + res += (&MonthPeriodOps{}).PointedPeriodDays(d) d.Month-- } return res @@ -141,7 +159,7 @@ func PeriodsToMerge(srcDates, mergedPeriods []TimePeriod, srcRows, mergedRows [] periods := []TimePeriod{} for periodEndDate := range periodRows { periods = append(periods, - TimePeriod{DateTo: periodEndDate, Days: ops.pointedPeriodDays(periodEndDate)}) + TimePeriod{DateTo: periodEndDate, Days: ops.PointedPeriodDays(periodEndDate)}) } sort.Slice(periods, func(i, j int) bool { return periods[i].DateTo.After(periods[j].DateTo) diff --git a/pkg/coveragedb/time_period_test.go b/pkg/coveragedb/time_period_test.go index 4ccd18f12..e985b162a 100644 --- a/pkg/coveragedb/time_period_test.go +++ b/pkg/coveragedb/time_period_test.go @@ -22,7 +22,7 @@ func TestDayPeriodOps(t *testing.T) { assert.True(t, ops.IsValidPeriod(goodPeriod)) assert.False(t, ops.IsValidPeriod(badPeriod)) - assert.Equal(t, 1, ops.pointedPeriodDays(d)) + assert.Equal(t, 1, ops.PointedPeriodDays(d)) assert.Equal(t, []TimePeriod{ @@ -47,7 +47,7 @@ func TestMonthPeriodOps(t *testing.T) { assert.False(t, ops.IsValidPeriod(badPeriod1)) assert.False(t, ops.IsValidPeriod(badPeriod2)) - assert.Equal(t, 29, ops.pointedPeriodDays(midMonthDate)) + assert.Equal(t, 29, ops.PointedPeriodDays(midMonthDate)) assert.Equal(t, []TimePeriod{ @@ -73,7 +73,7 @@ func TestQuarterPeriodOps(t *testing.T) { assert.False(t, ops.IsValidPeriod(badPeriod1)) assert.False(t, ops.IsValidPeriod(badPeriod2)) - assert.Equal(t, 31+29+31, ops.pointedPeriodDays(midQuarterDate)) + assert.Equal(t, 31+29+31, ops.PointedPeriodDays(midQuarterDate)) assert.Equal(t, []TimePeriod{ @@ -279,3 +279,13 @@ func TestAtMostNLatestPeriods(t *testing.T) { assert.Equal(t, []TimePeriod{makeTimePeriod("2024-06-06", 1)}, AtMostNLatestPeriods(sampleDays, 1)) assert.Equal(t, sampleDays, AtMostNLatestPeriods(sampleDays, 100)) } + +func TestMakeTimePeriod(t *testing.T) { + tp, err := MakeTimePeriod(civil.Date{Year: 2024, Month: time.March, Day: 31}, QuarterPeriod) + assert.NoError(t, err) + assert.NotEqual(t, TimePeriod{}, tp) + + tp, err = MakeTimePeriod(civil.Date{Year: 2024, Month: time.March, Day: 30}, QuarterPeriod) + assert.Error(t, err) + assert.Equal(t, TimePeriod{}, tp) +} |
