Skip to content

Commit

Permalink
god i hate timezones and dst so much
Browse files Browse the repository at this point in the history
  • Loading branch information
lowlighter committed Oct 31, 2023
1 parent 5d86df8 commit b550e07
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 24 deletions.
2 changes: 1 addition & 1 deletion deno.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
},
"tasks": {
// '
"qq": "rm -rf .coverage && deno test --coverage=.coverage --no-check --unstable --trace-ops --allow-all source --filter='lines' && deno coverage .coverage --include='^file:.*/lines/mod.ts'",
"qq": "rm -rf .coverage && deno test --coverage=.coverage --no-check --unstable --trace-ops --allow-all source --filter='calendar' && deno coverage .coverage --include='^file:.*/calendar/mod.ts'",
"q": "rm -rf .coverage && deno test --coverage=.coverage --unstable --trace-ops --fail-fast --allow-all source && deno coverage .coverage --exclude='/dom/'",
"btr": "deno run --allow-env --allow-read --allow-write=.btr.json --allow-run=deno --no-lock tasks.ts $0"
},
Expand Down
45 changes: 26 additions & 19 deletions source/plugins/calendar/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,23 +143,23 @@ export default class extends Plugin {
const n = Number((range as string).match(lastXdays)!.groups!.n)
end = this.date(today, { time: "keep" })
start = this.date(end, { time: "keep" })
start.setHours((-n + 1) * 24 + start.getTimezoneOffset() / 60)
start.setDate(start.getDate() - n)
}
this.log.trace(`start date set from year "${typeof range === "object" ? range.from : range}" → ${start.toISOString()}`)
this.log.trace(`end date set from "${typeof range === "object" ? range.to : range}" → ${end.toISOString()}`)
this.log.trace(`start date set from year "${typeof range === "object" ? range.from : range}" → ${this.format(start)}`)
this.log.trace(`end date set from "${typeof range === "object" ? range.to : range}" → ${this.format(end)}`)

