Skip to content

Commit d29625c

Browse files
authored
chore: generate browser versions when doing release (#999)
This introduces a handful of new markdown preprocessor commands to insert browser versions: - `GEN:chromium-version-if-release` - inserts current Chromium version if we're doing release; noop otherwise. - `GEN:firefox-version-if-release` - inserts current Firefox version if we're doing release; noop otherwise. And to generate badge links: - `GEN:chromium-version-badge-if-release` - inserts current Chromium version badge if we're doing release; noop otherwise. - `GEN:firefox-version-badge-if-release` - inserts current Firefox version badge if we're doing release; noop otherwise. This doesn't touch webkit at all - we're yet to figure what to do with webkit version. NOTE: versions will be updated only once we release. This way our README.md always represents last released version.
1 parent 1eabd18 commit d29625c

File tree

4 files changed

+114
-31
lines changed

4 files changed

+114
-31
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Playwright
2-
[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-81.0.4044-blue.svg)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-73.0b3-blue.svg)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-13.0.4-blue.svg)](https://webkit.org/) [![Join Slack](https://img.shields.io/badge/join-slack-infomational)](https://join.slack.com/t/playwright/shared_invite/enQtOTEyMTUxMzgxMjIwLThjMDUxZmIyNTRiMTJjNjIyMzdmZDA3MTQxZWUwZTFjZjQwNGYxZGM5MzRmNzZlMWI5ZWUyOTkzMjE5Njg1NDg)
2+
[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) <!-- GEN:chromium-version-badge-if-release -->[![Chromium version](https://img.shields.io/badge/chromium-81.0.4044-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) <!-- GEN:stop --> <!-- GEN:firefox-version-badge-if-release --> [![Firefox version](https://img.shields.io/badge/firefox-73.0b3-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/) <!-- GEN:stop --> [![WebKit version](https://img.shields.io/badge/webkit-13.0.4-blue.svg?logo=safari)](https://webkit.org/) [![Join Slack](https://img.shields.io/badge/join-slack-infomational)](https://join.slack.com/t/playwright/shared_invite/enQtOTEyMTUxMzgxMjIwLThjMDUxZmIyNTRiMTJjNjIyMzdmZDA3MTQxZWUwZTFjZjQwNGYxZGM5MzRmNzZlMWI5ZWUyOTkzMjE5Njg1NDg)
33

44
###### [API](https://github.com/microsoft/playwright/blob/v0.10.0/docs/api.md) | [FAQ](#faq) | [Contributing](#contributing)
55

@@ -8,9 +8,9 @@ Playwright is a Node library to automate the [Chromium](https://www.chromium.org
88

99
| | ver | Linux | macOS | Win |
1010
| ---: | :---: | :---: | :---: | :---: |
11-
| Chromium| 81.0.4044 | :white_check_mark: | :white_check_mark: | :white_check_mark: |
11+
| Chromium| <!-- GEN:chromium-version-if-release-->81.0.4044<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
1212
| WebKit | 13.0.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: |
13-
| Firefox |73.0b3 | :white_check_mark: | :white_check_mark: | :white_check_mark: |
13+
| Firefox | <!-- GEN:firefox-version-if-release -->73.0b3<!-- GEN:stop --> | :white_check_mark: | :white_check_mark: | :white_check_mark: |
1414
- Headless is supported for all the browsers on all platforms.
1515

1616

utils/doclint/cli.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
* limitations under the License.
1616
*/
1717

18-
const playwright = require('../../index.js').chromium;
18+
const playwright = require('../../index.js');
1919
const path = require('path');
2020
const Source = require('./Source');
2121

22+
const {spawnSync} = require('child_process');
23+
2224
const PROJECT_DIR = path.join(__dirname, '..', '..');
2325
const VERSION = require(path.join(PROJECT_DIR, 'package.json')).version;
2426

@@ -43,10 +45,15 @@ async function run() {
4345
const mdSources = [readme, api, troubleshooting];
4446

4547
const preprocessor = require('./preprocessor');
46-
messages.push(...await preprocessor.runCommands(mdSources, VERSION));
48+
const browserVersions = getBrowserVersions();
49+
messages.push(...(await preprocessor.runCommands(mdSources, {
50+
libversion: VERSION,
51+
chromiumVersion: browserVersions.chromium,
52+
firefoxVersion: browserVersions.firefox,
53+
})));
4754
messages.push(...await preprocessor.ensureReleasedAPILinks([readme], VERSION));
4855

49-
const browser = await playwright.launch();
56+
const browser = await playwright.chromium.launch();
5057
const page = await browser.newPage();
5158
const checkPublicAPI = require('./check_public_api');
5259
const jsSources = await Source.readdir(path.join(PROJECT_DIR, 'src'));
@@ -60,7 +67,7 @@ async function run() {
6067
await source.save();
6168
changedFiles = true;
6269
}
63-
70+
6471
await readme.saveAs(path.join(PROJECT_DIR, 'packages', 'playwright', 'README.md'));
6572
}
6673

@@ -94,3 +101,12 @@ async function run() {
94101
console.log(`DocLint Finished in ${runningTime / 1000} seconds`);
95102
process.exit(clearExit ? 0 : 1);
96103
}
104+
105+
function getBrowserVersions() {
106+
const chromiumVersion = spawnSync(playwright.chromium.executablePath(), ['--version']).stdout.toString();
107+
const firefoxVersion = spawnSync(playwright.firefox.executablePath(), ['--version']).stdout.toString();
108+
return {
109+
chromium: chromiumVersion.trim().split(' ').pop(),
110+
firefox: firefoxVersion.trim().split(' ').pop(),
111+
};
112+
}

utils/doclint/preprocessor/index.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
*/
1616

1717
const Message = require('../Message');
18+
const {firefox, webkit, chromium} = require('../../../');
1819

19-
module.exports.ensureReleasedAPILinks = function(sources, version) {
20+
module.exports.ensureReleasedAPILinks = function(sources, libversion) {
2021
// Release version is everything that doesn't include "-".
2122
const apiLinkRegex = /https:\/\/github.com\/microsoft\/playwright\/blob\/v[^/]*\/docs\/api.md/ig;
22-
const lastReleasedAPI = `https://github.com/microsoft/playwright/blob/v${version.split('-')[0]}/docs/api.md`;
23+
const lastReleasedAPI = `https://github.com/microsoft/playwright/blob/v${libversion.split('-')[0]}/docs/api.md`;
2324

2425
const messages = [];
2526
for (const source of sources) {
@@ -31,9 +32,9 @@ module.exports.ensureReleasedAPILinks = function(sources, version) {
3132
return messages;
3233
};
3334

34-
module.exports.runCommands = function(sources, version) {
35+
module.exports.runCommands = function(sources, {libversion, chromiumVersion, firefoxVersion}) {
3536
// Release version is everything that doesn't include "-".
36-
const isReleaseVersion = !version.includes('-');
37+
const isReleaseVersion = !libversion.includes('-');
3738

3839
const messages = [];
3940
const commands = [];
@@ -65,9 +66,17 @@ module.exports.runCommands = function(sources, version) {
6566
for (const command of commands) {
6667
let newText = null;
6768
if (command.name === 'version')
68-
newText = isReleaseVersion ? 'v' + version : 'Tip-Of-Tree';
69+
newText = isReleaseVersion ? 'v' + libversion : 'Tip-Of-Tree';
6970
else if (command.name === 'empty-if-release')
7071
newText = isReleaseVersion ? '' : command.originalText;
72+
else if (command.name === 'chromium-version-if-release')
73+
newText = isReleaseVersion ? chromiumVersion : command.originalText;
74+
else if (command.name === 'firefox-version-if-release')
75+
newText = isReleaseVersion ? firefoxVersion : command.originalText;
76+
else if (command.name === 'chromium-version-badge-if-release')
77+
newText = isReleaseVersion ? `[![Chromium version](https://img.shields.io/badge/chromium-${chromiumVersion}-blue.svg?logo=google-chrome)](https://www.chromium.org/Home)` : command.originalText;
78+
else if (command.name === 'firefox-version-badge-if-release')
79+
newText = isReleaseVersion ? `[![Firefox version](https://img.shields.io/badge/firefox-${firefoxVersion}-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/)` : command.originalText;
7180
else if (command.name === 'toc')
7281
newText = generateTableOfContents(command.source.text(), command.to, false /* topLevelOnly */);
7382
else if (command.name === 'toc-top-level')

utils/doclint/preprocessor/test.js

Lines changed: 77 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,21 @@ describe('ensureReleasedAPILinks', function() {
6363
});
6464

6565
describe('runCommands', function() {
66+
const OPTIONS_REL = {
67+
libversion: '1.3.0',
68+
chromiumVersion: '80.0.4004.0',
69+
firefoxVersion: '73.0b3',
70+
};
71+
const OPTIONS_DEV = {
72+
libversion: '1.3.0-post',
73+
chromiumVersion: '<CRVERSION>',
74+
firefoxVersion: '<FFVERSION>',
75+
};
6676
it('should throw for unknown command', function() {
6777
const source = new Source('doc.md', `
6878
<!-- gen:unknown-command -->something<!-- gen:stop -->
6979
`);
70-
const messages = runCommands([source], '1.1.1');
80+
const messages = runCommands([source], OPTIONS_REL);
7181
expect(source.hasUpdatedText()).toBe(false);
7282
expect(messages.length).toBe(1);
7383
expect(messages[0].type).toBe('error');
@@ -78,19 +88,19 @@ describe('runCommands', function() {
7888
const source = new Source('doc.md', `
7989
Playwright <!-- gen:version -->XXX<!-- gen:stop -->
8090
`);
81-
const messages = runCommands([source], '1.2.0');
91+
const messages = runCommands([source], OPTIONS_REL);
8292
expect(messages.length).toBe(1);
8393
expect(messages[0].type).toBe('warning');
8494
expect(messages[0].text).toContain('doc.md');
8595
expect(source.text()).toBe(`
86-
Playwright <!-- gen:version -->v1.2.0<!-- gen:stop -->
96+
Playwright <!-- gen:version -->v1.3.0<!-- gen:stop -->
8797
`);
8898
});
8999
it('should work for *-post versions', function() {
90100
const source = new Source('doc.md', `
91101
Playwright <!-- gen:version -->XXX<!-- gen:stop -->
92102
`);
93-
const messages = runCommands([source], '1.2.0-post');
103+
const messages = runCommands([source], OPTIONS_DEV);
94104
expect(messages.length).toBe(1);
95105
expect(messages[0].type).toBe('warning');
96106
expect(messages[0].text).toContain('doc.md');
@@ -101,12 +111,12 @@ describe('runCommands', function() {
101111
it('should tolerate different writing', function() {
102112
const source = new Source('doc.md', `Playwright v<!-- gEn:version -->WHAT
103113
<!-- GEN:stop -->`);
104-
runCommands([source], '1.1.1');
105-
expect(source.text()).toBe(`Playwright v<!-- gEn:version -->v1.1.1<!-- GEN:stop -->`);
114+
runCommands([source], OPTIONS_REL);
115+
expect(source.text()).toBe(`Playwright v<!-- gEn:version -->v1.3.0<!-- GEN:stop -->`);
106116
});
107117
it('should not tolerate missing gen:stop', function() {
108118
const source = new Source('doc.md', `<!--GEN:version-->`);
109-
const messages = runCommands([source], '1.2.0');
119+
const messages = runCommands([source], OPTIONS_REL);
110120
expect(source.hasUpdatedText()).toBe(false);
111121
expect(messages.length).toBe(1);
112122
expect(messages[0].type).toBe('error');
@@ -118,7 +128,7 @@ describe('runCommands', function() {
118128
const source = new Source('doc.md', `
119129
<!-- gen:empty-if-release -->XXX<!-- gen:stop -->
120130
`);
121-
const messages = runCommands([source], '1.1.1');
131+
const messages = runCommands([source], OPTIONS_REL);
122132
expect(messages.length).toBe(1);
123133
expect(messages[0].type).toBe('warning');
124134
expect(messages[0].text).toContain('doc.md');
@@ -130,7 +140,7 @@ describe('runCommands', function() {
130140
const source = new Source('doc.md', `
131141
<!-- gen:empty-if-release -->XXX<!-- gen:stop -->
132142
`);
133-
const messages = runCommands([source], '1.1.1-post');
143+
const messages = runCommands([source], OPTIONS_DEV);
134144
expect(messages.length).toBe(0);
135145
expect(source.text()).toBe(`
136146
<!-- gen:empty-if-release -->XXX<!-- gen:stop -->
@@ -143,7 +153,7 @@ describe('runCommands', function() {
143153
### class: page
144154
#### page.$
145155
#### page.$$`);
146-
const messages = runCommands([source], '1.3.0');
156+
const messages = runCommands([source], OPTIONS_REL);
147157
expect(messages.length).toBe(1);
148158
expect(messages[0].type).toBe('warning');
149159
expect(messages[0].text).toContain('doc.md');
@@ -164,7 +174,7 @@ describe('runCommands', function() {
164174
# yo comment
165175
\`\`\`
166176
`);
167-
const messages = runCommands([source], '1.3.0');
177+
const messages = runCommands([source], OPTIONS_REL);
168178
expect(messages.length).toBe(1);
169179
expect(messages[0].type).toBe('warning');
170180
expect(messages[0].text).toContain('doc.md');
@@ -182,7 +192,7 @@ describe('runCommands', function() {
182192
const source = new Source('doc.md', `<!-- gen:toc -->XXX<!-- gen:stop -->
183193
### some [link](#foobar) here
184194
`);
185-
const messages = runCommands([source], '1.3.0');
195+
const messages = runCommands([source], OPTIONS_REL);
186196
expect(messages.length).toBe(1);
187197
expect(messages[0].type).toBe('warning');
188198
expect(messages[0].text).toContain('doc.md');
@@ -201,7 +211,7 @@ describe('runCommands', function() {
201211
#### first.2.1
202212
## Second
203213
`);
204-
const messages = runCommands([source], '1.3.0');
214+
const messages = runCommands([source], OPTIONS_REL);
205215
expect(messages.length).toBe(1);
206216
expect(messages[0].type).toBe('warning');
207217
expect(messages[0].text).toContain('doc.md');
@@ -221,20 +231,68 @@ describe('runCommands', function() {
221231
});
222232
it('should work with multiple commands', function() {
223233
const source = new Source('doc.md', `
224-
<!-- gen:version -->XXX<!-- gen:stop -->
225-
<!-- gen:empty-if-release -->YYY<!-- gen:stop -->
226-
<!-- gen:version -->ZZZ<!-- gen:stop -->
234+
<!-- gen:version -->xxx<!-- gen:stop -->
235+
<!-- gen:empty-if-release -->yyy<!-- gen:stop -->
236+
<!-- gen:version -->zzz<!-- gen:stop -->
227237
`);
228-
const messages = runCommands([source], '1.1.1');
238+
const messages = runCommands([source], OPTIONS_REL);
229239
expect(messages.length).toBe(1);
230240
expect(messages[0].type).toBe('warning');
231241
expect(messages[0].text).toContain('doc.md');
232242
expect(source.text()).toBe(`
233-
<!-- gen:version -->v1.1.1<!-- gen:stop -->
243+
<!-- gen:version -->v1.3.0<!-- gen:stop -->
234244
<!-- gen:empty-if-release --><!-- gen:stop -->
235-
<!-- gen:version -->v1.1.1<!-- gen:stop -->
245+
<!-- gen:version -->v1.3.0<!-- gen:stop -->
236246
`);
237247
});
248+
describe('gen:chromium-version-if-release', function() {
249+
it('should work for release', function() {
250+
const source = new Source('doc.md', `
251+
Playwright <!-- gen:chromium-version-if-release -->XXX<!-- gen:stop -->
252+
`);
253+
const messages = runCommands([source], OPTIONS_REL);
254+
expect(messages.length).toBe(1);
255+
expect(messages[0].type).toBe('warning');
256+
expect(messages[0].text).toContain('doc.md');
257+
expect(source.text()).toBe(`
258+
Playwright <!-- gen:chromium-version-if-release -->80.0.4004.0<!-- gen:stop -->
259+
`);
260+
});
261+
it('should be noop for dev', function() {
262+
const source = new Source('doc.md', `
263+
Playwright <!-- gen:chromium-version-if-release -->XXX<!-- gen:stop -->
264+
`);
265+
const messages = runCommands([source], OPTIONS_DEV);
266+
expect(messages.length).toBe(0);
267+
expect(source.text()).toBe(`
268+
Playwright <!-- gen:chromium-version-if-release -->XXX<!-- gen:stop -->
269+
`);
270+
});
271+
});
272+
describe('gen:firefox-version', function() {
273+
it('should work for release', function() {
274+
const source = new Source('doc.md', `
275+
Playwright <!-- gen:firefox-version-if-release -->XXX<!-- gen:stop -->
276+
`);
277+
const messages = runCommands([source], OPTIONS_REL);
278+
expect(messages.length).toBe(1);
279+
expect(messages[0].type).toBe('warning');
280+
expect(messages[0].text).toContain('doc.md');
281+
expect(source.text()).toBe(`
282+
Playwright <!-- gen:firefox-version-if-release -->73.0b3<!-- gen:stop -->
283+
`);
284+
});
285+
it('should be noop for dev', function() {
286+
const source = new Source('doc.md', `
287+
Playwright <!-- gen:firefox-version-if-release -->XXX<!-- gen:stop -->
288+
`);
289+
const messages = runCommands([source], OPTIONS_DEV);
290+
expect(messages.length).toBe(0);
291+
expect(source.text()).toBe(`
292+
Playwright <!-- gen:firefox-version-if-release -->XXX<!-- gen:stop -->
293+
`);
294+
});
295+
});
238296
});
239297

240298
runner.run();

0 commit comments

Comments
 (0)