doing 1.0.37 → 1.0.42

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d00d66a9e4fa16bdc40697f2fa7b42685d87e64c757d6f5e0096dd8a07af4c37
4
- data.tar.gz: d7624aefddb7eb42b1a86c97f140e0881cbf2d8a41b34109d1f2f3a31b82c9b3
3
+ metadata.gz: f715c083c72c609fb2e2fc8c730cca68b8391dccbc4ca2168333dd9b30df0887
4
+ data.tar.gz: 3d7df2ec9624ae8d2b6822ccceed402c42f82f2a5b2e010c639880c9cd95580f
5
5
  SHA512:
6
- metadata.gz: a50d44f0db2756591fc7b7e276dd521a27f13fc893c91928386a504ffc874657bb3913cad123c59e5c86fbb858812aa91914082bd183652857a43d0455ee3047
7
- data.tar.gz: bf9684307fbdf99a5f6846ae09ecc3c574eecba8be0d609ce0ce7f00c838470d39b434e065725c951a140d1be921910b61376c0793319be184997daa0d4b98e3
6
+ metadata.gz: 4287daf5a4821ff6e295c36275d2101ecebefdc0adc962faefe82c460bd52f2e9a1a69e767e3ad59f7d68074a86807496e3e1669dd7f6f68688da903fb370309
7
+ data.tar.gz: 4a62305048b02bac186c63f951a6e3a7985663dc826070801c3a333b8e9388147435639910ac0f1fe24b0ad5a90e15b61510c0799ce94cf84060ca8fad097f0b
data/bin/doing CHANGED
@@ -604,6 +604,13 @@ command :show do |c|
604
604
  c.default_value false
605
605
  c.switch [:totals], :default_value => false, :negatable => true
606
606
 
607
+ c.desc 'Sort tags by (name|time)'
608
+ default = 'time'
609
+ if wwid.config.has_key?('tag_sort')
610
+ default = wwid.config['tag_sort']
611
+ end
612
+ c.flag [:tag_sort], :default_value => default
613
+
607
614
  c.desc 'Only show items with recorded time intervals'
608
615
  c.default_value false
609
616
  c.switch [:only_timed], :default_value => false, :negatable => false
@@ -666,7 +673,9 @@ command :show do |c|
666
673
 
667
674
  options[:t] = true if options[:totals]
668
675
 
669
- puts wwid.list_section({:section => section, :date_filter => dates, :count => options[:c].to_i, :tag_filter => tag_filter, :age => options[:a], :order => options[:s], :output => options[:output], :times => options[:t], :totals => options[:totals], :highlight => true, :only_timed => options[:only_timed]})
676
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
677
+
678
+ puts wwid.list_section({:section => section, :date_filter => dates, :count => options[:c].to_i, :tag_filter => tag_filter, :age => options[:a], :order => options[:s], :output => options[:output], :times => options[:t], :totals => options[:totals], :sort_tags => options[:sort_tags], :highlight => true, :only_timed => options[:only_timed]})
670
679
 
671
680
  end
672
681
  end
@@ -690,6 +699,13 @@ command [:grep,:search] do |c|
690
699
  c.default_value false
691
700
  c.switch [:totals], :default_value => false, :negatable => true
692
701
 
702
+ c.desc 'Sort tags by (name|time)'
703
+ default = 'time'
704
+ if wwid.config.has_key?('tag_sort')
705
+ default = wwid.config['tag_sort']
706
+ end
707
+ c.flag [:tag_sort], :default_value => default
708
+
693
709
  c.desc 'Only show items with recorded time intervals'
694
710
  c.default_value false
695
711
  c.switch [:only_timed], :default_value => false, :negatable => false
@@ -699,8 +715,9 @@ command [:grep,:search] do |c|
699
715
  section = wwid.guess_section(options[:s]) if options[:s]
700
716
 
701
717
  options[:t] = true if options[:totals]
718
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
702
719
 
703
- puts wwid.list_section({:search => args.join(' '), :section => section, :output => options[:output], :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => options[:only_timed]})
720
+ puts wwid.list_section({:search => args.join(' '), :section => section, :output => options[:output], :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => options[:only_timed], :sort_tags => options[:sort_tags]})
704
721
 
705
722
  end
706
723
  end
@@ -721,6 +738,13 @@ command :recent do |c|
721
738
  c.default_value false
