Skip to content
This repository was archived by the owner on Apr 2, 2026. It is now read-only.

Commit 6cecd9f

Browse files
committed
feat: reformat output for reset crossing
1 parent 77530e5 commit 6cecd9f

5 files changed

Lines changed: 89 additions & 77 deletions

File tree

README.md

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,33 @@ After your job completes, you'll get a nice summary:
5353

5454
## Outputs
5555

56-
| Name | Description |
57-
| ----- | ----------------------------------------------------------------------------------------------------------------- |
58-
| usage | JSON string with total, duration_ms, total_is_minimum, and buckets_data (per-bucket used/remaining/crossed_reset) |
56+
| Name | Description |
57+
| ----- | -------------------------------------------------------------------------------------------------------------- |
58+
| usage | JSON string with total, duration_ms, crossed_reset, and buckets_data (per-bucket used/remaining/crossed_reset) |
5959

6060
Example output:
6161

6262
```json
6363
{
6464
"total": 60,
6565
"duration_ms": 12345,
66-
"total_is_minimum": false,
66+
"crossed_reset": false,
6767
"buckets_data": {
68-
"core": { "used": 45, "remaining": 4955, "crossed_reset": false },
69-
"graphql": { "used": 10, "remaining": 4990, "crossed_reset": false },
70-
"search": { "used": 5, "remaining": 25, "crossed_reset": false }
68+
"core": {
69+
"used": { "start": 5, "end": 50, "total": 45 },
70+
"remaining": { "start": 4995, "end": 4950 },
71+
"crossed_reset": false
72+
},
73+
"graphql": {
74+
"used": { "start": 0, "end": 10, "total": 10 },
75+
"remaining": { "start": 5000, "end": 4990 },
76+
"crossed_reset": false
77+
},
78+
"search": {
79+
"used": { "start": 0, "end": 5, "total": 5 },
80+
"remaining": { "start": 30, "end": 25 },
81+
"crossed_reset": false
82+
}
7183
}
7284
}
7385
```

dist/post/index.js

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27868,13 +27868,15 @@ function makeSummaryTable(resources, options = {}) {
2786827868
];
2786927869
const formatValue = (value) => (Number.isFinite(value) ? String(value) : 'n/a');
2787027870
for (const [bucket, info] of Object.entries(resources)) {
27871+
const used = info.used || {};
27872+
const remaining = info.remaining || {};
2787127873
summaryTable.push([
2787227874
{ data: bucket },
27873-
{ data: formatValue(info.used_start) },
27874-
{ data: formatValue(info.remaining_start) },
27875-
{ data: formatValue(info.used_end) },
27876-
{ data: formatValue(info.remaining_end) },
27877-
{ data: formatValue(info.used_total) }
27875+
{ data: formatValue(used.start) },
27876+
{ data: formatValue(remaining.start) },
27877+
{ data: formatValue(used.end) },
27878+
{ data: formatValue(remaining.end) },
27879+
{ data: formatValue(used.total) }
2787827880
]);
2787927881
}
2788027882

@@ -28179,7 +28181,6 @@ async function run() {
2817928181
log(`[github-api-usage-tracker] ${JSON.stringify(endingResources, null, 2)}`);
2818028182

2818128183
const data = {};
28182-
const summaryData = {};
2818328184
const crossedBuckets = [];
2818428185
let totalUsed = 0;
2818528186
let totalIsMinimum = false;
@@ -28250,11 +28251,6 @@ async function run() {
2825028251
);
2825128252
}
2825228253

