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.
- {whatnext-3.1 → whatnext-3.2}/.github/workflows/tests.yml +1 -1
- {whatnext-3.1 → whatnext-3.2}/CHANGELOG.md +13 -0
- {whatnext-3.1 → whatnext-3.2}/PKG-INFO +2 -1
- {whatnext-3.1 → whatnext-3.2}/docs/usage.md +10 -4
- {whatnext-3.1 → whatnext-3.2}/pyproject.toml +1 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/deferring.md +6 -0
- whatnext-3.2/tasks/ignoring.md +3 -0
- whatnext-3.2/tasks/summaries.md +3 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring.bats +72 -0
- {whatnext-3.1 → whatnext-3.2}/tests/matching.bats +72 -0
- {whatnext-3.1 → whatnext-3.2}/tests/summary.bats +13 -13
- {whatnext-3.1 → whatnext-3.2}/tests/usage.bats +9 -3
- {whatnext-3.1 → whatnext-3.2}/whatnext/summary.py +6 -1
- {whatnext-3.1 → whatnext-3.2}/whatnext/whatnext.py +36 -6
- {whatnext-3.1 → whatnext-3.2}/.flake8 +0 -0
- {whatnext-3.1 → whatnext-3.2}/.github/dependabot.yml +0 -0
- {whatnext-3.1 → whatnext-3.2}/.github/workflows/publish.yml +0 -0
- {whatnext-3.1 → whatnext-3.2}/.gitignore +0 -0
- {whatnext-3.1 → whatnext-3.2}/.whatnext +0 -0
- {whatnext-3.1 → whatnext-3.2}/LICENCE +0 -0
- {whatnext-3.1 → whatnext-3.2}/LICENSE +0 -0
- {whatnext-3.1 → whatnext-3.2}/Makefile +0 -0
- {whatnext-3.1 → whatnext-3.2}/README.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/archive/done/tasks.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/annotations.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/basics.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/deadlines.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/deferring.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/exclusions.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/index.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/installation.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/next.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/prioritisation.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/docs/sequential.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/archived/projects/tangerine.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/projects/curtain.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/projects/fountain.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/projects/harvest.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/projects/obelisk.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/projects/tinsel.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/tasks.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/example/template.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/scripts/update-usage-examples.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/documentation.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/listing.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/next.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/test_refactor.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_0.1.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_0.2.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_0.3.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_0.4.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_0.5.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_1.0.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_1.1.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_1.2.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks/version_1.3.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tasks.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/colour.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config/.whatnext +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config/.whatnext.alt +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config/apples.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config/oranges.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config-external +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/config.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deadline.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/bare-after.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/circular-a.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/circular-b.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/deferred.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/duplicate-warnings.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/missing-dep.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/needs-absolute.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/needs-subdir.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/phase-misplaced.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-empty.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-partial.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases-queue.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/phases.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/regular.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/root-target.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/samename.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/needs-parent.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/needs-sibling.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/samename.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/deferring/subdir/target.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/edit.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/headerless/annotation.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/headerless/deadline.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/housekeeping.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/invalid.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/list.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/alternate.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/append-after.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/append.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/empty.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/insert.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/projects/alpha/tasks/things.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/projects/alpha/tasks.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/projects/beta/things.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/something.txt +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next/tasks.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/next.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/notnext.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue/all-complete.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue/blocked.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue/in-progress.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue/normal.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue/prioritised.md +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/queue.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_defer.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_edit.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_file.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_limit.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_output.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_summary.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/test_task.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/tests/version.bats +0 -0
- {whatnext-3.1 → whatnext-3.2}/whatnext/__init__.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/whatnext/guide.txt +0 -0
- {whatnext-3.1 → whatnext-3.2}/whatnext/models.py +0 -0
- {whatnext-3.1 → whatnext-3.2}/whatnext/next.py +0 -0
|
@@ -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.
|
|
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` —
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
311
|
+
███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5 25 30, of 33 total
|
|
306
312
|
|
|
307
313
|
█ High ░ (Overdue/Imminent/Medium/Normal)
|
|
308
314
|
```
|
|
@@ -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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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] [--
|
|
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] [--
|
|
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
|
|
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"{
|
|
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
|
|
253
|
-
|
|
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="
|
|
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
|
|
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
|
|
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
|