722
739
  c.switch [:totals], :default_value => false, :negatable => true
723
740
 
741
+ c.desc 'Sort tags by (name|time)'
742
+ default = 'time'
743
+ if wwid.config.has_key?('tag_sort')
744
+ default = wwid.config['tag_sort']
745
+ end
746
+ c.flag [:tag_sort], :default_value => default
747
+
724
748
  c.action do |global_options,options,args|
725
749
 
726
750
  section = wwid.guess_section(options[:s]) || options[:s].cap_first
@@ -732,8 +756,9 @@ command :recent do |c|
732
756
  count = 10
733
757
  end
734
758
  options[:t] = true if options[:totals]
759
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
735
760
 
736
- puts wwid.recent(count,section.cap_first,{ :times => options[:t], :totals => options[:totals] })
761
+ puts wwid.recent(count,section.cap_first,{ :times => options[:t], :totals => options[:totals], :sort_tags => options[:sort_tags] })
737
762
 
738
763
  end
739
764
  end
@@ -754,14 +779,22 @@ command :today do |c|
754
779
  c.default_value false
755
780
  c.switch [:totals], :default_value => false, :negatable => true
756
781
 
782
+ c.desc 'Sort tags by (name|time)'
783
+ default = 'time'
784
+ if wwid.config.has_key?('tag_sort')
785
+ default = wwid.config['tag_sort']
786
+ end
787
+ c.flag [:tag_sort], :default_value => default
788
+
757
789
  c.desc 'Output to export format (csv|html|json)'
758
790
  c.flag [:o,:output]
759
791
 
760
792
  c.action do |global_options,options,args|
761
793
 
762
794
  options[:t] = true if options[:totals]
795
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
763
796
 
764
- puts wwid.today(options[:t],options[:output],{:totals => options[:totals], :section => options[:s]}).chomp
797
+ puts wwid.today(options[:t],options[:output],{:totals => options[:totals], :section => options[:s], :sort_tags => options[:sort_tags]}).chomp
765
798
 
766
799
  end
767
800
  end
@@ -783,6 +816,13 @@ command :on do |c|
783
816
  c.default_value false
784
817
  c.switch [:totals], :default_value => false, :negatable => true
785
818
 
819
+ c.desc 'Sort tags by (name|time)'
820
+ default = 'time'
821
+ if wwid.config.has_key?('tag_sort')
822
+ default = wwid.config['tag_sort']
823
+ end
824
+ c.flag [:tag_sort], :default_value => default
825
+
786
826
  c.desc 'Output to export format (csv|html|json)'
787
827
  c.flag [:o,:output]
788
828
 
@@ -806,8 +846,9 @@ command :on do |c|
806
846
  wwid.results.push(message)
807
847
 
808
848
  options[:t] = true if options[:totals]
849
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
809
850
 
810
- puts wwid.list_date([start,finish],options[:s],options[:t],options[:output],{:totals => options[:totals]}).chomp
851
+ puts wwid.list_date([start, finish], options[:s], options[:t], options[:output], {:totals => options[:totals], :sort_tags => options[:sort_tags]}).chomp
811
852
 
812
853
  end
813
854
  end
@@ -830,8 +871,16 @@ command :yesterday do |c|
830
871
  c.default_value false
831
872
  c.switch [:totals], :default_value => false, :negatable => true
832
873
 
874
+ c.desc 'Sort tags by (name|time)'
875
+ default = 'time'
876
+ if wwid.config.has_key?('tag_sort')
877
+ default = wwid.config['tag_sort']
878
+ end
879
+ c.flag [:tag_sort], :default_value => default
880
+
833
881
  c.action do |global_options, options,args|
834
- puts wwid.yesterday(options[:s],options[:t],options[:o],{:totals => options[:totals]}).chomp
882
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
883
+ puts wwid.yesterday(options[:s],options[:t],options[:o],{:totals => options[:totals], :sort_tags => options[:sort_tags]}).chomp
835
884
 
836
885
  end
837
886
  end
@@ -918,6 +967,13 @@ command :view do |c|
918
967
  c.default_value false
919
968
  c.switch [:totals], :default_value => false, :negatable => true
920
969
 
970
+ c.desc 'Sort tags by (name|time)'
971
+ default = 'time'
972
+ if wwid.config.has_key?('tag_sort')
973
+ default = wwid.config['tag_sort']
974
+ end
975
+ c.flag [:tag_sort], :default_value => default
976
+
921
977
  c.desc 'Only show items with recorded time intervals'
922
978
  c.default_value false
923
979
  c.switch [:only_timed], :default_value => false, :negatable => true
@@ -963,9 +1019,12 @@ command :view do |c|
963
1019
  count = options[:c] ? options[:c] : view.has_key?('count') ? view['count'] : 10
964
1020
  section = options[:s] ? section : view.has_key?('section') ? view['section'] : wwid.current_section
965
1021
  order = view.has_key?('order') ? view['order'] : "asc"
1022
+
966
1023
  options[:t] = true if options[:totals]
967
1024
  options[:output].downcase! if options[:output]
968
- puts wwid.list_section({:section => section, :count => count, :template => template, :format => format, :order => order, :tag_filter => tag_filter, :output => options[:o], :tags_color => tags_color, :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => only_timed })
1025
+ options[:sort_tags] = options[:tag_sort] =~ /^n/i
1026
+
1027
+ puts wwid.list_section({:section => section, :count => count, :template => template, :format => format, :order => order, :tag_filter => tag_filter, :output => options[:o], :tags_color => tags_color, :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => only_timed, :sort_tags => options[:sort_tags] })
969
1028
  else
970
1029
  if title.class == FalseClass
971
1030
  exit_now! "Cancelled"
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '1.0.37'
2
+ VERSION = '1.0.42'
3
3
  end
data/lib/doing/wwid.rb CHANGED
@@ -188,6 +188,7 @@ class WWID
188
188
  @config['marker_tag'] ||= 'flagged'
189
189
  @config['marker_color'] ||= 'red'
190
190
  @config['default_tags'] ||= []
191
+ @config['tag_sort'] ||= 'time'
191
192
 
192
193
  @current_section = config['current_section']
193
194
  @default_template = config['templates']['default']['template']
@@ -997,6 +998,7 @@ class WWID
997
998
  opt[:tags_color] ||= false
998
999
  opt[:times] ||= false
999
1000
  opt[:totals] ||= false
1001
+ opt[:sort_tags] ||= false
1000
1002
  opt[:search] ||= false
1001
1003
  opt[:only_timed] ||= false
1002
1004
  opt[:date_filter] ||= []
@@ -1123,7 +1125,6 @@ class WWID
1123
1125
  }
1124
1126
  out = output.join("")
1125
1127
  elsif opt[:output] == "json" || opt[:output] == "timeline"
1126
-
1127
1128
  items_out = []
1128
1129
  max = items[-1]['date'].strftime('%F')
1129
1130
  min = items[0]['date'].strftime('%F')
@@ -1135,7 +1136,6 @@ class WWID
1135
1136
  title = i['title']
1136
1137
  note = i['note'].map { |line| line.strip } if i['note']
1137
1138
  end
1138
-
1139
1139
  if i['title'] =~ /@done\((\d{4}-\d\d-\d\d \d\d:\d\d.*?)\)/ && opt[:times]
1140
1140
  end_date = Time.parse($1)
1141
1141
  interval = get_interval(i,false)
@@ -1150,14 +1150,16 @@ class WWID
1150
1150
  tags.push(tag[0]) unless skip_tags.include?(tag[0])
1151
1151
  }
1152
1152
  if opt[:output] == "json"
1153
+
1153
1154
  items_out << {
1154
1155
  :date => i['date'],
1155
1156
  :end_date => end_date,
1156
1157
  :title => title.strip, #+ " #{note}"
1157
- :note => note.class == Array ? note.join("\n") : note,
1158
+ :note => note.class == Array ? note.map(&:strip).join("\n") : note,
1158
1159
  :time => "%02d:%02d:%02d" % fmt_time(interval),
1159
1160
  :tags => tags
1160
1161
  }
1162
+
1161
1163
  elsif opt[:output] == "timeline"
