Skip to content

Commit 0df230b

Browse files
committed
Add lint rules to ensure every key under prs is stage and each key tha
t is there is a valid URL for a PR on emberjs/rfcs
1 parent 7c3c7ce commit 0df230b

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

lib/frontmatter-linter.js

+41-5
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,50 @@ module.exports = class FrontmatterLinter {
4545
prs: {
4646
type: 'object',
4747
required: true,
48+
conform(value) {
49+
let keys = Object.keys(value);
50+
return keys.every((key) => stages.includes(key));
51+
},
52+
messages: {
53+
conform: `must only include keys for RFC Stages: ${stages.join(', ')}`,
54+
},
4855
properties: {
4956
accepted: {
5057
required: true,
5158
allowEmpty: false,
52-
conform(url) {
53-
let regex = /https:\/\/github.com\/emberjs\/rfcs\/pull\/\d+(\/|$)$/;
54-
let cli = /https:\/\/github.com\/ember-cli\/rfcs\/pull\/\d+(\/|$)$/;
55-
return regex.test(url) || cli.test(url);
56-
},
59+
conform: rfcUrlConform,
5760
messages: {
5861
conform:
5962
'must be the URL for the original pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
6063
},
6164
},
65+
'ready-for-release': {
66+
required: false,
67+
allowEmpty: true,
68+
conform: rfcUrlConform,
69+
messages: {
70+
conform:
71+
'must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
72+
},
73+
},
74+
released: {
75+
required: false,
76+
allowEmpty: true,
77+
conform: rfcUrlConform,
78+
messages: {
79+
conform:
80+
'must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
81+
},
82+
},
83+
recommended: {
84+
required: false,
85+
allowEmpty: true,
86+
conform: rfcUrlConform,
87+
messages: {
88+
conform:
89+
'must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
90+
},
91+
},
6292
},
6393
},
6494
'release-date': {
@@ -132,3 +162,9 @@ function formatErrors(errors) {
132162
return `${e.property} ${e.message}`;
133163
});
134164
}
165+
166+
function rfcUrlConform(url) {
167+
let regex = /https:\/\/github.com\/emberjs\/rfcs\/pull\/\d+(\/|$)$/;
168+
let cli = /https:\/\/github.com\/ember-cli\/rfcs\/pull\/\d+(\/|$)$/;
169+
return regex.test(url) || cli.test(url);
170+
}

test/frontmatter-linter-test.js

+48
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,36 @@ prs:
6868
accepted: https://github.com/emberjs/rfcs/pull/123/files
6969
---`;
7070

71+
const multiplePrsKeysMetadata = `---
72+
stage: recommended
73+
start-date: 2020-01-01
74+
release-date: 2020-04-02
75+
release-versions:
76+
ember-source: v1.1.1
77+
ember-data: v0.0.3
78+
teams:
79+
- framework
80+
prs:
81+
accepted: https://github.com/emberjs/rfcs/pull/123/
82+
ready-for-release: https://example.com/emberjs/rfcs/pull/456/
83+
released: https://github.com/emberjs/ember.js/pull/789/
84+
recommended: https://raw.github.com/emberjs/rfcs/987
85+
---`;
86+
87+
const extraPrsKeysMetadata = `---
88+
stage: recommended
89+
start-date: 2020-01-01
90+
release-date: 2020-04-02
91+
release-versions:
92+
ember-source: v1.1.1
93+
ember-data: v0.0.3
94+
teams:
95+
- framework
96+
prs:
97+
accepted: https://github.com/emberjs/rfcs/pull/123/
98+
edition: https://github.com/emberjs/rfcs/pull/456/
99+
---`;
100+
71101
const cliUrlForRFCMetadataMarkdown = `---
72102
stage: recommended
73103
start-date: 2020-01-01
@@ -153,6 +183,24 @@ describe('FrontmatterLinter', function () {
153183
]);
154184
});
155185

186+
it('reports errors for each incorrect key under prs', function () {
187+
let results = linter.lint(multiplePrsKeysMetadata);
188+
189+
expect(results.messages).to.deep.eql([
190+
'prs.ready-for-release must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
191+
'prs.released must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
192+
'prs.recommended must be the URL for the advancement pull request on emberjs/rfcs, for example: https://github.com/emberjs/rfcs/pull/123',
193+
]);
194+
});
195+
196+
it('reports errors for extraneous keys under prs', function () {
197+
let results = linter.lint(extraPrsKeysMetadata);
198+
199+
expect(results.messages).to.deep.eql([
200+
'prs must only include keys for RFC Stages: proposed, exploring, accepted, ready-for-release, released, recommended',
201+
]);
202+
});
203+
156204
it('reports NO errors for completed metadata', function () {
157205
let results = linter.lint(completedMetadataMarkdown);
158206
expect(results.messages).to.be.empty;

0 commit comments

Comments
 (0)