Skip to content

Commit 0a6d827

Browse files
stop lintgpt spinners on error (#2553)
1 parent 702d036 commit 0a6d827

File tree

9 files changed

+145
-133
lines changed

9 files changed

+145
-133
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "openapi-workspaces",
33
"license": "MIT",
44
"private": true,
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"workspaces": [
77
"projects/json-pointer-helpers",
88
"projects/openapi-io",

projects/fastify-capture/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/fastify-capture",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/json-pointer-helpers/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/json-pointer-helpers",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/openapi-io/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/openapi-io",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/openapi-utilities/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/openapi-utilities",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/optic/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/optic",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/rulesets-base/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/rulesets-base",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/standard-rulesets/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@useoptic/standard-rulesets",
33
"license": "MIT",
44
"packageManager": "[email protected]",
5-
"version": "0.53.2",
5+
"version": "0.53.3",
66
"main": "build/index.js",
77
"types": "build/index.d.ts",
88
"files": [

projects/standard-rulesets/src/lintgpt/rules-helper.ts

Lines changed: 137 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,6 @@ export class LintgptRulesHelper {
8282

8383
const ora = (await import('ora')).default;
8484

85-
for (const rule of rules) {
86-
const rule_checksum = computeRuleChecksum(rule);
87-
preparedRulesMap.set(rule_checksum, { rule, rule_checksum });
88-
}
89-
9085
let spinner = ora({
9186
text: this.getPrepSpinnerText({
9287
total: rules.length,
@@ -96,61 +91,71 @@ export class LintgptRulesHelper {
9691

9792
spinner.start();
9893

99-
const getRulesWithoutPrep = () =>
100-
[...preparedRulesMap.values()].filter(
101-
({ prep }) => !prep || prep.status === 'requested'
102-
);
103-
104-
const maxTime = Date.now() + 3 * 60 * 1000;
94+
try {
95+
for (const rule of rules) {
96+
const rule_checksum = computeRuleChecksum(rule);
97+
preparedRulesMap.set(rule_checksum, { rule, rule_checksum });
98+
}
10599

106-
let rulesWithoutPreps = getRulesWithoutPrep();
107-
let firstRun = true;
108-
const pollInterval = 2000;
100+
const getRulesWithoutPrep = () =>
101+
[...preparedRulesMap.values()].filter(
102+
({ prep }) => !prep || prep.status === 'requested'
103+
);
109104

110-
while (rulesWithoutPreps.length && maxTime > Date.now()) {
111-
if (!firstRun)
112-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
105+
const maxTime = Date.now() + 3 * 60 * 1000;
113106

114-
const results = await this.client.getLintgptPreps(
115-
rulesWithoutPreps.map((r) => r.rule_checksum)
116-
);
107+
let rulesWithoutPreps = getRulesWithoutPrep();
108+
let firstRun = true;
109+
const pollInterval = 2000;
117110

118-
for (const result of results.lintgpt_preps) {
119-
preparedRulesMap.set(result.rule_checksum, {
120-
...preparedRulesMap.get(result.rule_checksum)!,
121-
prep: result,
122-
});
123-
}
111+
while (rulesWithoutPreps.length && maxTime > Date.now()) {
112+
if (!firstRun)
113+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
124114

125-
rulesWithoutPreps = getRulesWithoutPrep();
115+
const results = await this.client.getLintgptPreps(
116+
rulesWithoutPreps.map((r) => r.rule_checksum)
117+
);
126118

127-
if (firstRun && rulesWithoutPreps.length) {
128-
const rulesToPrep = rulesWithoutPreps.map((r) => r.rule);
129-
await this.client.requestLintgptPreps(rulesToPrep);
130-
}
119+
for (const result of results.lintgpt_preps) {
120+
preparedRulesMap.set(result.rule_checksum, {
121+
...preparedRulesMap.get(result.rule_checksum)!,
122+
prep: result,
123+
});
124+
}
131125

132-
spinner.text = this.getPrepSpinnerText({
133-
total: rules.length,
134-
evaluated: rules.length - rulesWithoutPreps.length,
135-
});
126+
rulesWithoutPreps = getRulesWithoutPrep();
136127

137-
firstRun = false;
138-
}
128+
if (firstRun && rulesWithoutPreps.length) {
129+
const rulesToPrep = rulesWithoutPreps.map((r) => r.rule);
130+
await this.client.requestLintgptPreps(rulesToPrep);
131+
}
139132

140-
if (rulesWithoutPreps.length) {
141-
spinner.warn(
142-
`LintGPT: ${rulesWithoutPreps.length}/${rules.length} rules timed out`
143-
);
144-
} else {
145-
spinner.succeed(
146-
this.getPrepSpinnerText({
133+
spinner.text = this.getPrepSpinnerText({
147134
total: rules.length,
148135
evaluated: rules.length - rulesWithoutPreps.length,
149-
})
150-
);
151-
}
136+
});
137+
138+
firstRun = false;
139+
}
152140

153-
return preparedRulesMap;
141+
if (rulesWithoutPreps.length) {
142+
spinner.warn(
143+
`LintGPT: ${rulesWithoutPreps.length}/${rules.length} rules timed out`
144+
);
145+
} else {
146+
spinner.succeed(
147+
this.getPrepSpinnerText({
148+
total: rules.length,
149+
evaluated: rules.length - rulesWithoutPreps.length,
150+
})
151+
);
152+
}
153+
154+
return preparedRulesMap;
155+
} catch (e) {
156+
spinner.fail(`LintGPT: an error occured while preparing rules`);
157+
throw e;
158+
}
154159
}
155160

156161
private getEvalSpinnerText = ({
@@ -174,17 +179,6 @@ export class LintgptRulesHelper {
174179

175180
const ora = (await import('ora')).default;
176181

177-
for (const eval_request of eval_requests) {
178-
const rule_checksum = eval_request.rule_checksum;
179-
const node_checksum = computeNodeChecksum(eval_request);
180-
const key = getEvalKey(rule_checksum, node_checksum);
181-
evalsMap.set(key, {
182-
eval_request,
183-
rule_checksum,
184-
node_checksum,
185-
});
186-
}
187-
188182
let spinner = ora({
189183
text: this.getEvalSpinnerText({
190184
total: eval_requests.length,
@@ -194,84 +188,102 @@ export class LintgptRulesHelper {
194188

195189
spinner.start();
196190

197-
const getRequestsWithoutEvals = () =>
198-
[...evalsMap.values()].filter(
199-
({ rule_eval }) => !rule_eval || rule_eval.status === 'requested'
200-
);
191+
try {
192+
for (const eval_request of eval_requests) {
193+
const rule_checksum = eval_request.rule_checksum;
194+
const node_checksum = computeNodeChecksum(eval_request);
195+
const key = getEvalKey(rule_checksum, node_checksum);
196+
evalsMap.set(key, {
197+
eval_request,
198+
rule_checksum,
199+
node_checksum,
200+
});
201+
}
201202

202-
const maxTime = Date.now() + 5 * 60 * 1000;
203+
const getRequestsWithoutEvals = () =>
204+
[...evalsMap.values()].filter(
205+
({ rule_eval }) => !rule_eval || rule_eval.status === 'requested'
206+
);
203207

204-
let requestsWithoutEvals = getRequestsWithoutEvals();
205-
let firstRun = true;
206-
let pollInterval0 = 0;
207-
let pollInterval1 = 1000;
208+
const maxTime = Date.now() + 5 * 60 * 1000;
208209

209-
while (requestsWithoutEvals.length && maxTime > Date.now()) {
210-
if (!firstRun) {
211-
pollInterval1 = pollInterval0 + pollInterval1;
212-
pollInterval0 = pollInterval1 - pollInterval0;
213-
await new Promise((resolve) => setTimeout(resolve, pollInterval1));
214-
}
210+
let requestsWithoutEvals = getRequestsWithoutEvals();
211+
let firstRun = true;
212+
let pollInterval0 = 0;
213+
let pollInterval1 = 1000;
215214

216-
const queryChunks = chunk(
217-
requestsWithoutEvals.map((r) => ({
218-
rule_checksum: r.rule_checksum,
219-
node_checksum: r.node_checksum,
220-
})),
221-
20
222-
);
223-
224-
const resultChunks = await Promise.all(
225-
queryChunks.map((c) => this.client.getLintgptEvals(c))
226-
);
227-
228-
const results = resultChunks.reduce(
229-
(acc, val) => ({
230-
lintgpt_evals: [...acc.lintgpt_evals, ...val.lintgpt_evals],
231-
}),
232-
{ lintgpt_evals: [] }
233-
);
234-
235-
for (const result of results.lintgpt_evals) {
236-
const key = getEvalKey(result.rule_checksum, result.node_checksum);
237-
if (!evalsMap.has(key)) {
238-
continue;
215+
while (requestsWithoutEvals.length && maxTime > Date.now()) {
216+
if (!firstRun) {
217+
pollInterval1 = pollInterval0 + pollInterval1;
218+
pollInterval0 = pollInterval1 - pollInterval0;
219+
await new Promise((resolve) => setTimeout(resolve, pollInterval1));
239220
}
240-
evalsMap.set(key, {
241-
...evalsMap.get(key)!,
242-
rule_eval: result,
243-
});
244-
}
245221

246-
requestsWithoutEvals = getRequestsWithoutEvals();
222+
const queryChunks = chunk(
223+
requestsWithoutEvals.map((r) => ({
224+
rule_checksum: r.rule_checksum,
225+
node_checksum: r.node_checksum,
226+
})),
227+
20
228+
);
229+
230+
const resultChunks = await Promise.all(
231+
queryChunks.map((c) => this.client.getLintgptEvals(c))
232+
);
233+
234+
const results = resultChunks.reduce(
235+
(acc, val) => ({
236+
lintgpt_evals: [...acc.lintgpt_evals, ...val.lintgpt_evals],
237+
}),
238+
{ lintgpt_evals: [] }
239+
);
240+
241+
for (const result of results.lintgpt_evals) {
242+
const key = getEvalKey(result.rule_checksum, result.node_checksum);
243+
if (!evalsMap.has(key)) {
244+
continue;
245+
}
246+
evalsMap.set(key, {
247+
...evalsMap.get(key)!,
248+
rule_eval: result,
249+
});
250+
}
247251

248-
spinner.text = this.getEvalSpinnerText({
249-
total: eval_requests.length,
250-
evaluated: eval_requests.length - requestsWithoutEvals.length,
251-
});
252+
requestsWithoutEvals = getRequestsWithoutEvals();
253+
254+
spinner.text = this.getEvalSpinnerText({
255+
total: eval_requests.length,
256+
evaluated: eval_requests.length - requestsWithoutEvals.length,
257+
});
258+
259+
if (firstRun && requestsWithoutEvals.length) {
260+
const evalsToRequest = requestsWithoutEvals.map(
261+
(r) => r.eval_request
262+
);
263+
await this.client.requestLintgptEvals(evalsToRequest);
264+
}
252265

253-
if (firstRun && requestsWithoutEvals.length) {
254-
const evalsToRequest = requestsWithoutEvals.map((r) => r.eval_request);
255-
await this.client.requestLintgptEvals(evalsToRequest);
266+
firstRun = false;
256267
}
257268

258-
firstRun = false;
259-
}
269+
if (requestsWithoutEvals.length) {
270+
spinner.warn(
271+
`LintGPT: ${requestsWithoutEvals.length}/${eval_requests.length} checks timed out`
272+
);
273+
} else {
274+
spinner.succeed(
275+
this.getEvalSpinnerText({
276+
total: eval_requests.length,
277+
evaluated: eval_requests.length - requestsWithoutEvals.length,
278+
})
279+
);
280+
}
260281

261-
if (requestsWithoutEvals.length) {
262-
spinner.warn(
263-
`LintGPT: ${requestsWithoutEvals.length}/${eval_requests.length} checks timed out`
264-
);
265-
} else {
266-
spinner.succeed(
267-
this.getEvalSpinnerText({
268-
total: eval_requests.length,
269-
evaluated: eval_requests.length - requestsWithoutEvals.length,
270-
})
271-
);
282+
return evalsMap;
283+
} catch (e) {
284+
spinner.fail('LintGPT: an error occured while running evals');
285+
throw e;
272286
}
273-
274-
return evalsMap;
275287
}
276288
}
277289

0 commit comments

Comments
 (0)