whatnext 3.1__tar.gz → 3.2__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 (121) hide show
  1. {whatnext-3.1 → whatnext-3.2}/.github/workflows/tests.yml +1 -1
  2. {whatnext-3.1 → whatnext-3.2}/CHANGELOG.md +13 -0
  3. {whatnext-3.1 → whatnext-3.2}/PKG-INFO +2 -1
  4. {whatnext-3.1 → whatnext-3.2}/docs/usage.md +10 -4
  5. {whatnext-3.1 → whatnext-3.2}/pyproject.toml +1 -0
  6. {whatnext-3.1 → whatnext-3.2}/tasks/deferring.md +6 -0
  7. whatnext-3.2/tasks/ignoring.md +3 -0
  8. whatnext-3.2/tasks/summaries.md +3 -0
  9. {whatnext-3.1 → whatnext-3.2}/tests/deferring.bats +72 -0
  10. {whatnext-3.1 → whatnext-3.2}/tests/matching.bats +72 -0
  11. {whatnext-3.1 → whatnext-3.2}/tests/summary.bats +13 -13
  12. {whatnext-3.1 → whatnext-3.2}/tests/usage.bats +9 -3
  13. {whatnext-3.1 → whatnext-3.2}/whatnext/summary.py +6 -1
  14. {whatnext-3.1 → whatnext-3.2}/whatnext/whatnext.py +36 -6
  15. {whatnext-3.1 → whatnext-3.2}/.flake8 +0 -0
  16. {whatnext-3.1 → whatnext-3.2}/.github/dependabot.yml +0 -0
  17. {whatnext-3.1 → whatnext-3.2}/.github/workflows/publish.yml +0 -0
  18. {whatnext-3.1 → whatnext-3.2}/.gitignore +0 -0
  19. {whatnext-3.1 → whatnext-3.2}/.whatnext +0 -0
  20. {whatnext-3.1 → whatnext-3.2}/LICENCE +0 -0
  21. {whatnext-3.1 → whatnext-3.2}/LICENSE +0 -0
  22. {whatnext-3.1 → whatnext-3.2}/Makefile +0 -0
  23. {whatnext-3.1 → whatnext-3.2}/README.md +0 -0
  24. {whatnext-3.1 → whatnext-3.2}/archive/done/tasks.md +0 -0
  25. {whatnext-3.1 → whatnext-3.2}/docs/annotations.md +0 -0
  26. {whatnext-3.1 → whatnext-3.2}/docs/basics.md +0 -0
  27. {whatnext-3.1 → whatnext-3.2}/docs/deadlines.md +0 -0
  28. {whatnext-3.1 → whatnext-3.2}/docs/deferring.md +0 -0
  29. {whatnext-3.1 → whatnext-3.2}/docs/exclusions.md +0 -0
  30. {whatnext-3.1 → whatnext-3.2}/docs/index.md +0 -0
  31. {whatnext-3.1 → whatnext-3.2}/docs/installation.md +0 -0
  32. {whatnext-3.1 → whatnext-3.2}/docs/next.md +0 -0
  33. {whatnext-3.1 → whatnext-3.2}/docs/prioritisation.md +0 -0
  34. {whatnext-3.1 → whatnext-3.2}/docs/sequential.md +0 -0
  35. {whatnext-3.1 → whatnext-3.2}/example/archived/projects/tangerine.md +0 -0
  36. {whatnext-3.1 → whatnext-3.2}/example/projects/curtain.md +0 -0
  37. {whatnext-3.1 → whatnext-3.2}/example/projects/fountain.md +0 -0
  38. {whatnext-3.1 → whatnext-3.2}/example/projects/harvest.md +0 -0
  39. {whatnext-3.1 → whatnext-3.2}/example/projects/obelisk.md +0 -0
  40. {whatnext-3.1 → whatnext-3.2}/example/projects/tinsel.md +0 -0
  41. {whatnext-3.1 → whatnext-3.2}/example/tasks.md +0 -0
  42. {whatnext-3.1 → whatnext-3.2}/example/template.md +0 -0
  43. {whatnext-3.1 → whatnext-3.2}/scripts/update-usage-examples.py +0 -0
  44. {whatnext-3.1 → whatnext-3.2}/tasks/documentation.md +0 -0
  45. {whatnext-3.1 → whatnext-3.2}/tasks/listing.md +0 -0
  46. {whatnext-3.1 → whatnext-3.2}/tasks/next.md +0 -0
  47. {whatnext-3.1 → whatnext-3.2}/tasks/test_refactor.md +0 -0
  48. {whatnext-3.1 → whatnext-3.2}/tasks/version_0.1.md +0 -0
  49. {whatnext-3.1 → whatnext-3.2}/tasks/version_0.2.md +0 -0
  50. {whatnext-3.1 → whatnext-3.2}/tasks/version_0.3.md +0 -0
  51. {whatnext-3.1 → whatnext-3.2}/tasks/version_0.4.md +0 -0
  52. {whatnext-3.1 → whatnext-3.2}/tasks/version_0.5.md +0 -0
  53. {whatnext-3.1 → whatnext-3.2}/tasks/version_1.0.md +0 -0
  54. {whatnext-3.1 → whatnext-3.2}/tasks/version_1.1.md +0 -0
  55. {whatnext-3.1 → whatnext-3.2}/tasks/version_1.2.md +0 -0
  56. {whatnext-3.1 → whatnext-3.2}/tasks/version_1.3.md +0 -0
  57. {whatnext-3.1 → whatnext-3.2}/tasks.md +0 -0
  58. {whatnext-3.1 → whatnext-3.2}/tests/colour.bats +0 -0
  59. {whatnext-3.1 → whatnext-3.2}/tests/config/.whatnext +0 -0
  60. {whatnext-3.1 → whatnext-3.2}/tests/config/.whatnext.alt +0 -0
  61. {whatnext-3.1 → whatnext-3.2}/tests/config/apples.md +0 -0
  62. {whatnext-3.1 → whatnext-3.2}/tests/config/oranges.md +0 -0
  63. {whatnext-3.1 → whatnext-3.2}/tests/config-external +0 -0
  64. {whatnext-3.1 → whatnext-3.2}/tests/config.bats +0 -0
  65. {whatnext-3.1 → whatnext-3.2}/tests/deadline.bats +0 -0
  66. {whatnext-3.1 → whatnext-3.2}/tests/deferring/bare-after.md +0 -0
  67. {whatnext-3.1 → whatnext-3.2}/tests/deferring/circular-a.md +0 -0
  68. {whatnext-3.1 → whatnext-3.2}/tests/deferring/circular-b.md +0 -0
  69. {whatnext-3.1 → whatnext-3.2}/tests/deferring/deferred.md +0 -0
  70. {whatnext-3.1 → whatnext-3.2}/tests/deferring/duplicate-warnings.md +0 -0
  71. {whatnext-3.1 → whatnext-3.2}/tests/deferring/missing-dep.md +0 -0
  72. {whatnext-3.1 → whatnext-3.2}/tests/deferring/needs-absolute.md +0 -0
  73. {whatnext-3.1 → whatnext-3.2}/tests/deferring/needs-subdir.md +0 -0
  74. {whatnext-3.1 → whatnext-3.2}/tests/deferring/phase-misplaced.md +0 -0
  75. {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-empty.md +0 -0
  76. {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-partial.md +0 -0
  77. {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-queue.md +0 -0
  78. {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases.md +0 -0
  79. {whatnext-3.1 → whatnext-3.2}/tests/deferring/regular.md +0 -0
  80. {whatnext-3.1 → whatnext-3.2}/tests/deferring/root-target.md +0 -0
  81. {whatnext-3.1 → whatnext-3.2}/tests/deferring/samename.md +0 -0
  82. {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/needs-parent.md +0 -0
  83. {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/needs-sibling.md +0 -0
  84. {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/samename.md +0 -0
  85. {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/target.md +0 -0
  86. {whatnext-3.1 → whatnext-3.2}/tests/edit.bats +0 -0
  87. {whatnext-3.1 → whatnext-3.2}/tests/headerless/annotation.md +0 -0
  88. {whatnext-3.1 → whatnext-3.2}/tests/headerless/deadline.md +0 -0
  89. {whatnext-3.1 → whatnext-3.2}/tests/housekeeping.bats +0 -0
  90. {whatnext-3.1 → whatnext-3.2}/tests/invalid.md +0 -0
  91. {whatnext-3.1 → whatnext-3.2}/tests/list.bats +0 -0
  92. {whatnext-3.1 → whatnext-3.2}/tests/next/alternate.md +0 -0
  93. {whatnext-3.1 → whatnext-3.2}/tests/next/append-after.md +0 -0
  94. {whatnext-3.1 → whatnext-3.2}/tests/next/append.md +0 -0
  95. {whatnext-3.1 → whatnext-3.2}/tests/next/empty.md +0 -0
  96. {whatnext-3.1 → whatnext-3.2}/tests/next/insert.md +0 -0
  97. {whatnext-3.1 → whatnext-3.2}/tests/next/projects/alpha/tasks/things.md +0 -0
  98. {whatnext-3.1 → whatnext-3.2}/tests/next/projects/alpha/tasks.md +0 -0
  99. {whatnext-3.1 → whatnext-3.2}/tests/next/projects/beta/things.md +0 -0
  100. {whatnext-3.1 → whatnext-3.2}/tests/next/something.txt +0 -0
  101. {whatnext-3.1 → whatnext-3.2}/tests/next/tasks.md +0 -0
  102. {whatnext-3.1 → whatnext-3.2}/tests/next.bats +0 -0
  103. {whatnext-3.1 → whatnext-3.2}/tests/notnext.bats +0 -0
  104. {whatnext-3.1 → whatnext-3.2}/tests/queue/all-complete.md +0 -0
  105. {whatnext-3.1 → whatnext-3.2}/tests/queue/blocked.md +0 -0
  106. {whatnext-3.1 → whatnext-3.2}/tests/queue/in-progress.md +0 -0
  107. {whatnext-3.1 → whatnext-3.2}/tests/queue/normal.md +0 -0
  108. {whatnext-3.1 → whatnext-3.2}/tests/queue/prioritised.md +0 -0
  109. {whatnext-3.1 → whatnext-3.2}/tests/queue.bats +0 -0
  110. {whatnext-3.1 → whatnext-3.2}/tests/test_defer.py +0 -0
  111. {whatnext-3.1 → whatnext-3.2}/tests/test_edit.py +0 -0
  112. {whatnext-3.1 → whatnext-3.2}/tests/test_file.py +0 -0
  113. {whatnext-3.1 → whatnext-3.2}/tests/test_limit.py +0 -0
  114. {whatnext-3.1 → whatnext-3.2}/tests/test_output.py +0 -0
  115. {whatnext-3.1 → whatnext-3.2}/tests/test_summary.py +0 -0
  116. {whatnext-3.1 → whatnext-3.2}/tests/test_task.py +0 -0
  117. {whatnext-3.1 → whatnext-3.2}/tests/version.bats +0 -0
  118. {whatnext-3.1 → whatnext-3.2}/whatnext/__init__.py +0 -0
  119. {whatnext-3.1 → whatnext-3.2}/whatnext/guide.txt +0 -0
  120. {whatnext-3.1 → whatnext-3.2}/whatnext/models.py +0 -0
  121. {whatnext-3.1 → whatnext-3.2}/whatnext/next.py +0 -0
@@ -11,7 +11,7 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
13
  matrix:
14
- python-version: ['3.10', '3.11', '3.12']
14
+ python-version: ['3.10', '3.11', '3.12', '3.13']
15
15
 
16
16
  steps:
17
17
  - uses: actions/checkout@v6
@@ -1,6 +1,19 @@
1
1
  # Changelog
2
2
 
3
3
 
4
+ ## [v3.2] - 2026-04-09
5
+
6
+ **Added:**
7
+ - Summary view now shows a progress bar on the totals line.
8
+ - `--ignore-queue` flag to ignore `@queue` constraints.
9
+ - `--ignore-phase` flag to ignore `@phase` constraints.
10
+ - `--ignore-all` flag to ignore all deferral constraints.
11
+
12
+ **Fixes:**
13
+ - Directories are now properly ignored without requiring wildcards,
14
+ (`example/` and `example` both now work, `example/**` continues to work).
15
+
16
+
4
17
  ## [v3.1] - 2026-03-14
5
18
 
6
19
  **Fixes:**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: whatnext
3
- Version: 3.1
3
+ Version: 3.2
4
4
  Summary: A lister of tasks found in Markdown files
5
5
  Project-URL: Homepage, https://github.com/norm/whatnext
6
6
  Project-URL: Repository, https://github.com/norm/whatnext
@@ -14,6 +14,7 @@ Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
17
18
  Requires-Python: >=3.10
18
19
  Requires-Dist: termcolor
19
20
  Requires-Dist: toml
@@ -224,7 +224,13 @@ To show a random selection of tasks rather than by priority, use `5r`.
224
224
  - [#] throw fruit at neighbours (they moved away)
225
225
  ```
226
226
 
227
- - `--ignore-after` — show all tasks, ignoring `@after` constraints.
227
+ - `--ignore-after` — ignore `@after` constraints.
228
+
229
+ - `--ignore-queue` — ignore `@queue` constraints.
230
+
231
+ - `--ignore-phase` — ignore `@phase` constraints.
232
+
233
+ - `--ignore-all` — ignore all deferral constraints (`@after`, `@phase`, `@queue`).
228
234
 
229
235
  - `-o` / `--open` — show only open tasks.
230
236
 
@@ -252,7 +258,7 @@ To show a random selection of tasks rather than by priority, use `5r`.
252
258
  ▚▚▚▚▚▚▚▚▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░ 1 1 2 projects/obelisk.md
253
259
  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0 0 5 projects/tinsel.md
254
260
  ──────
255
- 1 2 20 23, of 33 total
261
+ ▚▚▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1 2 20 23, of 33 total
256
262
 
257
263
  ▚ Blocked ▓ Partial ░ Open
258
264
  ```
@@ -274,7 +280,7 @@ To show a random selection of tasks rather than by priority, use `5r`.
274
280
  ░░░░░░░░░░░░░░░░░░░░░ 0 0 0 0 5 projects/tinsel.md
275
281
  ▚▚▚▚█████████████ 1 3 0 0 0 archived/projects/tangerine.md
276
282
  ──────────
277
- 2 5 1 2 23 33, of 33 total
283
+ ▚▚█████▓▒▒░░░░░░░░░░░░░░░░░░░░░░░░ 2 5 1 2 23 33, of 33 total
278
284
 
279
285
  ▚ Cancelled █ Done ▓ Blocked ▒ Partial ░ Open
280
286
  ```
@@ -302,7 +308,7 @@ To show a random selection of tasks rather than by priority, use `5r`.
302
308
  █████░░░░░░░░░░░░░░░░░░░░ 1 4 projects/tinsel.md
303
309
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
304
310
  ────
305
- 5 25 30, of 33 total
311
+ ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5 25 30, of 33 total
306
312
 
307
313
  █ High ░ (Overdue/Imminent/Medium/Normal)
308
314
  ```
@@ -15,6 +15,7 @@ classifiers = [
15
15
  "Programming Language :: Python :: 3.10",
16
16
  "Programming Language :: Python :: 3.11",
17
17
  "Programming Language :: Python :: 3.12",
18
+ "Programming Language :: Python :: 3.13",
18
19
  ]
19
20
  dependencies = [
20
21
  "termcolor",
@@ -22,3 +22,9 @@ Later sections also tagged with phase are not shown when earlier phases
22
22
  are incomplete. Non-tagged sections are shown as normal.
23
23
 
24
24
  - [X] implement \@phase directive for section-level sequencing
25
+
26
+ Be able to ignore deferring controls to list all incomplete tasks.
27
+
28
+ - [X] implement --ignore-queue
29
+ - [X] implement --ignore-phase
30
+ - [X] implement catch-all ignore flag
@@ -0,0 +1,3 @@
1
+ Ignoring files.
2
+
3
+ - [X] be able to ignore entire directories, not just files
@@ -0,0 +1,3 @@
1
+ Improvements to `--summary` output.
2
+
3
+ - [X] show total %age progression across project, not just column totals
@@ -320,3 +320,75 @@ teardown_file() {
320
320
  diff -u <(echo "$expected_stderr") <(echo "$stderr")
321
321
  [ $status -eq 0 ]
322
322
  }
323
+
324
+ @test "queue can be ignored" {
325
+ expected_output=$(sed -e 's/^ //' <<" EOF"
326
+ example/projects/fountain.md:
327
+ - [ ] nigredo, the blackening or melanosis
328
+ - [ ] albedo, the whitening or leucosis
329
+ - [ ] citrinitas, the yellowing or xanthosis
330
+ - [ ] rubedo, the reddening, purpling, or iosis
331
+ EOF
332
+ )
333
+
334
+ WHATNEXT_TODAY=2025-01-01 \
335
+ run whatnext --ignore-queue example/projects/fountain.md
336
+ diff -u <(echo "$expected_output") <(echo "$output")
337
+ [ $status -eq 0 ]
338
+ }
339
+
340
+ @test "phase can be ignored" {
341
+ expected_output=$(sed -e 's/^ //' <<" EOF"
342
+ tests/deferring/phases.md:
343
+ # Bugs
344
+ - [ ] fix bug
345
+ # New feature [phase 1/3]
346
+ - [ ] install dependencies
347
+ # New feature / Implement [phase 2/3]
348
+ - [ ] write code
349
+ # New feature / Test [phase 3/3]
350
+ - [ ] run tests
351
+ EOF
352
+ )
353
+
354
+ run --separate-stderr \
355
+ whatnext \
356
+ --ignore-phase \
357
+ tests/deferring/phases.md
358
+
359
+ diff -u <(echo "$expected_output") <(echo "$output")
360
+ [ $status -eq 0 ]
361
+ }
362
+
363
+ @test "all deferral constraints can be ignored" {
364
+ expected_output=$(sed -e 's/^ //' <<" EOF"
365
+ example/projects/fountain.md:
366
+ - [ ] nigredo, the blackening or melanosis
367
+ - [ ] albedo, the whitening or leucosis
368
+ - [ ] citrinitas, the yellowing or xanthosis
369
+ - [ ] rubedo, the reddening, purpling, or iosis
370
+ tests/deferring/deferred.md:
371
+ - [ ] wait for regular
372
+ tests/deferring/phases.md:
373
+ # Bugs
374
+ - [ ] fix bug
375
+ # New feature [phase 1/3]
376
+ - [ ] install dependencies
377
+ # New feature / Implement [phase 2/3]
378
+ - [ ] write code
379
+ # New feature / Test [phase 3/3]
380
+ - [ ] run tests
381
+ EOF
382
+ )
383
+
384
+ WHATNEXT_TODAY=2025-01-01 \
385
+ run --separate-stderr \
386
+ whatnext \
387
+ --ignore-all \
388
+ example/projects/fountain.md \
389
+ tests/deferring/deferred.md \
390
+ tests/deferring/phases.md
391
+
392
+ diff -u <(echo "$expected_output") <(echo "$output")
393
+ [ $status -eq 0 ]
394
+ }
@@ -552,3 +552,75 @@ function setup {
552
552
  [ -n "$(echo "$output" | grep tasks.md)" ]
553
553
  [ $status -eq 0 ]
554
554
  }
555
+
556
+ @test "ignore patterns without wildcard only match on whole names" {
557
+ expected_output=$(sed -e 's/^ //' <<" EOF"
558
+ tasks.md:
559
+ # Get S Done / MEDIUM
560
+ - [ ] question entire existence
561
+
562
+ tasks.md:
563
+ # Get S Done
564
+ - [ ] come up with better projects
565
+ - [ ] start third project
566
+
567
+ archived/projects/tangerine.md:
568
+ # Project Tangerine / FINISHED
569
+ - [X] acquire trebuchet plans
570
+ - [X] source counterweight materials
571
+ - [X] build it
572
+ - [#] throw fruit at neighbours (they moved away)
573
+ EOF
574
+ )
575
+
576
+ echo "ignore = ['projects', 'task']" > "$BATS_TEST_TMPDIR/.whatnext"
577
+
578
+ run --separate-stderr \
579
+ whatnext \
580
+ --config "$BATS_TEST_TMPDIR/.whatnext" \
581
+ --all
582
+
583
+ diff -u <(echo "$expected_output") <(echo "$output")
584
+ [ $status -eq 0 ]
585
+
586
+ echo "ignore = ['projects/', 'tasks']" > "$BATS_TEST_TMPDIR/.whatnext"
587
+
588
+ run --separate-stderr \
589
+ whatnext \
590
+ --config "$BATS_TEST_TMPDIR/.whatnext" \
591
+ --all
592
+
593
+ diff -u <(echo "$expected_output") <(echo "$output")
594
+ [ $status -eq 0 ]
595
+ }
596
+
597
+ @test "glob patterns still work with directory patterns" {
598
+ expected_output=$(sed -e 's/^ //' <<" EOF"
599
+ tasks.md:
600
+ # Get S Done / MEDIUM
601
+ - [ ] question entire existence
602
+
603
+ tasks.md:
604
+ # Get S Done
605
+ - [ ] come up with better projects
606
+ - [ ] start third project
607
+
608
+ archived/projects/tangerine.md:
609
+ # Project Tangerine / FINISHED
610
+ - [X] acquire trebuchet plans
611
+ - [X] source counterweight materials
612
+ - [X] build it
613
+ - [#] throw fruit at neighbours (they moved away)
614
+ EOF
615
+ )
616
+
617
+ echo "ignore = ['projects/**']" > "$BATS_TEST_TMPDIR/.whatnext"
618
+
619
+ run --separate-stderr \
620
+ whatnext \
621
+ --config "$BATS_TEST_TMPDIR/.whatnext" \
622
+ --all
623
+
624
+ diff -u <(echo "$expected_output") <(echo "$output")
625
+ [ $status -eq 0 ]
626
+ }
@@ -19,7 +19,7 @@ function setup {
19
19
  ▚▚▚▚▚▚▚▚▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░ 1 1 2 projects/obelisk.md
20
20
  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0 0 5 projects/tinsel.md
21
21
  ──────
22
- 1 2 20 23, of 33 total
22
+ ▚▚▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1 2 20 23, of 33 total
23
23
 
24
24
  ▚ Blocked ▓ Partial ░ Open
25
25
  EOF
@@ -45,7 +45,7 @@ function setup {
45
45
  ░░░░░░░░░░░░░░░░░░░░░ 0 0 0 0 5 projects/tinsel.md
46
46
  ▚▚▚▚█████████████ 1 3 0 0 0 archived/projects/tangerine.md
47
47
  ──────────
48
- 2 5 1 2 23 33, of 33 total
48
+ ▚▚█████▓▒▒░░░░░░░░░░░░░░░░░░░░░░░░ 2 5 1 2 23 33, of 33 total
49
49
 
50
50
  ▚ Cancelled █ Done ▓ Blocked ▒ Partial ░ Open
51
51
  EOF
@@ -101,7 +101,7 @@ function setup {
101
101
  ░░░░░░ 0 0 0 0 5 projects/tinsel.md
102
102
  ▚████ 1 3 0 0 0 archived/projects/tangerine.md
103
103
  ──────────
104
- 2 5 1 2 23 33, of 33 total
104
+ ▚█▒░░░░░░░ 2 5 1 2 23 33, of 33 total
105
105
 
106
106
  ▚ Cancelled █ Done ▓ Blocked ▒ Partial ░ Open
107
107
  EOF
@@ -126,7 +126,7 @@ function setup {
126
126
  █████████████████████ 2 projects/obelisk.md
127
127
  ████████████████████████████████████████████████████ 5 projects/tinsel.md
128
128
  ──
129
- 20 20, of 33 total
129
+ ████████████████████████████████████████████████████ 20 20, of 33 total
130
130
 
131
131
  █ Open
132
132
  EOF
@@ -153,7 +153,7 @@ function setup {
153
153
  ████████████████████████ 5 0 projects/tinsel.md
154
154
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
155
155
  ─────
156
- 20 10 30, of 33 total
156
+ ██████████████████████████░░░░░░░░░░░░░ 20 10 30, of 33 total
157
157
 
158
158
  █ Open ░ (Cancelled/Done/Blocked/Partial)
159
159
  EOF
@@ -180,7 +180,7 @@ function setup {
180
180
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
181
181
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
182
182
  ────
183
- 2 28 30, of 33 total
183
+ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2 28 30, of 33 total
184
184
 
185
185
  █ Partial ░ (Cancelled/Done/Blocked/Open)
186
186
  EOF
@@ -207,7 +207,7 @@ function setup {
207
207
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
208
208
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
209
209
  ────
210
- 1 29 30, of 33 total
210
+ █░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 1 29 30, of 33 total
211
211
 
212
212
  █ Blocked ░ (Cancelled/Done/Partial/Open)
213
213
  EOF
@@ -234,7 +234,7 @@ function setup {
234
234
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
235
235
  ███████████████░░░░░ 3 1 archived/projects/tangerine.md
236
236
  ────
237
- 5 25 30, of 33 total
237
+ ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5 25 30, of 33 total
238
238
 
239
239
  █ Done ░ (Cancelled/Blocked/Partial/Open)
240
240
  EOF
@@ -261,7 +261,7 @@ function setup {
261
261
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
262
262
  █████░░░░░░░░░░░░░░░ 1 3 archived/projects/tangerine.md
263
263
  ────
264
- 2 28 30, of 33 total
264
+ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2 28 30, of 33 total
265
265
 
266
266
  █ Cancelled ░ (Done/Blocked/Partial/Open)
267
267
  EOF
@@ -289,7 +289,7 @@ function setup {
289
289
  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 0 5 0 projects/tinsel.md
290
290
  ▚▚▚▚▚░░░░░░░░░░░░░░ 1 0 3 archived/projects/tangerine.md
291
291
  ──────
292
- 2 20 8 30, of 33 total
292
+ ▚▚▚▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░ 2 20 8 30, of 33 total
293
293
 
294
294
  ▚ Cancelled ▓ Open ░ (Done/Blocked/Partial)
295
295
  EOF
@@ -316,7 +316,7 @@ function setup {
316
316
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
317
317
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
318
318
  ────
319
- 3 27 30, of 33 total
319
+ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3 27 30, of 33 total
320
320
 
321
321
  █ High ░ (Overdue/Imminent/Medium/Normal)
322
322
  EOF
@@ -343,7 +343,7 @@ function setup {
343
343
  ░░░░░░░░░░░░░░░░░░░░░░░░░ 0 5 projects/tinsel.md
344
344
  ░░░░░░░░░░░░░░░░░░░░ 0 4 archived/projects/tangerine.md
345
345
  ────
346
- 2 28 30, of 33 total
346
+ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2 28 30, of 33 total
347
347
 
348
348
  █ Medium ░ (Overdue/Imminent/High/Normal)
349
349
  EOF
@@ -371,7 +371,7 @@ function setup {
371
371
  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 0 5 0 projects/tinsel.md
372
372
  ░░░░░░░░░░░░░░░░░░ 0 0 4 archived/projects/tangerine.md
373
373
  ───────
374
- 3 17 10 30, of 33 total
374
+ ▚▚▚▚▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░ 3 17 10 30, of 33 total
375
375
 
376
376
  ▚ High ▓ Normal ░ (Overdue/Imminent/Medium)
377
377
  EOF
@@ -7,7 +7,8 @@ bats_require_minimum_version 1.5.0
7
7
 
8
8
  expected_output=$(sed -e 's/^ //' <<" EOF"
9
9
  Usage: whatnext [-h] [--help] [--version] [--guide] [--dir DIR] [-s] [-e]
10
- [--relative] [-a] [--ignore-after] [--config CONFIG]
10
+ [--relative] [-a] [--ignore-after] [--ignore-queue]
11
+ [--ignore-phase] [--ignore-all] [--config CONFIG]
11
12
  [--ignore PATTERN] [-q] [-o] [-p] [-b] [-d] [-c]
12
13
  [--priority LEVEL] [--color | --no-color]
13
14
  [match ...]
@@ -24,7 +25,8 @@ bats_require_minimum_version 1.5.0
24
25
 
25
26
  expected_output=$(sed -e 's/^ //' <<" EOF"
26
27
  Usage: whatnext [-h] [--help] [--version] [--guide] [--dir DIR] [-s] [-e]
27
- [--relative] [-a] [--ignore-after] [--config CONFIG]
28
+ [--relative] [-a] [--ignore-after] [--ignore-queue]
29
+ [--ignore-phase] [--ignore-all] [--config CONFIG]
28
30
  [--ignore PATTERN] [-q] [-o] [-p] [-b] [-d] [-c]
29
31
  [--priority LEVEL] [--color | --no-color]
30
32
  [match ...]
@@ -51,7 +53,11 @@ bats_require_minimum_version 1.5.0
51
53
  --relative Show selected states relative to all others (use with
52
54
  --summary)
53
55
  -a, --all Include all tasks and files, not just incomplete
54
- --ignore-after Show all tasks, ignoring @after constraints
56
+ --ignore-after Ignore @after constraints
57
+ --ignore-queue Ignore @queue constraints
58
+ --ignore-phase Ignore @phase constraints
59
+ --ignore-all Ignore all deferral constraints (@after, @phase,
60
+ @queue)
55
61
  --config CONFIG Path to config file (default: WHATNEXT_CONFIG, or
56
62
  '.whatnext' in --dir)
57
63
  --ignore PATTERN Ignore files matching pattern (can be specified
@@ -244,8 +244,13 @@ def format_summary(
244
244
  if all_tasks_total is None:
245
245
  all_tasks_total = displayed_total
246
246
  lines.append(f"{' ' * bar_width}{gap}{'─' * count_width}")
247
+ total_bar = build_bar(
248
+ total_counts, displayed_total, bar_width, char_map, bar_order
249
+ )
250
+ if use_colour:
251
+ total_bar = colored(total_bar, "blue", force_color=True)
247
252
  lines.append(
248
- f"{' ' * bar_width}{gap}{total_str.rjust(count_width)}{gap}"
253
+ f"{total_bar}{gap}{total_str.rjust(count_width)}{gap}"
249
254
  f"{displayed_total}, of {all_tasks_total} total"
250
255
  )
251
256
 
@@ -249,8 +249,18 @@ def load_config(config_path=None, directory="."):
249
249
 
250
250
  def is_ignored(filepath, ignore_patterns):
251
251
  for pattern in ignore_patterns:
252
- if fnmatch.fnmatch(filepath, pattern):
253
- return True
252
+ if pattern.endswith('/'):
253
+ dir_name = pattern.rstrip('/')
254
+ if filepath.startswith(dir_name + '/'):
255
+ return True
256
+ elif not any(c in pattern for c in ['*', '?', '[']):
257
+ if filepath == pattern:
258
+ return True
259
+ if filepath.startswith(pattern + '/'):
260
+ return True
261
+ else:
262
+ if fnmatch.fnmatch(filepath, pattern):
263
+ return True
254
264
  return False
255
265
 
256
266
 
@@ -487,7 +497,22 @@ def main():
487
497
  parser.add_argument(
488
498
  "--ignore-after",
489
499
  action="store_true",
490
- help="Show all tasks, ignoring @after constraints",
500
+ help="Ignore @after constraints",
501
+ )
502
+ parser.add_argument(
503
+ "--ignore-queue",
504
+ action="store_true",
505
+ help="Ignore @queue constraints",
506
+ )
507
+ parser.add_argument(
508
+ "--ignore-phase",
509
+ action="store_true",
510
+ help="Ignore @phase constraints",
511
+ )
512
+ parser.add_argument(
513
+ "--ignore-all",
514
+ action="store_true",
515
+ help="Ignore all deferral constraints (@after, @phase, @queue)",
491
516
  )
492
517
  parser.add_argument(
493
518
  "--config",
@@ -640,13 +665,18 @@ def main():
640
665
  for file in task_files
641
666
  ]
642
667
 
643
- if not args.all and not args.ignore_after:
668
+ if not args.all and not args.ignore_after and not args.ignore_all:
644
669
  filtered_data = filter_deferred(filtered_data, ignore_patterns)
645
670
 
646
- if not args.all:
671
+ if not args.all and not args.ignore_phase and not args.ignore_all:
647
672
  filtered_data = filter_phases(filtered_data)
648
673
 
649
- if not args.all and not args.summary:
674
+ if (
675
+ not args.all
676
+ and not args.ignore_queue
677
+ and not args.ignore_all
678
+ and not args.summary
679
+ ):
650
680
  filtered_data = filter_queue(filtered_data)
651
681
 
652
682
  if args.summary:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes