doing 2.1.3 → 2.1.4pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +13 -10
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +27 -0
  6. data/Gemfile.lock +23 -1
  7. data/README.md +1 -1
  8. data/bin/doing +253 -63
  9. data/doc/Array.html +1 -1
  10. data/doc/Doing/Color.html +1 -1
  11. data/doc/Doing/Completion.html +1 -1
  12. data/doc/Doing/Configuration.html +42 -1
  13. data/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  14. data/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  15. data/doc/Doing/Errors/DoingStandardError.html +1 -1
  16. data/doc/Doing/Errors/EmptyInput.html +1 -1
  17. data/doc/Doing/Errors/NoResults.html +1 -1
  18. data/doc/Doing/Errors/PluginException.html +1 -1
  19. data/doc/Doing/Errors/UserCancelled.html +1 -1
  20. data/doc/Doing/Errors/WrongCommand.html +1 -1
  21. data/doc/Doing/Errors.html +1 -1
  22. data/doc/Doing/Hooks.html +1 -1
  23. data/doc/Doing/Item.html +37 -3
  24. data/doc/Doing/Items.html +35 -1
  25. data/doc/Doing/LogAdapter.html +1 -1
  26. data/doc/Doing/Note.html +1 -1
  27. data/doc/Doing/Pager.html +1 -1
  28. data/doc/Doing/Plugins.html +1 -1
  29. data/doc/Doing/Prompt.html +35 -1
  30. data/doc/Doing/Section.html +1 -1
  31. data/doc/Doing/Util.html +16 -4
  32. data/doc/Doing/WWID.html +131 -71
  33. data/doc/Doing.html +3 -3
  34. data/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  35. data/doc/GLI/Commands.html +1 -1
  36. data/doc/GLI.html +1 -1
  37. data/doc/Hash.html +1 -1
  38. data/doc/Status.html +1 -1
  39. data/doc/String.html +104 -2
  40. data/doc/Symbol.html +1 -1
  41. data/doc/Time.html +70 -2
  42. data/doc/_index.html +125 -4
  43. data/doc/class_list.html +1 -1
  44. data/doc/file.README.html +2 -2
  45. data/doc/index.html +2 -2
  46. data/doc/method_list.html +480 -144
  47. data/doc/top-level-namespace.html +2 -2
  48. data/doing.gemspec +2 -0
  49. data/doing.rdoc +155 -66
  50. data/lib/doing/boolean_term_parser.rb +86 -0
  51. data/lib/doing/configuration.rb +13 -4
  52. data/lib/doing/item.rb +94 -8
  53. data/lib/doing/items.rb +6 -0
  54. data/lib/doing/phrase_parser.rb +124 -0
  55. data/lib/doing/prompt.rb +8 -0
  56. data/lib/doing/string.rb +16 -2
  57. data/lib/doing/string_chronify.rb +5 -1
  58. data/lib/doing/time.rb +32 -0
  59. data/lib/doing/util.rb +2 -5
  60. data/lib/doing/util_backup.rb +235 -0
  61. data/lib/doing/version.rb +1 -1
  62. data/lib/doing/wwid.rb +81 -26
  63. data/lib/doing.rb +6 -0
  64. metadata +47 -4
@@ -82,7 +82,7 @@
82
82
  <p class="children">
83
83
 
84
84
 
85
- <strong class="modules">Modules:</strong> <span class='object_link'><a href="Doing.html" title="Doing (module)">Doing</a></span>, <span class='object_link'><a href="GLI.html" title="GLI (module)">GLI</a></span>, <span class='object_link'><a href="Status.html" title="Status (module)">Status</a></span>
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="BooleanTermParser.html" title="BooleanTermParser (module)">BooleanTermParser</a></span>, <span class='object_link'><a href="Doing.html" title="Doing (module)">Doing</a></span>, <span class='object_link'><a href="GLI.html" title="GLI (module)">GLI</a></span>, <span class='object_link'><a href="PhraseParser.html" title="PhraseParser (module)">PhraseParser</a></span>, <span class='object_link'><a href="Status.html" title="Status (module)">Status</a></span>
86
86
 
87
87
 
88
88
 
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Thu Dec 16 11:02:39 2021 by
105
+ Generated on Fri Dec 17 16:17:18 2021 by
106
106
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
107
  0.9.26 (ruby-3.0.1).
108
108
  </div>
data/doing.gemspec CHANGED
@@ -39,5 +39,7 @@ spec = Gem::Specification.new do |s|
39
39
  s.add_runtime_dependency('deep_merge', '~> 1.2', '>= 1.2.1')
40
40
  s.add_runtime_dependency('tty-link', '~> 0.1', '>= 0.1.1')
41
41
  s.add_runtime_dependency('tty-which', '~> 0.5', '>= 0.5.0')
42
+ s.add_runtime_dependency('tty-markdown', '~> 0.7', '>= 0.7.0')
43
+ s.add_runtime_dependency('parslet', '~> 2.0', '>= 2.0.0')
42
44
  # s.add_runtime_dependency('amatch', '~> 0.4', '>= 0.4.0')
43
45
  end
data/doing.rdoc CHANGED
@@ -5,7 +5,7 @@ record of what you've been doing, complete with tag-based time tracking. The
5
5
  command line tool allows you to add entries, annotate with tags and notes, and
6
6
  view your entries with myriad options, with a focus on a "natural" language syntax.
7
7
 
8
- v2.1.3
8
+ v2.1.4pre
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -90,14 +90,14 @@ Add a new section to the "doing" file
90
90
  ==== Command: <tt>again|resume </tt>
91
91
  Repeat last entry as new entry
92
92
 
93
-
93
+ This command is designed to allow multiple time intervals to be created for an entry by duplicating it with a new start (and end, eventually) time.
94
94
  ===== Options
95
95
  ===== --bool BOOLEAN
96
96
 
97
- Boolean used to combine multiple tags
97
+ Boolean used to combine multiple tags. Use PATTERN to parse + and - as booleans.
98
98
 
99
- [Default Value] AND
100
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
99
+ [Default Value] PATTERN
100
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
101
101
 
102
102
 
103
103
  ===== --case TYPE
@@ -139,7 +139,7 @@ Repeat last entry matching search. Surround with
139
139
 
140
140
  ===== --tag TAG
141
141
 
142
- Repeat last entry matching tags. Combine multiple tags with a comma.
142
+ Repeat last entry matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?).
143
143
 
144
144
  [Default Value] None
145
145
 
@@ -182,10 +182,10 @@ Archive entries older than date
182
182
 
183
183
  ===== --bool BOOLEAN
184
184
 
185
- Tag boolean (AND|OR|NOT)
185
+ Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.
186
186
 
187
- [Default Value] AND
188
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
187
+ [Default Value] PATTERN
188
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
189
189
 
190
190
 
191
191
  ===== --case TYPE
@@ -220,7 +220,7 @@ Move entries to
220
220
 
221
221
  ===== --tag TAG
222
222
 
223
- Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.
223
+ Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands.
224
224
 
225
225
  [Default Value] None
226
226
 
@@ -250,7 +250,7 @@ Autotag last entry or filtered entries
250
250
  Boolean (AND|OR|NOT) with which to combine multiple tag filters
251
251
 
252
252
  [Default Value] AND
253
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
253
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
254
254
 
255
255
 
256
256
  ===== -c|--count COUNT
