From 354984ad6c368ccbaae0df29740e2913e410cdbf Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Tue, 7 Sep 2021 02:09:40 +0200 Subject: [PATCH] feat(plugins/isocalendar): make stats based on overall account contributions rather than restricted to `isocalendar.duration` (#525) --- source/plugins/isocalendar/index.mjs | 38 ++++++++++++++++++------- source/plugins/isocalendar/metadata.yml | 2 +- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/source/plugins/isocalendar/index.mjs b/source/plugins/isocalendar/index.mjs index 1b2332c8..136b7179 100644 --- a/source/plugins/isocalendar/index.mjs +++ b/source/plugins/isocalendar/index.mjs @@ -39,16 +39,7 @@ export default async function({login, data, graphql, q, imports, queries, accoun //Compute the highest contributions in a day, streaks and average commits per day console.debug(`metrics/compute/${login}/plugins > isocalendar > computing stats`) - let average = 0, max = 0, streak = {max:0, current:0}, values = [] - for (const week of calendar.weeks) { - for (const day of week.contributionDays) { - values.push(day.contributionCount) - max = Math.max(max, day.contributionCount) - streak.current = day.contributionCount ? streak.current + 1 : 0 - streak.max = Math.max(streak.max, streak.current) - } - } - average = (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2).replace(/[.]0+$/, "") + const {streak, max, average} = await statistics({login, data, graphql, queries}) //Compute SVG console.debug(`metrics/compute/${login}/plugins > isocalendar > computing svg render`) @@ -97,3 +88,30 @@ export default async function({login, data, graphql, q, imports, queries, accoun throw {error:{message:"An error occured", instance:error}} } } + +/**Compute max and current streaks */ +async function statistics({login, data, graphql, queries}) { + let average = 0, max = 0, streak = {max:0, current:0}, values = [] + const now = new Date() + for (let from = new Date(data.user.createdAt); from < now;) { + //Load contribution calendar + let to = new Date(from) + to.setFullYear(to.getFullYear() + 1) + if (to > now) + to = now + console.debug(`metrics/compute/${login}/plugins > isocalendar > loading calendar from "${from.toISOString()}" to "${to.toISOString()}"`) + const {user:{calendar:{contributionCalendar:{weeks}}}} = await graphql(queries.isocalendar.calendar({login, from:from.toISOString(), to:to.toISOString()})) + from = to + //Compute streaks + for (const week of weeks) { + for (const day of week.contributionDays) { + values.push(day.contributionCount) + max = Math.max(max, day.contributionCount) + streak.current = day.contributionCount ? streak.current + 1 : 0 + streak.max = Math.max(streak.max, streak.current) + } + } + } + average = (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2).replace(/[.]0+$/, "") + return {streak, max, average} +} \ No newline at end of file diff --git a/source/plugins/isocalendar/metadata.yml b/source/plugins/isocalendar/metadata.yml index 6f24f8de..a0ee1546 100644 --- a/source/plugins/isocalendar/metadata.yml +++ b/source/plugins/isocalendar/metadata.yml @@ -1,5 +1,5 @@ name: "📅 Isometric commit calendar" -cost: 2-3 REST requests +cost: 1-2 GraphQL requests + 1 GraphQL request per year category: github index: 0 supports: