doing 1.0.80 → 1.0.81
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/doing +6 -2
- data/lib/doing/version.rb +1 -1
- data/lib/doing/wwid.rb +89 -64
- data/lib/doing.rb +3 -2
- 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: 860b1b1c3f8f1ffd33fc344cabb37a7a060cdcb80d54f65a8f3598450b4c22cf
|
4
|
+
data.tar.gz: 83767946e503d9bd2515aa99a7e11de87c2910f48a1b2c6e5a745c9e7dada0be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d78baf84b0bef668b7c877e908b6f1ee4ea05ce3914735f8d2e069abed215dfe5c9fc1fc3a9eb0dc5e4f5e251420d2454fb14a1b7465a5df8cf688e4b16b24ef
|
7
|
+
data.tar.gz: b38cf4b873baeb35ecab15ef10b3c1b8be4a7d2e28f9b34511d30f50def0b47ef127829bc5755bb0b2ba424183959dd009a222958df03ee8e54680e2ce267ab6
|
data/bin/doing
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
1
|
+
#!/usr/bin/env ruby -W1
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
$LOAD_PATH.unshift File.join(__dir__, '..', 'lib')
|
@@ -301,6 +301,9 @@ command :select do |c|
|
|
301
301
|
c.desc 'Add flag to selected item(s)'
|
302
302
|
c.switch %i[flag], negatable: false, default_value: false
|
303
303
|
|
304
|
+
c.desc 'Perform action without confirmation'
|
305
|
+
c.switch %i[force], negatable: false, default_value: false
|
306
|
+
|
304
307
|
c.desc 'Save selected entries to file using --output format'
|
305
308
|
c.arg_name 'FILE'
|
306
309
|
c.flag %i[save_to]
|
@@ -1306,7 +1309,8 @@ desc 'Select a section to display from a menu'
|
|
1306
1309
|
command :choose do |c|
|
1307
1310
|
c.action do |_global_options, _options, _args|
|
1308
1311
|
section = wwid.choose_section
|
1309
|
-
|
1312
|
+
|
1313
|
+
puts wwid.list_section({ section: section.cap_first, count: 0 }) if section
|
1310
1314
|
end
|
1311
1315
|
end
|
1312
1316
|
|
data/lib/doing/version.rb
CHANGED
data/lib/doing/wwid.rb
CHANGED
@@ -757,7 +757,7 @@ class WWID
|
|
757
757
|
all_items.concat(@content[section]['items'].dup) if @content.key?(section)
|
758
758
|
end
|
759
759
|
|
760
|
-
if opt[:tag]
|
760
|
+
if opt[:tag]&.length
|
761
761
|
all_items.select! { |item| item.has_tags?(opt[:tag], opt[:tag_bool]) }
|
762
762
|
elsif opt[:search]&.length
|
763
763
|
all_items.select! { |item| item.matches_search?(opt[:search]) }
|
@@ -771,9 +771,14 @@ class WWID
|
|
771
771
|
##
|
772
772
|
## @return (String) The selected option
|
773
773
|
##
|
774
|
-
def choose_from(options, prompt)
|
774
|
+
def choose_from(options, prompt: 'Make a selection: ', multiple: false, fzf_args: [])
|
775
775
|
fzf = File.join(File.dirname(__FILE__), '../helpers/fuzzyfilefinder')
|
776
|
-
|
776
|
+
fzf_args << '-1'
|
777
|
+
fzf_args << %(--prompt "#{prompt}")
|
778
|
+
fzf_args << '--multi' if multiple
|
779
|
+
header = "esc: cancel,#{multiple ? ' tab: multi-select, ctrl-a: select all,' : ''} return: confirm"
|
780
|
+
fzf_args << %(--header "#{header}")
|
781
|
+
res = `echo #{Shellwords.escape(options.join("\n"))}|#{fzf} #{fzf_args.join(' ')}`
|
777
782
|
return false if res.strip.size.zero?
|
778
783
|
|
779
784
|
res
|
@@ -807,7 +812,7 @@ class WWID
|
|
807
812
|
') ',
|
808
813
|
item['date'],
|
809
814
|
' | ',
|
810
|
-
item['title']
|
815
|
+
item['title']
|
811
816
|
]
|
812
817
|
if opt[:section] =~ /^all/i
|
813
818
|
out.concat([
|
@@ -818,8 +823,15 @@ class WWID
|
|
818
823
|
end
|
819
824
|
out.join('')
|
820
825
|
end
|
821
|
-
|
822
|
-
|
826
|
+
fzf_args = [
|
827
|
+
%(--header="Arrows: navigate, tab: mark for selection, ctrl-a: select all, enter: commit"),
|
828
|
+
%(--prompt="Select entries to act on > "),
|
829
|
+
'-1',
|
830
|
+
'-m',
|
831
|
+
'--bind ctrl-a:select-all',
|
832
|
+
%(-q "#{opt[:query]}")
|
833
|
+
]
|
834
|
+
res = `echo #{Shellwords.escape(options.join("\n"))}|#{fzf} #{fzf_args.join(' ')}`
|
823
835
|
selected = []
|
824
836
|
res.split(/\n/).each do |item|
|
825
837
|
idx = item.match(/^(\d+)\)/)[1].to_i
|
@@ -841,62 +853,71 @@ class WWID
|
|
841
853
|
end
|
842
854
|
|
843
855
|
unless has_action
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
opt[:
|
856
|
+
choice = choose_from([
|
857
|
+
'add tag',
|
858
|
+
'remove tag',
|
859
|
+
'cancel',
|
860
|
+
'delete',
|
861
|
+
'finish',
|
862
|
+
'flag',
|
863
|
+
'archive',
|
864
|
+
'move',
|
865
|
+
'edit',
|
866
|
+
'output formatted'
|
867
|
+
],
|
868
|
+
prompt: 'What do you want to do with the selected items? > ',
|
869
|
+
multiple: true,
|
870
|
+
fzf_args: ['--height=60%', '--tac', '--no-sort'])
|
871
|
+
return unless choice
|
872
|
+
|
873
|
+
to_do = choice.strip.split(/\n/)
|
874
|
+
to_do.each do |action|
|
875
|
+
case action
|
876
|
+
when /(add|remove) tag/
|
877
|
+
type = action =~ /^add/ ? 'add' : 'remove'
|
878
|
+
if opt[:tag]
|
879
|
+
warn "'add tag' and 'remove tag' can not be used together"
|
880
|
+
Process.exit 1
|
881
|
+
end
|
882
|
+
print "#{colors['yellow']}Tag to #{type}: #{colors['reset']}"
|
883
|
+
tag = STDIN.gets
|
884
|
+
return if tag =~ /^ *$/
|
885
|
+
opt[:tag] = tag.strip.sub(/^@/, '')
|
886
|
+
opt[:remove] = true if type == 'remove'
|
887
|
+
when /output formatted/
|
888
|
+
output_format = choose_from(%w[doing taskpaper json timeline html csv].sort, prompt: 'Which output format? > ', fzf_args: ['--height=60%', '--tac', '--no-sort'])
|
889
|
+
return if tag =~ /^ *$/
|
890
|
+
opt[:output] = output_format.strip
|
891
|
+
res = opt[:force] ? false : yn('Save to file?', default_response: 'n')
|
892
|
+
if res
|
893
|
+
print "#{colors['yellow']}File path/name: #{colors['reset']}"
|
894
|
+
filename = STDIN.gets.strip
|
895
|
+
return if filename.empty?
|
896
|
+
opt[:save_to] = filename
|
897
|
+
end
|
898
|
+
when /archive/
|
899
|
+
opt[:archive] = true
|
900
|
+
when /delete/
|
901
|
+
opt[:delete] = true
|
902
|
+
when /edit/
|
903
|
+
opt[:editor] = true
|
904
|
+
when /finish/
|
905
|
+
opt[:finish] = true
|
906
|
+
when /cancel/
|
907
|
+
opt[:cancel] = true
|
908
|
+
when /move/
|
909
|
+
section = choose_section.strip
|
910
|
+
opt[:move] = section.strip unless section =~ /^ *$/
|
911
|
+
when /flag/
|
912
|
+
opt[:flag] = true
|
875
913
|
end
|
876
|
-
when /archive/
|
877
|
-
opt[:archive] = true
|
878
|
-
when /delete/
|
879
|
-
opt[:delete] = true
|
880
|
-
when /edit/
|
881
|
-
opt[:editor] = true
|
882
|
-
when /finish/
|
883
|
-
opt[:finish] = true
|
884
|
-
when /cancel/
|
885
|
-
opt[:cancel] = true
|
886
|
-
when /move/
|
887
|
-
section = choose_section.strip
|
888
|
-
return if section =~ /^ *$/
|
889
|
-
opt[:move] = section.strip
|
890
|
-
when /flag/
|
891
|
-
opt[:flag] = true
|
892
914
|
end
|
893
915
|
end
|
894
916
|
|
895
|
-
|
896
917
|
if opt[:delete]
|
897
|
-
res = yn("Delete #{selected.size} items?", default_response: 'y')
|
918
|
+
res = opt[:force] ? true : yn("Delete #{selected.size} items?", default_response: 'y')
|
898
919
|
if res
|
899
|
-
selected.each {|item| delete_item(item) }
|
920
|
+
selected.each { |item| delete_item(item) }
|
900
921
|
write(@doing_file)
|
901
922
|
end
|
902
923
|
return
|
@@ -990,13 +1011,16 @@ class WWID
|
|
990
1011
|
item
|
991
1012
|
end
|
992
1013
|
|
993
|
-
@content = {'Export' => {'original' => 'Export:', 'items' => selected}}
|
994
|
-
options = {section: 'Export'}
|
1014
|
+
@content = { 'Export' => { 'original' => 'Export:', 'items' => selected } }
|
1015
|
+
options = { section: 'Export' }
|
995
1016
|
|
996
|
-
|
997
|
-
|
998
|
-
else
|
1017
|
+
case opt[:output]
|
1018
|
+
when /doing/
|
999
1019
|
options[:template] = '- %date | %title%note'
|
1020
|
+
when /taskpaper/
|
1021
|
+
options[:template] = '- %title @date(%date)%note'
|
1022
|
+
else
|
1023
|
+
options[:output] = opt[:output]
|
1000
1024
|
end
|
1001
1025
|
|
1002
1026
|
output = list_section(options)
|
@@ -1078,7 +1102,6 @@ class WWID
|
|
1078
1102
|
count = (opt[:count]).zero? ? items.length : opt[:count]
|
1079
1103
|
items.map! do |item|
|
1080
1104
|
break if idx == count
|
1081
|
-
|
1082
1105
|
finished = opt[:unfinished] && item.has_tags?('done', :and)
|
1083
1106
|
tag_match = opt[:tag].nil? || opt[:tag].empty? ? true : item.has_tags?(opt[:tag], opt[:tag_bool])
|
1084
1107
|
search_match = opt[:search].nil? || opt[:search].empty? ? true : item.matches_search?(opt[:search])
|
@@ -1503,7 +1526,8 @@ class WWID
|
|
1503
1526
|
## @return (String) The selected section name
|
1504
1527
|
##
|
1505
1528
|
def choose_section
|
1506
|
-
choose_from(sections, 'Choose a section > ')
|
1529
|
+
choice = choose_from(sections.sort, prompt: 'Choose a section > ', fzf_args: ['--height=60%'])
|
1530
|
+
choice ? choice.strip : choice
|
1507
1531
|
end
|
1508
1532
|
|
1509
1533
|
##
|
@@ -1521,7 +1545,8 @@ class WWID
|
|
1521
1545
|
## @return (String) The selected view name
|
1522
1546
|
##
|
1523
1547
|
def choose_view
|
1524
|
-
choose_from(views, 'Choose a view > ')
|
1548
|
+
choice = choose_from(views.sort, prompt: 'Choose a view > ', fzf_args: ['--height=60%'])
|
1549
|
+
choice ? choice.strip : choice
|
1525
1550
|
end
|
1526
1551
|
|
1527
1552
|
##
|
data/lib/doing.rb
CHANGED
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.81
|
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-09-
|
11
|
+
date: 2021-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|