@nsxbet/playwright-orchestrator 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -5
- package/dist/commands/assign.d.ts.map +1 -1
- package/dist/commands/assign.js +7 -48
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/extract-timing.d.ts +1 -12
- package/dist/commands/extract-timing.d.ts.map +1 -1
- package/dist/commands/extract-timing.js +15 -84
- package/dist/commands/extract-timing.js.map +1 -1
- package/dist/commands/merge-timing.d.ts +1 -4
- package/dist/commands/merge-timing.d.ts.map +1 -1
- package/dist/commands/merge-timing.js +11 -106
- package/dist/commands/merge-timing.js.map +1 -1
- package/dist/core/estimate.d.ts +9 -9
- package/dist/core/estimate.d.ts.map +1 -1
- package/dist/core/estimate.js +4 -4
- package/dist/core/estimate.js.map +1 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/test-discovery.d.ts.map +1 -1
- package/dist/core/test-discovery.js +7 -4
- package/dist/core/test-discovery.js.map +1 -1
- package/dist/core/timing-store.d.ts +16 -36
- package/dist/core/timing-store.d.ts.map +1 -1
- package/dist/core/timing-store.js +21 -140
- package/dist/core/timing-store.js.map +1 -1
- package/dist/core/types.d.ts +7 -67
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -32
- package/dist/core/types.js.map +1 -1
- package/dist/reporter.d.ts +40 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +73 -0
- package/dist/reporter.js.map +1 -0
- package/package.json +20 -1
- package/dist/core/grep-pattern.d.ts +0 -61
- package/dist/core/grep-pattern.d.ts.map +0 -1
- package/dist/core/grep-pattern.js +0 -104
- package/dist/core/grep-pattern.js.map +0 -1
package/README.md
CHANGED
|
@@ -70,6 +70,23 @@ playwright-orchestrator merge-timing \
|
|
|
70
70
|
2. **Run Tests**: Each shard reads its files from `needs.orchestrate.outputs`
|
|
71
71
|
3. **Merge**: Collect timing from all shards, update history with EMA
|
|
72
72
|
|
|
73
|
+
## Reporter Setup
|
|
74
|
+
|
|
75
|
+
Add the reporter to your `playwright.config.ts`:
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { defineConfig } from '@playwright/test';
|
|
79
|
+
|
|
80
|
+
export default defineConfig({
|
|
81
|
+
reporter: [
|
|
82
|
+
['@nsxbet/playwright-orchestrator/reporter'],
|
|
83
|
+
['html'],
|
|
84
|
+
],
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The reporter reads `ORCHESTRATOR_SHARD_FILE` env var to filter tests for the current shard.
|
|
89
|
+
|
|
73
90
|
## GitHub Actions (External Repositories)
|
|
74
91
|
|
|
75
92
|
Use the orchestrator in your own repository. The recommended pattern runs orchestration **once** before matrix jobs:
|
|
@@ -99,8 +116,6 @@ jobs:
|
|
|
99
116
|
test-dir: ./e2e
|
|
100
117
|
shards: 4
|
|
101
118
|
timing-file: timing-data.json
|
|
102
|
-
project: Mobile Chrome # Recommended for accurate parameterized test discovery
|
|
103
|
-
# No shard-index = outputs ALL shards
|
|
104
119
|
|
|
105
120
|
# Phase 2: Run tests (parallel matrix)
|
|
106
121
|
e2e:
|
|
@@ -113,7 +128,7 @@ jobs:
|
|
|
113
128
|
steps:
|
|
114
129
|
- uses: actions/checkout@v4
|
|
115
130
|
|
|
116
|
-
# Action
|
|
131
|
+
# Action outputs shard-file path for reporter
|
|
117
132
|
- uses: NSXBet/playwright-orchestrator/.github/actions/get-shard@v0
|
|
118
133
|
id: shard
|
|
119
134
|
with:
|
|
@@ -121,8 +136,10 @@ jobs:
|
|
|
121
136
|
shard-index: ${{ matrix.shard }}
|
|
122
137
|
shards: 4
|
|
123
138
|
|
|
124
|
-
#
|
|
125
|
-
- run: npx playwright test
|
|
139
|
+
# Reporter reads ORCHESTRATOR_SHARD_FILE to filter tests
|
|
140
|
+
- run: npx playwright test
|
|
141
|
+
env:
|
|
142
|
+
ORCHESTRATOR_SHARD_FILE: ${{ steps.shard.outputs.shard-file }}
|
|
126
143
|
```
|
|
127
144
|
|
|
128
145
|
See [docs/external-integration.md](./docs/external-integration.md) for complete workflow with timing data persistence.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAsB7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SAC8C;IAEzE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;;MA8DnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA2BZ,YAAY;YAqIZ,YAAY;IAyF1B,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,cAAc;CAQvB"}
|
package/dist/commands/assign.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
2
|
import { Command, Flags } from '@oclif/core';
|
|
3
3
|
import { glob } from 'glob';
|
|
4
|
-
import { assignWithCKK, assignWithLPT,
|
|
4
|
+
import { assignWithCKK, assignWithLPT, DEFAULT_CKK_TIMEOUT, DEFAULT_MS_PER_LINE, discoverTests, discoverTestsFromFiles, estimateDuration, formatAssignResult, getFileDuration, getTestDurations, loadTestListFromFile, loadTimingData, } from '../core/index.js';
|
|
5
5
|
export default class Assign extends Command {
|
|
6
6
|
static description = 'Assign test files or tests to shards based on historical timing data';
|
|
7
7
|
static examples = [
|
|
@@ -133,8 +133,6 @@ export default class Assign extends Command {
|
|
|
133
133
|
this.warn(`No tests found in ${source}`);
|
|
134
134
|
this.outputTestResult({
|
|
135
135
|
shards: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, []])),
|
|
136
|
-
grepPatterns: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, ''])),
|
|
137
|
-
testLocations: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, []])),
|
|
138
136
|
expectedDurations: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, 0])),
|
|
139
137
|
totalTests: 0,
|
|
140
138
|
estimatedTests: [],
|
|
@@ -148,13 +146,7 @@ export default class Assign extends Command {
|
|
|
148
146
|
// Load timing data if available
|
|
149
147
|
let timingData = null;
|
|
150
148
|
if (flags['timing-file']) {
|
|
151
|
-
|
|
152
|
-
if (isTimingDataV2(loadedData)) {
|
|
153
|
-
timingData = loadedData;
|
|
154
|
-
}
|
|
155
|
-
else if (flags.verbose) {
|
|
156
|
-
this.warn('Timing data is v1 (file-level), will estimate all tests');
|
|
157
|
-
}
|
|
149
|
+
timingData = loadTimingData(flags['timing-file']);
|
|
158
150
|
}
|
|
159
151
|
// Get test durations
|
|
160
152
|
const testsWithDurations = getTestDurations(tests, timingData);
|
|
@@ -177,35 +169,14 @@ export default class Assign extends Command {
|
|
|
177
169
|
this.log(`Assignment ${ckkResult.isOptimal ? 'optimal' : 'near-optimal (LPT fallback)'}`);
|
|
178
170
|
this.log(`Makespan: ${this.formatDuration(ckkResult.makespan)}`);
|
|
179
171
|
}
|
|
180
|
-
//
|
|
172
|
+
// Build shard assignments
|
|
181
173
|
const shardTests = {};
|
|
182
174
|
for (const assignment of ckkResult.assignments) {
|
|
183
175
|
shardTests[assignment.shardIndex] = assignment.tests;
|
|
184
176
|
}
|
|
185
|
-
const grepPatterns = generateGrepPatterns(shardTests);
|
|
186
|
-
// Build testId to test lookup for generating test locations
|
|
187
|
-
const testById = new Map();
|
|
188
|
-
for (const test of tests) {
|
|
189
|
-
testById.set(test.testId, test);
|
|
190
|
-
}
|
|
191
|
-
// Generate test locations (file:line format) for exact test filtering
|
|
192
|
-
const testLocations = {};
|
|
193
|
-
for (const [shardIndex, testIds] of Object.entries(shardTests)) {
|
|
194
|
-
testLocations[Number(shardIndex)] = testIds
|
|
195
|
-
.map((testId) => {
|
|
196
|
-
const test = testById.get(testId);
|
|
197
|
-
if (test) {
|
|
198
|
-
return buildTestLocation(test.file, test.line);
|
|
199
|
-
}
|
|
200
|
-
return null;
|
|
201
|
-
})
|
|
202
|
-
.filter((loc) => loc !== null);
|
|
203
|
-
}
|
|
204
177
|
// Build result
|
|
205
178
|
const result = {
|
|
206
179
|
shards: shardTests,
|
|
207
|
-
grepPatterns,
|
|
208
|
-
testLocations,
|
|
209
180
|
expectedDurations: Object.fromEntries(ckkResult.assignments.map((a) => [a.shardIndex, a.expectedDuration])),
|
|
210
181
|
totalTests: tests.length,
|
|
211
182
|
estimatedTests,
|
|
@@ -235,12 +206,14 @@ export default class Assign extends Command {
|
|
|
235
206
|
// Load timing data if available
|
|
236
207
|
const timingData = flags['timing-file']
|
|
237
208
|
? loadTimingData(flags['timing-file'])
|
|
238
|
-
:
|
|
209
|
+
: null;
|
|
239
210
|
// Build file list with durations
|
|
240
211
|
const filesWithDurations = [];
|
|
241
212
|
const estimatedFiles = [];
|
|
242
213
|
for (const file of testFiles) {
|
|
243
|
-
const historicalDuration =
|
|
214
|
+
const historicalDuration = timingData
|
|
215
|
+
? getFileDuration(timingData, file)
|
|
216
|
+
: undefined;
|
|
244
217
|
if (historicalDuration !== undefined) {
|
|
245
218
|
filesWithDurations.push({
|
|
246
219
|
file,
|
|
@@ -286,20 +259,6 @@ export default class Assign extends Command {
|
|
|
286
259
|
this.log(` - ${testId}${isEstimated ? ' (estimated)' : ''}`);
|
|
287
260
|
}
|
|
288
261
|
}
|
|
289
|
-
const grepPattern = result.grepPatterns[Number(shard)];
|
|
290
|
-
if (grepPattern && grepPattern.length < 100) {
|
|
291
|
-
this.log(` grep: "${grepPattern}"`);
|
|
292
|
-
}
|
|
293
|
-
else if (grepPattern) {
|
|
294
|
-
this.log(` grep: (${grepPattern.length} chars, use --grep-file)`);
|
|
295
|
-
}
|
|
296
|
-
const locations = result.testLocations[Number(shard)];
|
|
297
|
-
if (locations && locations.length > 0 && locations.length <= 5) {
|
|
298
|
-
this.log(` locations: ${locations.join(' ')}`);
|
|
299
|
-
}
|
|
300
|
-
else if (locations && locations.length > 5) {
|
|
301
|
-
this.log(` locations: ${locations.length} file:line entries`);
|
|
302
|
-
}
|
|
303
262
|
this.log('');
|
|
304
263
|
}
|
|
305
264
|
this.log(`Total tests: ${result.totalTests}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ export default class ExtractTiming extends Command {
|
|
|
7
7
|
'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
8
|
shard: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
9
|
project: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
level: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
10
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
11
|
};
|
|
13
12
|
run(): Promise<void>;
|
|
@@ -21,20 +20,10 @@ export default class ExtractTiming extends Command {
|
|
|
21
20
|
* Recursively extract test durations from a suite
|
|
22
21
|
*/
|
|
23
22
|
private extractTestsFromSuite;
|
|
24
|
-
/**
|
|
25
|
-
* Extract file durations from Playwright report (legacy file-level)
|
|
26
|
-
*
|
|
27
|
-
* The report structure has nested suites where the top-level suite
|
|
28
|
-
* represents the file. We sum up all test durations within each file.
|
|
29
|
-
*/
|
|
30
|
-
private extractFileDurations;
|
|
31
23
|
/**
|
|
32
24
|
* Normalize file path to be relative and consistent
|
|
25
|
+
* Uses path relative to CWD for consistency with reporter and discovery
|
|
33
26
|
*/
|
|
34
27
|
private normalizeFilePath;
|
|
35
|
-
/**
|
|
36
|
-
* Calculate total duration for a suite (recursively including nested suites)
|
|
37
|
-
*/
|
|
38
|
-
private calculateSuiteDuration;
|
|
39
28
|
}
|
|
40
29
|
//# sourceMappingURL=extract-timing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-timing.d.ts","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-timing.d.ts","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,OAAgB,WAAW,SACyB;IAEpD,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;;;MAyBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8C7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
|
|
@@ -3,10 +3,10 @@ import * as path from 'node:path';
|
|
|
3
3
|
import { Command, Flags } from '@oclif/core';
|
|
4
4
|
import { buildTestId } from '../core/index.js';
|
|
5
5
|
export default class ExtractTiming extends Command {
|
|
6
|
-
static description = 'Extract timing data from Playwright JSON report
|
|
6
|
+
static description = 'Extract timing data from Playwright JSON report';
|
|
7
7
|
static examples = [
|
|
8
8
|
'<%= config.bin %> extract-timing --report-file ./playwright-report/results.json --output-file ./timing.json',
|
|
9
|
-
'<%= config.bin %> extract-timing --report-file ./results.json --shard 1 --project "Mobile Chrome"
|
|
9
|
+
'<%= config.bin %> extract-timing --report-file ./results.json --shard 1 --project "Mobile Chrome"',
|
|
10
10
|
];
|
|
11
11
|
static flags = {
|
|
12
12
|
'report-file': Flags.string({
|
|
@@ -28,12 +28,6 @@ export default class ExtractTiming extends Command {
|
|
|
28
28
|
description: 'Playwright project name',
|
|
29
29
|
default: 'default',
|
|
30
30
|
}),
|
|
31
|
-
level: Flags.string({
|
|
32
|
-
char: 'l',
|
|
33
|
-
description: 'Extraction level: file or test',
|
|
34
|
-
default: 'test',
|
|
35
|
-
options: ['file', 'test'],
|
|
36
|
-
}),
|
|
37
31
|
verbose: Flags.boolean({
|
|
38
32
|
char: 'v',
|
|
39
33
|
description: 'Show verbose output',
|
|
@@ -52,35 +46,18 @@ export default class ExtractTiming extends Command {
|
|
|
52
46
|
catch {
|
|
53
47
|
this.error(`Failed to read Playwright report: ${reportPath}`);
|
|
54
48
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (flags.verbose) {
|
|
60
|
-
this.log(`Extracted timing for ${Object.keys(testDurations).length} tests`);
|
|
61
|
-
}
|
|
62
|
-
// Create test-level artifact
|
|
63
|
-
const artifact = {
|
|
64
|
-
shard: flags.shard,
|
|
65
|
-
project: flags.project,
|
|
66
|
-
tests: testDurations,
|
|
67
|
-
};
|
|
68
|
-
output = JSON.stringify(artifact, null, 2);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
// Extract file-level durations (legacy)
|
|
72
|
-
const fileDurations = this.extractFileDurations(report);
|
|
73
|
-
if (flags.verbose) {
|
|
74
|
-
this.log(`Extracted timing for ${Object.keys(fileDurations).length} files`);
|
|
75
|
-
}
|
|
76
|
-
// Create file-level artifact
|
|
77
|
-
const artifact = {
|
|
78
|
-
shard: flags.shard,
|
|
79
|
-
project: flags.project,
|
|
80
|
-
files: fileDurations,
|
|
81
|
-
};
|
|
82
|
-
output = JSON.stringify(artifact, null, 2);
|
|
49
|
+
// Extract test-level durations
|
|
50
|
+
const testDurations = this.extractTestDurations(report);
|
|
51
|
+
if (flags.verbose) {
|
|
52
|
+
this.log(`Extracted timing for ${Object.keys(testDurations).length} tests`);
|
|
83
53
|
}
|
|
54
|
+
// Create artifact
|
|
55
|
+
const artifact = {
|
|
56
|
+
shard: flags.shard,
|
|
57
|
+
project: flags.project,
|
|
58
|
+
tests: testDurations,
|
|
59
|
+
};
|
|
60
|
+
const output = JSON.stringify(artifact, null, 2);
|
|
84
61
|
// Output
|
|
85
62
|
if (flags['output-file']) {
|
|
86
63
|
fs.writeFileSync(flags['output-file'], output, 'utf-8');
|
|
@@ -139,58 +116,12 @@ export default class ExtractTiming extends Command {
|
|
|
139
116
|
}
|
|
140
117
|
}
|
|
141
118
|
}
|
|
142
|
-
/**
|
|
143
|
-
* Extract file durations from Playwright report (legacy file-level)
|
|
144
|
-
*
|
|
145
|
-
* The report structure has nested suites where the top-level suite
|
|
146
|
-
* represents the file. We sum up all test durations within each file.
|
|
147
|
-
*/
|
|
148
|
-
extractFileDurations(report) {
|
|
149
|
-
const fileDurations = {};
|
|
150
|
-
for (const suite of report.suites) {
|
|
151
|
-
const file = this.normalizeFilePath(suite.file);
|
|
152
|
-
const duration = this.calculateSuiteDuration(suite);
|
|
153
|
-
fileDurations[file] = duration;
|
|
154
|
-
}
|
|
155
|
-
return fileDurations;
|
|
156
|
-
}
|
|
157
119
|
/**
|
|
158
120
|
* Normalize file path to be relative and consistent
|
|
121
|
+
* Uses path relative to CWD for consistency with reporter and discovery
|
|
159
122
|
*/
|
|
160
123
|
normalizeFilePath(filePath) {
|
|
161
|
-
|
|
162
|
-
// Remove any absolute path prefix
|
|
163
|
-
const parts = filePath.split('/');
|
|
164
|
-
// Find the index of common test directories
|
|
165
|
-
const testDirIndex = parts.findIndex((p) => p === 'e2e' || p === 'test' || p === '__tests__');
|
|
166
|
-
if (testDirIndex !== -1) {
|
|
167
|
-
return parts.slice(testDirIndex + 1).join('/');
|
|
168
|
-
}
|
|
169
|
-
// Just return the filename
|
|
170
|
-
return parts[parts.length - 1] ?? filePath;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Calculate total duration for a suite (recursively including nested suites)
|
|
174
|
-
*/
|
|
175
|
-
calculateSuiteDuration(suite) {
|
|
176
|
-
let total = 0;
|
|
177
|
-
// Sum durations from specs
|
|
178
|
-
if (suite.specs) {
|
|
179
|
-
for (const spec of suite.specs) {
|
|
180
|
-
for (const test of spec.tests) {
|
|
181
|
-
for (const result of test.results) {
|
|
182
|
-
total += result.duration;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
// Sum durations from nested suites
|
|
188
|
-
if (suite.suites) {
|
|
189
|
-
for (const nestedSuite of suite.suites) {
|
|
190
|
-
total += this.calculateSuiteDuration(nestedSuite);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return total;
|
|
124
|
+
return path.relative(process.cwd(), filePath).replace(/\\/g, '/');
|
|
194
125
|
}
|
|
195
126
|
}
|
|
196
127
|
//# sourceMappingURL=extract-timing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-timing.js","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-timing.js","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,9 @@ export default class MergeTiming extends Command {
|
|
|
8
8
|
output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
9
|
alpha: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
10
|
'prune-days': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
'current-
|
|
12
|
-
level: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'current-tests': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
12
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
13
|
};
|
|
15
14
|
run(): Promise<void>;
|
|
16
|
-
private runTestLevel;
|
|
17
|
-
private runFileLevel;
|
|
18
15
|
}
|
|
19
16
|
//# sourceMappingURL=merge-timing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-timing.d.ts","sourceRoot":"","sources":["../../src/commands/merge-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-timing.d.ts","sourceRoot":"","sources":["../../src/commands/merge-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAY7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SACiD;IAE5E,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;;;;;MAkCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoG3B"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { Command, Flags } from '@oclif/core';
|
|
4
|
-
import { DEFAULT_EMA_ALPHA, DEFAULT_PRUNE_DAYS,
|
|
4
|
+
import { DEFAULT_EMA_ALPHA, DEFAULT_PRUNE_DAYS, loadTimingData, mergeTimingData, pruneTimingData, saveTimingData, } from '../core/index.js';
|
|
5
5
|
export default class MergeTiming extends Command {
|
|
6
6
|
static description = 'Merge timing data from multiple shards using Exponential Moving Average';
|
|
7
7
|
static examples = [
|
|
8
8
|
'<%= config.bin %> merge-timing --existing ./timing.json --new ./shard-1.json ./shard-2.json --output ./timing.json',
|
|
9
9
|
'<%= config.bin %> merge-timing --new ./shard-*.json --output ./timing.json --alpha 0.3 --prune-days 30',
|
|
10
|
-
'<%= config.bin %> merge-timing --new ./shard-*.json --output ./timing.json --level test',
|
|
11
10
|
];
|
|
12
11
|
static flags = {
|
|
13
12
|
existing: Flags.string({
|
|
@@ -34,14 +33,8 @@ export default class MergeTiming extends Command {
|
|
|
34
33
|
description: 'Remove entries older than N days',
|
|
35
34
|
default: DEFAULT_PRUNE_DAYS,
|
|
36
35
|
}),
|
|
37
|
-
'current-
|
|
38
|
-
description: 'Path to file listing current test
|
|
39
|
-
}),
|
|
40
|
-
level: Flags.string({
|
|
41
|
-
char: 'l',
|
|
42
|
-
description: 'Data level: file or test',
|
|
43
|
-
default: 'test',
|
|
44
|
-
options: ['file', 'test'],
|
|
36
|
+
'current-tests': Flags.string({
|
|
37
|
+
description: 'Path to file listing current test IDs (for pruning deleted tests)',
|
|
45
38
|
}),
|
|
46
39
|
verbose: Flags.boolean({
|
|
47
40
|
char: 'v',
|
|
@@ -55,24 +48,10 @@ export default class MergeTiming extends Command {
|
|
|
55
48
|
if (Number.isNaN(alpha) || alpha < 0 || alpha > 1) {
|
|
56
49
|
this.error('Alpha must be a number between 0 and 1');
|
|
57
50
|
}
|
|
58
|
-
if (flags.level === 'test') {
|
|
59
|
-
await this.runTestLevel(flags, alpha);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
await this.runFileLevel(flags, alpha);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async runTestLevel(flags, alpha) {
|
|
66
51
|
// Load existing timing data
|
|
67
52
|
let existingData = null;
|
|
68
53
|
if (flags.existing) {
|
|
69
|
-
|
|
70
|
-
if (isTimingDataV2(loaded)) {
|
|
71
|
-
existingData = loaded;
|
|
72
|
-
}
|
|
73
|
-
else if (flags.verbose) {
|
|
74
|
-
this.warn('Existing timing data is v1 (file-level), starting fresh for test-level');
|
|
75
|
-
}
|
|
54
|
+
existingData = loadTimingData(flags.existing);
|
|
76
55
|
}
|
|
77
56
|
if (flags.verbose) {
|
|
78
57
|
const testCount = existingData
|
|
@@ -86,7 +65,6 @@ export default class MergeTiming extends Command {
|
|
|
86
65
|
try {
|
|
87
66
|
const content = fs.readFileSync(path.resolve(artifactPath), 'utf-8');
|
|
88
67
|
const artifact = JSON.parse(content);
|
|
89
|
-
// Check if it has tests (v2) or files (v1)
|
|
90
68
|
if (artifact.tests) {
|
|
91
69
|
newArtifacts.push(artifact);
|
|
92
70
|
if (flags.verbose) {
|
|
@@ -94,7 +72,7 @@ export default class MergeTiming extends Command {
|
|
|
94
72
|
}
|
|
95
73
|
}
|
|
96
74
|
else if (flags.verbose) {
|
|
97
|
-
this.warn(`Artifact ${artifactPath}
|
|
75
|
+
this.warn(`Artifact ${artifactPath} has no tests, skipping`);
|
|
98
76
|
}
|
|
99
77
|
}
|
|
100
78
|
catch {
|
|
@@ -102,28 +80,28 @@ export default class MergeTiming extends Command {
|
|
|
102
80
|
}
|
|
103
81
|
}
|
|
104
82
|
if (newArtifacts.length === 0) {
|
|
105
|
-
this.warn('No valid
|
|
83
|
+
this.warn('No valid timing artifacts found');
|
|
106
84
|
return;
|
|
107
85
|
}
|
|
108
86
|
// Merge timing data using EMA
|
|
109
|
-
let mergedData =
|
|
87
|
+
let mergedData = mergeTimingData(existingData, newArtifacts, alpha);
|
|
110
88
|
if (flags.verbose) {
|
|
111
89
|
this.log(`Merged timing data now has ${Object.keys(mergedData.tests).length} tests`);
|
|
112
90
|
}
|
|
113
91
|
// Load current test IDs for pruning if provided
|
|
114
92
|
let currentTestIds;
|
|
115
|
-
if (flags['current-
|
|
93
|
+
if (flags['current-tests']) {
|
|
116
94
|
try {
|
|
117
|
-
const content = fs.readFileSync(flags['current-
|
|
95
|
+
const content = fs.readFileSync(flags['current-tests'], 'utf-8');
|
|
118
96
|
currentTestIds = content.split('\n').filter((line) => line.trim());
|
|
119
97
|
}
|
|
120
98
|
catch {
|
|
121
|
-
this.warn(`Failed to load current test IDs list: ${flags['current-
|
|
99
|
+
this.warn(`Failed to load current test IDs list: ${flags['current-tests']}`);
|
|
122
100
|
}
|
|
123
101
|
}
|
|
124
102
|
// Prune old entries
|
|
125
103
|
const beforePrune = Object.keys(mergedData.tests).length;
|
|
126
|
-
mergedData =
|
|
104
|
+
mergedData = pruneTimingData(mergedData, flags['prune-days'], currentTestIds);
|
|
127
105
|
const afterPrune = Object.keys(mergedData.tests).length;
|
|
128
106
|
if (flags.verbose && beforePrune !== afterPrune) {
|
|
129
107
|
this.log(`Pruned ${beforePrune - afterPrune} old entries`);
|
|
@@ -140,78 +118,5 @@ export default class MergeTiming extends Command {
|
|
|
140
118
|
version: mergedData.version,
|
|
141
119
|
}));
|
|
142
120
|
}
|
|
143
|
-
async runFileLevel(flags, alpha) {
|
|
144
|
-
// Load existing timing data
|
|
145
|
-
const existingData = flags.existing
|
|
146
|
-
? loadTimingData(flags.existing)
|
|
147
|
-
: { version: 1, updatedAt: new Date().toISOString(), files: {} };
|
|
148
|
-
if (flags.verbose) {
|
|
149
|
-
const fileCount = 'files' in existingData ? Object.keys(existingData.files).length : 0;
|
|
150
|
-
this.log(`Loaded existing timing data with ${fileCount} files`);
|
|
151
|
-
}
|
|
152
|
-
// Load new timing artifacts
|
|
153
|
-
const newArtifacts = [];
|
|
154
|
-
for (const artifactPath of flags.new) {
|
|
155
|
-
try {
|
|
156
|
-
const content = fs.readFileSync(path.resolve(artifactPath), 'utf-8');
|
|
157
|
-
const artifact = JSON.parse(content);
|
|
158
|
-
// Check if it has files (v1)
|
|
159
|
-
if (artifact.files) {
|
|
160
|
-
newArtifacts.push(artifact);
|
|
161
|
-
if (flags.verbose) {
|
|
162
|
-
this.log(`Loaded timing artifact from shard ${artifact.shard} with ${Object.keys(artifact.files).length} files`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else if (flags.verbose) {
|
|
166
|
-
this.warn(`Artifact ${artifactPath} is test-level, skipping for file-level merge`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
this.warn(`Failed to load timing artifact: ${artifactPath}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (newArtifacts.length === 0) {
|
|
174
|
-
this.warn('No valid file-level timing artifacts found');
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
// Merge timing data using EMA
|
|
178
|
-
let mergedData = mergeTimingData(existingData, newArtifacts, alpha);
|
|
179
|
-
if (flags.verbose) {
|
|
180
|
-
this.log(`Merged timing data now has ${Object.keys(mergedData.files).length} files`);
|
|
181
|
-
}
|
|
182
|
-
// Load current files for pruning if provided
|
|
183
|
-
let currentFiles;
|
|
184
|
-
if (flags['current-files']) {
|
|
185
|
-
try {
|
|
186
|
-
const content = fs.readFileSync(flags['current-files'], 'utf-8');
|
|
187
|
-
currentFiles = content.split('\n').filter((line) => line.trim());
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
this.warn(`Failed to load current files list: ${flags['current-files']}`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
// Prune old entries
|
|
194
|
-
const beforePrune = Object.keys(mergedData.files).length;
|
|
195
|
-
const prunedData = pruneTimingData(mergedData, flags['prune-days'], currentFiles);
|
|
196
|
-
// pruneTimingData can return v1 or v2, but for file-level we expect v1
|
|
197
|
-
if ('files' in prunedData) {
|
|
198
|
-
mergedData = prunedData;
|
|
199
|
-
}
|
|
200
|
-
const afterPrune = Object.keys(mergedData.files).length;
|
|
201
|
-
if (flags.verbose && beforePrune !== afterPrune) {
|
|
202
|
-
this.log(`Pruned ${beforePrune - afterPrune} old entries`);
|
|
203
|
-
}
|
|
204
|
-
// Save merged data
|
|
205
|
-
saveTimingData(flags.output, mergedData);
|
|
206
|
-
if (flags.verbose) {
|
|
207
|
-
this.log(`Saved merged timing data to ${flags.output}`);
|
|
208
|
-
}
|
|
209
|
-
// Output summary
|
|
210
|
-
this.log(JSON.stringify({
|
|
211
|
-
files: Object.keys(mergedData.files).length,
|
|
212
|
-
updatedAt: mergedData.updatedAt,
|
|
213
|
-
version: mergedData.version,
|
|
214
|
-
}));
|
|
215
|
-
}
|
|
216
121
|
}
|
|
217
122
|
//# sourceMappingURL=merge-timing.js.map
|