@@ -307,10 +307,10 @@ Adds @done tag without datestamp so no elapsed time is recorded. Alias for `doin
307
307
  ===== Options
308
308
  ===== --bool BOOLEAN
309
309
 
310
- Boolean (AND|OR|NOT) with which to combine multiple tag filters
310
+ Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.
311
311
 
312
- [Default Value] AND
313
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
312
+ [Default Value] PATTERN
313
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
314
314
 
315
315
 
316
316
  ===== --case TYPE
@@ -337,7 +337,7 @@ Cancel the last X entries matching search filter, surround with slashes for rege
337
337
 
338
338
  ===== --tag TAG
339
339
 
340
- Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag1,tag2)
340
+ Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag1,tag2). Wildcards allowed (*, ?).
341
341
 
342
342
  [Default Value] None
343
343
 
@@ -367,6 +367,10 @@ Force exact search string matching (case sensitive)
367
367
 
368
368
 
369
369
 
370
+ ==== Command: <tt>changelog|changes </tt>
371
+ List recent changes in Doing
372
+
373
+ Display a formatted list of changes in recent versions, latest at the top
370
374
  ==== Command: <tt>choose </tt>
371
375
  Select a section to display from a menu
372
376
 
@@ -376,7 +380,8 @@ List available color variables for configuration templates and views
376
380
 
377
381
 
378
382
  ==== Command: <tt>completion </tt>
379
- Generate shell completion scripts
383
+ Generates the necessary scripts to add command line completion to various shells, so typing 'doing' and hitting
384
+ tab will offer completions of subcommands and their options.
380
385
 
381
386
 
382
387
  ===== Options
@@ -488,7 +493,9 @@ Update default config file, adding any missing keys
488
493
 
489
494
  [Default Command] edit
490
495
  ==== Command: <tt>done|did ENTRY</tt>
491
- Add a completed item with @done(date). No argument finishes last entry.
496
+ Use this command to add an entry after you've already finished it. It will be immediately marked as @done.
497
+ You can modify the start and end times of the entry using the --back, --took, and --at flags, making it an easy
498
+ way to add entries in post and maintain accurate (albeit manual) time tracking.
492
499
 
493
500
 
494
501
  ===== Options
@@ -576,10 +583,10 @@ Backdate completed date to date string [4pm|20m|2h|yesterday noon]
576
583
 
577
584
  ===== --bool BOOLEAN
578
585
 
579
- Boolean (AND|OR|NOT) with which to combine multiple tag filters
586
+ Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.
580
587
 
581
- [Default Value] AND
582
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
588
+ [Default Value] PATTERN
589
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
583
590
 
584
591
 
585
592
  ===== --case TYPE
@@ -614,7 +621,7 @@ Set the completed date to the start date plus XX[hmd]
614
621
  ===== --tag TAG
615
622
 
616
623
  Finish the last X entries containing TAG.
617
- Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool
624
+ Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).
618
625
 
619
626
  [Default Value] None
620
627
 
@@ -666,7 +673,7 @@ Search for entries
666
673
 
667
674
  Search all sections (or limit to a single section) for entries matching text or regular expression. Normal strings are fuzzy matched.
668
675
 
669
- To search with regular expressions, single quote the string and surround with slashes: `doing search '/\bm.*?x\b/'`
676
+ To search with regular expressions, single quote the string and surround with slashes: `doing search '/m.*?x/'`
670
677
  ===== Options
671
678
  ===== --after DATE_STRING
672
679
 
@@ -868,14 +875,15 @@ Force exact search string matching (case sensitive)
868
875
  ==== Command: <tt>last </tt>
869
876
  Show the last entry, optionally edit
870
877
 
871
-
878
+ Shows the last entry. Using --search and --tag filters, you can view/edit the last entry matching a filter,
879
+ allowing `doing last` to target historical entries.
872
880
  ===== Options
873
881
  ===== --bool BOOLEAN
874
882
 
875
- Tag boolean
883
+ Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.
876
884
 
877
- [Default Value] AND
878
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
885
+ [Default Value] PATTERN
886
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
879
887
 
880
888
 
881
889
  ===== --case TYPE
@@ -902,7 +910,7 @@ Search filter, surround with slashes for regex (/query/), start with single quot
902
910
 
903
911
  ===== --tag TAG
904
912
 
905
- Tag filter, combine multiple tags with a comma.
913
+ Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?).
906
914
 
907
915
  [Default Value] None
908
916
 
@@ -958,10 +966,10 @@ Mark last entry as flagged
958
966
  ===== Options
959
967
  ===== --bool BOOLEAN
960
968
 
961
- Boolean (AND|OR|NOT) with which to combine multiple tag filters
969
+ Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.
962
970
 
963
- [Default Value] AND
964
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
971
+ [Default Value] PATTERN
972
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
965
973
 
966
974
 
967
975
  ===== -c|--count COUNT
@@ -997,7 +1005,7 @@ Flag the last entry matching search filter, surround with slashes for regex (e.g
997
1005
  ===== --tag TAG
998
1006
 
999
1007
  Flag the last entry containing TAG.
1000
- Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool
1008
+ Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).
1001
1009
 
1002
1010
  [Default Value] None
1003
1011
 
@@ -1040,7 +1048,10 @@ Force exact search string matching (case sensitive)
1040
1048
  ==== Command: <tt>meanwhile ENTRY</tt>
1041
1049
  Finish any running @meanwhile tasks and optionally create a new one
1042
1050
 
1043
-
1051
+ The @meanwhile tag allows you to have long-running entries that encompass smaller entries.
1052
+ This command makes it easy to start and stop these overarching entries. Just run `doing meanwhile Starting work on this
1053
+ big project` to start a @meanwhile entry, add other entries as you work on the project, then use `doing meanwhile` by
1054
+ itself to mark the entry as @done.
1044
1055
  ===== Options
1045
1056
  ===== -b|--back DATE_STRING
1046
1057
 
@@ -1084,10 +1095,10 @@ If -r is provided with no other arguments, the last note is removed.
1084
1095
  ===== Options
1085
1096
  ===== --bool BOOLEAN
1086
1097
 
1087
- Boolean (AND|OR|NOT) with which to combine multiple tag filters
1098
+ Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.
1088
1099
 
1089
- [Default Value] AND
1090
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
1100
+ [Default Value] PATTERN
1101
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1091
1102
 
1092
1103
 
1093
1104
  ===== --case TYPE
@@ -1114,7 +1125,7 @@ Add/remove note from last entry matching search filter, surround with slashes fo
1114
1125
 
1115
1126
  ===== --tag TAG
1116
1127
 
1117
- Add/remove note from last entry matching tag
1128
+ Add/remove note from last entry matching tag. Wildcards allowed (*, ?).
1118
1129
 
1119
1130
  [Default Value] None
1120
1131
 
@@ -1231,7 +1242,8 @@ Show time totals at the end of output
1231
1242
  ==== Command: <tt>open </tt>
1232
1243
  Open the "doing" file in an editor
1233
1244
 
1234
- `doing open` defaults to using the editor_app setting in /Users/ttscoff/.config/doing/config.yml (not set).
1245
+ `doing open` defaults to using the editors->doing_file setting
1246
+ in /Users/ttscoff/.config/doing/config.yml (TaskPaper).
1235
1247
  ===== Options
1236
1248
  ===== -a|--app APP_NAME
1237
1249
 
@@ -1316,17 +1328,19 @@ Show intervals with totals at the end of output
1316
1328
 
1317
1329
 
1318
1330
 
1319
- ==== Command: <tt>reset|begin </tt>
1331
+ ==== Command: <tt>reset|begin DATE_STRING</tt>
1320
1332
  Reset the start time of an entry
1321
1333
 
1322
-
1334
+ Update the start time of the last entry or the last entry matching a tag/search filter.
1335
+ If no argument is provided, the start time will be reset to the current time.
1336
+ If a date string is provided as an argument, the start time will be set to the parsed result.
1323
1337
  ===== Options
1324
1338
  ===== --bool BOOLEAN
1325
1339
 
1326
1340
  Boolean (AND|OR|NOT) with which to combine multiple tag filters
1327
1341
 
1328
- [Default Value] AND
1329
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
1342
+ [Default Value] PATTERN
1343
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1330
1344
 
1331
1345
 
1332
1346
  ===== --case TYPE
@@ -1353,7 +1367,7 @@ Reset last entry matching search filter, surround with slashes for regex (e.g. "
1353
1367
 
1354
1368
  ===== --tag TAG
1355
1369
 
1356
- Reset last entry matching tag
1370
+ Reset last entry matching tag. Wildcards allowed (*, ?).
1357
1371
 
1358
1372
  [Default Value] None
1359
1373
 
@@ -1381,7 +1395,9 @@ Force exact search string matching (case sensitive)
1381
1395
  ==== Command: <tt>rotate </tt>
1382
1396
  Move entries to archive file
1383
1397
 
1384
-
1398
+ As your doing file grows, commands can get slow. Given that your historical data (and your archive section)
1399
+ probably aren't providing any useful insights a year later, use this command to "rotate" old entries out to an archive
1400
+ file. You'll still have access to all historical data, but it won't be slowing down daily operation.
1385
1401
  ===== Options
1386
1402
  ===== --before DATE_STRING
1387
1403
 
@@ -1393,10 +1409,10 @@ Rotate entries older than date
1393
1409
 
1394
1410
  ===== --bool BOOLEAN
1395
1411
 
1396
- Tag boolean (AND|OR|NOT)
1412
+ Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.
1397
1413
 
1398
- [Default Value] AND
1399
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
1414
+ [Default Value] PATTERN
1415
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1400
1416
 
1401
1417
 
1402
1418
  ===== --case TYPE
@@ -1431,7 +1447,7 @@ Search filter
1431
1447
 
1432
1448
  ===== --tag TAG
1433
1449
 
1434
- Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.
1450
+ Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands.
1435
1451
 
1436
1452
  [Default Value] None
1437
1453
 
@@ -1464,6 +1480,14 @@ List all entries and select with typeahead fuzzy matching.
1464
1480
  Multiple selections are allowed, hit tab to add the highlighted entry to the
1465
1481
  selection, and use ctrl-a to select all visible items. Return processes the
1466
1482
  selected entries.
1483
+
1484
+ Search in the menu by typing:
1485
+
1486
+ sbtrkt fuzzy-match Items that match sbtrkt
1487
+
1488
+ 'wild exact-match (quoted) Items that include wild
1489
+
1490
+ !fire inverse-exact-match Items that do not include fire
1467
1491
  ===== Options
1468
1492
  ===== --after DATE_STRING
1469
1493
 
@@ -1605,7 +1629,11 @@ Force exact search string matching (case sensitive)
1605
1629
  List all entries
1606
1630
 
1607
1631
  The argument can be a section name, @tag(s) or both.
1608
- "pick" or "choose" as an argument will offer a section menu.
1632
+ "pick" or "choose" as an argument will offer a section menu. Run with `--menu` to get a menu of available tags.
1633
+
1634
+ Show tags by passing @tagname arguments. Multiple tags can be combined, and you can specify the boolean used to
1635
+ combine them with `--bool (AND|OR|NOT)`. You can also use @+tagname to require a tag to match, or @-tagname to ignore
1636
+ entries containing tagname. +/- operators require `--bool PATTERN` (which is the default).
1609
1637
  ===== Options
1610
1638
  ===== -a|--age AGE
1611
1639
 
@@ -1623,10 +1651,10 @@ Show entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all d
1623
1651
 
1624
1652
  ===== -b|--bool BOOLEAN
1625
1653
 
1626
- Tag boolean (AND,OR,NOT)
1654
+ Tag boolean (AND,OR,NOT). Use PATTERN to parse + and - as booleans.
1627
1655
 
1628
- [Default Value] OR
1629
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
1656
+ [Default Value] PATTERN
1657
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1630
1658
 
1631
1659
 
1632
1660
  ===== --before DATE_STRING
@@ -1687,7 +1715,7 @@ Search filter, surround with slashes for regex (/query/), start with single quot
1687
1715
 
1688
1716
  ===== --tag TAG
1689
1717
 
1690
- Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.
1718
+ Tag filter, combine multiple tags with a comma. Use `--tag pick` for a menu of available tags. Wildcards allowed (*, ?). Added for compatibility with other commands.
1691
1719
 
1692
1720
  [Default Value] None
1693
1721
 
@@ -1718,6 +1746,11 @@ Select from a menu of matching entries to perform additional operations
1718
1746
 
1719
1747
 
1720
1748
 
1749
+ ===== -m|--menu
1750
+ Select section or tag to display from a menu
1751
+
1752
+
1753
+
1721
1754
  ===== --not
1722
1755
  Show items that *don't* match search/tag/date filters
1723
1756
 
@@ -1805,10 +1838,10 @@ Add (or remove) tags from the last entry, or from multiple entries
1805
1838
  ===== Options
1806
1839
  ===== --bool BOOLEAN
1807
1840
 
1808
- Boolean (AND|OR|NOT) with which to combine multiple tag filters
1841
+ Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.
1809
1842
 
1810
- [Default Value] AND
1811
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
1843
+ [Default Value] PATTERN
1844
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1812
1845
 
1813
1846
 
1814
1847
  ===== -c|--count COUNT
@@ -1851,7 +1884,7 @@ Tag entries matching search filter, surround with slashes for regex (e.g. "/quer
1851
1884
  ===== --tag TAG
1852
1885
 
1853
1886
  Tag the last X entries containing TAG.
1854
- Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool
1887
+ Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).
1855
1888
 
1856
1889
  [Default Value] None
1857
1890
 
@@ -1901,6 +1934,39 @@ Force exact search string matching (case sensitive)
1901
1934
 
1902
1935
 
1903
1936
 
1937
+ ==== Command: <tt>tags </tt>
1938
+ List all tags in the current Doing file
1939
+
1940
+
1941
+ ===== Options
1942
+ ===== -o|--order ORDER
1943
+
1944
+ Sort order (asc/desc)
1945
+
1946
+ [Default Value] asc
1947
+ [Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)
1948
+
1949
+
1950
+ ===== -s|--section SECTION_NAME
1951
+
1952
+ Section
1953
+
1954
+ [Default Value] All
1955
+
1956
+
1957
+ ===== --sort SORT_ORDER
1958
+
1959
+ Sort by name or count
1960
+
1961
+ [Default Value] name
1962
+ [Must Match] (?-mix:^(?:n(?:ame)?|c(?:ount)?)$)
1963
+
1964
+
1965
+ ===== -c|--[no-]counts
1966
+ Show count of occurrences
1967
+
1968
+
1969
+
1904
1970
  ==== Command: <tt>template TYPE</tt>
1905
1971
  Output HTML, CSS, and Markdown (ERB) templates for customization
1906
1972
 
@@ -1924,7 +1990,8 @@ This command is coming from /Users/ttscoff/.config/doing/commands/test.rb
1924
1990
  ==== Command: <tt>today </tt>
1925
1991
  List entries from today
1926
1992
 
1927
-
1993
+ List entries from the current day. Use --before, --after, and
1994
+ --from to specify time ranges.
1928
1995
  ===== Options
1929
1996
  ===== --after TIME_STRING
1930
1997
 
@@ -1984,10 +2051,13 @@ Show time totals at the end of output
1984
2051
 
1985
2052
 
1986
2053
 
1987
- ==== Command: <tt>undo </tt>
1988
- Undo the last change to the Doing file
2054
+ ==== Command: <tt>undo COUNT</tt>
2055
+ Undo the last X changes to the Doing file
1989
2056
 
2057
+ Reverts the last X commands that altered the doing file.
2058
+ All changes performed by a single command are undone at once.
1990
2059
 
2060
+ Specify a number to jump back multiple revisions, or use --select for an interactive menu.
1991
2061
  ===== Options
1992
2062
  ===== -f|--file PATH
1993
2063
 
@@ -1996,10 +2066,28 @@ Specify alternate doing file
1996
2066
  [Default Value] None
1997
2067
 
1998
2068
 
2069
+ ===== -p|--prune COUNT
2070
+
2071
+ Remove old backups, retaining X files
2072
+
2073
+ [Default Value] None
2074
+
2075
+
2076
+ ===== -i|--interactive
2077
+ Select from recent backups
2078
+
2079
+
2080
+
2081
+ ===== -r|--[no-]redo
2082
+ Redo last undo. Note: you cannot undo a redo.
2083
+
2084
+
2085
+
1999
2086
  ==== Command: <tt>view VIEW_NAME</tt>
2000
2087
  Display a user-created view
2001
2088
 
2002
- Command line options override view configuration
2089
+ Views are defined in your configuration (use `doing config` to edit).
2090
+ Command line options override view configuration.
2003
2091
  ===== Options
2004
2092
  ===== --after DATE_STRING
2005
2093
 
@@ -2010,10 +2098,10 @@ View entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all d
2010
2098
 
2011
2099
  ===== -b|--bool BOOLEAN
2012
2100
 
2013
- Tag boolean (AND,OR,NOT)
2101
+ Tag boolean (AND,OR,NOT). Use PATTERN to parse + and - as booleans.
2014
2102
 
2015
- [Default Value] OR
2016
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
2103
+ [Default Value] PATTERN
2104
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
2017
2105
 
2018
2106
 
2019
2107
  ===== --before DATE_STRING
@@ -2074,7 +2162,7 @@ Search filter, surround with slashes for regex (/query/), start with single quot
2074
2162
 
2075
2163
  ===== --tag TAG
2076
2164
 
2077
- Tag filter, combine multiple tags with a comma.
2165
+ Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?).
2078
2166
 
2079
2167
  [Default Value] None
2080
2168
 
@@ -2162,7 +2250,7 @@ Include entries newer than date
2162
2250
  Tag boolean (AND,OR,NOT)
2163
2251
 
2164
2252
  [Default Value] OR
2165
- [Must Match] (?i-mx:^(?:and|all|any|or|not|none)$)
2253
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
2166
2254
 
2167
2255
 
2168
2256
  ===== --before DATE_STRING
@@ -2208,7 +2296,8 @@ Only show items with recorded time intervals
2208
2296
 
2209
2297
 
2210
2298
  ==== Command: <tt>yesterday </tt>
2211
- List entries from yesterday
2299
+ Show only entries with start times within the previous 24 hour period. Use --before, --after, and --from to limit to
2300
+ time spans within the day.
2212
2301
 
2213
2302
 
2214
2303
  ===== Options
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parslet'
4
+
5
+ module BooleanTermParser
6
+ # This query parser adds an optional operator ("+" or "-") to the simple term
7
+ # parser. In order to do that, a new "clause" node is added to the parse tree.
8
+ class QueryParser < Parslet::Parser
9
+ rule(:term) { match('[^\s]').repeat(1).as(:term) }
10
+ rule(:operator) { (str('+') | str('-')).as(:operator) }
11
+ rule(:clause) { (operator.maybe >> term).as(:clause) }
12
+ rule(:space) { match('\s').repeat(1) }
13
+ rule(:query) { (clause >> space.maybe).repeat.as(:query) }
14
+ root(:query)
15
+ end
16
+
17
+ class QueryTransformer < Parslet::Transform
18
+ rule(:clause => subtree(:clause)) do
19
+ Clause.new(clause[:operator]&.to_s, clause[:term].to_s)
20
+ end
21
+ rule(:query => sequence(:clauses)) { Query.new(clauses) }
22
+ end
23
+
24
+ class Operator
25
+ def self.symbol(str)
26
+ case str
27
+ when '+'
28
+ :must
29
+ when '-'
30
+ :must_not
31
+ when nil
32
+ :should
33
+ else
34
+ raise "Unknown operator: #{str}"
35
+ end
36
+ end
37
+ end
38
+
39
+ class Clause
40
+ attr_accessor :operator, :term
41
+
42
+ def initialize(operator, term)
43
+ self.operator = Operator.symbol(operator)
44
+ self.term = term
45
+ end
46
+ end
47
+
48
+ class Query
49
+ attr_accessor :should_terms, :must_not_terms, :must_terms
50
+
51
+ def initialize(clauses)
52
+ grouped = clauses.chunk { |c| c.operator }.to_h
53
+ self.should_terms = grouped.fetch(:should, []).map(&:term)
54
+ self.must_not_terms = grouped.fetch(:must_not, []).map(&:term)
55
+ self.must_terms = grouped.fetch(:must, []).map(&:term)
56
+ end
57
+
58
+ def to_elasticsearch
59
+ query = {}
60
+
61
+ if should_terms.any?
62
+ query[:should] = should_terms.map do |term|
63
+ match(term)
64
+ end
65
+ end
66
+
67
+ if must_terms.any?
68
+ query[:must] = must_terms.map do |term|
69
+ match(term)
70
+ end
71
+ end
72
+
73
+ if must_not_terms.any?
74
+ query[:must_not] = must_not_terms.map do |term|
75
+ match(term)
76
+ end
77
+ end
78
+
79
+ query
80
+ end
81
+
82
+ def match(term)
83
+ term
84
+ end
85
+ end
86
+ end
@@ -7,7 +7,11 @@ module Doing
7
7
  class Configuration
8
8
  attr_reader :settings
9
9
 
10
- attr_writer :ignore_local, :config_file
10
+ attr_writer :ignore_local, :config_file, :force_answer
11
+
12
+ def force_answer
13
+ @force_answer ||= false
14
+ end
11
15
 
12
16
  MissingConfigFile = Class.new(RuntimeError)
13
17
 
@@ -26,10 +30,12 @@ module Doing
26
30
  'command_path' => File.join(Util.user_home, '.config', 'doing', 'commands')
27
31
  },
28
32
  'doing_file' => '~/what_was_i_doing.md',
33
+ 'backup_dir' => '~/.doing_backup',
29
34
  'current_section' => 'Currently',
30
35
  'paginate' => false,
31
36
  'never_time' => [],
32
37
  'never_finish' => [],
38
+ 'date_tags' => ['done', 'defer(?:red)?', 'waiting'],
33
39
 
34
40
  'timer_format' => 'text',
35
41
  'interval_format' => 'text',
@@ -128,10 +134,13 @@ module Doing
128
134
  ## @return [String] file path
129
135
  ##
130
136
  def choose_config
137
+ return @config_file if @force_answer
138
+
131
139
  if @additional_configs.count.positive?
132
- choices = [@config_file]
133
- choices.concat(@additional_configs)
134
- res = Doing::Prompt.choose_from(choices.uniq.sort.reverse, sorted: false, prompt: 'Local configs found, select which to update > ')
140
+ choices = [@config_file].concat(@additional_configs)
141
+ res = Doing::Prompt.choose_from(choices.uniq.sort.reverse,
142
+ sorted: false,
143
+ prompt: 'Local configs found, select which to update > ')
135
144
 
136
145
  raise UserCancelled, 'Cancelled' unless res
137
146