pluginbench 0.5.0__py3-none-any.whl

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.
Files changed (58) hide show
  1. pluginbench/__init__.py +3 -0
  2. pluginbench/__main__.py +3 -0
  3. pluginbench/assessment-charts.html +790 -0
  4. pluginbench/assessment.py +316 -0
  5. pluginbench/assessment_charts.py +1225 -0
  6. pluginbench/assessment_metrics.py +1956 -0
  7. pluginbench/assessment_models.py +127 -0
  8. pluginbench/baselines.py +792 -0
  9. pluginbench/claude.py +374 -0
  10. pluginbench/cli.py +672 -0
  11. pluginbench/code_diff.py +207 -0
  12. pluginbench/codex.py +451 -0
  13. pluginbench/codex_events.py +585 -0
  14. pluginbench/collectors.py +591 -0
  15. pluginbench/compare.py +927 -0
  16. pluginbench/components.py +129 -0
  17. pluginbench/coverage_report.py +610 -0
  18. pluginbench/datasets.py +207 -0
  19. pluginbench/evaluation.example.yaml +45 -0
  20. pluginbench/evaluation.py +1651 -0
  21. pluginbench/evaluation_report.py +1004 -0
  22. pluginbench/fallow_parse.mjs +101 -0
  23. pluginbench/harbor_backend.py +2946 -0
  24. pluginbench/isolation.py +314 -0
  25. pluginbench/judge.py +683 -0
  26. pluginbench/language_analysis.py +915 -0
  27. pluginbench/ledger.py +217 -0
  28. pluginbench/measurement_profiles.py +616 -0
  29. pluginbench/native_treatment_runtime.js +221 -0
  30. pluginbench/native_treatments.py +155 -0
  31. pluginbench/observer_data/go-analysis-v1/go.mod +10 -0
  32. pluginbench/observer_data/go-analysis-v1/go.sum +10 -0
  33. pluginbench/observer_data/go-analysis-v1/main.go +64 -0
  34. pluginbench/observer_data/oxc-parser-0.126.0/package-lock.json +449 -0
  35. pluginbench/observer_data/oxc-parser-0.126.0/package.json +5 -0
  36. pluginbench/parallel.py +101 -0
  37. pluginbench/processes.py +100 -0
  38. pluginbench/remeasure.py +992 -0
  39. pluginbench/run_lock.py +227 -0
  40. pluginbench/run_status.py +518 -0
  41. pluginbench/study.py +1858 -0
  42. pluginbench/study_review.py +924 -0
  43. pluginbench/submissions.py +486 -0
  44. pluginbench/task_sources.py +403 -0
  45. pluginbench/treatments.py +388 -0
  46. pluginbench/trial_containers.py +94 -0
  47. pluginbench/vendor/ECHARTS-LICENSE +222 -0
  48. pluginbench/vendor/ECHARTS-NOTICE +5 -0
  49. pluginbench/vendor/ZRENDER-LICENSE +29 -0
  50. pluginbench/vendor/echarts.min.js +48 -0
  51. pluginbench-0.5.0.dist-info/METADATA +294 -0
  52. pluginbench-0.5.0.dist-info/RECORD +58 -0
  53. pluginbench-0.5.0.dist-info/WHEEL +4 -0
  54. pluginbench-0.5.0.dist-info/entry_points.txt +2 -0
  55. pluginbench-0.5.0.dist-info/licenses/LICENSE +201 -0
  56. pluginbench-0.5.0.dist-info/licenses/src/pluginbench/vendor/ECHARTS-LICENSE +222 -0
  57. pluginbench-0.5.0.dist-info/licenses/src/pluginbench/vendor/ECHARTS-NOTICE +5 -0
  58. pluginbench-0.5.0.dist-info/licenses/src/pluginbench/vendor/ZRENDER-LICENSE +29 -0
