@benchkit/format 0.1.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 +521 -0
- package/dist/build-otlp-result.d.ts +43 -0
- package/dist/build-otlp-result.d.ts.map +1 -0
- package/dist/build-otlp-result.js +102 -0
- package/dist/build-otlp-result.js.map +1 -0
- package/dist/build-otlp-result.test.d.ts +2 -0
- package/dist/build-otlp-result.test.d.ts.map +1 -0
- package/dist/build-otlp-result.test.js +148 -0
- package/dist/build-otlp-result.test.js.map +1 -0
- package/dist/compare.d.ts +20 -0
- package/dist/compare.d.ts.map +1 -0
- package/dist/compare.js +92 -0
- package/dist/compare.js.map +1 -0
- package/dist/compare.test.d.ts +2 -0
- package/dist/compare.test.d.ts.map +1 -0
- package/dist/compare.test.js +233 -0
- package/dist/compare.test.js.map +1 -0
- package/dist/format-comparison-markdown.d.ts +3 -0
- package/dist/format-comparison-markdown.d.ts.map +1 -0
- package/dist/format-comparison-markdown.js +142 -0
- package/dist/format-comparison-markdown.js.map +1 -0
- package/dist/format-comparison-markdown.test.d.ts +2 -0
- package/dist/format-comparison-markdown.test.d.ts.map +1 -0
- package/dist/format-comparison-markdown.test.js +173 -0
- package/dist/format-comparison-markdown.test.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/infer-direction.d.ts +10 -0
- package/dist/infer-direction.d.ts.map +1 -0
- package/dist/infer-direction.js +23 -0
- package/dist/infer-direction.js.map +1 -0
- package/dist/infer-direction.test.d.ts +2 -0
- package/dist/infer-direction.test.d.ts.map +1 -0
- package/dist/infer-direction.test.js +28 -0
- package/dist/infer-direction.test.js.map +1 -0
- package/dist/metrics-batch.d.ts +55 -0
- package/dist/metrics-batch.d.ts.map +1 -0
- package/dist/metrics-batch.js +296 -0
- package/dist/metrics-batch.js.map +1 -0
- package/dist/metrics-batch.test.d.ts +2 -0
- package/dist/metrics-batch.test.d.ts.map +1 -0
- package/dist/metrics-batch.test.js +306 -0
- package/dist/metrics-batch.test.js.map +1 -0
- package/dist/native-builder.d.ts.map +1 -0
- package/dist/native-builder.js.map +1 -0
- package/dist/native-builder.test.d.ts.map +1 -0
- package/dist/native-builder.test.js.map +1 -0
- package/dist/otlp-conventions.d.ts +80 -0
- package/dist/otlp-conventions.d.ts.map +1 -0
- package/dist/otlp-conventions.js +114 -0
- package/dist/otlp-conventions.js.map +1 -0
- package/dist/otlp-conventions.test.d.ts +2 -0
- package/dist/otlp-conventions.test.d.ts.map +1 -0
- package/dist/otlp-conventions.test.js +65 -0
- package/dist/otlp-conventions.test.js.map +1 -0
- package/dist/otlp-projections.d.ts.map +1 -0
- package/dist/otlp-projections.js.map +1 -0
- package/dist/otlp-projections.test.d.ts.map +1 -0
- package/dist/otlp-projections.test.js.map +1 -0
- package/dist/otlp-validation.d.ts +40 -0
- package/dist/otlp-validation.d.ts.map +1 -0
- package/dist/otlp-validation.js +110 -0
- package/dist/otlp-validation.js.map +1 -0
- package/dist/otlp-validation.test.d.ts +2 -0
- package/dist/otlp-validation.test.d.ts.map +1 -0
- package/dist/otlp-validation.test.js +160 -0
- package/dist/otlp-validation.test.js.map +1 -0
- package/dist/parse-benchmark-action.d.ts +11 -0
- package/dist/parse-benchmark-action.d.ts.map +1 -0
- package/dist/parse-benchmark-action.js +54 -0
- package/dist/parse-benchmark-action.js.map +1 -0
- package/dist/parse-benchmark-action.test.d.ts +2 -0
- package/dist/parse-benchmark-action.test.d.ts.map +1 -0
- package/dist/parse-benchmark-action.test.js +66 -0
- package/dist/parse-benchmark-action.test.js.map +1 -0
- package/dist/parse-go.d.ts +12 -0
- package/dist/parse-go.d.ts.map +1 -0
- package/dist/parse-go.js +63 -0
- package/dist/parse-go.js.map +1 -0
- package/dist/parse-go.test.d.ts +2 -0
- package/dist/parse-go.test.d.ts.map +1 -0
- package/dist/parse-go.test.js +110 -0
- package/dist/parse-go.test.js.map +1 -0
- package/dist/parse-hyperfine.d.ts +3 -0
- package/dist/parse-hyperfine.d.ts.map +1 -0
- package/dist/parse-hyperfine.js +59 -0
- package/dist/parse-hyperfine.js.map +1 -0
- package/dist/parse-hyperfine.test.d.ts +2 -0
- package/dist/parse-hyperfine.test.d.ts.map +1 -0
- package/dist/parse-hyperfine.test.js +64 -0
- package/dist/parse-hyperfine.test.js.map +1 -0
- package/dist/parse-otlp.d.ts +45 -0
- package/dist/parse-otlp.d.ts.map +1 -0
- package/dist/parse-otlp.js +92 -0
- package/dist/parse-otlp.js.map +1 -0
- package/dist/parse-otlp.test.d.ts +2 -0
- package/dist/parse-otlp.test.d.ts.map +1 -0
- package/dist/parse-otlp.test.js +133 -0
- package/dist/parse-otlp.test.js.map +1 -0
- package/dist/parse-pytest-benchmark.d.ts +3 -0
- package/dist/parse-pytest-benchmark.d.ts.map +1 -0
- package/dist/parse-pytest-benchmark.js +72 -0
- package/dist/parse-pytest-benchmark.js.map +1 -0
- package/dist/parse-pytest-benchmark.test.d.ts +2 -0
- package/dist/parse-pytest-benchmark.test.d.ts.map +1 -0
- package/dist/parse-pytest-benchmark.test.js +85 -0
- package/dist/parse-pytest-benchmark.test.js.map +1 -0
- package/dist/parse-rust.d.ts +9 -0
- package/dist/parse-rust.d.ts.map +1 -0
- package/dist/parse-rust.js +50 -0
- package/dist/parse-rust.js.map +1 -0
- package/dist/parse-rust.test.d.ts +2 -0
- package/dist/parse-rust.test.d.ts.map +1 -0
- package/dist/parse-rust.test.js +62 -0
- package/dist/parse-rust.test.js.map +1 -0
- package/dist/parse.d.ts +7 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +87 -0
- package/dist/parse.js.map +1 -0
- package/dist/parse.test.d.ts +2 -0
- package/dist/parse.test.d.ts.map +1 -0
- package/dist/parse.test.js +171 -0
- package/dist/parse.test.js.map +1 -0
- package/dist/parser-utils.d.ts +17 -0
- package/dist/parser-utils.d.ts.map +1 -0
- package/dist/parser-utils.js +29 -0
- package/dist/parser-utils.js.map +1 -0
- package/dist/parser-utils.test.d.ts +2 -0
- package/dist/parser-utils.test.d.ts.map +1 -0
- package/dist/parser-utils.test.js +27 -0
- package/dist/parser-utils.test.js.map +1 -0
- package/dist/retry.d.ts +6 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +18 -0
- package/dist/retry.js.map +1 -0
- package/dist/retry.test.d.ts +2 -0
- package/dist/retry.test.d.ts.map +1 -0
- package/dist/retry.test.js +29 -0
- package/dist/retry.test.js.map +1 -0
- package/dist/test-otlp-helpers.d.ts.map +1 -0
- package/dist/test-otlp-helpers.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +22 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const parse_otlp_js_1 = require("./parse-otlp.js");
|
|
9
|
+
function makeDocument() {
|
|
10
|
+
return {
|
|
11
|
+
resourceMetrics: [
|
|
12
|
+
{
|
|
13
|
+
resource: {
|
|
14
|
+
attributes: [
|
|
15
|
+
{ key: "benchkit.run_id", value: { stringValue: "run-123" } },
|
|
16
|
+
{ key: "benchkit.kind", value: { stringValue: "workflow" } },
|
|
17
|
+
{ key: "benchkit.source_format", value: { stringValue: "otlp" } },
|
|
18
|
+
{ key: "benchkit.ref", value: { stringValue: "refs/heads/main" } },
|
|
19
|
+
{ key: "benchkit.commit", value: { stringValue: "abcdef123456" } },
|
|
20
|
+
{ key: "benchkit.workflow", value: { stringValue: "Workflow Benchmark" } },
|
|
21
|
+
{ key: "benchkit.job", value: { stringValue: "workflow-bench" } },
|
|
22
|
+
{ key: "service.name", value: { stringValue: "mock-ingest" } },
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
scopeMetrics: [
|
|
26
|
+
{
|
|
27
|
+
metrics: [
|
|
28
|
+
{
|
|
29
|
+
name: "events_per_sec",
|
|
30
|
+
unit: "events/sec",
|
|
31
|
+
gauge: {
|
|
32
|
+
dataPoints: [
|
|
33
|
+
{
|
|
34
|
+
attributes: [
|
|
35
|
+
{ key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
|
|
36
|
+
{ key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
|
|
37
|
+
{ key: "benchkit.metric.direction", value: { stringValue: "bigger_is_better" } },
|
|
38
|
+
{ key: "benchkit.metric.role", value: { stringValue: "outcome" } },
|
|
39
|
+
{ key: "benchkit.transport", value: { stringValue: "http" } },
|
|
40
|
+
],
|
|
41
|
+
timeUnixNano: "1711929600000000000",
|
|
42
|
+
asDouble: 13240.5,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
attributes: [
|
|
46
|
+
{ key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
|
|
47
|
+
{ key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
|
|
48
|
+
{ key: "benchkit.metric.direction", value: { stringValue: "bigger_is_better" } },
|
|
49
|
+
{ key: "benchkit.metric.role", value: { stringValue: "outcome" } },
|
|
50
|
+
{ key: "benchkit.transport", value: { stringValue: "http" } },
|
|
51
|
+
],
|
|
52
|
+
timeUnixNano: "1711929660000000000",
|
|
53
|
+
asDouble: 14000,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "_monitor.cpu_user_pct",
|
|
60
|
+
unit: "%",
|
|
61
|
+
sum: {
|
|
62
|
+
aggregationTemporality: 2,
|
|
63
|
+
dataPoints: [
|
|
64
|
+
{
|
|
65
|
+
attributes: [
|
|
66
|
+
{ key: "benchkit.scenario", value: { stringValue: "diagnostic" } },
|
|
67
|
+
{ key: "benchkit.series", value: { stringValue: "system" } },
|
|
68
|
+
{ key: "benchkit.metric.role", value: { stringValue: "diagnostic" } },
|
|
69
|
+
{ key: "benchkit.metric.direction", value: { stringValue: "smaller_is_better" } },
|
|
70
|
+
],
|
|
71
|
+
startTimeUnixNano: "1711929540000000000",
|
|
72
|
+
timeUnixNano: "1711929600000000000",
|
|
73
|
+
asDouble: 71.2,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "request_latency_ms",
|
|
80
|
+
unit: "ms",
|
|
81
|
+
histogram: {
|
|
82
|
+
aggregationTemporality: 2,
|
|
83
|
+
dataPoints: [
|
|
84
|
+
{
|
|
85
|
+
attributes: [
|
|
86
|
+
{ key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
|
|
87
|
+
{ key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
|
|
88
|
+
{ key: "benchkit.metric.direction", value: { stringValue: "smaller_is_better" } },
|
|
89
|
+
],
|
|
90
|
+
timeUnixNano: "1711929600000000000",
|
|
91
|
+
count: "15",
|
|
92
|
+
sum: 2148,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
(0, node_test_1.describe)("parseOtlpMetrics", () => {
|
|
105
|
+
(0, node_test_1.it)("parses a valid OTLP metrics document", () => {
|
|
106
|
+
const parsed = (0, parse_otlp_js_1.parseOtlp)(JSON.stringify(makeDocument()));
|
|
107
|
+
strict_1.default.equal(parsed.resourceMetrics.length, 1);
|
|
108
|
+
strict_1.default.equal(parsed.resourceMetrics[0].scopeMetrics?.[0].metrics?.length, 3);
|
|
109
|
+
});
|
|
110
|
+
(0, node_test_1.it)("throws when resourceMetrics is missing", () => {
|
|
111
|
+
strict_1.default.throws(() => (0, parse_otlp_js_1.parseOtlp)("{}"), /resourceMetrics/);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
(0, node_test_1.describe)("OTLP traversal helpers", () => {
|
|
115
|
+
(0, node_test_1.it)("converts attributes to flat string records", () => {
|
|
116
|
+
const record = (0, parse_otlp_js_1.otlpAttributesToRecord)([
|
|
117
|
+
{ key: "a", value: { stringValue: "hello" } },
|
|
118
|
+
{ key: "b", value: { intValue: "42" } },
|
|
119
|
+
{ key: "c", value: { boolValue: true } },
|
|
120
|
+
]);
|
|
121
|
+
strict_1.default.deepEqual(record, { a: "hello", b: "42", c: "true" });
|
|
122
|
+
});
|
|
123
|
+
(0, node_test_1.it)("reports metric kind and temporality", () => {
|
|
124
|
+
const document = (0, parse_otlp_js_1.parseOtlp)(JSON.stringify(makeDocument()));
|
|
125
|
+
const metrics = document.resourceMetrics[0].scopeMetrics?.[0].metrics ?? [];
|
|
126
|
+
strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[0]), "gauge");
|
|
127
|
+
strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[1]), "sum");
|
|
128
|
+
strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[2]), "histogram");
|
|
129
|
+
strict_1.default.equal((0, parse_otlp_js_1.getOtlpTemporality)(metrics[0]), "unspecified");
|
|
130
|
+
strict_1.default.equal((0, parse_otlp_js_1.getOtlpTemporality)(metrics[1]), "cumulative");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=parse-otlp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-otlp.test.js","sourceRoot":"","sources":["../src/parse-otlp.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-pytest-benchmark.d.ts","sourceRoot":"","sources":["../src/parse-pytest-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgDtD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CA0EvE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parsePytestBenchmark = parsePytestBenchmark;
|
|
4
|
+
const build_otlp_result_js_1 = require("./build-otlp-result.js");
|
|
5
|
+
const infer_direction_js_1 = require("./infer-direction.js");
|
|
6
|
+
function parsePytestBenchmark(input) {
|
|
7
|
+
let parsed;
|
|
8
|
+
try {
|
|
9
|
+
parsed = JSON.parse(input);
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new Error(`[parse-pytest-benchmark] Failed to parse input as JSON: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
13
|
+
}
|
|
14
|
+
if (!parsed.benchmarks || !Array.isArray(parsed.benchmarks)) {
|
|
15
|
+
throw new Error("[parse-pytest-benchmark] pytest-benchmark format must have a 'benchmarks' array.");
|
|
16
|
+
}
|
|
17
|
+
const benchmarks = parsed.benchmarks.map((entry) => {
|
|
18
|
+
if (typeof entry.name !== "string") {
|
|
19
|
+
throw new Error("[parse-pytest-benchmark] Each pytest-benchmark entry must have a 'name' string.");
|
|
20
|
+
}
|
|
21
|
+
if (!entry.stats || typeof entry.stats !== "object") {
|
|
22
|
+
throw new Error(`[parse-pytest-benchmark] pytest-benchmark entry '${entry.name}' must have a 'stats' object.`);
|
|
23
|
+
}
|
|
24
|
+
const stats = entry.stats;
|
|
25
|
+
const timeDirection = (0, infer_direction_js_1.inferDirection)("s");
|
|
26
|
+
const metrics = {
|
|
27
|
+
mean: {
|
|
28
|
+
value: stats.mean,
|
|
29
|
+
unit: "s",
|
|
30
|
+
direction: timeDirection,
|
|
31
|
+
},
|
|
32
|
+
median: {
|
|
33
|
+
value: stats.median,
|
|
34
|
+
unit: "s",
|
|
35
|
+
direction: timeDirection,
|
|
36
|
+
},
|
|
37
|
+
min: {
|
|
38
|
+
value: stats.min,
|
|
39
|
+
unit: "s",
|
|
40
|
+
direction: timeDirection,
|
|
41
|
+
},
|
|
42
|
+
max: {
|
|
43
|
+
value: stats.max,
|
|
44
|
+
unit: "s",
|
|
45
|
+
direction: timeDirection,
|
|
46
|
+
},
|
|
47
|
+
stddev: {
|
|
48
|
+
value: stats.stddev,
|
|
49
|
+
unit: "s",
|
|
50
|
+
direction: timeDirection,
|
|
51
|
+
},
|
|
52
|
+
ops: {
|
|
53
|
+
value: stats.ops,
|
|
54
|
+
unit: "ops/s",
|
|
55
|
+
direction: (0, infer_direction_js_1.inferDirection)("ops/s"),
|
|
56
|
+
},
|
|
57
|
+
rounds: {
|
|
58
|
+
value: stats.rounds,
|
|
59
|
+
direction: "bigger_is_better",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
name: entry.name,
|
|
64
|
+
metrics,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
return (0, build_otlp_result_js_1.buildOtlpResult)({
|
|
68
|
+
benchmarks,
|
|
69
|
+
context: { sourceFormat: "pytest-benchmark" },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=parse-pytest-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-pytest-benchmark.js","sourceRoot":"","sources":["../src/parse-pytest-benchmark.ts"],"names":[],"mappings":";;AAgDA,oDA0EC;AAxHD,iEAAyD;AACzD,6DAAsD;AA6CtD,SAAgB,oBAAoB,CAAC,KAAa;IAChD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAA0B,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2DAA2D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC7G,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,UAAU,GAA0B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxE,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAC,IAAI,+BAA+B,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,aAAa,GAAG,IAAA,mCAAc,EAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAqC;YAChD,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,IAAA,mCAAc,EAAC,OAAO,CAAC;aACnC;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,SAAS,EAAE,kBAAkB;aAC9B;SACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,IAAA,sCAAe,EAAC;QACrB,UAAU;QACV,OAAO,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-pytest-benchmark.test.d.ts","sourceRoot":"","sources":["../src/parse-pytest-benchmark.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const parse_pytest_benchmark_js_1 = require("./parse-pytest-benchmark.js");
|
|
9
|
+
const parse_js_1 = require("./parse.js");
|
|
10
|
+
const metrics_batch_js_1 = require("./metrics-batch.js");
|
|
11
|
+
const PYTEST_BENCHMARK_OUTPUT = JSON.stringify({
|
|
12
|
+
benchmarks: [
|
|
13
|
+
{
|
|
14
|
+
name: "test_sort",
|
|
15
|
+
fullname: "tests/test_perf.py::test_sort",
|
|
16
|
+
stats: {
|
|
17
|
+
min: 0.000123,
|
|
18
|
+
max: 0.000156,
|
|
19
|
+
mean: 0.000134,
|
|
20
|
+
stddev: 0.0000089,
|
|
21
|
+
rounds: 1000,
|
|
22
|
+
median: 0.000132,
|
|
23
|
+
ops: 7462.68,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "test_search",
|
|
28
|
+
fullname: "tests/test_perf.py::test_search",
|
|
29
|
+
stats: {
|
|
30
|
+
min: 0.000050,
|
|
31
|
+
max: 0.000080,
|
|
32
|
+
mean: 0.000063,
|
|
33
|
+
stddev: 0.000005,
|
|
34
|
+
rounds: 2000,
|
|
35
|
+
median: 0.000062,
|
|
36
|
+
ops: 15873.02,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.describe)("parsePytestBenchmark", () => {
|
|
42
|
+
(0, node_test_1.it)("parses pytest-benchmark JSON output", () => {
|
|
43
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(PYTEST_BENCHMARK_OUTPUT));
|
|
44
|
+
strict_1.default.equal(batch.scenarios.length, 2);
|
|
45
|
+
const sortBatch = batch.forScenario("test_sort");
|
|
46
|
+
strict_1.default.equal(sortBatch.forMetric("mean").points[0].value, 0.000134);
|
|
47
|
+
strict_1.default.equal(sortBatch.forMetric("mean").points[0].unit, "s");
|
|
48
|
+
strict_1.default.equal(sortBatch.forMetric("mean").points[0].direction, "smaller_is_better");
|
|
49
|
+
strict_1.default.equal(sortBatch.forMetric("median").points[0].value, 0.000132);
|
|
50
|
+
strict_1.default.equal(sortBatch.forMetric("min").points[0].value, 0.000123);
|
|
51
|
+
strict_1.default.equal(sortBatch.forMetric("max").points[0].value, 0.000156);
|
|
52
|
+
strict_1.default.equal(sortBatch.forMetric("stddev").points[0].value, 0.0000089);
|
|
53
|
+
strict_1.default.equal(sortBatch.forMetric("ops").points[0].value, 7462.68);
|
|
54
|
+
strict_1.default.equal(sortBatch.forMetric("ops").points[0].unit, "ops/s");
|
|
55
|
+
strict_1.default.equal(sortBatch.forMetric("ops").points[0].direction, "bigger_is_better");
|
|
56
|
+
strict_1.default.equal(sortBatch.forMetric("rounds").points[0].value, 1000);
|
|
57
|
+
strict_1.default.equal(sortBatch.forMetric("rounds").points[0].direction, "bigger_is_better");
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)("parses multiple benchmarks", () => {
|
|
60
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(PYTEST_BENCHMARK_OUTPUT));
|
|
61
|
+
const searchBatch = batch.forScenario("test_search");
|
|
62
|
+
strict_1.default.equal(searchBatch.forMetric("mean").points[0].value, 0.000063);
|
|
63
|
+
strict_1.default.equal(searchBatch.forMetric("ops").points[0].value, 15873.02);
|
|
64
|
+
strict_1.default.equal(searchBatch.forMetric("rounds").points[0].value, 2000);
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.it)("auto-detects pytest-benchmark format", () => {
|
|
67
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_js_1.parseBenchmarks)(PYTEST_BENCHMARK_OUTPUT));
|
|
68
|
+
strict_1.default.equal(batch.scenarios.length, 2);
|
|
69
|
+
strict_1.default.ok(batch.scenarios.includes("test_sort"));
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.it)("throws on missing benchmarks array", () => {
|
|
72
|
+
strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)('{"foo": "bar"}'), {
|
|
73
|
+
message: /\[parse-pytest-benchmark\].*benchmarks/,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
(0, node_test_1.it)("throws when an entry lacks a stats object", () => {
|
|
77
|
+
strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(JSON.stringify({ benchmarks: [{ name: "bad_bench" }] })), { message: /stats/ });
|
|
78
|
+
});
|
|
79
|
+
(0, node_test_1.it)("throws contextual error on malformed JSON", () => {
|
|
80
|
+
strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)("not-json"), {
|
|
81
|
+
message: /\[parse-pytest-benchmark\] Failed to parse input as JSON/,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=parse-pytest-benchmark.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-pytest-benchmark.test.js","sourceRoot":"","sources":["../src/parse-pytest-benchmark.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OtlpMetricsDocument } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse Rust cargo bench (libtest) output into an OtlpMetricsDocument.
|
|
4
|
+
*
|
|
5
|
+
* Example:
|
|
6
|
+
* test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseRustBench(input: string): OtlpMetricsDocument;
|
|
9
|
+
//# sourceMappingURL=parse-rust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-rust.d.ts","sourceRoot":"","sources":["../src/parse-rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAgDjE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseRustBench = parseRustBench;
|
|
4
|
+
const build_otlp_result_js_1 = require("./build-otlp-result.js");
|
|
5
|
+
const parser_utils_js_1 = require("./parser-utils.js");
|
|
6
|
+
/**
|
|
7
|
+
* Parse Rust cargo bench (libtest) output into an OtlpMetricsDocument.
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
|
|
11
|
+
*/
|
|
12
|
+
function parseRustBench(input) {
|
|
13
|
+
if (typeof input !== "string" || input.trim() === "") {
|
|
14
|
+
throw new Error("[parse-rust] Input must be a non-empty string.");
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const benchmarks = [];
|
|
18
|
+
const re = /^test\s+(?<name>\S+)\s+\.\.\.\s+bench:\s+(?<value>[\d,]+)\s+(?<unit>\S+)(?:\s+\(\+\/-\s+(?<range>[\d,]+)\))?/;
|
|
19
|
+
for (const line of input.split(/\r?\n/)) {
|
|
20
|
+
const trimmedLine = line.trim();
|
|
21
|
+
const m = trimmedLine.match(re);
|
|
22
|
+
if (!m?.groups)
|
|
23
|
+
continue;
|
|
24
|
+
const { name, value, unit, range: _range } = m.groups;
|
|
25
|
+
const numericValue = parseFloat(value.replace(/,/g, ""));
|
|
26
|
+
if (isNaN(numericValue)) {
|
|
27
|
+
throw new Error(`Invalid numeric value '${value}' for benchmark '${name}'.`);
|
|
28
|
+
}
|
|
29
|
+
const metric = {
|
|
30
|
+
value: numericValue,
|
|
31
|
+
unit,
|
|
32
|
+
direction: "smaller_is_better",
|
|
33
|
+
};
|
|
34
|
+
const metrics = {};
|
|
35
|
+
metrics[(0, parser_utils_js_1.unitToMetricName)(unit)] = metric;
|
|
36
|
+
benchmarks.push({
|
|
37
|
+
name,
|
|
38
|
+
metrics,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return (0, build_otlp_result_js_1.buildOtlpResult)({
|
|
42
|
+
benchmarks,
|
|
43
|
+
context: { sourceFormat: "rust" },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
throw new Error(`[parse-rust] Failed to parse Rust benchmark output: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=parse-rust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-rust.js","sourceRoot":"","sources":["../src/parse-rust.ts"],"names":[],"mappings":";;AAWA,wCAgDC;AAzDD,iEAAyD;AACzD,uDAAqD;AAErD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,MAAM,EAAE,GACN,8GAA8G,CAAC;QAEjH,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,EAAE,MAAM;gBAAE,SAAS;YAEzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YAEtD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,oBAAoB,IAAI,IAAI,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,MAAM,GAAqB;gBAC/B,KAAK,EAAE,YAAY;gBACnB,IAAI;gBACJ,SAAS,EAAE,mBAAmB;aAC/B,CAAC;YAEF,MAAM,OAAO,GAAqC,EAAE,CAAC;YACrD,OAAO,CAAC,IAAA,kCAAgB,EAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YAEzC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAA,sCAAe,EAAC;YACrB,UAAU;YACV,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzG,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-rust.test.d.ts","sourceRoot":"","sources":["../src/parse-rust.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const parse_rust_js_1 = require("./parse-rust.js");
|
|
9
|
+
const metrics_batch_js_1 = require("./metrics-batch.js");
|
|
10
|
+
(0, node_test_1.describe)("parseRustBench", () => {
|
|
11
|
+
(0, node_test_1.it)("parses single rust benchmark", () => {
|
|
12
|
+
const input = "test sort::bench_sort ... bench: 320 ns/iter (+/- 42)";
|
|
13
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
|
|
14
|
+
strict_1.default.equal(batch.scenarios.length, 1);
|
|
15
|
+
strict_1.default.equal(batch.scenarios[0], "sort::bench_sort");
|
|
16
|
+
const p = batch.forMetric("ns_per_iter").points[0];
|
|
17
|
+
strict_1.default.equal(p.value, 320);
|
|
18
|
+
strict_1.default.equal(p.unit, "ns/iter");
|
|
19
|
+
strict_1.default.equal(p.direction, "smaller_is_better");
|
|
20
|
+
});
|
|
21
|
+
(0, node_test_1.it)("parses multiple rust benchmarks", () => {
|
|
22
|
+
const input = `
|
|
23
|
+
test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
|
|
24
|
+
test sort::bench_stable ... bench: 285 ns/iter (+/- 31)
|
|
25
|
+
`;
|
|
26
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
|
|
27
|
+
strict_1.default.equal(batch.scenarios.length, 2);
|
|
28
|
+
strict_1.default.ok(batch.scenarios.includes("sort::bench_sort"));
|
|
29
|
+
strict_1.default.ok(batch.scenarios.includes("sort::bench_stable"));
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.it)("handles benchmarks without range", () => {
|
|
32
|
+
const input = "test basic ... bench: 100 ns/iter";
|
|
33
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
|
|
34
|
+
strict_1.default.equal(batch.forMetric("ns_per_iter").points[0].value, 100);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)("handles numbers with commas", () => {
|
|
37
|
+
const input = "test large ... bench: 1,234,567 ns/iter (+/- 1,234)";
|
|
38
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
|
|
39
|
+
strict_1.default.equal(batch.forMetric("ns_per_iter").points[0].value, 1234567);
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.it)("skips non-benchmark lines", () => {
|
|
42
|
+
const input = `
|
|
43
|
+
running 2 tests
|
|
44
|
+
test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
|
|
45
|
+
test sort::bench_stable ... bench: 285 ns/iter (+/- 31)
|
|
46
|
+
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out; finished in 0.00s
|
|
47
|
+
`;
|
|
48
|
+
const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
|
|
49
|
+
strict_1.default.equal(batch.scenarios.length, 2);
|
|
50
|
+
});
|
|
51
|
+
(0, node_test_1.it)("throws on empty string input", () => {
|
|
52
|
+
strict_1.default.throws(() => (0, parse_rust_js_1.parseRustBench)(""), {
|
|
53
|
+
message: /\[parse-rust\] Input must be a non-empty string/,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
(0, node_test_1.it)("throws on whitespace-only input", () => {
|
|
57
|
+
strict_1.default.throws(() => (0, parse_rust_js_1.parseRustBench)(" \n\t \n "), {
|
|
58
|
+
message: /\[parse-rust\] Input must be a non-empty string/,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=parse-rust.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-rust.test.js","sourceRoot":"","sources":["../src/parse-rust.test.ts"],"names":[],"mappings":"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"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OtlpMetricsDocument } from "./types.js";
|
|
2
|
+
export type Format = "go" | "benchmark-action" | "rust" | "hyperfine" | "pytest-benchmark" | "otlp" | "auto";
|
|
3
|
+
/**
|
|
4
|
+
* Detect the input format and parse into an OtlpMetricsDocument.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseBenchmarks(input: string, format?: Format): OtlpMetricsDocument;
|
|
7
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7G;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,mBAAmB,CAqB3F"}
|
package/dist/parse.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseBenchmarks = parseBenchmarks;
|
|
4
|
+
const parse_go_js_1 = require("./parse-go.js");
|
|
5
|
+
const parse_rust_js_1 = require("./parse-rust.js");
|
|
6
|
+
const parse_benchmark_action_js_1 = require("./parse-benchmark-action.js");
|
|
7
|
+
const parse_hyperfine_js_1 = require("./parse-hyperfine.js");
|
|
8
|
+
const parse_pytest_benchmark_js_1 = require("./parse-pytest-benchmark.js");
|
|
9
|
+
const parse_otlp_js_1 = require("./parse-otlp.js");
|
|
10
|
+
/**
|
|
11
|
+
* Detect the input format and parse into an OtlpMetricsDocument.
|
|
12
|
+
*/
|
|
13
|
+
function parseBenchmarks(input, format = "auto") {
|
|
14
|
+
if (format === "auto") {
|
|
15
|
+
format = detectFormat(input);
|
|
16
|
+
}
|
|
17
|
+
switch (format) {
|
|
18
|
+
case "go":
|
|
19
|
+
return (0, parse_go_js_1.parseGoBench)(input);
|
|
20
|
+
case "rust":
|
|
21
|
+
return (0, parse_rust_js_1.parseRustBench)(input);
|
|
22
|
+
case "benchmark-action":
|
|
23
|
+
return (0, parse_benchmark_action_js_1.parseBenchmarkAction)(input);
|
|
24
|
+
case "hyperfine":
|
|
25
|
+
return (0, parse_hyperfine_js_1.parseHyperfine)(input);
|
|
26
|
+
case "pytest-benchmark":
|
|
27
|
+
return (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(input);
|
|
28
|
+
case "otlp":
|
|
29
|
+
return (0, parse_otlp_js_1.parseOtlp)(input);
|
|
30
|
+
default:
|
|
31
|
+
throw new Error(`[parseBenchmarks] Unknown format: ${format}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Auto-detect format from content.
|
|
36
|
+
*
|
|
37
|
+
* - If it parses as JSON with a "benchmarks" key and entries with "stats" → pytest-benchmark
|
|
38
|
+
* - If it parses as JSON with a "resourceMetrics" key → otlp
|
|
39
|
+
* - If it parses as JSON with a "results" key containing objects with "command" → hyperfine
|
|
40
|
+
* - If it parses as a JSON array of objects with "name"/"value"/"unit" → benchmark-action
|
|
41
|
+
* - If it contains lines matching "Benchmark...\s+\d+" → go
|
|
42
|
+
* - Otherwise → error
|
|
43
|
+
*/
|
|
44
|
+
function detectFormat(input) {
|
|
45
|
+
const trimmed = input.trim();
|
|
46
|
+
// Try JSON first
|
|
47
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(trimmed);
|
|
50
|
+
if (parsed.benchmarks && Array.isArray(parsed.benchmarks)) {
|
|
51
|
+
if (parsed.benchmarks.length > 0 &&
|
|
52
|
+
parsed.benchmarks[0].stats &&
|
|
53
|
+
typeof parsed.benchmarks[0].stats === "object") {
|
|
54
|
+
return "pytest-benchmark";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (parsed.resourceMetrics && Array.isArray(parsed.resourceMetrics)) {
|
|
58
|
+
return "otlp";
|
|
59
|
+
}
|
|
60
|
+
if (parsed.results &&
|
|
61
|
+
Array.isArray(parsed.results) &&
|
|
62
|
+
parsed.results.length > 0 &&
|
|
63
|
+
typeof parsed.results[0].command === "string") {
|
|
64
|
+
return "hyperfine";
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(parsed) &&
|
|
67
|
+
parsed.length > 0 &&
|
|
68
|
+
typeof parsed[0].name === "string" &&
|
|
69
|
+
typeof parsed[0].value === "number") {
|
|
70
|
+
return "benchmark-action";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not valid JSON, fall through
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Check for Go benchmark lines
|
|
78
|
+
if (/^Benchmark\w.*\s+\d+\s+[\d.]+\s+\w+\/\w+/m.test(trimmed)) {
|
|
79
|
+
return "go";
|
|
80
|
+
}
|
|
81
|
+
// Check for Rust benchmark lines
|
|
82
|
+
if (/^test\s+\S+\s+\.\.\.\s+bench:/m.test(trimmed)) {
|
|
83
|
+
return "rust";
|
|
84
|
+
}
|
|
85
|
+
throw new Error("[parseBenchmarks] Could not auto-detect format. Use the 'format' option to specify one of: go, rust, benchmark-action, hyperfine, pytest-benchmark, otlp.");
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../src/parse.test.ts"],"names":[],"mappings":""}
|