//Fetch data
const calendar = { colors, years: [] } as is.infer<typeof this["outputs"]["shape"]["calendar"]>
const result = { range: { start, end, average: 0, max: 0, streak: { max: 0, current: 0 } }, calendar }
this.log.debug(`fetching data from ${start.toISOString()} to ${end.toISOString()}`)
this.log.debug(`fetching data from ${this.format(start)} to ${this.format(end)}`)
for (let year = start.getFullYear(); year <= end.getFullYear(); year++) {
this.log.trace(`processing ${lastXdays.test(`${range}`) ? `"${range}"` : `year ${year}`}`)
calendar.years.push({ year, weeks: [], average: 0, max: 0, streak: { max: 0 } })

//Ensure starting date is on a sunday (to avoid incomplete week arrays that would offset results later on)
const A = lastXdays.test(`${range}`) ? this.date(start, { time: "keep" }) : this.date(year, { day: "1st jan", time: "00:00" })
const O = this.date(A, { time: "keep" })
A.setHours(-A.getDay() * 24)
A.setDate(A.getDate() - A.getDay())

//Ensure ending date is either on today or a 31st of december
const B = lastXdays.test(`${range}`) ? this.date(end, { time: "keep" }) : (year >= today.getFullYear()) ? this.date(today, { time: "keep" }) : this.date(year, { day: "31st dec", time: "23:59" })
Expand All @@ -168,14 +168,16 @@ export default class extends Plugin {
for (let a = this.date(A, { time: "keep" }), first = true; a < B; first = false) {
//Compute next date range
let b = this.date(a, { time: "23:59" })
b.setHours(27 * 24)
b.setDate(b.getDate() + 27)
if (b > B) {
b = this.date(B, { time: "keep" })
}

//Fetch data from api and clean padded days on first iteration
this.log.trace(`querying data from ${a.toISOString()} to ${b.toISOString()}`)
const { entity: { contributions: { calendar: { weeks } } } } = await this.graphql("calendar", { login: handle, from: a.toISOString(), to: b.toISOString() })
this.log.trace(`querying data from ${this.format(a)} to ${this.format(b)}`)
const from = this.date(a, { time: "keep", utc: true }).toISOString()
const to = this.date(b, { time: "keep", utc: true }).toISOString()
const { entity: { contributions: { calendar: { weeks } } } } = await this.graphql("calendar", { login: handle, from, to })
if (first) {
for (let i = 0; i < weeks[0].days.length; i++) {
const { date } = weeks[0].days[i]
Expand Down Expand Up @@ -203,7 +205,7 @@ export default class extends Plugin {
//Compute streaks and average
const global = [] as number[]
for (const year of calendar.years) {
this.log.trace(`computing additional data for ${lastXdays.test(`${range}`) ? `"${range}"` : `year ${year}`}`)
this.log.trace(`computing additional data for ${lastXdays.test(`${range}`) ? `"${range}"` : `year ${year.year}`}`)
const local = [] as number[]
let streak = 0
for (const { days } of year.weeks) {
Expand All @@ -229,10 +231,18 @@ export default class extends Plugin {
return result
}

/** Format date for debug */
private format(date: Date) {
const day = new Intl.DateTimeFormat("en-GB", { timeZone: this.context.timezone, weekday: "short" }).format(date)
const fdate = new Intl.DateTimeFormat("en-GB", { timeZone: this.context.timezone, year: "numeric", month: "2-digit", day: "2-digit" }).format(date)
const time = new Intl.DateTimeFormat("en-GB", { timeZone: this.context.timezone, hour: "2-digit", minute: "2-digit", second: "2-digit", fractionalSecondDigits: 3 }).format(date)
return `${day} ${fdate} ${time}`
}

/** Create a date from a reference, and optionally clean time */
private date(date: Date, options: { time: "00:00" | "23:59" | "keep" }): Date
private date(year: number, options: { day: "1st jan" | "31st dec"; time: "00:00" | "23:59" }): Date
private date(ref: number | Date, { day, time }: { day?: "1st jan" | "31st dec"; time: "00:00" | "23:59" | "keep" }) {
private date(date: Date, options: { time: "00:00" | "23:59" | "keep"; utc?: boolean }): Date
private date(year: number, options: { day: "1st jan" | "31st dec"; time: "00:00" | "23:59"; utc?: boolean }): Date
private date(ref: number | Date, { day, time, utc }: { day?: "1st jan" | "31st dec"; time: "00:00" | "23:59" | "keep"; utc?: boolean }) {
const date = new Date(new Date().toLocaleString("en", { timeZone: this.context.timezone }))
switch (typeof ref) {
case "number":
Expand All @@ -243,13 +253,7 @@ export default class extends Plugin {
}
break
case "object":
date.setFullYear(ref.getFullYear())
date.setMonth(ref.getMonth())
date.setDate(ref.getDate())
date.setHours(ref.getHours())
date.setMinutes(ref.getMinutes())
date.setSeconds(ref.getSeconds())
date.setMilliseconds(ref.getMilliseconds())
date.setTime(ref.getTime())
break
}
switch (time) {
Expand All @@ -266,6 +270,9 @@ export default class extends Plugin {
date.setMilliseconds(999)
break
}
if (utc) {
date.setMinutes(date.getMinutes() - date.getTimezoneOffset())
}
return date
}
}
4 changes: 2 additions & 2 deletions source/plugins/calendar/tests/calendar.graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ export default mock({ login: is.string(), from: is.coerce.date(), to: is.coerce.
const distribution = [[0, 50], [1, 15], [2, 15], [3, 5], [4, 5], [5, 3], [6, 1], [7, 1], [8, 1], [9, 1], [10, 1], [11, 1], [12, 1]].flatMap(([n, r]) => new Array(r).fill(n))
const max = Math.max(...distribution)
if (from.getFullYear() > 1970) {
for (const date = new Date(from); date <= to; date.setDate(date.getDate() + 1)) {
if ((!date.getDay()) && (date.getTime() !== from.getTime())) {
for (const date = new Date(from); date <= to; date.setUTCDate(date.getUTCDate() + 1)) {
if ((!date.getUTCDay()) && (date.getTime() !== from.getTime())) {
weeks.push({ days })
days = []
}
Expand Down
29 changes: 28 additions & 1 deletion source/plugins/calendar/tests/list.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,34 @@
select: .calendar .year .day
count: 180~1


- name: supports `range:"last-365-days"`
plugins:
- calendar:
view: isometric
range: last-365-days
handle: octocat
processors:
- assert:
html:
select: .calendar .year
count: 1=
- assert:
html:
select: .calendar .year .day
count: 365~1
- calendar:
view: top-down
range: last-365-days
handle: octocat
processors:
- assert:
html:
select: .calendar .year
count: 1=
- assert:
html:
select: .calendar .year .day
count: 365~1

- name: supports `range:"current-year"`
plugins:
Expand Down
2 changes: 1 addition & 1 deletion source/run/cli/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import core from "y/@actions/core@1.10.1"
import { process } from "@engine/process.ts"
import { parse as parseFlags } from "std/flags/mod.ts"
import { cyan, gray } from "std/fmt/colors.ts"
import { env } from "@engine/utils/deno/io.ts"
import { env } from "@engine/utils/deno/env.ts"
import { compat } from "./compat.ts"
import { parse } from "@engine/utils/validation.ts"

Expand Down
7 changes: 7 additions & 0 deletions source/run/server/imports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,15 @@
;(async () => await import("../../processors/publish.git/mod.ts"))
;(async () => await import("../../processors/publish.git/tests/commit.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/createref.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/extras_test.ts"))
;(async () => await import("../../processors/publish.git/tests/head.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/pullrequest.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/pullrequest.merge.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/pullrequest.mergeable.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/pullrequest.number.graphql.ts"))
;(async () => await import("../../processors/publish.git/tests/repository.graphql.ts"))
;(async () => await import("../../processors/render.gemojis/mod.ts"))
;(async () => await import("../../processors/render.octicons/mod.ts"))
;(async () => await import("../../processors/render.twemojis/mod.ts"))
;(async () => await import("../../processors/render/mod.ts"))
;(async () => await import("../../processors/render/tests/extras_test.ts"))

0 comments on commit b550e07

Please sign in to comment.