pullapprove 5.6.2__tar.gz → 5.6.3__tar.gz

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 (61) hide show
  1. {pullapprove-5.6.2 → pullapprove-5.6.3}/.coverage +0 -0
  2. {pullapprove-5.6.2 → pullapprove-5.6.3}/PKG-INFO +1 -1
  3. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/class_index.html +8 -8
  4. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/function_index.html +26 -26
  5. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/index.html +8 -8
  6. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/status.json +1 -1
  7. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_config_py.html +104 -98
  8. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_diff_py.html +2 -2
  9. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_matches_py.html +2 -2
  10. {pullapprove-5.6.2 → pullapprove-5.6.3}/pyproject.toml +1 -1
  11. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/config.py +7 -1
  12. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/test_config_aliases.py +47 -0
  13. {pullapprove-5.6.2 → pullapprove-5.6.3}/uv.lock +1 -1
  14. {pullapprove-5.6.2 → pullapprove-5.6.3}/.gitignore +0 -0
  15. {pullapprove-5.6.2 → pullapprove-5.6.3}/AGENTS.md +0 -0
  16. {pullapprove-5.6.2 → pullapprove-5.6.3}/README.md +0 -0
  17. {pullapprove-5.6.2 → pullapprove-5.6.3}/extra.md +0 -0
  18. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/.gitignore +0 -0
  19. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/coverage_html_cb_4c2177c4.js +0 -0
  20. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/coverage_html_cb_6fb7b396.js +0 -0
  21. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/coverage_html_cb_dd2e7eb5.js +0 -0
  22. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/favicon_32_cb_58284776.png +0 -0
  23. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/favicon_32_cb_c827f16f.png +0 -0
  24. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
  25. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  26. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/style_cb_14929a1c.css +0 -0
  27. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/style_cb_4667309f.css +0 -0
  28. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/style_cb_8e611ae1.css +0 -0
  29. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_1d9be94397a65771___init___py.html +0 -0
  30. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_1d9be94397a65771_shared_py.html +0 -0
  31. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e___init___py.html +0 -0
  32. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_checklists_py.html +0 -0
  33. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_cli_py.html +0 -0
  34. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_confirmation_py.html +0 -0
  35. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_docs_py.html +0 -0
  36. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_exceptions_py.html +0 -0
  37. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_forms_py.html +0 -0
  38. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_git_py.html +0 -0
  39. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_migrations_py.html +0 -0
  40. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_printer_py.html +0 -0
  41. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_pullrequests_py.html +0 -0
  42. {pullapprove-5.6.2 → pullapprove-5.6.3}/htmlcov/z_8111577e4327d43e_results_migrations_py.html +0 -0
  43. {pullapprove-5.6.2 → pullapprove-5.6.3}/scripts/check-unreleased +0 -0
  44. {pullapprove-5.6.2 → pullapprove-5.6.3}/scripts/release +0 -0
  45. {pullapprove-5.6.2 → pullapprove-5.6.3}/scripts/test +0 -0
  46. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/__init__.py +0 -0
  47. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/checklists.py +0 -0
  48. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/cli.py +0 -0
  49. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/diff.py +0 -0
  50. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/exceptions.py +0 -0
  51. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/git.py +0 -0
  52. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/matches.py +0 -0
  53. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/printer.py +0 -0
  54. {pullapprove-5.6.2 → pullapprove-5.6.3}/src/pullapprove/results_migrations.py +0 -0
  55. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/config.toml +0 -0
  56. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/snapshots/config__angular_diff__angular.json +0 -0
  57. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/snapshots/forms__generate_markdown__markdown.txt +0 -0
  58. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/test.diff +0 -0
  59. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/test_code.py +0 -0
  60. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/test_config.py +0 -0
  61. {pullapprove-5.6.2 → pullapprove-5.6.3}/tests/test_diff.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pullapprove
3
- Version: 5.6.2
3
+ Version: 5.6.3
4
4
  Summary: CLI for PullApprove5
5
5
  Project-URL: Homepage, https://www.pullapprove.com?ref=pypi
6
6
  Project-URL: Documentation, https://5.pullapprove.com/docs/?ref=pypi
@@ -55,7 +55,7 @@
55
55
  </h2>
56
56
  <p class="text">
57
57
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
58
- created at 2026-06-09 10:11 -0500
58
+ created at 2026-06-24 09:40 -0500
59
59
  </p>
60
60
  </div>
61
61
  </header>
@@ -188,11 +188,11 @@
188
188
  <td class="name"><a href="z_8111577e4327d43e_config_py.html#t478">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
189
189
  <td class="name"><a href="z_8111577e4327d43e_config_py.html#t478"><data value='ConfigModels'>ConfigModels</data></a></td>
190
190
  <td class="spacer">&nbsp;</td>
191
- <td>48</td>
192
- <td>14</td>
191
+ <td>49</td>
192
+ <td>10</td>
193
193
  <td>0</td>
194
194
  <td class="spacer">&nbsp;</td>
195
- <td data-ratio="34 48">71%</td>
195
+ <td data-ratio="39 49">80%</td>
196
196
  </tr>
197
197
  <tr class="region">
198
198
  <td class="name"><a href="z_8111577e4327d43e_config_py.html">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
@@ -370,11 +370,11 @@
370
370
  <td class="name">Total</td>
371
371
  <td class="name">&nbsp;</td>
372
372
  <td class="spacer">&nbsp;</td>
373
- <td>954</td>
374
- <td>429</td>
373
+ <td>955</td>
374
+ <td>425</td>
375
375
  <td>2</td>
376
376
  <td class="spacer">&nbsp;</td>
377
- <td data-ratio="525 954">55%</td>
377
+ <td data-ratio="530 955">55%</td>
378
378
  </tr>
379
379
  </tfoot>
380
380
  </table>
@@ -386,7 +386,7 @@
386
386
  <div class="content">
387
387
  <p>
388
388
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
389
- created at 2026-06-09 10:11 -0500
389
+ created at 2026-06-24 09:40 -0500
390
390
  </p>
391
391
  </div>
392
392
  <aside class="hidden">
@@ -55,7 +55,7 @@
55
55
  </h2>
56
56
  <p class="text">
57
57
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
58
- created at 2026-06-09 10:11 -0500
58
+ created at 2026-06-24 09:40 -0500
59
59
  </p>
60
60
  </div>
61
61
  </header>
@@ -448,15 +448,15 @@
448
448
  <td class="name"><a href="z_8111577e4327d43e_config_py.html#t517">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
449
449
  <td class="name"><a href="z_8111577e4327d43e_config_py.html#t517"><data value='get_default_large_scale_change'>ConfigModels.get_default_large_scale_change</data></a></td>
450
450
  <td class="spacer">&nbsp;</td>
451
- <td>5</td>
452
- <td>5</td>
451
+ <td>6</td>
452
+ <td>1</td>
453
453
  <td>0</td>
454
454
  <td class="spacer">&nbsp;</td>
455
- <td data-ratio="0 5">0%</td>
455
+ <td data-ratio="5 6">83%</td>
456
456
  </tr>
457
457
  <tr class="region">
458
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t527">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
459
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t527"><data value='bool__'>ConfigModels.__bool__</data></a></td>
458
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t533">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
459
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t533"><data value='bool__'>ConfigModels.__bool__</data></a></td>
460
460
  <td class="spacer">&nbsp;</td>
461
461
  <td>1</td>
462
462
  <td>0</td>
