Repository navigation
Commit c5b3bb3
Markus
fix(workflows): evaluate long and/or chains without exhausting the stack
The Lark engine built its AST with Lark's recursive Transformer, which
uses about two Python frames per tree level, and nested `a or b or c` as
`((a or b) or c)`. Building, evaluating and validating the tree all
recursed once per operator, so a condition of about 500 terms or 500
nested parentheses raised RecursionError. That includes `true or ...`,
which the former engine returned after its first operand, and the
validation of a bare condition of that length, which raised instead of
reporting the missing braces.
Build the AST with Transformer_NonRecursive and flatten each and/or
chain into one node, as filter chains already are. Evaluation loops over
the operands and stops at the first one that decides the result;
validation visits all of them. Chains and parentheses no longer depend
on the recursion limit (tested to 5,000). `not` chains, comparison
chains and nested lists keep the former engine's limit of about 1,000
levels.
Assisted-by: Pi Coding Agent (model: claude-opus-5.5, autonomous)1 parent a9fe9f7 commit c5b3bb3
3 files changed
Lines changed: 73 additions & 26 deletions
File tree
- src/specify_cli/workflows/expressions
- tests
- unit
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| |||
185 | 185 | | |
186 | 186 | | |
187 | 187 | | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
194 | 197 | | |
195 | 198 | | |
196 | 199 | | |
| |||
227 | 230 | | |
228 | 231 | | |
229 | 232 | | |
230 | | - | |
231 | | - | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
232 | 238 | | |
233 | | - | |
234 | | - | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
235 | 242 | | |
236 | 243 | | |
237 | 244 | | |
| |||
433 | 440 | | |
434 | 441 | | |
435 | 442 | | |
436 | | - | |
437 | | - | |
438 | | - | |
439 | | - | |
440 | | - | |
441 | | - | |
442 | | - | |
443 | | - | |
444 | | - | |
445 | | - | |
446 | | - | |
447 | | - | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
448 | 453 | | |
449 | 454 | | |
450 | 455 | | |
| |||
521 | 526 | | |
522 | 527 | | |
523 | 528 | | |
524 | | - | |
| 529 | + | |
525 | 530 | | |
526 | 531 | | |
527 | 532 | | |
| |||
544 | 549 | | |
545 | 550 | | |
546 | 551 | | |
547 | | - | |
548 | | - | |
| 552 | + | |
| 553 | + | |
549 | 554 | | |
550 | 555 | | |
551 | 556 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
416 | 416 | | |
417 | 417 | | |
418 | 418 | | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
419 | 451 | | |
420 | 452 | | |
421 | 453 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1007 | 1007 | | |
1008 | 1008 | | |
1009 | 1009 | | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
1010 | 1020 | | |
1011 | 1021 | | |
1012 | 1022 | | |
| |||
0 commit comments