28253-
data[bucket] = {
28254-
used: usage.used,
28255-
remaining: usage.remaining,
28256-
crossed_reset: usage.crossed_reset
28257-
};
2825828254
const startingRemaining = Number(startingBucket.remaining);
2825928255
const startingLimit = Number(startingBucket.limit);
2826028256
const endingRemaining = Number(endingBucket.remaining);
@@ -28267,12 +28263,17 @@ async function run() {
2826728263
Number.isFinite(endingLimit) && Number.isFinite(endingRemaining)
2826828264
? endingLimit - endingRemaining
2826928265
: null;
28270-
summaryData[bucket] = {
28271-
used_start: startUsed,
28272-
remaining_start: Number.isFinite(startingRemaining) ? startingRemaining : null,
28273-
used_end: endUsed,
28274-
remaining_end: Number.isFinite(endingRemaining) ? endingRemaining : null,
28275-
used_total: usage.used
28266+
data[bucket] = {
28267+
used: {
28268+
start: startUsed,
28269+
end: endUsed,
28270+
total: usage.used
28271+
},
28272+
remaining: {
28273+
start: Number.isFinite(startingRemaining) ? startingRemaining : null,
28274+
end: Number.isFinite(endingRemaining) ? endingRemaining : null
28275+
},
28276+
crossed_reset: usage.crossed_reset
2827628277
};
2827728278
if (usage.crossed_reset) {
2827828279
crossedBuckets.push(bucket);
@@ -28288,9 +28289,9 @@ async function run() {
2828828289
total: totalUsed,
2828928290
duration_ms: duration,
2829028291
buckets_data: data,
28291-
total_is_minimum: totalIsMinimum
28292+
crossed_reset: totalIsMinimum
2829228293
};
28293-
core.setOutput('usage', JSON.stringify(output));
28294+
core.setOutput('usage', JSON.stringify(output, null, 2));
2829428295

2829528296
// Write JSON file if path specified
2829628297
const outPath = (core.getInput('output_path') || '').trim();
@@ -28301,26 +28302,28 @@ async function run() {
2830128302
);
2830228303
const summary = core.summary
2830328304
.addHeading('GitHub API Usage Tracker Summary')
28304-
.addTable(makeSummaryTable(summaryData, { useMinimumHeader: totalIsMinimum }));
28305+
.addTable(makeSummaryTable(data, { useMinimumHeader: totalIsMinimum }));
2830528306
if (crossedBuckets.length > 0) {
2830628307
summary.addRaw(
2830728308
`<p><strong>Reset Window Crossed:</strong> Yes (${crossedBuckets.join(', ')})</p>`,
2830828309
true
2830928310
);
2831028311
summary.addRaw(
28311-
'<p><strong>Usage Note:</strong> Usage values are minimums; calls between the pre-snapshot and the reset are not observable.</p>',
28312+
'<p><strong>Total Usage:</strong> Total usage cannot be computed - usage reset window was crossed.</p>',
2831228313
true
2831328314
);
28315+
summary.addRaw(`<p><strong>Minimum API Calls/Points Used:</strong> ${totalUsed}</p>`, true);
2831428316
}
28315-
summary
28316-
.addRaw(
28317-
`<p><strong>Action Duration:</strong> ${
28318-
hasStartTime ? formatMs(duration) : 'Unknown (data missing)'
28319-
}</p>`,
28320-
true
28321-
)
28322-
.addRaw(`<p><strong>Total API Calls/Points Used:</strong> ${totalUsed}</p>`, true)
28323-
.write();
28317+
summary.addRaw(
28318+
`<p><strong>Action Duration:</strong> ${
28319+
hasStartTime ? formatMs(duration) : 'Unknown (data missing)'
28320+
}</p>`,
28321+
true
28322+
);
28323+
if (crossedBuckets.length === 0) {
28324+
summary.addRaw(`<p><strong>Total API Calls/Points Used:</strong> ${totalUsed}</p>`, true);
28325+
}
28326+
summary.write();
2832428327
} catch (err) {
2832528328
core.error(`[github-api-usage-tracker] Post step failed: ${err.message}`);
2832628329
}

src/post-utils.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ function makeSummaryTable(resources, options = {}) {
3030
];
3131
const formatValue = (value) => (Number.isFinite(value) ? String(value) : 'n/a');
3232
for (const [bucket, info] of Object.entries(resources)) {
33+
const used = info.used || {};
34+
const remaining = info.remaining || {};
3335
summaryTable.push([
3436
{ data: bucket },
35-
{ data: formatValue(info.used_start) },
36-
{ data: formatValue(info.remaining_start) },
37-
{ data: formatValue(info.used_end) },
38-
{ data: formatValue(info.remaining_end) },
39-
{ data: formatValue(info.used_total) }
37+
{ data: formatValue(used.start) },
38+
{ data: formatValue(remaining.start) },
39+
{ data: formatValue(used.end) },
40+
{ data: formatValue(remaining.end) },
41+
{ data: formatValue(used.total) }
4042
]);
4143
}
4244

src/post.js

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ async function run() {
107107
log(`[github-api-usage-tracker] ${JSON.stringify(endingResources, null, 2)}`);
108108

109109
const data = {};
110-
const summaryData = {};
111110
const crossedBuckets = [];
112111
let totalUsed = 0;
113112
let totalIsMinimum = false;
@@ -178,11 +177,6 @@ async function run() {
178177
);
179178
}
180179

181-
data[bucket] = {
182-
used: usage.used,
183-
remaining: usage.remaining,
184-
crossed_reset: usage.crossed_reset
185-
};
186180
const startingRemaining = Number(startingBucket.remaining);
187181
const startingLimit = Number(startingBucket.limit);
188182
const endingRemaining = Number(endingBucket.remaining);
@@ -195,12 +189,17 @@ async function run() {
195189
Number.isFinite(endingLimit) && Number.isFinite(endingRemaining)
196190
? endingLimit - endingRemaining
197191
: null;
198-
summaryData[bucket] = {
199-
used_start: startUsed,
200-
remaining_start: Number.isFinite(startingRemaining) ? startingRemaining : null,
201-
used_end: endUsed,
202-
remaining_end: Number.isFinite(endingRemaining) ? endingRemaining : null,
203-
used_total: usage.used
192+
data[bucket] = {
193+
used: {
194+
start: startUsed,
195+
end: endUsed,
196+
total: usage.used
197+
},
198+
remaining: {
199+
start: Number.isFinite(startingRemaining) ? startingRemaining : null,
200+
end: Number.isFinite(endingRemaining) ? endingRemaining : null
201+
},
202+
crossed_reset: usage.crossed_reset
204203
};
205204
if (usage.crossed_reset) {
206205
crossedBuckets.push(bucket);
@@ -216,9 +215,9 @@ async function run() {
216215
total: totalUsed,
217216
duration_ms: duration,
218217
buckets_data: data,
219-
total_is_minimum: totalIsMinimum
218+
crossed_reset: totalIsMinimum
220219
};
221-
core.setOutput('usage', JSON.stringify(output));
220+
core.setOutput('usage', JSON.stringify(output, null, 2));
222221

223222
// Write JSON file if path specified
224223
const outPath = (core.getInput('output_path') || '').trim();
@@ -229,26 +228,28 @@ async function run() {
229228
);
230229
const summary = core.summary
231230
.addHeading('GitHub API Usage Tracker Summary')
232-
.addTable(makeSummaryTable(summaryData, { useMinimumHeader: totalIsMinimum }));
231+
.addTable(makeSummaryTable(data, { useMinimumHeader: totalIsMinimum }));
233232
if (crossedBuckets.length > 0) {
234233
summary.addRaw(
235234
`<p><strong>Reset Window Crossed:</strong> Yes (${crossedBuckets.join(', ')})</p>`,
236235
true
237236
);
238237
summary.addRaw(
239-
'<p><strong>Usage Note:</strong> Usage values are minimums; calls between the pre-snapshot and the reset are not observable.</p>',
238+
'<p><strong>Total Usage:</strong> Total usage cannot be computed - usage reset window was crossed.</p>',
240239
true
241240
);
241+
summary.addRaw(`<p><strong>Minimum API Calls/Points Used:</strong> ${totalUsed}</p>`, true);
242242
}
243-
summary
244-
.addRaw(
245-
`<p><strong>Action Duration:</strong> ${
246-
hasStartTime ? formatMs(duration) : 'Unknown (data missing)'
247-
}</p>`,
248-
true
249-
)
250-
.addRaw(`<p><strong>Total API Calls/Points Used:</strong> ${totalUsed}</p>`, true)
251-
.write();
243+
summary.addRaw(
244+
`<p><strong>Action Duration:</strong> ${
245+
hasStartTime ? formatMs(duration) : 'Unknown (data missing)'
246+
}</p>`,
247+
true
248+
);
249+
if (crossedBuckets.length === 0) {
250+
summary.addRaw(`<p><strong>Total API Calls/Points Used:</strong> ${totalUsed}</p>`, true);
251+
}
252+
summary.write();
252253
} catch (err) {
253254
core.error(`[github-api-usage-tracker] Post step failed: ${err.message}`);
254255
}

tests/post-utils.test.mjs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,12 @@ describe('post utils', () => {
2323
it('builds a summary table with stringified counts', () => {
2424
const table = makeSummaryTable({
2525
core: {
26-
used_start: 3,
27-
remaining_start: 10,
28-
used_end: 5,
29-
remaining_end: 8,
30-
used_total: 2
26+
used: { start: 3, end: 5, total: 2 },
27+
remaining: { start: 10, end: 8 }
3128
},
3229
search: {
33-
used_start: 1,
34-
remaining_start: 2,
35-
used_end: 1,
36-
remaining_end: 2,
37-
used_total: 0
30+
used: { start: 1, end: 1, total: 0 },
31+
remaining: { start: 2, end: 2 }
3832
}
3933
});
4034

0 commit comments

Comments
 (0)