doing 1.0.65 → 1.0.66
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/doing +89 -36
- data/lib/doing.rb +1 -0
- data/lib/doing/version.rb +1 -1
- data/lib/doing/wwid.rb +15 -124
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e02c8453f718dfa428e578ab1b125528aa07ffee1390bbe8222fb425abd63fa
|
4
|
+
data.tar.gz: 333707321b7e92312ee8a2874292b45df782c83eff2ddcdb5279b648b14730ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 187ce7735035b86ae1233d08dd154f502c7b2def0fc1fd11532de5256647c8cce57bd4ea73ca3fa704c2dfb4a307b94f339222a476e3fd30ba991fea77daa190
|
7
|
+
data.tar.gz: 29f7123aa51cb8a5754bca68854dbbb606f69533d8cdbd90a7a2187ca1cc29dd09131aed0787f72fd680e2d04fe9e47a92555cf90c1327b74cba23cc8a2fab2b
|
data/README.md
CHANGED
@@ -29,7 +29,7 @@ _Side note:_ I actually use the library behind this utility as part of another s
|
|
29
29
|
|
30
30
|
## Installation
|
31
31
|
|
32
|
-
The current version of `doing` is <!--VER-->1.0.
|
32
|
+
The current version of `doing` is <!--VER-->1.0.65<!--END VER-->.
|
33
33
|
|
34
34
|
$ [sudo] gem install doing
|
35
35
|
|
data/bin/doing
CHANGED
@@ -52,7 +52,7 @@ flag %i[f doing_file]
|
|
52
52
|
|
53
53
|
desc 'Add an entry'
|
54
54
|
arg_name 'ENTRY'
|
55
|
-
command [
|
55
|
+
command %i[now next] do |c|
|
56
56
|
c.desc 'Section'
|
57
57
|
c.arg_name 'NAME'
|
58
58
|
c.flag %i[s section], default_value: wwid.current_section
|
@@ -105,7 +105,8 @@ command [:now, :next] do |c|
|
|
105
105
|
wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:f] })
|
106
106
|
wwid.write(wwid.doing_file)
|
107
107
|
elsif $stdin.stat.size.positive?
|
108
|
-
|
108
|
+
input = $stdin.read
|
109
|
+
title, note = wwid.format_input(input)
|
109
110
|
note.push(options[:n]) if options[:n]
|
110
111
|
wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:f] })
|
111
112
|
wwid.write(wwid.doing_file)
|
@@ -239,7 +240,7 @@ long_desc %(
|
|
239
240
|
|
240
241
|
Example `doing template HAML > ~/styles/my_doing.haml`
|
241
242
|
)
|
242
|
-
arg_name 'TYPE', must_match: /^(html|haml|css)/i
|
243
|
+
arg_name 'TYPE', must_match: /^(?:html|haml|css)/i
|
243
244
|
command :template do |c|
|
244
245
|
c.action do |_global_options, options, args|
|
245
246
|
raise 'No type specified, use `doing template [HAML|CSS]`' if args.empty?
|
@@ -443,7 +444,7 @@ command :cancel do |c|
|
|
443
444
|
|
444
445
|
c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters'
|
445
446
|
c.arg_name 'BOOLEAN'
|
446
|
-
c.flag [:bool], must_match:
|
447
|
+
c.flag [:bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'AND'
|
447
448
|
|
448
449
|
c.action do |_global_options, options, args|
|
449
450
|
section = wwid.guess_section(options[:s]) || options[:s].cap_first
|
@@ -452,7 +453,16 @@ command :cancel do |c|
|
|
452
453
|
tags = []
|
453
454
|
else
|
454
455
|
tags = options[:tag].split(/ *, */).map { |t| t.strip.sub(/^@/, '') }
|
455
|
-
options[:bool] =
|
456
|
+
options[:bool] = case options[:bool]
|
457
|
+
when /(and|all)/i
|
458
|
+
'AND'
|
459
|
+
when /(any|or)/i
|
460
|
+
'OR'
|
461
|
+
when /(not|none)/i
|
462
|
+
'NOT'
|
463
|
+
else
|
464
|
+
'AND'
|
465
|
+
end
|
456
466
|
end
|
457
467
|
|
458
468
|
raise 'Only one argument allowed' if args.length > 1
|
@@ -500,7 +510,7 @@ command :finish do |c|
|
|
500
510
|
|
501
511
|
c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters'
|
502
512
|
c.arg_name 'BOOLEAN'
|
503
|
-
c.flag [:bool], must_match:
|
513
|
+
c.flag [:bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'AND'
|
504
514
|
|
505
515
|
c.desc %(Auto-generate finish dates from next entry's start time.
|
506
516
|
Automatically generate completion dates 1 minute before next start date.
|
@@ -537,7 +547,16 @@ command :finish do |c|
|
|
537
547
|
tags = []
|
538
548
|
else
|
539
549
|
tags = options[:tag].split(/ *, */).map { |t| t.strip.sub(/^@/, '') }
|
540
|
-
options[:bool] =
|
550
|
+
options[:bool] = case options[:bool]
|
551
|
+
when /(and|all)/i
|
552
|
+
'AND'
|
553
|
+
when /(any|or)/i
|
554
|
+
'OR'
|
555
|
+
when /(not|none)/i
|
556
|
+
'NOT'
|
557
|
+
else
|
558
|
+
'AND'
|
559
|
+
end
|
541
560
|
end
|
542
561
|
|
543
562
|
raise 'Only one argument allowed' if args.length > 1
|
@@ -582,7 +601,7 @@ command [:again, :resume] do |c|
|
|
582
601
|
|
583
602
|
c.desc 'Boolean used to combine multiple tags'
|
584
603
|
c.arg_name 'BOOLEAN'
|
585
|
-
c.flag [:bool], must_match:
|
604
|
+
c.flag [:bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'AND'
|
586
605
|
|
587
606
|
c.desc 'Note'
|
588
607
|
c.arg_name 'TEXT'
|
@@ -590,6 +609,16 @@ command [:again, :resume] do |c|
|
|
590
609
|
|
591
610
|
c.action do |_global_options, options, _args|
|
592
611
|
tags = options[:tag].nil? ? [] : options[:tag].split(/ *, */).map { |t| t.sub(/^@/, '').strip }
|
612
|
+
options[:bool] = case options[:bool]
|
613
|
+
when /(and|all)/i
|
614
|
+
'AND'
|
615
|
+
when /(any|or)/i
|
616
|
+
'OR'
|
617
|
+
when /(not|none)/i
|
618
|
+
'NOT'
|
619
|
+
else
|
620
|
+
'AND'
|
621
|
+
end
|
593
622
|
opts = {
|
594
623
|
in: options[:in],
|
595
624
|
note: options[:n],
|
@@ -694,9 +723,9 @@ command :show do |c|
|
|
694
723
|
c.arg_name 'TAG'
|
695
724
|
c.flag [:tag]
|
696
725
|
|
697
|
-
c.desc 'Tag boolean (AND,OR,
|
726
|
+
c.desc 'Tag boolean (AND,OR,NOT)'
|
698
727
|
c.arg_name 'BOOLEAN'
|
699
|
-
c.flag %i[b bool], must_match:
|
728
|
+
c.flag %i[b bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'OR'
|
700
729
|
|
701
730
|
c.desc 'Max count to show'
|
702
731
|
c.arg_name 'MAX'
|
@@ -708,7 +737,7 @@ command :show do |c|
|
|
708
737
|
|
709
738
|
c.desc 'Sort order (asc/desc)'
|
710
739
|
c.arg_name 'ORDER'
|
711
|
-
c.flag %i[s sort], must_match: /^(a|d)/i, default_value: 'ASC'
|
740
|
+
c.flag %i[s sort], must_match: /^(?:a|d)/i, default_value: 'ASC'
|
712
741
|
|
713
742
|
c.desc %(
|
714
743
|
Date range to show, or a single day to filter date on.
|
@@ -728,14 +757,14 @@ command :show do |c|
|
|
728
757
|
default = 'time'
|
729
758
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
730
759
|
c.arg_name 'KEY'
|
731
|
-
c.flag [:tag_sort], must_match: /^(name|time)/i, default_value: default
|
760
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)/i, default_value: default
|
732
761
|
|
733
762
|
c.desc 'Only show items with recorded time intervals'
|
734
763
|
c.switch [:only_timed], default_value: false, negatable: false
|
735
764
|
|
736
765
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
737
766
|
c.arg_name 'FORMAT'
|
738
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
767
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
739
768
|
c.action do |_global_options, options, args|
|
740
769
|
tag_filter = false
|
741
770
|
tags = []
|
@@ -757,13 +786,9 @@ command :show do |c|
|
|
757
786
|
end
|
758
787
|
if args.length.positive?
|
759
788
|
args.each do |arg|
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
end
|
764
|
-
else
|
765
|
-
tags.push(arg.strip.sub(/^@/, ''))
|
766
|
-
end
|
789
|
+
arg.split(/,/).each do |tag|
|
790
|
+
tags.push(tag.strip.sub(/^@/, ''))
|
791
|
+
end
|
767
792
|
end
|
768
793
|
end
|
769
794
|
else
|
@@ -771,11 +796,21 @@ command :show do |c|
|
|
771
796
|
end
|
772
797
|
|
773
798
|
tags.concat(options[:tag].split(/ *, */).map { |t| t.sub(/^@/, '').strip }) if options[:tag]
|
799
|
+
options[:bool] = case options[:bool]
|
800
|
+
when /(and|all)/i
|
801
|
+
'AND'
|
802
|
+
when /(any|or)/i
|
803
|
+
'OR'
|
804
|
+
when /(not|none)/i
|
805
|
+
'NOT'
|
806
|
+
else
|
807
|
+
'AND'
|
808
|
+
end
|
774
809
|
|
775
810
|
unless tags.empty?
|
776
811
|
tag_filter = {
|
777
812
|
'tags' => tags,
|
778
|
-
'bool' => options[:
|
813
|
+
'bool' => options[:bool]
|
779
814
|
}
|
780
815
|
end
|
781
816
|
|
@@ -832,7 +867,7 @@ command [:grep, :search] do |c|
|
|
832
867
|
|
833
868
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
834
869
|
c.arg_name 'FORMAT'
|
835
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
870
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
836
871
|
|
837
872
|
c.desc 'Show time intervals on @done tasks'
|
838
873
|
c.switch %i[t times], default_value: true
|
@@ -844,7 +879,7 @@ command [:grep, :search] do |c|
|
|
844
879
|
default = 'time'
|
845
880
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
846
881
|
c.arg_name 'KEY'
|
847
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
882
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
848
883
|
|
849
884
|
c.desc 'Only show items with recorded time intervals'
|
850
885
|
c.switch [:only_timed], default_value: false, negatable: false
|
@@ -891,7 +926,7 @@ command :recent do |c|
|
|
891
926
|
default = 'time'
|
892
927
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
893
928
|
c.arg_name 'KEY'
|
894
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
929
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
895
930
|
|
896
931
|
c.action do |global_options, options, args|
|
897
932
|
section = wwid.guess_section(options[:s]) || options[:s].cap_first
|
@@ -931,11 +966,11 @@ command :today do |c|
|
|
931
966
|
default = 'time'
|
932
967
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
933
968
|
c.arg_name 'KEY'
|
934
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
969
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
935
970
|
|
936
971
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
937
972
|
c.arg_name 'FORMAT'
|
938
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
973
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
939
974
|
|
940
975
|
c.action do |_global_options, options, _args|
|
941
976
|
options[:t] = true if options[:totals]
|
@@ -966,11 +1001,11 @@ command :on do |c|
|
|
966
1001
|
default = 'time'
|
967
1002
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
968
1003
|
c.arg_name 'KEY'
|
969
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
1004
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
970
1005
|
|
971
1006
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
972
1007
|
c.arg_name 'FORMAT'
|
973
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
1008
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
974
1009
|
|
975
1010
|
c.action do |_global_options, options, args|
|
976
1011
|
exit_now! 'Missing date argument' if args.empty?
|
@@ -1008,7 +1043,7 @@ command :yesterday do |c|
|
|
1008
1043
|
|
1009
1044
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
1010
1045
|
c.arg_name 'FORMAT'
|
1011
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
1046
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
1012
1047
|
|
1013
1048
|
c.desc 'Show time intervals on @done tasks'
|
1014
1049
|
c.switch %i[t times], default_value: true
|
@@ -1020,7 +1055,7 @@ command :yesterday do |c|
|
|
1020
1055
|
default = 'time'
|
1021
1056
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
1022
1057
|
c.arg_name 'KEY'
|
1023
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
1058
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
1024
1059
|
|
1025
1060
|
c.action do |_global_options, options, _args|
|
1026
1061
|
options[:sort_tags] = options[:tag_sort] =~ /^n/i
|
@@ -1044,7 +1079,7 @@ command :last do |c|
|
|
1044
1079
|
|
1045
1080
|
c.desc 'Tag boolean'
|
1046
1081
|
c.arg_name 'BOOLEAN'
|
1047
|
-
c.flag [:bool], must_match: /(and|or|not)/i, default_value: 'AND'
|
1082
|
+
c.flag [:bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'AND'
|
1048
1083
|
|
1049
1084
|
c.desc 'Search filter, surround with slashes for regex (/query/)'
|
1050
1085
|
c.arg_name 'QUERY'
|
@@ -1057,7 +1092,15 @@ command :last do |c|
|
|
1057
1092
|
tags = []
|
1058
1093
|
else
|
1059
1094
|
tags = options[:tag].split(/ *, */).map { |t| t.strip.sub(/^@/, '') }
|
1060
|
-
options[:bool] =
|
1095
|
+
options[:bool] = case options[:bool]
|
1096
|
+
when /(any|or)/i
|
1097
|
+
:or
|
1098
|
+
when /(not|none)/i
|
1099
|
+
:not
|
1100
|
+
else
|
1101
|
+
:and
|
1102
|
+
end
|
1103
|
+
|
1061
1104
|
end
|
1062
1105
|
|
1063
1106
|
if options[:e]
|
@@ -1130,7 +1173,7 @@ command :view do |c|
|
|
1130
1173
|
|
1131
1174
|
c.desc 'Output to export format (csv|html|json|template|timeline)'
|
1132
1175
|
c.arg_name 'FORMAT'
|
1133
|
-
c.flag %i[o output], must_match: /^(template|html|csv|json|timeline)$/i
|
1176
|
+
c.flag %i[o output], must_match: /^(?:template|html|csv|json|timeline)$/i
|
1134
1177
|
|
1135
1178
|
c.desc 'Show time intervals on @done tasks'
|
1136
1179
|
c.switch %i[t times], default_value: true
|
@@ -1145,7 +1188,7 @@ command :view do |c|
|
|
1145
1188
|
default = 'time'
|
1146
1189
|
default = wwid.config['tag_sort'] if wwid.config.key?('tag_sort')
|
1147
1190
|
c.arg_name 'KEY'
|
1148
|
-
c.flag [:tag_sort], must_match: /^(name|time)$/i, default_value: default
|
1191
|
+
c.flag [:tag_sort], must_match: /^(?:name|time)$/i, default_value: default
|
1149
1192
|
|
1150
1193
|
c.desc 'Only show items with recorded time intervals'
|
1151
1194
|
c.switch [:only_timed], default_value: false, negatable: true
|
@@ -1178,7 +1221,7 @@ command :view do |c|
|
|
1178
1221
|
else
|
1179
1222
|
view['tags'].gsub(/[, ]+/, ' ').split(' ').map(&:strip)
|
1180
1223
|
end
|
1181
|
-
tag_filter['bool'] = view.key?('tags_bool') && !view['tags_bool'].nil? ? view['tags_bool'].
|
1224
|
+
tag_filter['bool'] = view.key?('tags_bool') && !view['tags_bool'].nil? ? view['tags_bool'].normalize_bool : :or
|
1182
1225
|
end
|
1183
1226
|
|
1184
1227
|
# If the -o/--output flag was specified, override any default in the view template
|
@@ -1257,7 +1300,7 @@ command :archive do |c|
|
|
1257
1300
|
|
1258
1301
|
c.desc 'Tag boolean (AND|OR|NOT)'
|
1259
1302
|
c.arg_name 'BOOLEAN'
|
1260
|
-
c.flag [:bool], must_match: /(and|or|not)/i, default_value: 'AND'
|
1303
|
+
c.flag [:bool], must_match: /(?:and|all|any|or|not|none)/i, default_value: 'AND'
|
1261
1304
|
|
1262
1305
|
c.desc 'Search filter'
|
1263
1306
|
c.arg_name 'QUERY'
|
@@ -1281,6 +1324,16 @@ command :archive do |c|
|
|
1281
1324
|
|
1282
1325
|
tags.concat(options[:tag].split(/ *, */).map { |t| t.sub(/^@/, '').strip }) if options[:tag]
|
1283
1326
|
|
1327
|
+
options[:bool] = case options[:bool]
|
1328
|
+
when /(and|all)/i
|
1329
|
+
'AND'
|
1330
|
+
when /(any|or)/i
|
1331
|
+
'OR'
|
1332
|
+
when /(not|none)/i
|
1333
|
+
'NOT'
|
1334
|
+
else
|
1335
|
+
'AND'
|
1336
|
+
end
|
1284
1337
|
opts = {
|
1285
1338
|
bool: options[:bool],
|
1286
1339
|
destination: options[:to],
|
data/lib/doing.rb
CHANGED
data/lib/doing/version.rb
CHANGED
data/lib/doing/wwid.rb
CHANGED
@@ -4,92 +4,6 @@ require 'deep_merge'
|
|
4
4
|
require 'open3'
|
5
5
|
require 'pp'
|
6
6
|
|
7
|
-
##
|
8
|
-
## @brief Hash helpers
|
9
|
-
##
|
10
|
-
class ::Hash
|
11
|
-
def has_tags?(tags, bool = 'AND')
|
12
|
-
tags = tags.split(/ *, */) if tags.is_a? String
|
13
|
-
item = self
|
14
|
-
case bool
|
15
|
-
when 'AND'
|
16
|
-
result = true
|
17
|
-
tags.each do |tag|
|
18
|
-
unless item['title'] =~ /@#{tag}/
|
19
|
-
result = false
|
20
|
-
break
|
21
|
-
end
|
22
|
-
end
|
23
|
-
result
|
24
|
-
when 'NOT'
|
25
|
-
result = true
|
26
|
-
tags.each do |tag|
|
27
|
-
if item['title'] =~ /@#{tag}/
|
28
|
-
result = false
|
29
|
-
break
|
30
|
-
end
|
31
|
-
end
|
32
|
-
result
|
33
|
-
else
|
34
|
-
result = false
|
35
|
-
tags.each do |tag|
|
36
|
-
if item['title'] =~ /@#{tag}/
|
37
|
-
result = true
|
38
|
-
break
|
39
|
-
end
|
40
|
-
end
|
41
|
-
result
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def matches_search?(search)
|
46
|
-
item = self
|
47
|
-
text = item['note'] ? item['title'] + item['note'].join(' ') : item['title']
|
48
|
-
pattern = if search.strip =~ %r{^/.*?/$}
|
49
|
-
search.sub(%r{/(.*?)/}, '\1')
|
50
|
-
else
|
51
|
-
search.split('').join('.{0,3}')
|
52
|
-
end
|
53
|
-
text =~ /#{pattern}/i ? true : false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
##
|
58
|
-
## @brief String helpers
|
59
|
-
##
|
60
|
-
class String
|
61
|
-
def cap_first
|
62
|
-
sub(/^\w/) do |m|
|
63
|
-
m.upcase
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
##
|
68
|
-
## @brief Turn raw urls into HTML links
|
69
|
-
##
|
70
|
-
## @param opt (Hash) Additional Options
|
71
|
-
##
|
72
|
-
def link_urls(opt = {})
|
73
|
-
opt[:format] ||= :html
|
74
|
-
if opt[:format] == :html
|
75
|
-
gsub(%r{(?mi)((http|https)://)?([\w\-_]+(\.[\w\-_]+)+)([\w\-.,@?^=%&:/~+#]*[\w\-@^=%&/~+#])?}) do |_match|
|
76
|
-
m = Regexp.last_match
|
77
|
-
proto = m[1].nil? ? 'http://' : ''
|
78
|
-
%(<a href="#{proto}#{m[0]}" title="Link to #{m[0]}">[#{m[3]}]</a>)
|
79
|
-
end.gsub(/<(\w+:.*?)>/) do |match|
|
80
|
-
m = Regexp.last_match
|
81
|
-
if m[1] =~ /<a href/
|
82
|
-
match
|
83
|
-
else
|
84
|
-
%(<a href="#{m[1]}" title="Link to #{m[1]}">[link]</a>)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
else
|
88
|
-
self
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
7
|
##
|
94
8
|
## @brief Main "What Was I Doing" methods
|
95
9
|
##
|
@@ -791,7 +705,7 @@ class WWID
|
|
791
705
|
opt[:section] ||= 'all'
|
792
706
|
opt[:note] ||= []
|
793
707
|
opt[:tag] ||= []
|
794
|
-
opt[:tag_bool] ||=
|
708
|
+
opt[:tag_bool] ||= :and
|
795
709
|
|
796
710
|
last = last_entry(opt)
|
797
711
|
if last.nil?
|
@@ -817,7 +731,7 @@ class WWID
|
|
817
731
|
## @param opt (Hash) Additional Options
|
818
732
|
##
|
819
733
|
def last_entry(opt = {})
|
820
|
-
opt[:tag_bool] ||=
|
734
|
+
opt[:tag_bool] ||= :and
|
821
735
|
opt[:section] ||= @current_section
|
822
736
|
|
823
737
|
sec_arr = []
|
@@ -1308,7 +1222,7 @@ class WWID
|
|
1308
1222
|
@content.each do |_k, v|
|
1309
1223
|
combined['items'] += v['items']
|
1310
1224
|
end
|
1311
|
-
section = if opt[:tag_filter] && opt[:tag_filter]['bool'] !=
|
1225
|
+
section = if opt[:tag_filter] && opt[:tag_filter]['bool'].normalize_bool != :not
|
1312
1226
|
opt[:tag_filter]['tags'].map do |tag|
|
1313
1227
|
"@#{tag}"
|
1314
1228
|
end.join(' + ')
|
@@ -1339,31 +1253,7 @@ class WWID
|
|
1339
1253
|
end
|
1340
1254
|
|
1341
1255
|
if opt[:tag_filter] && !opt[:tag_filter]['tags'].empty?
|
1342
|
-
items.
|
1343
|
-
case opt[:tag_filter]['bool']
|
1344
|
-
when /(AND|ALL)/
|
1345
|
-
del = false
|
1346
|
-
opt[:tag_filter]['tags'].each do |tag|
|
1347
|
-
unless item['title'] =~ /@#{tag}/
|
1348
|
-
del = true
|
1349
|
-
break
|
1350
|
-
end
|
1351
|
-
end
|
1352
|
-
del
|
1353
|
-
when /NONE/
|
1354
|
-
del = false
|
1355
|
-
opt[:tag_filter]['tags'].each do |tag|
|
1356
|
-
del = true if item['title'] =~ /@#{tag}/
|
1357
|
-
end
|
1358
|
-
del
|
1359
|
-
when /(OR|ANY)/
|
1360
|
-
del = true
|
1361
|
-
opt[:tag_filter]['tags'].each do |tag|
|
1362
|
-
del = false if item['title'] =~ /@#{tag}/
|
1363
|
-
end
|
1364
|
-
del
|
1365
|
-
end
|
1366
|
-
end
|
1256
|
+
items.select! { |item| item.has_tags?(opt[:tag_filter]['tags'], opt[:tag_filter]['bool']) }
|
1367
1257
|
end
|
1368
1258
|
|
1369
1259
|
if opt[:search]
|
@@ -1655,7 +1545,7 @@ class WWID
|
|
1655
1545
|
count = options[:keep] || 0
|
1656
1546
|
destination = options[:destination] || 'Archive'
|
1657
1547
|
tags = options[:tags] || []
|
1658
|
-
bool = options[:bool] ||
|
1548
|
+
bool = options[:bool] || :and
|
1659
1549
|
|
1660
1550
|
section = choose_section if section.nil? || section =~ /choose/i
|
1661
1551
|
archive_all = section =~ /^all$/i # && !(tags.nil? || tags.empty?)
|
@@ -1683,7 +1573,7 @@ class WWID
|
|
1683
1573
|
def do_archive(sect, destination, opt = {})
|
1684
1574
|
count = opt[:count] || 0
|
1685
1575
|
tags = opt[:tags] || []
|
1686
|
-
bool = opt[:bool] ||
|
1576
|
+
bool = opt[:bool] || :and
|
1687
1577
|
label = opt[:label] || true
|
1688
1578
|
|
1689
1579
|
if sect =~ /^all$/i
|
@@ -1696,7 +1586,7 @@ class WWID
|
|
1696
1586
|
counter = 0
|
1697
1587
|
|
1698
1588
|
all_sections.each do |section|
|
1699
|
-
items = @content[section]['items']
|
1589
|
+
items = @content[section]['items'].dup
|
1700
1590
|
|
1701
1591
|
moved_items = []
|
1702
1592
|
if !tags.empty? || opt[:search]
|
@@ -1720,13 +1610,7 @@ class WWID
|
|
1720
1610
|
@content[destination]['items'].concat(moved_items)
|
1721
1611
|
@results.push("Archived #{moved_items.length} items from #{section} to #{destination}")
|
1722
1612
|
else
|
1723
|
-
count = items.length if
|
1724
|
-
|
1725
|
-
@content[section]['items'] = if count.zero?
|
1726
|
-
[]
|
1727
|
-
else
|
1728
|
-
items[0..count - 1]
|
1729
|
-
end
|
1613
|
+
count = items.length if items.length < count
|
1730
1614
|
|
1731
1615
|
items.map! do |item|
|
1732
1616
|
if label && section != 'Currently'
|
@@ -1735,12 +1619,19 @@ class WWID
|
|
1735
1619
|
end
|
1736
1620
|
item
|
1737
1621
|
end
|
1622
|
+
|
1738
1623
|
if items.count > count
|
1739
1624
|
@content[destination]['items'].concat(items[count..-1])
|
1740
1625
|
else
|
1741
1626
|
@content[destination]['items'].concat(items)
|
1742
1627
|
end
|
1743
1628
|
|
1629
|
+
@content[section]['items'] = if count.zero?
|
1630
|
+
[]
|
1631
|
+
else
|
1632
|
+
items[0..count - 1]
|
1633
|
+
end
|
1634
|
+
|
1744
1635
|
@results.push("Archived #{items.length - count} items from #{section} to #{destination}")
|
1745
1636
|
end
|
1746
1637
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.66
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Terpstra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|