GeometricMeanOfContributionsSpec
by Aggre _--
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/9.3.2/math.js"></script>
<main>
<ol>
<li><a href="https://docs.github.com/en/graphql/overview/explorer" target="_blank">Open GraphQL Explorer</a></li>
<li>Pase and run the following query
<pre><code>{
user: viewer {
createdAt
y2020: contributionsCollection(from: "2020-05-01T00:00:00Z", to: "2021-04-30T23:59:59Z") {
endedAt
restrictedContributionsCount
contributionCalendar {
totalContributions
}
}
y2019: contributionsCollection(from: "2019-05-01T00:00:00Z", to: "2020-04-30T23:59:59Z") {
endedAt
restrictedContributionsCount
contributionCalendar {
totalContributions
}
}
y2018: contributionsCollection(from: "2018-05-01T00:00:00Z", to: "2019-04-30T23:59:59Z") {
endedAt
restrictedContributionsCount
contributionCalendar {
totalContributions
}
}
}
}
</code></pre>
</li>
<li>
<p>
Copy the results and past it into the following form, then click run</p>
<form id="form">
<textarea id="data"></textarea>
<button type="submit">
Run
</button>
</form>
</li>
<li><p>
Result is <input id="result" disabled /></p><p><i>
The target audience is users whose this result exceed 500.</i>
</p></li>
</ol>
</main>
CSS
ol,
form {
display: grid;
gap: 1rem;
}
pre {
margin: auto;
}
textarea {
height: 12rem;
font-family: monospace;
}
JavaScript
const createAnnual = (createdAt) => {
const createdAtDate = new Date(createdAt)
return (data) => {
const startedAtDate = new Date(data.startedAt)
const isFullfil = createdAtDate <= startedAtDate
const cont = data.contributionCalendar.totalContributions - data.restrictedContributionsCount
return (isFullfil ? cont : cont / ((new Date(data.endedAt) - createdAtDate) / 86400000) * 365) || 1
}
}
const run = (data) => {
const {
data: {
user: {
createdAt,
y2020,
y2019,
y2018
}
}
} = JSON.parse(data)
const values = [y2020, y2019, y2018].filter(v => {
return new Date(createdAt) < new Date(v.endedAt)
})
const annual = createAnnual(createdAt)
const sim = values.length > 1 ? math.pow(values.reduce((a, c) => {
return math.bignumber(
a.contributionCalendar ? annual(a) : a
).mul(annual(c))
}), math.bignumber(1).div(values.length)) : math.bignumber(y2020.contributionCalendar.totalContributions - y2020.restrictedContributionsCount)
return sim.toNumber()
}
document.getElementById("form").addEventListener("submit", e => {
e.preventDefault()
document.getElementById("result").value = run(
document.getElementById("data").value
)
})