@@ -465,8 +465,8 @@
465
465
  <td data-ratio="1 1">100%</td>
466
466
  </tr>
467
467
  <tr class="region">
468
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t530">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
469
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t530"><data value='getitem__'>ConfigModels.__getitem__</data></a></td>
468
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t536">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
469
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t536"><data value='getitem__'>ConfigModels.__getitem__</data></a></td>
470
470
  <td class="spacer">&nbsp;</td>
471
471
  <td>1</td>
472
472
  <td>0</td>
@@ -475,8 +475,8 @@
475
475
  <td data-ratio="1 1">100%</td>
476
476
  </tr>
477
477
  <tr class="region">
478
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t533">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
479
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t533"><data value='contains__'>ConfigModels.__contains__</data></a></td>
478
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t539">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
479
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t539"><data value='contains__'>ConfigModels.__contains__</data></a></td>
480
480
  <td class="spacer">&nbsp;</td>
481
481
  <td>1</td>
482
482
  <td>0</td>
@@ -485,8 +485,8 @@
485
485
  <td data-ratio="1 1">100%</td>
486
486
  </tr>
487
487
  <tr class="region">
488
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t536">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
489
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t536"><data value='len__'>ConfigModels.__len__</data></a></td>
488
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t542">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
489
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t542"><data value='len__'>ConfigModels.__len__</data></a></td>
490
490
  <td class="spacer">&nbsp;</td>
491
491
  <td>1</td>
492
492
  <td>1</td>
@@ -495,8 +495,8 @@
495
495
  <td data-ratio="0 1">0%</td>
496
496
  </tr>
497
497
  <tr class="region">
498
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t539">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
499
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t539"><data value='compile_closest_config'>ConfigModels.compile_closest_config</data></a></td>
498
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t545">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
499
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t545"><data value='compile_closest_config'>ConfigModels.compile_closest_config</data></a></td>
500
500
  <td class="spacer">&nbsp;</td>
501
501
  <td>9</td>
502
502
  <td>2</td>
@@ -505,8 +505,8 @@
505
505
  <td data-ratio="7 9">78%</td>
506
506
  </tr>
507
507
  <tr class="region">
508
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t557">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
509
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t557"><data value='iter_compiled_configs'>ConfigModels.iter_compiled_configs</data></a></td>
508
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t563">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
509
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t563"><data value='iter_compiled_configs'>ConfigModels.iter_compiled_configs</data></a></td>
510
510
  <td class="spacer">&nbsp;</td>
511
511
  <td>4</td>
512
512
  <td>4</td>
@@ -515,8 +515,8 @@
515
515
  <td data-ratio="0 4">0%</td>
516
516
  </tr>
517
517
  <tr class="region">
518
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t565">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
519
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t565"><data value='num_scopes'>ConfigModels.num_scopes</data></a></td>
518
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t571">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
519
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t571"><data value='num_scopes'>ConfigModels.num_scopes</data></a></td>
520
520
  <td class="spacer">&nbsp;</td>
521
521
  <td>1</td>
522
522
  <td>1</td>
@@ -525,8 +525,8 @@
525
525
  <td data-ratio="0 1">0%</td>
526
526
  </tr>
527
527
  <tr class="region">
528
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t571">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
529
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t571"><data value='num_reviewers'>ConfigModels.num_reviewers</data></a></td>
528
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t577">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
529
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t577"><data value='num_reviewers'>ConfigModels.num_reviewers</data></a></td>
530
530
  <td class="spacer">&nbsp;</td>
531
531
  <td>1</td>
532
532
  <td>1</td>
@@ -535,8 +535,8 @@
535
535
  <td data-ratio="0 1">0%</td>
536
536
  </tr>
537
537
  <tr class="region">
538
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t581">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
539
- <td class="name"><a href="z_8111577e4327d43e_config_py.html#t581"><data value='filter_for_pullrequest'>ConfigModels.filter_for_pullrequest</data></a></td>
538
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t587">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
539
+ <td class="name"><a href="z_8111577e4327d43e_config_py.html#t587"><data value='filter_for_pullrequest'>ConfigModels.filter_for_pullrequest</data></a></td>
540
540
  <td class="spacer">&nbsp;</td>
541
541
  <td>13</td>
542
542
  <td>0</td>
@@ -1110,11 +1110,11 @@
1110
1110
  <td class="name">Total</td>
1111
1111
  <td class="name">&nbsp;</td>
1112
1112
  <td class="spacer">&nbsp;</td>
1113
- <td>954</td>
1114
- <td>429</td>
1113
+ <td>955</td>
1114
+ <td>425</td>
1115
1115
  <td>2</td>
1116
1116
  <td class="spacer">&nbsp;</td>
1117
- <td data-ratio="525 954">55%</td>
1117
+ <td data-ratio="530 955">55%</td>
1118
1118
  </tr>
1119
1119
  </tfoot>
1120
1120
  </table>
@@ -1126,7 +1126,7 @@
1126
1126
  <div class="content">
1127
1127
  <p>
1128
1128
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
1129
- created at 2026-06-09 10:11 -0500
1129
+ created at 2026-06-24 09:40 -0500
1130
1130
  </p>
1131
1131
  </div>
1132
1132
  <aside class="hidden">
@@ -54,7 +54,7 @@
54
54
  </h2>
55
55
  <p class="text">
56
56
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
57
- created at 2026-06-09 10:11 -0500
57
+ created at 2026-06-24 09:40 -0500
58
58
  </p>
59
59
  </div>
60
60
  </header>
@@ -102,11 +102,11 @@
102
102
  <tr class="region">
103
103
  <td class="name"><a href="z_8111577e4327d43e_config_py.html">src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</a></td>
104
104
  <td class="spacer">&nbsp;</td>
105
- <td>318</td>
106
- <td>38</td>
105
+ <td>319</td>
106
+ <td>34</td>
107
107
  <td>0</td>
108
108
  <td class="spacer">&nbsp;</td>
109
- <td data-ratio="280 318">88%</td>
109
+ <td data-ratio="285 319">89%</td>
110
110
  </tr>
111
111
  <tr class="region">
112
112
  <td class="name"><a href="z_8111577e4327d43e_diff_py.html">src<span class="sep">/</span>pullapprove<span class="sep">/</span>diff.py</a></td>
@@ -167,11 +167,11 @@
167
167
  <tr class="total">
168
168
  <td class="name">Total</td>
169
169
  <td class="spacer">&nbsp;</td>
170
- <td>954</td>
171
- <td>429</td>
170
+ <td>955</td>
171
+ <td>425</td>
172
172
  <td>2</td>
173
173
  <td class="spacer">&nbsp;</td>
174
- <td data-ratio="525 954">55%</td>
174
+ <td data-ratio="530 955">55%</td>
175
175
  </tr>
176
176
  </tfoot>
177
177
  </table>
@@ -183,7 +183,7 @@
183
183
  <div class="content">
184
184
  <p>
185
185
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
186
- created at 2026-06-09 10:11 -0500
186
+ created at 2026-06-24 09:40 -0500
187
187
  </p>
188
188
  </div>
189
189
  <aside class="hidden">