@@ -0,0 +1,449 @@
1
+ {
2
+ "name": "oxc-parser-0.126.0",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "oxc-parser": "0.126.0"
9
+ }
10
+ },
11
+ "node_modules/@emnapi/core": {
12
+ "version": "1.9.2",
13
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz",
14
+ "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==",
15
+ "license": "MIT",
16
+ "optional": true,
17
+ "dependencies": {
18
+ "@emnapi/wasi-threads": "1.2.1",
19
+ "tslib": "^2.4.0"
20
+ }
21
+ },
22
+ "node_modules/@emnapi/runtime": {
23
+ "version": "1.9.2",
24
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz",
25
+ "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==",
26
+ "license": "MIT",
27
+ "optional": true,
28
+ "dependencies": {
29
+ "tslib": "^2.4.0"
30
+ }
31
+ },
32
+ "node_modules/@emnapi/wasi-threads": {
33
+ "version": "1.2.1",
34
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
35
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
36
+ "license": "MIT",
37
+ "optional": true,
38
+ "dependencies": {
39
+ "tslib": "^2.4.0"
40
+ }
41
+ },
42
+ "node_modules/@napi-rs/wasm-runtime": {
43
+ "version": "1.2.5",
44
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz",
45
+ "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==",
46
+ "license": "MIT",
47
+ "optional": true,
48
+ "dependencies": {
49
+ "@tybys/wasm-util": "^0.10.3"
50
+ },
51
+ "engines": {
52
+ "node": "^20.19.0 || ^22.13.0 || >=23.5.0"
53
+ },
54
+ "funding": {
55
+ "type": "github",
56
+ "url": "https://github.com/sponsors/Brooooooklyn"
57
+ },
58
+ "peerDependencies": {
59
+ "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4",
60
+ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4"
61
+ }
62
+ },
63
+ "node_modules/@oxc-parser/binding-android-arm-eabi": {
64
+ "version": "0.126.0",
65
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.126.0.tgz",
66
+ "integrity": "sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==",
67
+ "cpu": [
68
+ "arm"
69
+ ],
70
+ "license": "MIT",
71
+ "optional": true,
72
+ "os": [
73
+ "android"
74
+ ],
75
+ "engines": {
76
+ "node": "^20.19.0 || >=22.12.0"
77
+ }
78
+ },
79
+ "node_modules/@oxc-parser/binding-android-arm64": {
80
+ "version": "0.126.0",
81
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.126.0.tgz",
82
+ "integrity": "sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==",
83
+ "cpu": [
84
+ "arm64"
85
+ ],
86
+ "license": "MIT",
87
+ "optional": true,
88
+ "os": [
89
+ "android"
90
+ ],
91
+ "engines": {
92
+ "node": "^20.19.0 || >=22.12.0"
93
+ }
94
+ },
95
+ "node_modules/@oxc-parser/binding-darwin-arm64": {
96
+ "version": "0.126.0",
97
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.126.0.tgz",
98
+ "integrity": "sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==",
99
+ "cpu": [
100
+ "arm64"
101
+ ],
102
+ "license": "MIT",
103
+ "optional": true,
104
+ "os": [
105
+ "darwin"
106
+ ],
107
+ "engines": {
108
+ "node": "^20.19.0 || >=22.12.0"
109
+ }
110
+ },
111
+ "node_modules/@oxc-parser/binding-darwin-x64": {
112
+ "version": "0.126.0",
113
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.126.0.tgz",
114
+ "integrity": "sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==",
115
+ "cpu": [
116
+ "x64"
117
+ ],
118
+ "license": "MIT",
119
+ "optional": true,
120
+ "os": [
121
+ "darwin"
122
+ ],
123
+ "engines": {
124
+ "node": "^20.19.0 || >=22.12.0"
125
+ }
126
+ },
127
+ "node_modules/@oxc-parser/binding-freebsd-x64": {
128
+ "version": "0.126.0",
129
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.126.0.tgz",
130
+ "integrity": "sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==",
131
+ "cpu": [
132
+ "x64"
133
+ ],
134
+ "license": "MIT",
135
+ "optional": true,
136
+ "os": [
137
+ "freebsd"
138
+ ],
139
+ "engines": {
140
+ "node": "^20.19.0 || >=22.12.0"
141
+ }
142
+ },
143
+ "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": {
144
+ "version": "0.126.0",
145
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.126.0.tgz",
146
+ "integrity": "sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==",
147
+ "cpu": [
148
+ "arm"
149
+ ],
150
+ "license": "MIT",
151
+ "optional": true,
152
+ "os": [
153
+ "linux"
154
+ ],
155
+ "engines": {
156
+ "node": "^20.19.0 || >=22.12.0"
157
+ }
158
+ },
159
+ "node_modules/@oxc-parser/binding-linux-arm-musleabihf": {
160
+ "version": "0.126.0",
161
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.126.0.tgz",
162
+ "integrity": "sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==",
163
+ "cpu": [
164
+ "arm"
165
+ ],
166
+ "license": "MIT",
167
+ "optional": true,
168
+ "os": [
169
+ "linux"
170
+ ],
171
+ "engines": {
172
+ "node": "^20.19.0 || >=22.12.0"
173
+ }
174
+ },
175
+ "node_modules/@oxc-parser/binding-linux-arm64-gnu": {
176
+ "version": "0.126.0",
177
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.126.0.tgz",
178
+ "integrity": "sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==",
179
+ "cpu": [
180
+ "arm64"
181
+ ],
182
+ "license": "MIT",
183
+ "optional": true,
184
+ "os": [
185
+ "linux"
186
+ ],
187
+ "engines": {
188
+ "node": "^20.19.0 || >=22.12.0"
189
+ }
190
+ },
191
+ "node_modules/@oxc-parser/binding-linux-arm64-musl": {
192
+ "version": "0.126.0",
193
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.126.0.tgz",
194
+ "integrity": "sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==",
195
+ "cpu": [
196
+ "arm64"
197
+ ],
198
+ "license": "MIT",
199
+ "optional": true,
200
+ "os": [
201
+ "linux"
202
+ ],
203
+ "engines": {
204
+ "node": "^20.19.0 || >=22.12.0"
205
+ }
206
+ },
207
+ "node_modules/@oxc-parser/binding-linux-ppc64-gnu": {
208
+ "version": "0.126.0",
209
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.126.0.tgz",
210
+ "integrity": "sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==",
211
+ "cpu": [
212
+ "ppc64"
213
+ ],
214
+ "license": "MIT",
215
+ "optional": true,
216
+ "os": [
217
+ "linux"
218
+ ],
219
+ "engines": {
220
+ "node": "^20.19.0 || >=22.12.0"
221
+ }
222
+ },
223
+ "node_modules/@oxc-parser/binding-linux-riscv64-gnu": {
224
+ "version": "0.126.0",
225
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.126.0.tgz",
226
+ "integrity": "sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==",
227
+ "cpu": [
228
+ "riscv64"
229
+ ],
230
+ "license": "MIT",
231
+ "optional": true,
232
+ "os": [
233
+ "linux"
234
+ ],
235
+ "engines": {
236
+ "node": "^20.19.0 || >=22.12.0"
237
+ }
238
+ },
239
+ "node_modules/@oxc-parser/binding-linux-riscv64-musl": {
240
+ "version": "0.126.0",
241
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.126.0.tgz",
242
+ "integrity": "sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==",
243
+ "cpu": [
244
+ "riscv64"
245
+ ],
246
+ "license": "MIT",
247
+ "optional": true,
248
+ "os": [
249
+ "linux"
250
+ ],
251
+ "engines": {
252
+ "node": "^20.19.0 || >=22.12.0"
253
+ }
254
+ },
255
+ "node_modules/@oxc-parser/binding-linux-s390x-gnu": {
256
+ "version": "0.126.0",
257
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.126.0.tgz",
258
+ "integrity": "sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==",
259
+ "cpu": [
260
+ "s390x"
261
+ ],
262
+ "license": "MIT",
263
+ "optional": true,
264
+ "os": [
265
+ "linux"
266
+ ],
267
+ "engines": {
268
+ "node": "^20.19.0 || >=22.12.0"
269
+ }
270
+ },
271
+ "node_modules/@oxc-parser/binding-linux-x64-gnu": {
272
+ "version": "0.126.0",
273
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.126.0.tgz",
274
+ "integrity": "sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==",
275
+ "cpu": [
276
+ "x64"
277
+ ],
278
+ "license": "MIT",
279
+ "optional": true,
280
+ "os": [
281
+ "linux"
282
+ ],
283
+ "engines": {
284
+ "node": "^20.19.0 || >=22.12.0"
285
+ }
286
+ },
287
+ "node_modules/@oxc-parser/binding-linux-x64-musl": {
288
+ "version": "0.126.0",
289
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.126.0.tgz",
290
+ "integrity": "sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==",
291
+ "cpu": [
292
+ "x64"
293
+ ],
294
+ "license": "MIT",
295
+ "optional": true,
296
+ "os": [
297
+ "linux"
298
+ ],
299
+ "engines": {
300
+ "node": "^20.19.0 || >=22.12.0"
301
+ }
302
+ },
303
+ "node_modules/@oxc-parser/binding-openharmony-arm64": {
304
+ "version": "0.126.0",
305
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.126.0.tgz",
306
+ "integrity": "sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==",
307
+ "cpu": [
308
+ "arm64"
309
+ ],
310
+ "license": "MIT",
311
+ "optional": true,
312
+ "os": [
313
+ "openharmony"
314
+ ],
315
+ "engines": {
316
+ "node": "^20.19.0 || >=22.12.0"
317
+ }
318
+ },
319
+ "node_modules/@oxc-parser/binding-wasm32-wasi": {
320
+ "version": "0.126.0",
321
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.126.0.tgz",
322
+ "integrity": "sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==",
323
+ "cpu": [
324
+ "wasm32"
325
+ ],
326
+ "license": "MIT",
327
+ "optional": true,
328
+ "dependencies": {
329
+ "@emnapi/core": "1.9.2",
330
+ "@emnapi/runtime": "1.9.2",
331
+ "@napi-rs/wasm-runtime": "^1.1.4"
332
+ },
333
+ "engines": {
334
+ "node": ">=14.0.0"
335
+ }
336
+ },
337
+ "node_modules/@oxc-parser/binding-win32-arm64-msvc": {
338
+ "version": "0.126.0",
339
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.126.0.tgz",
340
+ "integrity": "sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==",
341
+ "cpu": [
342
+ "arm64"
343
+ ],
344
+ "license": "MIT",
345
+ "optional": true,
346
+ "os": [
347
+ "win32"
348
+ ],
349
+ "engines": {
350
+ "node": "^20.19.0 || >=22.12.0"
351
+ }
352
+ },
353
+ "node_modules/@oxc-parser/binding-win32-ia32-msvc": {
354
+ "version": "0.126.0",
355
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.126.0.tgz",
356
+ "integrity": "sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==",
357
+ "cpu": [
358
+ "ia32"
359
+ ],
360
+ "license": "MIT",
361
+ "optional": true,
362
+ "os": [
363
+ "win32"
364
+ ],
365
+ "engines": {
366
+ "node": "^20.19.0 || >=22.12.0"
367
+ }
368
+ },
369
+ "node_modules/@oxc-parser/binding-win32-x64-msvc": {
370
+ "version": "0.126.0",
371
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.126.0.tgz",
372
+ "integrity": "sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==",
373
+ "cpu": [
374
+ "x64"
375
+ ],
376
+ "license": "MIT",
377
+ "optional": true,
378
+ "os": [
379
+ "win32"
380
+ ],
381
+ "engines": {
382
+ "node": "^20.19.0 || >=22.12.0"
383
+ }
384
+ },
385
+ "node_modules/@oxc-project/types": {
386
+ "version": "0.126.0",
387
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.126.0.tgz",
388
+ "integrity": "sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==",
389
+ "license": "MIT",
390
+ "funding": {
391
+ "url": "https://github.com/sponsors/Boshen"
392
+ }
393
+ },
394
+ "node_modules/@tybys/wasm-util": {
395
+ "version": "0.10.4",
396
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz",
397
+ "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==",
398
+ "license": "MIT",
399
+ "optional": true,
400
+ "dependencies": {
401
+ "tslib": "^2.4.0"
402
+ }
403
+ },
404
+ "node_modules/oxc-parser": {
405
+ "version": "0.126.0",
406
+ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.126.0.tgz",
407
+ "integrity": "sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==",
408
+ "license": "MIT",
409
+ "dependencies": {
410
+ "@oxc-project/types": "^0.126.0"
411
+ },
412
+ "engines": {
413
+ "node": "^20.19.0 || >=22.12.0"
414
+ },
415
+ "funding": {
416
+ "url": "https://github.com/sponsors/Boshen"
417
+ },
418
+ "optionalDependencies": {
419
+ "@oxc-parser/binding-android-arm-eabi": "0.126.0",
420
+ "@oxc-parser/binding-android-arm64": "0.126.0",
421
+ "@oxc-parser/binding-darwin-arm64": "0.126.0",
422
+ "@oxc-parser/binding-darwin-x64": "0.126.0",
423
+ "@oxc-parser/binding-freebsd-x64": "0.126.0",
424
+ "@oxc-parser/binding-linux-arm-gnueabihf": "0.126.0",
425
+ "@oxc-parser/binding-linux-arm-musleabihf": "0.126.0",
426
+ "@oxc-parser/binding-linux-arm64-gnu": "0.126.0",
427
+ "@oxc-parser/binding-linux-arm64-musl": "0.126.0",
428
+ "@oxc-parser/binding-linux-ppc64-gnu": "0.126.0",
429
+ "@oxc-parser/binding-linux-riscv64-gnu": "0.126.0",
430
+ "@oxc-parser/binding-linux-riscv64-musl": "0.126.0",
431
+ "@oxc-parser/binding-linux-s390x-gnu": "0.126.0",
432
+ "@oxc-parser/binding-linux-x64-gnu": "0.126.0",
433
+ "@oxc-parser/binding-linux-x64-musl": "0.126.0",
434
+ "@oxc-parser/binding-openharmony-arm64": "0.126.0",
435
+ "@oxc-parser/binding-wasm32-wasi": "0.126.0",
436
+ "@oxc-parser/binding-win32-arm64-msvc": "0.126.0",
437
+ "@oxc-parser/binding-win32-ia32-msvc": "0.126.0",
438
+ "@oxc-parser/binding-win32-x64-msvc": "0.126.0"
439
+ }
440
+ },
441
+ "node_modules/tslib": {
442
+ "version": "2.8.1",
443
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
444
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
445
+ "license": "0BSD",
446
+ "optional": true
447
+ }
448
+ }
449
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "oxc-parser": "0.126.0"
4
+ }
5
+ }
@@ -0,0 +1,101 @@
1
+ """Bounded independent jobs with one coordinator and cancellation-aware draining."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable, Sequence
6
+ from concurrent.futures import CancelledError, Future, ThreadPoolExecutor, wait, FIRST_COMPLETED
7
+ from queue import Empty, SimpleQueue
8
+ from threading import Event
9
+
10
+
11
+ def validate_jobs(jobs: object) -> None:
12
+ if type(jobs) is not int or not 1 <= jobs <= 16:
13
+ raise ValueError("jobs must be an integer from 1 to 16")
14
+
15
+
16
+ def run_jobs[T](
17
+ items: Sequence[T],
18
+ *,
19
+ jobs: int,
20
+ operation: Callable[[T, Event, Callable[[Callable[[], None]], None]], None],
21
+ on_submit: Callable[[T], None] | None = None,
22
+ ) -> None:
23
+ """Stop admission on failure; drain active calls and coordinator updates before raising."""
24
+ validate_jobs(jobs)
25
+ cancelled = Event()
26
+ if jobs == 1:
27
+ try:
28
+ for item in items:
29
+ if on_submit:
30
+ on_submit(item)
31
+ operation(item, cancelled, lambda callback: callback())
32
+ except BaseException:
33
+ cancelled.set()
34
+ raise
35
+ return
36
+ updates: SimpleQueue[Callable[[], None]] = SimpleQueue()
37
+ failures: SimpleQueue[BaseException] = SimpleQueue()
38
+ first_failure: BaseException | None = None
39
+
40
+ def perform(item: T) -> None:
41
+ if cancelled.is_set():
42
+ return
43
+ try:
44
+ operation(item, cancelled, updates.put)
45
+ except BaseException as exc:
46
+ if not isinstance(exc, CancelledError) or not cancelled.is_set():
47
+ failures.put(exc)
48
+ cancelled.set()
49
+
50
+ def drain_updates() -> None:
51
+ nonlocal first_failure
52
+ while True:
53
+ try:
54
+ failure = failures.get_nowait()
55
+ except Empty:
56
+ break
57
+ first_failure = first_failure or failure
58
+ while True:
59
+ try:
60
+ callback = updates.get_nowait()
61
+ except Empty:
62
+ break
63
+ try:
64
+ callback()
65
+ except BaseException as exc:
66
+ first_failure = first_failure or exc
67
+ cancelled.set()
68
+
69
+ iterator = iter(items)
70
+ active: set[Future[None]] = set()
71
+ with ThreadPoolExecutor(max_workers=jobs, thread_name_prefix="pluginbench") as pool:
72
+
73
+ def replenish() -> None:
74
+ while len(active) < jobs and not cancelled.is_set():
75
+ try:
76
+ item = next(iterator)
77
+ except StopIteration:
78
+ return
79
+ if on_submit:
80
+ on_submit(item)
81
+ active.add(pool.submit(perform, item))
82
+
83
+ try:
84
+ replenish()
85
+ except BaseException as exc:
86
+ first_failure = exc
87
+ cancelled.set()
88
+ while active:
89
+ try:
90
+ drain_updates()
91
+ done, _ = wait(active, timeout=0.05, return_when=FIRST_COMPLETED)
92
+ active.difference_update(done)
93
+ drain_updates()
94
+ replenish()
95
+ except BaseException as exc:
96
+ first_failure = first_failure or exc
97
+ cancelled.set()
98
+ # Current native calls finish under their existing timeout. No new work is admitted.
99
+ drain_updates()
100
+ if first_failure is not None:
101
+ raise first_failure
@@ -0,0 +1,100 @@
1
+ """Run commands and clean up only the POSIX process groups they own."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import signal
7
+ import subprocess
8
+ import time
9
+ from collections.abc import Mapping, Sequence
10
+ from pathlib import Path
11
+
12
+ _CLEANUP_TIMEOUT = 1.0
13
+
14
+
15
+ def _signal_group(pid: int, sig: int) -> bool:
16
+ try:
17
+ os.killpg(pid, sig)
18
+ except ProcessLookupError:
19
+ return False
20
+ except PermissionError:
21
+ if sig != 0:
22
+ raise
23
+ # macOS can report EPERM while an owned, terminated group is disappearing.
24
+ return True
25
+
26
+
27
+ def terminate_process_group(proc: subprocess.Popen[str]) -> None:
28
+ """Reap a command started with start_new_session=True and stop its group.
29
+
30
+ The group can outlive its leader. Descendants that create a new session or
31
+ process group escape this cleanup and require a separate containment boundary.
32
+ """
33
+ if _signal_group(proc.pid, signal.SIGTERM):
34
+ deadline = time.monotonic() + _CLEANUP_TIMEOUT
35
+ while time.monotonic() < deadline:
36
+ proc.poll()
37
+ if not _signal_group(proc.pid, 0):
38
+ break
39
+ time.sleep(0.01)
40
+ else:
41
+ _signal_group(proc.pid, signal.SIGKILL)
42
+ proc.wait(timeout=_CLEANUP_TIMEOUT)
43
+
44
+
45
+ def run_command(
46
+ argv: Sequence[str | Path],
47
+ *,
48
+ cwd: str | Path,
49
+ env: Mapping[str, str],
50
+ timeout: float | None,
51
+ ) -> subprocess.CompletedProcess[str]:
52
+ """Capture UTF-8 output and clean the command's group, including on failure.
53
+
54
+ TimeoutExpired retains byte output. The final drain is bounded because an
55
+ escaped descendant can keep pipes open after the owned group has stopped.
56
+ """
57
+ proc = subprocess.Popen(
58
+ argv,
59
+ cwd=cwd,
60
+ env=env,
61
+ stdout=subprocess.PIPE,
62
+ stderr=subprocess.PIPE,
63
+ text=True,
64
+ encoding="utf-8",
65
+ start_new_session=True,
66
+ )
67
+ failure: BaseException | None = None
68
+ try:
69
+ try:
70
+ stdout, stderr = proc.communicate(timeout=timeout)
71
+ except BaseException as error:
72
+ failure = error
73
+ raise
74
+ finally:
75
+ try:
76
+ terminate_process_group(proc)
77
+ except (OSError, subprocess.TimeoutExpired) as cleanup_error:
78
+ if failure is None:
79
+ raise
80
+ failure.add_note(f"Process-group cleanup failed: {cleanup_error}")
81
+ except BaseException as error:
82
+ try:
83
+ stdout, stderr = proc.communicate(timeout=_CLEANUP_TIMEOUT)
84
+ except subprocess.TimeoutExpired:
85
+ error.add_note(
86
+ f"Final output drain exceeded {_CLEANUP_TIMEOUT:g} seconds; "
87
+ "a descendant may hold pipes open."
88
+ )
89
+ except OSError as drain_error:
90
+ error.add_note(f"Could not drain captured process output: {drain_error}")
91
+ else:
92
+ if isinstance(error, subprocess.TimeoutExpired):
93
+ error.output = stdout.encode("utf-8")
94
+ error.stderr = stderr.encode("utf-8")
95
+ finally:
96
+ for pipe in (proc.stdout, proc.stderr):
97
+ if pipe is not None:
98
+ pipe.close()
99
+ raise
100
+ return subprocess.CompletedProcess(argv, proc.returncode, stdout, stderr)