1162
1164
  new_item = {
1163
1165
  'id' => index + 1,
@@ -1180,7 +1182,7 @@ class WWID
1180
1182
  out = {
1181
1183
  'section' => section,
1182
1184
  'items' => items_out,
1183
- 'timers' => tag_times("json")
1185
+ 'timers' => tag_times("json", opt[:sort_tags])
1184
1186
  }.to_json
1185
1187
  elsif opt[:output] == "timeline"
1186
1188
  template =<<EOTEMPLATE
@@ -1263,7 +1265,7 @@ EOTEMPLATE
1263
1265
  style = css_template
1264
1266
  end
1265
1267
 
1266
- totals = opt[:totals] ? tag_times("html") : ""
1268
+ totals = opt[:totals] ? tag_times("html", opt[:sort_tags]) : ""
1267
1269
  engine = Haml::Engine.new(template)
1268
1270
  puts engine.render(Object.new, { :@items => items_out, :@page_title => page_title, :@style => style, :@totals => totals })
1269
1271
  else
@@ -1278,7 +1280,7 @@ EOTEMPLATE
1278
1280
  end
1279
1281
 
1280
1282
  if (item.has_key?('note') && !item['note'].empty?) && @config[:include_notes]
1281
- note_lines = item['note'].delete_if{|line| line =~ /^\s*$/ }.map{|line| "\t" + line.sub(/^\t*/,'') + " " }
1283
+ note_lines = item['note'].delete_if{|line| line =~ /^\s*$/ }.map{|line| "\t\t" + line.sub(/^\t*/,'').sub(/^-/, '—') + " " }
1282
1284
  if opt[:wrap_width] && opt[:wrap_width] > 0
1283
1285
  width = opt[:wrap_width]
1284
1286
  note_lines.map! {|line|
@@ -1353,7 +1355,7 @@ EOTEMPLATE
1353
1355
 
1354
1356
  out += output + "\n"
1355
1357
  }
1356
- out += tag_times if opt[:totals]
1358
+ out += tag_times("text", opt[:sort_tags]) if opt[:totals]
1357
1359
  end
1358
1360
  return out
1359
1361
  end
@@ -1526,8 +1528,10 @@ EOTEMPLATE
1526
1528
  ##
1527
1529
  def today(times=true,output=nil,opt={})
1528
1530
  opt[:totals] ||= false
1531
+ opt[:sort_tags] ||= false
1532
+
1529
1533
  cfg = @config['templates']['today']
1530
- list_section({:section => opt[:section], :wrap_width => cfg['wrap_width'], :count => 0, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :today => true, :times => times, :output => output, :totals => opt[:totals]})
1534
+ list_section({:section => opt[:section], :wrap_width => cfg['wrap_width'], :count => 0, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :today => true, :times => times, :output => output, :totals => opt[:totals], :sort_tags => opt[:sort_tags]})
1531
1535
  end
1532
1536
 
1533
1537
  ##
@@ -1541,13 +1545,14 @@ EOTEMPLATE
1541
1545
  ##
1542
1546
  def list_date(dates,section,times=nil,output=nil,opt={})
1543
1547
  opt[:totals] ||= false
1548
+ opt[:sort_tags] ||= false
1544
1549
  section = guess_section(section)
1545
1550
  # :date_filter expects an array with start and end date
1546
1551
  if dates.class == String
1547
1552
  dates = [dates, dates]
1548
1553
  end
1549
1554
 
1550
- list_section({:section => section, :count => 0, :order => "asc", :date_filter => dates, :times => times, :output => output, :totals => opt[:totals] })
1555
+ list_section({:section => section, :count => 0, :order => "asc", :date_filter => dates, :times => times, :output => output, :totals => opt[:totals], :sort_tags => opt[:sort_tags] })
1551
1556
  end
1552
1557
 
1553
1558
  ##
@@ -1560,8 +1565,9 @@ EOTEMPLATE
1560
1565
  ##
1561
1566
  def yesterday(section,times=nil,output=nil,opt={})
1562
1567
  opt[:totals] ||= false
1568
+ opt[:sort_tags] ||= false
1563
1569
  section = guess_section(section)
1564
- list_section({:section => section, :count => 0, :order => "asc", :yesterday => true, :times => times, :output => output, :totals => opt[:totals] })
1570
+ list_section({:section => section, :count => 0, :order => "asc", :yesterday => true, :times => times, :output => output, :totals => opt[:totals], :sort_tags => opt[:sort_tags] })
1565
1571
  end
1566
1572
 
1567
1573
  ##
@@ -1574,10 +1580,12 @@ EOTEMPLATE
1574
1580
  def recent(count=10,section=nil,opt={})
1575
1581
  times = opt[:t] || true
1576
1582
  opt[:totals] ||= false
1583
+ opt[:sort_tags] ||= false
1584
+
1577
1585
  cfg = @config['templates']['recent']
1578
1586
  section ||= @current_section
1579
1587
  section = guess_section(section)
1580
- list_section({:section => section, :wrap_width => cfg['wrap_width'], :count => count, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :times => times, :totals => opt[:totals] })
1588
+ list_section({:section => section, :wrap_width => cfg['wrap_width'], :count => count, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :times => times, :totals => opt[:totals], :sort_tags => opt[:sort_tags] })
1581
1589
  end
1582
1590
 
1583
1591
  ##
@@ -1598,14 +1606,20 @@ EOTEMPLATE
1598
1606
  ##
1599
1607
  ## @param format (String) return format (html, json, or text)
1600
1608
  ##
1601
- def tag_times(format="text")
1602
-
1609
+ def tag_times(format="text", sort_by_name = false)
1603
1610
  return "" if @timers.empty?
1604
1611
 
1605
1612
  max = @timers.keys.sort_by {|k| k.length }.reverse[0].length + 1
1606
1613
 
1607
1614
  total = @timers.delete("All")
1608
1615
 
1616
+ tags_data = @timers.delete_if { |k,v| v == 0}
1617
+ if sort_by_name
1618
+ sorted_tags_data = tags_data.sort_by{|k,v| k }.reverse
1619
+ else
1620
+ sorted_tags_data = tags_data.sort_by{|k,v| v }
1621
+ end
1622
+
1609
1623
  if format == "html"
1610
1624
  output =<<EOS
1611
1625
  <table>
@@ -1622,9 +1636,7 @@ EOTEMPLATE
1622
1636
  </thead>
1623
1637
  <tbody>
1624
1638
  EOS
1625
- @timers.sort_by {|k,v|
1626
- v
1627
- }.reverse.each {|k,v|
1639
+ sorted_tags_data.reverse.each {|k,v|
1628
1640
  output += "<tr><td style='text-align:left;'>#{k}</td><td style='text-align:left;'>#{"%02d:%02d:%02d" % fmt_time(v)}</td></tr>\n" if v > 0
1629
1641
  }
1630
1642
  tail =<<EOS
@@ -1643,7 +1655,7 @@ EOS
1643
1655
  output + tail
1644
1656
  elsif format == "json"
1645
1657
  output = []
1646
- @timers.delete_if { |k,v| v == 0}.sort_by{|k,v| v }.reverse.each {|k,v|
1658
+ sorted_tags_data.reverse.each {|k,v|
1647
1659
  output << {
1648
1660
  'tag' => k,
1649
1661
  'seconds' => v,
@@ -1653,7 +1665,7 @@ EOS
1653
1665
  output
1654
1666
  else
1655
1667
  output = []
1656
- @timers.delete_if { |k,v| v == 0}.sort_by{|k,v| v }.reverse.each {|k,v|
1668
+ sorted_tags_data.reverse.each {|k,v|
1657
1669
  spacer = ""
1658
1670
  (max - k.length).times do
1659
1671
  spacer += " "
@@ -1704,11 +1716,15 @@ EOS
1704
1716
  regex = Regexp.new('@' + rx + '\b')
1705
1717
 
1706
1718
  matches = text.scan(regex)
1707
-
1708
1719
  matches.each {|m|
1709
- puts rx,r
1710
- new_tag = m[0].sub(Regexp.new(rx), r)
1711
- puts new_tag
1720
+ new_tag = r
1721
+ if m.kind_of?(Array)
1722
+ index = 1
1723
+ m.each {|v|
1724
+ new_tag = new_tag.gsub('\\' + index.to_s, v)
1725
+ index = index + 1
1726
+ }
1727
+ end
1712
1728
  tail_tags.push(new_tag)
1713
1729
  } if matches
1714
1730
  end
@@ -1782,6 +1798,10 @@ EOS
1782
1798
  if seconds.nil?
1783
1799
  return [0, 0, 0]
1784
1800
  end
1801
+ if seconds =~ /(\d+):(\d+):(\d+)/
1802
+ h, m, s = [$1, $2, $3]
1803
+ seconds = (h.to_i * 60 * 60) + (m.to_i * 60) + s.to_i
1804
+ end
1785
1805
  minutes = (seconds / 60).to_i
1786
1806
  hours = (minutes / 60).to_i
1787
1807
  days = (hours / 24).to_i
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.37
4
+ version: 1.0.42
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-05-14 00:00:00.000000000 Z
11
+ date: 2021-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake