[GitHubHacktoberfest] 2020 (and beyond) (#5549)

* feat: GitHub Hacktoberfest 2020 (and beyond)

* chore: prettify

* refactor: convert to static fields

* refactor: fix spelling in pre-start message

Co-authored-by: repo-ranger[bot] <39074581+repo-ranger[bot]@users.noreply.github.com>
This commit is contained in:
Caleb Cartwright
2020-09-20 13:40:47 -05:00
committed by GitHub
parent ff3acce7bb
commit 36395715a5
3 changed files with 83 additions and 55 deletions

View File

@@ -59,66 +59,71 @@ const queryParamSchema = Joi.object({
}).required()
module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Service {
static get category() {
return 'issue-tracking'
static category = 'issue-tracking'
static route = {
base: 'github/hacktoberfest',
pattern: ':year(2019|2020)/:user/:repo',
queryParamSchema,
}
static get route() {
return {
base: 'github/hacktoberfest/2019',
pattern: ':user/:repo',
queryParamSchema,
}
}
static get examples() {
return [
{
title: 'GitHub Hacktoberfest combined status',
namedParams: {
user: 'snyk',
repo: 'snyk',
},
staticPreview: this.render({
suggestedIssueCount: 12,
contributionCount: 8,
daysLeft: 15,
}),
documentation,
static examples = [
{
title: 'GitHub Hacktoberfest combined status',
namedParams: {
year: '2020',
user: 'snyk',
repo: 'snyk',
},
{
title:
'GitHub Hacktoberfest combined status (suggestion label override)',
namedParams: {
user: 'tmrowco',
repo: 'tmrowapp-contrib',
},
queryParams: {
suggestion_label: 'help wanted',
},
staticPreview: this.render({
suggestedIssueCount: 12,
contributionCount: 8,
daysLeft: 15,
}),
documentation,
staticPreview: this.render({
suggestedIssueCount: 12,
contributionCount: 8,
daysLeft: 15,
}),
documentation,
},
{
title: 'GitHub Hacktoberfest combined status (suggestion label override)',
namedParams: {
year: '2020',
user: 'tmrowco',
repo: 'tmrowapp-contrib',
},
]
}
queryParams: {
suggestion_label: 'help wanted',
},
staticPreview: this.render({
year: '2020',
suggestedIssueCount: 12,
contributionCount: 8,
daysLeft: 15,
}),
documentation,
},
]
static get defaultBadgeData() {
return {
label: 'hacktoberfest',
color: 'orange',
static defaultBadgeData = { label: 'hacktoberfest', color: 'orange' }
static render({
suggestedIssueCount,
contributionCount,
daysLeft,
daysToStart,
year,
hasStarted = true,
}) {
if (!hasStarted) {
return {
message: `${daysToStart} ${maybePluralize(
'day',
daysToStart
)} till kickoff!`,
}
}
}
static render({ suggestedIssueCount, contributionCount, daysLeft }) {
if (daysLeft === undefined) {
// The global cutoff time is 11/1 noon UTC.
// https://github.com/badges/shields/pull/4109#discussion_r330782093
// We want to show "1 day left" on the last day so we add 1.
daysLeft = moment('2019-11-01 12:00:00 Z').diff(moment(), 'days') + 1
daysLeft = moment(`${year}-11-01 12:00:00 Z`).diff(moment(), 'days') + 1
}
if (daysLeft < 0) {
return {
@@ -152,11 +157,11 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser
return { message }
}
async fetch({ user, repo, suggestionLabel = 'hacktoberfest' }) {
async fetch({ user, repo, year, suggestionLabel = 'hacktoberfest' }) {
const isValidOctoberPR = [
`repo:${user}/${repo}`,
'is:pr',
'created:2019-10-01..2019-10-31',
`created:${year}-10-01..${year}-10-31`,
`-label:invalid`,
]
.filter(Boolean)
@@ -201,15 +206,31 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser
}
}
async handle({ user, repo }, { suggestion_label: suggestionLabel }) {
static getCalendarPosition(year) {
const daysToStart =
moment(`${year}-10-01 12:00:00 Z`).diff(moment(), 'days') + 1
const isBefore = daysToStart > 0
return { daysToStart, isBefore }
}
async handle({ user, repo, year }, { suggestion_label: suggestionLabel }) {
const { isBefore, daysToStart } = this.constructor.getCalendarPosition(
+year
)
if (isBefore) {
return this.constructor.render({ hasStarted: false, daysToStart, year })
}
const { suggestedIssueCount, contributionCount } = await this.fetch({
user,
repo,
year,
suggestionLabel,
})
return this.constructor.render({
suggestedIssueCount,
contributionCount,
year,
})
}
}

View File

@@ -18,5 +18,12 @@ describe('GitHubHacktoberfest', function () {
}).expect({
message: '54 open issues, 27 PRs, 10 days left',
})
given({
daysToStart: 5,
hasStarted: false,
year: 2020,
}).expect({
message: '5 days till kickoff!',
})
})
})

View File

@@ -20,7 +20,7 @@ const isHacktoberfestStatus = Joi.alternatives().try(
)
t.create('GitHub Hacktoberfest combined status')
.get('/badges/shields.json')
.get('/2019/badges/shields.json')
.expectBadge({
label: 'hacktoberfest',
message: isHacktoberfestStatus,
@@ -28,7 +28,7 @@ t.create('GitHub Hacktoberfest combined status')
t.create('GitHub Hacktoberfest combined status (suggestion label override)')
.get(
`/badges/shields.json?suggestion_label=${encodeURIComponent(
`/2019/badges/shields.json?suggestion_label=${encodeURIComponent(
'good first issue'
)}`
)