@@ -1 +1 @@
1
- {"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.14.1","globals":"b3c6600ddc349cd3171669b15253b692","files":{"z_8111577e4327d43e___init___py":{"hash":"22a55c70b987e14d3f30c99eef952833","index":{"url":"z_8111577e4327d43e___init___py.html","file":"src/pullapprove/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_checklists_py":{"hash":"a2b164177ea9aa0ae5d456bfa3c42054","index":{"url":"z_8111577e4327d43e_checklists_py.html","file":"src/pullapprove/checklists.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":13,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_cli_py":{"hash":"13dce9af8462b05831b4d07b2d054fe6","index":{"url":"z_8111577e4327d43e_cli_py.html","file":"src/pullapprove/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":150,"n_excluded":0,"n_missing":150,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_config_py":{"hash":"3964f0a8dee6e4c6125d21af8ae61813","index":{"url":"z_8111577e4327d43e_config_py.html","file":"src/pullapprove/config.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":318,"n_excluded":0,"n_missing":38,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_diff_py":{"hash":"860349795ea24cfc52c21964a4b8acb3","index":{"url":"z_8111577e4327d43e_diff_py.html","file":"src/pullapprove/diff.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":87,"n_excluded":0,"n_missing":7,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_exceptions_py":{"hash":"01a8f05255c75fb1d80496b68a25e9d7","index":{"url":"z_8111577e4327d43e_exceptions_py.html","file":"src/pullapprove/exceptions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":3,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_git_py":{"hash":"eefe98f6702be18d7b1709fd27515cdf","index":{"url":"z_8111577e4327d43e_git_py.html","file":"src/pullapprove/git.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":26,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_matches_py":{"hash":"843a28030426eb8a2ea5ed4b0ca43735","index":{"url":"z_8111577e4327d43e_matches_py.html","file":"src/pullapprove/matches.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":172,"n_excluded":0,"n_missing":34,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_printer_py":{"hash":"7f32306e04370770236e93c8771db341","index":{"url":"z_8111577e4327d43e_printer_py.html","file":"src/pullapprove/printer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":140,"n_excluded":2,"n_missing":140,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_results_migrations_py":{"hash":"cec11f94babaa6b05707f2be2cdb1252","index":{"url":"z_8111577e4327d43e_results_migrations_py.html","file":"src/pullapprove/results_migrations.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":20,"n_excluded":0,"n_missing":20,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
1
+ {"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.14.1","globals":"b3c6600ddc349cd3171669b15253b692","files":{"z_8111577e4327d43e___init___py":{"hash":"22a55c70b987e14d3f30c99eef952833","index":{"url":"z_8111577e4327d43e___init___py.html","file":"src/pullapprove/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_checklists_py":{"hash":"a2b164177ea9aa0ae5d456bfa3c42054","index":{"url":"z_8111577e4327d43e_checklists_py.html","file":"src/pullapprove/checklists.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":13,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_cli_py":{"hash":"13dce9af8462b05831b4d07b2d054fe6","index":{"url":"z_8111577e4327d43e_cli_py.html","file":"src/pullapprove/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":150,"n_excluded":0,"n_missing":150,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_config_py":{"hash":"2b6b0a4ac758784bc8d92744188dd740","index":{"url":"z_8111577e4327d43e_config_py.html","file":"src/pullapprove/config.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":319,"n_excluded":0,"n_missing":34,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_diff_py":{"hash":"860349795ea24cfc52c21964a4b8acb3","index":{"url":"z_8111577e4327d43e_diff_py.html","file":"src/pullapprove/diff.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":87,"n_excluded":0,"n_missing":7,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_exceptions_py":{"hash":"01a8f05255c75fb1d80496b68a25e9d7","index":{"url":"z_8111577e4327d43e_exceptions_py.html","file":"src/pullapprove/exceptions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":3,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_git_py":{"hash":"eefe98f6702be18d7b1709fd27515cdf","index":{"url":"z_8111577e4327d43e_git_py.html","file":"src/pullapprove/git.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":26,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_matches_py":{"hash":"843a28030426eb8a2ea5ed4b0ca43735","index":{"url":"z_8111577e4327d43e_matches_py.html","file":"src/pullapprove/matches.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":172,"n_excluded":0,"n_missing":34,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_printer_py":{"hash":"7f32306e04370770236e93c8771db341","index":{"url":"z_8111577e4327d43e_printer_py.html","file":"src/pullapprove/printer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":140,"n_excluded":2,"n_missing":140,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8111577e4327d43e_results_migrations_py":{"hash":"cec11f94babaa6b05707f2be2cdb1252","index":{"url":"z_8111577e4327d43e_results_migrations_py.html","file":"src/pullapprove/results_migrations.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":20,"n_excluded":0,"n_missing":20,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
@@ -2,7 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <title>Coverage for src/pullapprove/config.py: 88%</title>
5
+ <title>Coverage for src/pullapprove/config.py: 89%</title>
6
6
  <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
7
  <link rel="stylesheet" href="style_cb_4667309f.css" type="text/css">
8
8
  <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
@@ -12,7 +12,7 @@
12
12
  <div class="content">
13
13
  <h1>
14
14
  <span class="text">Coverage for </span><b>src<span class="sep">/</span>pullapprove<span class="sep">/</span>config.py</b>:
15
- <span class="pc_cov">88%</span>
15
+ <span class="pc_cov">89%</span>
16
16
  </h1>
17
17
  <aside id="help_panel_wrapper">
18
18
  <input id="help_panel_state" type="checkbox">
@@ -54,9 +54,9 @@
54
54
  </div>
55
55
  </aside>
56
56
  <h2>
57
- <span class="text">318 statements &nbsp;</span>
58
- <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">280<span class="text"> run</span></button>
59
- <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">38<span class="text"> missing</span></button>
57
+ <span class="text">319 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">285<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">34<span class="text"> missing</span></button>
60
60
  <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
61
  </h2>
62
62
  <p class="text">
@@ -65,7 +65,7 @@
65
65
  <a id="nextFileLink" class="nav" href="z_8111577e4327d43e_diff_py.html">&#xbb; next</a>
66
66
  &nbsp; &nbsp; &nbsp;
67
67
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
68
- created at 2026-06-08 22:13 -0500
68
+ created at 2026-06-24 09:37 -0500
69
69
  </p>
70
70
  <aside class="hidden">
71
71
  <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -598,107 +598,113 @@
598
598
  <p class="pln"><span class="n"><a id="t516" href="#t516">516</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
599
599
  <p class="run"><span class="n"><a id="t517" href="#t517">517</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_default_large_scale_change</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">LargeScaleChangeModel</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
600
600
  <p class="pln"><span class="n"><a id="t518" href="#t518">518</a></span><span class="t"> <span class="str">"""Get the root config, which is the first one found in the list"""</span>&nbsp;</span><span class="r"></span></p>
601
- <p class="mis show_mis"><span class="n"><a id="t519" href="#t519">519</a></span><span class="t"> <span class="nam">primary_config</span> <span class="op">=</span> <span class="nam">CONFIG_FILENAME</span>&nbsp;</span><span class="r"></span></p>
601
+ <p class="run"><span class="n"><a id="t519" href="#t519">519</a></span><span class="t"> <span class="nam">primary_config</span> <span class="op">=</span> <span class="nam">CONFIG_FILENAME</span>&nbsp;</span><span class="r"></span></p>
602
602
  <p class="pln"><span class="n"><a id="t520" href="#t520">520</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
603
- <p class="mis show_mis"><span class="n"><a id="t521" href="#t521">521</a></span><span class="t"> <span class="key">if</span> <span class="nam">primary_config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
604
- <p class="mis show_mis"><span class="n"><a id="t522" href="#t522">522</a></span><span class="t"> <span class="key">if</span> <span class="nam">lsc</span> <span class="op">:=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">primary_config</span><span class="op">]</span><span class="op">.</span><span class="nam">large_scale_change</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
605
- <p class="mis show_mis"><span class="n"><a id="t523" href="#t523">523</a></span><span class="t"> <span class="key">return</span> <span class="nam">lsc</span>&nbsp;</span><span class="r"></span></p>
606
- <p class="pln"><span class="n"><a id="t524" href="#t524">524</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
607
- <p class="mis show_mis"><span class="n"><a id="t525" href="#t525">525</a></span><span class="t"> <span class="key">return</span> <span class="nam">LargeScaleChangeModel</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
608
- <p class="pln"><span class="n"><a id="t526" href="#t526">526</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
609
- <p class="run"><span class="n"><a id="t527" href="#t527">527</a></span><span class="t"> <span class="key">def</span> <span class="nam">__bool__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
610
- <p class="run"><span class="n"><a id="t528" href="#t528">528</a></span><span class="t"> <span class="key">return</span> <span class="nam">bool</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
611
- <p class="pln"><span class="n"><a id="t529" href="#t529">529</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
612
- <p class="run"><span class="n"><a id="t530" href="#t530">530</a></span><span class="t"> <span class="key">def</span> <span class="nam">__getitem__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModel</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
613
- <p class="run"><span class="n"><a id="t531" href="#t531">531</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
603
+ <p class="run"><span class="n"><a id="t521" href="#t521">521</a></span><span class="t"> <span class="key">if</span> <span class="nam">primary_config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
604
+ <p class="pln"><span class="n"><a id="t522" href="#t522">522</a></span><span class="t"> <span class="com"># Compile first so the large-scale-change section gets the same</span>&nbsp;</span><span class="r"></span></p>
605
+ <p class="pln"><span class="n"><a id="t523" href="#t523">523</a></span><span class="t"> <span class="com"># extends-merging and alias expansion as everything else. Without</span>&nbsp;</span><span class="r"></span></p>
606
+ <p class="pln"><span class="n"><a id="t524" href="#t524">524</a></span><span class="t"> <span class="com"># this, reviewers like ["$backend"] are matched literally.</span>&nbsp;</span><span class="r"></span></p>
607
+ <p class="run"><span class="n"><a id="t525" href="#t525">525</a></span><span class="t"> <span class="nam">compiled</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">primary_config</span><span class="op">]</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
608
+ <p class="run run2"><span class="n"><a id="t526" href="#t526">526</a></span><span class="t"> <span class="nam">Path</span><span class="op">(</span><span class="nam">primary_config</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
609
+ <p class="run run2"><span class="n"><a id="t527" href="#t527">527</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
610
+ <p class="run"><span class="n"><a id="t528" href="#t528">528</a></span><span class="t"> <span class="key">if</span> <span class="nam">lsc</span> <span class="op">:=</span> <span class="nam">compiled</span><span class="op">.</span><span class="nam">large_scale_change</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
611
+ <p class="run"><span class="n"><a id="t529" href="#t529">529</a></span><span class="t"> <span class="key">return</span> <span class="nam">lsc</span>&nbsp;</span><span class="r"></span></p>
612
+ <p class="pln"><span class="n"><a id="t530" href="#t530">530</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
613
+ <p class="mis show_mis"><span class="n"><a id="t531" href="#t531">531</a></span><span class="t"> <span class="key">return</span> <span class="nam">LargeScaleChangeModel</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
614
614
  <p class="pln"><span class="n"><a id="t532" href="#t532">532</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
615
- <p class="run"><span class="n"><a id="t533" href="#t533">533</a></span><span class="t"> <span class="key">def</span> <span class="nam">__contains__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
616
- <p class="run"><span class="n"><a id="t534" href="#t534">534</a></span><span class="t"> <span class="key">return</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span>&nbsp;</span><span class="r"></span></p>
615
+ <p class="run"><span class="n"><a id="t533" href="#t533">533</a></span><span class="t"> <span class="key">def</span> <span class="nam">__bool__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
616
+ <p class="run"><span class="n"><a id="t534" href="#t534">534</a></span><span class="t"> <span class="key">return</span> <span class="nam">bool</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
617
617
  <p class="pln"><span class="n"><a id="t535" href="#t535">535</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
618
- <p class="run"><span class="n"><a id="t536" href="#t536">536</a></span><span class="t"> <span class="key">def</span> <span class="nam">__len__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
619
- <p class="mis show_mis"><span class="n"><a id="t537" href="#t537">537</a></span><span class="t"> <span class="key">return</span> <span class="nam">len</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
618
+ <p class="run"><span class="n"><a id="t536" href="#t536">536</a></span><span class="t"> <span class="key">def</span> <span class="nam">__getitem__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModel</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
619
+ <p class="run"><span class="n"><a id="t537" href="#t537">537</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
620
620
  <p class="pln"><span class="n"><a id="t538" href="#t538">538</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
621
- <p class="run"><span class="n"><a id="t539" href="#t539">539</a></span><span class="t"> <span class="key">def</span> <span class="nam">compile_closest_config</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file_path</span><span class="op">:</span> <span class="nam">Path</span><span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModel</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
622
- <p class="pln"><span class="n"><a id="t540" href="#t540">540</a></span><span class="t"> <span class="str">"""Find the closest config file to this file"""</span>&nbsp;</span><span class="r"></span></p>
623
- <p class="run"><span class="n"><a id="t541" href="#t541">541</a></span><span class="t"> <span class="key">for</span> <span class="nam">parent</span> <span class="key">in</span> <span class="nam">file_path</span><span class="op">.</span><span class="nam">parents</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
624
- <p class="run"><span class="n"><a id="t542" href="#t542">542</a></span><span class="t"> <span class="nam">parent_config_path</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">parent</span> <span class="op">/</span> <span class="nam">CONFIG_FILENAME</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
625
- <p class="pln"><span class="n"><a id="t543" href="#t543">543</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
626
- <p class="run"><span class="n"><a id="t544" href="#t544">544</a></span><span class="t"> <span class="key">if</span> <span class="nam">parent_config_path</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
627
- <p class="run"><span class="n"><a id="t545" href="#t545">545</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">parent_config_path</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
628
- <p class="pln"><span class="n"><a id="t546" href="#t546">546</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
629
- <p class="run"><span class="n"><a id="t547" href="#t547">547</a></span><span class="t"> <span class="key">if</span> <span class="nam">config</span><span class="op">.</span><span class="nam">template</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
630
- <p class="pln"><span class="n"><a id="t548" href="#t548">548</a></span><span class="t"> <span class="com"># Skip templates</span>&nbsp;</span><span class="r"></span></p>
631
- <p class="mis show_mis"><span class="n"><a id="t549" href="#t549">549</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
632
- <p class="pln"><span class="n"><a id="t550" href="#t550">550</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
633
- <p class="run"><span class="n"><a id="t551" href="#t551">551</a></span><span class="t"> <span class="nam">compiled</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">parent_config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
621
+ <p class="run"><span class="n"><a id="t539" href="#t539">539</a></span><span class="t"> <span class="key">def</span> <span class="nam">__contains__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
622
+ <p class="run"><span class="n"><a id="t540" href="#t540">540</a></span><span class="t"> <span class="key">return</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span>&nbsp;</span><span class="r"></span></p>
623
+ <p class="pln"><span class="n"><a id="t541" href="#t541">541</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
624
+ <p class="run"><span class="n"><a id="t542" href="#t542">542</a></span><span class="t"> <span class="key">def</span> <span class="nam">__len__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
625
+ <p class="mis show_mis"><span class="n"><a id="t543" href="#t543">543</a></span><span class="t"> <span class="key">return</span> <span class="nam">len</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
626
+ <p class="pln"><span class="n"><a id="t544" href="#t544">544</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
627
+ <p class="run"><span class="n"><a id="t545" href="#t545">545</a></span><span class="t"> <span class="key">def</span> <span class="nam">compile_closest_config</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">file_path</span><span class="op">:</span> <span class="nam">Path</span><span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModel</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
628
+ <p class="pln"><span class="n"><a id="t546" href="#t546">546</a></span><span class="t"> <span class="str">"""Find the closest config file to this file"""</span>&nbsp;</span><span class="r"></span></p>
629
+ <p class="run"><span class="n"><a id="t547" href="#t547">547</a></span><span class="t"> <span class="key">for</span> <span class="nam">parent</span> <span class="key">in</span> <span class="nam">file_path</span><span class="op">.</span><span class="nam">parents</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
630
+ <p class="run"><span class="n"><a id="t548" href="#t548">548</a></span><span class="t"> <span class="nam">parent_config_path</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">parent</span> <span class="op">/</span> <span class="nam">CONFIG_FILENAME</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
631
+ <p class="pln"><span class="n"><a id="t549" href="#t549">549</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
632
+ <p class="run"><span class="n"><a id="t550" href="#t550">550</a></span><span class="t"> <span class="key">if</span> <span class="nam">parent_config_path</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
633
+ <p class="run"><span class="n"><a id="t551" href="#t551">551</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">[</span><span class="nam">parent_config_path</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
634
634
  <p class="pln"><span class="n"><a id="t552" href="#t552">552</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
635
- <p class="run"><span class="n"><a id="t553" href="#t553">553</a></span><span class="t"> <span class="key">return</span> <span class="nam">compiled</span>&nbsp;</span><span class="r"></span></p>
636
- <p class="pln"><span class="n"><a id="t554" href="#t554">554</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
637
- <p class="mis show_mis"><span class="n"><a id="t555" href="#t555">555</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">No config found for </span><span class="op">{</span><span class="nam">file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
635
+ <p class="run"><span class="n"><a id="t553" href="#t553">553</a></span><span class="t"> <span class="key">if</span> <span class="nam">config</span><span class="op">.</span><span class="nam">template</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
636
+ <p class="pln"><span class="n"><a id="t554" href="#t554">554</a></span><span class="t"> <span class="com"># Skip templates</span>&nbsp;</span><span class="r"></span></p>
637
+ <p class="mis show_mis"><span class="n"><a id="t555" href="#t555">555</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
638
638
  <p class="pln"><span class="n"><a id="t556" href="#t556">556</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
639
- <p class="run"><span class="n"><a id="t557" href="#t557">557</a></span><span class="t"> <span class="key">def</span> <span class="nam">iter_compiled_configs</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Generator</span><span class="op">[</span><span class="nam">tuple</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">ConfigModel</span><span class="op">]</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
640
- <p class="mis show_mis"><span class="n"><a id="t558" href="#t558">558</a></span><span class="t"> <span class="key">for</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
641
- <p class="mis show_mis"><span class="n"><a id="t559" href="#t559">559</a></span><span class="t"> <span class="key">if</span> <span class="nam">config</span><span class="op">.</span><span class="nam">template</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
642
- <p class="pln"><span class="n"><a id="t560" href="#t560">560</a></span><span class="t"> <span class="com"># Skip templates</span>&nbsp;</span><span class="r"></span></p>
643
- <p class="mis show_mis"><span class="n"><a id="t561" href="#t561">561</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
639
+ <p class="run"><span class="n"><a id="t557" href="#t557">557</a></span><span class="t"> <span class="nam">compiled</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">parent_config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
640
+ <p class="pln"><span class="n"><a id="t558" href="#t558">558</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
641
+ <p class="run"><span class="n"><a id="t559" href="#t559">559</a></span><span class="t"> <span class="key">return</span> <span class="nam">compiled</span>&nbsp;</span><span class="r"></span></p>
642
+ <p class="pln"><span class="n"><a id="t560" href="#t560">560</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
643
+ <p class="mis show_mis"><span class="n"><a id="t561" href="#t561">561</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">No config found for </span><span class="op">{</span><span class="nam">file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
644
644
  <p class="pln"><span class="n"><a id="t562" href="#t562">562</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
645
- <p class="mis show_mis"><span class="n"><a id="t563" href="#t563">563</a></span><span class="t"> <span class="key">yield</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
646
- <p class="pln"><span class="n"><a id="t564" href="#t564">564</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
647
- <p class="run"><span class="n"><a id="t565" href="#t565">565</a></span><span class="t"> <span class="key">def</span> <span class="nam">num_scopes</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
648
- <p class="pln"><span class="n"><a id="t566" href="#t566">566</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
649
- <p class="pln"><span class="n"><a id="t567" href="#t567">567</a></span><span class="t"><span class="str"> Count the total number of scopes across all configs.</span>&nbsp;</span><span class="r"></span></p>
650
- <p class="pln"><span class="n"><a id="t568" href="#t568">568</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
651
- <p class="mis show_mis"><span class="n"><a id="t569" href="#t569">569</a></span><span class="t"> <span class="key">return</span> <span class="nam">sum</span><span class="op">(</span><span class="nam">len</span><span class="op">(</span><span class="nam">config</span><span class="op">.</span><span class="nam">scopes</span><span class="op">)</span> <span class="key">for</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">values</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
645
+ <p class="run"><span class="n"><a id="t563" href="#t563">563</a></span><span class="t"> <span class="key">def</span> <span class="nam">iter_compiled_configs</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Generator</span><span class="op">[</span><span class="nam">tuple</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">ConfigModel</span><span class="op">]</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
646
+ <p class="mis show_mis"><span class="n"><a id="t564" href="#t564">564</a></span><span class="t"> <span class="key">for</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
647
+ <p class="mis show_mis"><span class="n"><a id="t565" href="#t565">565</a></span><span class="t"> <span class="key">if</span> <span class="nam">config</span><span class="op">.</span><span class="nam">template</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
648
+ <p class="pln"><span class="n"><a id="t566" href="#t566">566</a></span><span class="t"> <span class="com"># Skip templates</span>&nbsp;</span><span class="r"></span></p>
649
+ <p class="mis show_mis"><span class="n"><a id="t567" href="#t567">567</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
650
+ <p class="pln"><span class="n"><a id="t568" href="#t568">568</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
651
+ <p class="mis show_mis"><span class="n"><a id="t569" href="#t569">569</a></span><span class="t"> <span class="key">yield</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
652
652
  <p class="pln"><span class="n"><a id="t570" href="#t570">570</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
653
- <p class="run"><span class="n"><a id="t571" href="#t571">571</a></span><span class="t"> <span class="key">def</span> <span class="nam">num_reviewers</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
653
+ <p class="run"><span class="n"><a id="t571" href="#t571">571</a></span><span class="t"> <span class="key">def</span> <span class="nam">num_scopes</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
654
654
  <p class="pln"><span class="n"><a id="t572" href="#t572">572</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
655
- <p class="pln"><span class="n"><a id="t573" href="#t573">573</a></span><span class="t"><span class="str"> Count the total number of reviewers across all configs.</span>&nbsp;</span><span class="r"></span></p>
655
+ <p class="pln"><span class="n"><a id="t573" href="#t573">573</a></span><span class="t"><span class="str"> Count the total number of scopes across all configs.</span>&nbsp;</span><span class="r"></span></p>
656
656
  <p class="pln"><span class="n"><a id="t574" href="#t574">574</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
657
- <p class="mis show_mis"><span class="n"><a id="t575" href="#t575">575</a></span><span class="t"> <span class="key">return</span> <span class="nam">sum</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
658
- <p class="mis mis2 show_mis"><span class="n"><a id="t576" href="#t576">576</a></span><span class="t"> <span class="nam">len</span><span class="op">(</span><span class="nam">scope</span><span class="op">.</span><span class="nam">reviewers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
659
- <p class="mis mis2 show_mis"><span class="n"><a id="t577" href="#t577">577</a></span><span class="t"> <span class="key">for</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">values</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
660
- <p class="mis mis2 show_mis"><span class="n"><a id="t578" href="#t578">578</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">config</span><span class="op">.</span><span class="nam">scopes</span>&nbsp;</span><span class="r"></span></p>
661
- <p class="mis mis2 show_mis"><span class="n"><a id="t579" href="#t579">579</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
662
- <p class="pln"><span class="n"><a id="t580" href="#t580">580</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
663
- <p class="run"><span class="n"><a id="t581" href="#t581">581</a></span><span class="t"> <span class="key">def</span> <span class="nam">filter_for_pullrequest</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
664
- <p class="run run2"><span class="n"><a id="t582" href="#t582">582</a></span><span class="t"> <span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
665
- <p class="run run2"><span class="n"><a id="t583" href="#t583">583</a></span><span class="t"> <span class="nam">base_branch</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
666
- <p class="run run2"><span class="n"><a id="t584" href="#t584">584</a></span><span class="t"> <span class="nam">head_branch</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
667
- <p class="run run2"><span class="n"><a id="t585" href="#t585">585</a></span><span class="t"> <span class="nam">author_username</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
668
- <p class="run run2"><span class="n"><a id="t586" href="#t586">586</a></span><span class="t"> <span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModels</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
669
- <p class="pln"><span class="n"><a id="t587" href="#t587">587</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
670
- <p class="pln"><span class="n"><a id="t588" href="#t588">588</a></span><span class="t"><span class="str"> Look at all configs (including templates) and filter out</span>&nbsp;</span><span class="r"></span></p>
671
- <p class="pln"><span class="n"><a id="t589" href="#t589">589</a></span><span class="t"><span class="str"> configs and scopes based on branches, authors, etc.</span>&nbsp;</span><span class="r"></span></p>
672
- <p class="pln"><span class="n"><a id="t590" href="#t590">590</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
673
- <p class="run"><span class="n"><a id="t591" href="#t591">591</a></span><span class="t"> <span class="nam">filtered_configs</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
674
- <p class="pln"><span class="n"><a id="t592" href="#t592">592</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
675
- <p class="run"><span class="n"><a id="t593" href="#t593">593</a></span><span class="t"> <span class="key">for</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
676
- <p class="run"><span class="n"><a id="t594" href="#t594">594</a></span><span class="t"> <span class="nam">compiled_config</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
677
- <p class="pln"><span class="n"><a id="t595" href="#t595">595</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
678
- <p class="run"><span class="n"><a id="t596" href="#t596">596</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">compiled_config</span><span class="op">.</span><span class="nam">enabled_for_pullrequest</span><span class="op">(</span><span class="nam">base_branch</span><span class="op">,</span> <span class="nam">head_branch</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
679
- <p class="pln"><span class="n"><a id="t597" href="#t597">597</a></span><span class="t"> <span class="com"># Remove the config from the list</span>&nbsp;</span><span class="r"></span></p>
680
- <p class="run"><span class="n"><a id="t598" href="#t598">598</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
681
- <p class="pln"><span class="n"><a id="t599" href="#t599">599</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
682
- <p class="pln"><span class="n"><a id="t600" href="#t600">600</a></span><span class="t"> <span class="com"># Collect the names of scopes to remove</span>&nbsp;</span><span class="r"></span></p>
683
- <p class="run"><span class="n"><a id="t601" href="#t601">601</a></span><span class="t"> <span class="nam">scopes_to_remove</span> <span class="op">=</span> <span class="nam">set</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
684
- <p class="run"><span class="n"><a id="t602" href="#t602">602</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">compiled_config</span><span class="op">.</span><span class="nam">scopes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
685
- <p class="run"><span class="n"><a id="t603" href="#t603">603</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">scope</span><span class="op">.</span><span class="nam">enabled_for_pullrequest</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
686
- <p class="run run2"><span class="n"><a id="t604" href="#t604">604</a></span><span class="t"> <span class="nam">author_username</span><span class="op">,</span> <span class="nam">base_branch</span><span class="op">,</span> <span class="nam">head_branch</span>&nbsp;</span><span class="r"></span></p>
687
- <p class="run run2"><span class="n"><a id="t605" href="#t605">605</a></span><span class="t"> <span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
688
- <p class="run"><span class="n"><a id="t606" href="#t606">606</a></span><span class="t"> <span class="nam">scopes_to_remove</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">scope</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
689
- <p class="pln"><span class="n"><a id="t607" href="#t607">607</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
690
- <p class="pln"><span class="n"><a id="t608" href="#t608">608</a></span><span class="t"> <span class="com"># Create a filtered copy of the config data</span>&nbsp;</span><span class="r"></span></p>
691
- <p class="run"><span class="n"><a id="t609" href="#t609">609</a></span><span class="t"> <span class="nam">filtered_config_data</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">model_dump</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
692
- <p class="run"><span class="n"><a id="t610" href="#t610">610</a></span><span class="t"> <span class="nam">filtered_config_data</span><span class="op">[</span><span class="str">"scopes"</span><span class="op">]</span> <span class="op">=</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
693
- <p class="run run2"><span class="n"><a id="t611" href="#t611">611</a></span><span class="t"> <span class="nam">scope</span>&nbsp;</span><span class="r"></span></p>
694
- <p class="run run2"><span class="n"><a id="t612" href="#t612">612</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">filtered_config_data</span><span class="op">[</span><span class="str">"scopes"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
695
- <p class="run run2"><span class="n"><a id="t613" href="#t613">613</a></span><span class="t"> <span class="key">if</span> <span class="nam">scope</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">scopes_to_remove</span>&nbsp;</span><span class="r"></span></p>
696
- <p class="run run2"><span class="n"><a id="t614" href="#t614">614</a></span><span class="t"> <span class="op">]</span>&nbsp;</span><span class="r"></span></p>
697
- <p class="pln"><span class="n"><a id="t615" href="#t615">615</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
698
- <p class="pln"><span class="n"><a id="t616" href="#t616">616</a></span><span class="t"> <span class="com"># Rebuild using the original/modified raw data</span>&nbsp;</span><span class="r"></span></p>
699
- <p class="run"><span class="n"><a id="t617" href="#t617">617</a></span><span class="t"> <span class="nam">filtered_configs</span><span class="op">[</span><span class="nam">config_path</span><span class="op">]</span> <span class="op">=</span> <span class="nam">filtered_config_data</span>&nbsp;</span><span class="r"></span></p>
700
- <p class="pln"><span class="n"><a id="t618" href="#t618">618</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
701
- <p class="run"><span class="n"><a id="t619" href="#t619">619</a></span><span class="t"> <span class="key">return</span> <span class="nam">ConfigModels</span><span class="op">.</span><span class="nam">from_configs_data</span><span class="op">(</span><span class="nam">filtered_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
657
+ <p class="mis show_mis"><span class="n"><a id="t575" href="#t575">575</a></span><span class="t"> <span class="key">return</span> <span class="nam">sum</span><span class="op">(</span><span class="nam">len</span><span class="op">(</span><span class="nam">config</span><span class="op">.</span><span class="nam">scopes</span><span class="op">)</span> <span class="key">for</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">values</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
658
+ <p class="pln"><span class="n"><a id="t576" href="#t576">576</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
659
+ <p class="run"><span class="n"><a id="t577" href="#t577">577</a></span><span class="t"> <span class="key">def</span> <span class="nam">num_reviewers</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
660
+ <p class="pln"><span class="n"><a id="t578" href="#t578">578</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
661
+ <p class="pln"><span class="n"><a id="t579" href="#t579">579</a></span><span class="t"><span class="str"> Count the total number of reviewers across all configs.</span>&nbsp;</span><span class="r"></span></p>
662
+ <p class="pln"><span class="n"><a id="t580" href="#t580">580</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
663
+ <p class="mis show_mis"><span class="n"><a id="t581" href="#t581">581</a></span><span class="t"> <span class="key">return</span> <span class="nam">sum</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
664
+ <p class="mis mis2 show_mis"><span class="n"><a id="t582" href="#t582">582</a></span><span class="t"> <span class="nam">len</span><span class="op">(</span><span class="nam">scope</span><span class="op">.</span><span class="nam">reviewers</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
665
+ <p class="mis mis2 show_mis"><span class="n"><a id="t583" href="#t583">583</a></span><span class="t"> <span class="key">for</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">values</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
666
+ <p class="mis mis2 show_mis"><span class="n"><a id="t584" href="#t584">584</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">config</span><span class="op">.</span><span class="nam">scopes</span>&nbsp;</span><span class="r"></span></p>
667
+ <p class="mis mis2 show_mis"><span class="n"><a id="t585" href="#t585">585</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
668
+ <p class="pln"><span class="n"><a id="t586" href="#t586">586</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
669
+ <p class="run"><span class="n"><a id="t587" href="#t587">587</a></span><span class="t"> <span class="key">def</span> <span class="nam">filter_for_pullrequest</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
670
+ <p class="run run2"><span class="n"><a id="t588" href="#t588">588</a></span><span class="t"> <span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
671
+ <p class="run run2"><span class="n"><a id="t589" href="#t589">589</a></span><span class="t"> <span class="nam">base_branch</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
672
+ <p class="run run2"><span class="n"><a id="t590" href="#t590">590</a></span><span class="t"> <span class="nam">head_branch</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
673
+ <p class="run run2"><span class="n"><a id="t591" href="#t591">591</a></span><span class="t"> <span class="nam">author_username</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
674
+ <p class="run run2"><span class="n"><a id="t592" href="#t592">592</a></span><span class="t"> <span class="op">)</span> <span class="op">-></span> <span class="nam">ConfigModels</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
675
+ <p class="pln"><span class="n"><a id="t593" href="#t593">593</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
676
+ <p class="pln"><span class="n"><a id="t594" href="#t594">594</a></span><span class="t"><span class="str"> Look at all configs (including templates) and filter out</span>&nbsp;</span><span class="r"></span></p>
677
+ <p class="pln"><span class="n"><a id="t595" href="#t595">595</a></span><span class="t"><span class="str"> configs and scopes based on branches, authors, etc.</span>&nbsp;</span><span class="r"></span></p>
678
+ <p class="pln"><span class="n"><a id="t596" href="#t596">596</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
679
+ <p class="run"><span class="n"><a id="t597" href="#t597">597</a></span><span class="t"> <span class="nam">filtered_configs</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
680
+ <p class="pln"><span class="n"><a id="t598" href="#t598">598</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
681
+ <p class="run"><span class="n"><a id="t599" href="#t599">599</a></span><span class="t"> <span class="key">for</span> <span class="nam">config_path</span><span class="op">,</span> <span class="nam">config</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">root</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
682
+ <p class="run"><span class="n"><a id="t600" href="#t600">600</a></span><span class="t"> <span class="nam">compiled_config</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">compiled_config</span><span class="op">(</span><span class="nam">Path</span><span class="op">(</span><span class="nam">config_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">self</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
683
+ <p class="pln"><span class="n"><a id="t601" href="#t601">601</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
684
+ <p class="run"><span class="n"><a id="t602" href="#t602">602</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">compiled_config</span><span class="op">.</span><span class="nam">enabled_for_pullrequest</span><span class="op">(</span><span class="nam">base_branch</span><span class="op">,</span> <span class="nam">head_branch</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
685
+ <p class="pln"><span class="n"><a id="t603" href="#t603">603</a></span><span class="t"> <span class="com"># Remove the config from the list</span>&nbsp;</span><span class="r"></span></p>
686
+ <p class="run"><span class="n"><a id="t604" href="#t604">604</a></span><span class="t"> <span class="key">continue</span>&nbsp;</span><span class="r"></span></p>
687
+ <p class="pln"><span class="n"><a id="t605" href="#t605">605</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
688
+ <p class="pln"><span class="n"><a id="t606" href="#t606">606</a></span><span class="t"> <span class="com"># Collect the names of scopes to remove</span>&nbsp;</span><span class="r"></span></p>
689
+ <p class="run"><span class="n"><a id="t607" href="#t607">607</a></span><span class="t"> <span class="nam">scopes_to_remove</span> <span class="op">=</span> <span class="nam">set</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
690
+ <p class="run"><span class="n"><a id="t608" href="#t608">608</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">compiled_config</span><span class="op">.</span><span class="nam">scopes</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
691
+ <p class="run"><span class="n"><a id="t609" href="#t609">609</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">scope</span><span class="op">.</span><span class="nam">enabled_for_pullrequest</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
692
+ <p class="run run2"><span class="n"><a id="t610" href="#t610">610</a></span><span class="t"> <span class="nam">author_username</span><span class="op">,</span> <span class="nam">base_branch</span><span class="op">,</span> <span class="nam">head_branch</span>&nbsp;</span><span class="r"></span></p>
693
+ <p class="run run2"><span class="n"><a id="t611" href="#t611">611</a></span><span class="t"> <span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
694
+ <p class="run"><span class="n"><a id="t612" href="#t612">612</a></span><span class="t"> <span class="nam">scopes_to_remove</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">scope</span><span class="op">.</span><span class="nam">name</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
695
+ <p class="pln"><span class="n"><a id="t613" href="#t613">613</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
696
+ <p class="pln"><span class="n"><a id="t614" href="#t614">614</a></span><span class="t"> <span class="com"># Create a filtered copy of the config data</span>&nbsp;</span><span class="r"></span></p>
697
+ <p class="run"><span class="n"><a id="t615" href="#t615">615</a></span><span class="t"> <span class="nam">filtered_config_data</span> <span class="op">=</span> <span class="nam">config</span><span class="op">.</span><span class="nam">model_dump</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
698
+ <p class="run"><span class="n"><a id="t616" href="#t616">616</a></span><span class="t"> <span class="nam">filtered_config_data</span><span class="op">[</span><span class="str">"scopes"</span><span class="op">]</span> <span class="op">=</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
699
+ <p class="run run2"><span class="n"><a id="t617" href="#t617">617</a></span><span class="t"> <span class="nam">scope</span>&nbsp;</span><span class="r"></span></p>
700
+ <p class="run run2"><span class="n"><a id="t618" href="#t618">618</a></span><span class="t"> <span class="key">for</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">filtered_config_data</span><span class="op">[</span><span class="str">"scopes"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
701
+ <p class="run run2"><span class="n"><a id="t619" href="#t619">619</a></span><span class="t"> <span class="key">if</span> <span class="nam">scope</span><span class="op">[</span><span class="str">"name"</span><span class="op">]</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">scopes_to_remove</span>&nbsp;</span><span class="r"></span></p>
702
+ <p class="run run2"><span class="n"><a id="t620" href="#t620">620</a></span><span class="t"> <span class="op">]</span>&nbsp;</span><span class="r"></span></p>
703
+ <p class="pln"><span class="n"><a id="t621" href="#t621">621</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
704
+ <p class="pln"><span class="n"><a id="t622" href="#t622">622</a></span><span class="t"> <span class="com"># Rebuild using the original/modified raw data</span>&nbsp;</span><span class="r"></span></p>
705
+ <p class="run"><span class="n"><a id="t623" href="#t623">623</a></span><span class="t"> <span class="nam">filtered_configs</span><span class="op">[</span><span class="nam">config_path</span><span class="op">]</span> <span class="op">=</span> <span class="nam">filtered_config_data</span>&nbsp;</span><span class="r"></span></p>
706
+ <p class="pln"><span class="n"><a id="t624" href="#t624">624</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
707
+ <p class="run"><span class="n"><a id="t625" href="#t625">625</a></span><span class="t"> <span class="key">return</span> <span class="nam">ConfigModels</span><span class="op">.</span><span class="nam">from_configs_data</span><span class="op">(</span><span class="nam">filtered_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
702
708
  </main>
703
709
  <footer>
704
710
  <div class="content">
@@ -708,7 +714,7 @@
708
714
  <a class="nav" href="z_8111577e4327d43e_diff_py.html">&#xbb; next</a>
709
715
  &nbsp; &nbsp; &nbsp;
710
716
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
711
- created at 2026-06-08 22:13 -0500
717
+ created at 2026-06-24 09:37 -0500
712
718
  </p>
713
719
  </div>
714
720
  </footer>
@@ -65,7 +65,7 @@
65
65
  <a id="nextFileLink" class="nav" href="z_8111577e4327d43e_exceptions_py.html">&#xbb; next</a>
66
66
  &nbsp; &nbsp; &nbsp;
67
67
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
68
- created at 2026-06-08 22:13 -0500
68
+ created at 2026-06-24 09:37 -0500
69
69
  </p>
70
70
  <aside class="hidden">
71
71
  <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -279,7 +279,7 @@
279
279
  <a class="nav" href="z_8111577e4327d43e_exceptions_py.html">&#xbb; next</a>
280
280
  &nbsp; &nbsp; &nbsp;
281
281
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
282
- created at 2026-06-08 22:13 -0500
282
+ created at 2026-06-24 09:37 -0500
283
283
  </p>
284
284
  </div>
285
285
  </footer>
@@ -65,7 +65,7 @@
65
65
  <a id="nextFileLink" class="nav" href="z_8111577e4327d43e_printer_py.html">&#xbb; next</a>
66
66
  &nbsp; &nbsp; &nbsp;
67
67
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
68
- created at 2026-06-08 23:14 -0500
68
+ created at 2026-06-24 09:37 -0500
69
69
  </p>
70
70
  <aside class="hidden">
71
71
  <button type="button" class="button_next_chunk" data-shortcut="j"></button>
@@ -492,7 +492,7 @@
492
492
  <a class="nav" href="z_8111577e4327d43e_printer_py.html">&#xbb; next</a>
493
493
  &nbsp; &nbsp; &nbsp;
494
494
  <a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
495
- created at 2026-06-08 23:14 -0500
495
+ created at 2026-06-24 09:37 -0500
496
496
  </p>
497
497
  </div>
498
498
  </footer>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pullapprove"
3
- version = "5.6.2"
3
+ version = "5.6.3"
4
4
  description = "CLI for PullApprove5"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -519,7 +519,13 @@ class ConfigModels(RootModel):
519
519
  primary_config = CONFIG_FILENAME
520
520
 
521
521
  if primary_config in self.root:
522
- if lsc := self.root[primary_config].large_scale_change:
522
+ # Compile first so the large-scale-change section gets the same
523
+ # extends-merging and alias expansion as everything else. Without
524
+ # this, reviewers like ["$backend"] are matched literally.
525
+ compiled = self.root[primary_config].compiled_config(
526
+ Path(primary_config), self
527
+ )
528
+ if lsc := compiled.large_scale_change:
523
529
  return lsc
524
530
 
525
531
  return LargeScaleChangeModel()
@@ -313,3 +313,50 @@ def test_circular_alias_across_extends():
313
313
  ValueError, match="Circular reference detected in aliases: a -> b -> a"
314
314
  ):
315
315
  extended_config.compiled_config(Path("CODEREVIEW.toml"), configs)
316
+
317
+
318
+ def test_large_scale_change_reviewers_expand_through_processing_path():
319
+ """The large-scale-change section must get aliases expanded (and extends
320
+ merged) the same way scopes do.
321
+
322
+ This mirrors a real config where ``$backend`` is defined in an extended
323
+ template and used in the main config's ``[large-scale-change]`` reviewers.
324
+ The processing path goes through ``filter_for_pullrequest`` (which rebuilds
325
+ configs from raw data) and then ``get_default_large_scale_change``, so the
326
+ alias must still resolve to usernames there.
327
+ """
328
+ teams_template_data = {
329
+ "template": True,
330
+ "aliases": {
331
+ "backend": ["mozerov", "lundemann", "hua-dit-alkistis"],
332
+ },
333
+ }
334
+ main_config_data = {
335
+ "extends": ["CODEREVIEW-TEAMS.toml"],
336
+ "large_scale_change": {
337
+ "reviewers": ["$backend"],
338
+ "labels": ["large-change"],
339
+ },
340
+ "scopes": [
341
+ {"name": "all", "paths": ["*"], "reviewers": ["$backend"]},
342
+ ],
343
+ }
344
+
345
+ configs = ConfigModels.from_config_models(
346
+ {
347
+ "CODEREVIEW-TEAMS.toml": ConfigModel.from_data(
348
+ teams_template_data, Path("CODEREVIEW-TEAMS.toml")
349
+ ),
350
+ "CODEREVIEW.toml": ConfigModel.from_data(
351
+ main_config_data, Path("CODEREVIEW.toml")
352
+ ),
353
+ }
354
+ )
355
+
356
+ filtered = configs.filter_for_pullrequest(
357
+ base_branch="main", head_branch="feature", author_username="someone"
358
+ )
359
+
360
+ lsc = filtered.get_default_large_scale_change()
361
+ assert lsc.reviewers == ["mozerov", "lundemann", "hua-dit-alkistis"]
362
+ assert lsc.labels == ["large-change"]
@@ -245,7 +245,7 @@ wheels = [
245
245
 
246
246
  [[package]]
247
247
  name = "pullapprove"
248
- version = "5.6.2"
248
+ version = "5.6.3"
249
249
  source = { editable = "." }
250
250
  dependencies = [
251
251
  { name = "click" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes