doing 2.1.6 → 2.1.10

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +9 -9
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +33 -0
  6. data/Gemfile.lock +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +12 -1
  9. data/bin/doing +29 -2
  10. data/docs/doc/Array.html +1 -1
  11. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  12. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  13. data/docs/doc/BooleanTermParser/Query.html +1 -1
  14. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  15. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  16. data/docs/doc/BooleanTermParser.html +1 -1
  17. data/docs/doc/Doing/Color.html +1 -1
  18. data/docs/doc/Doing/Completion.html +1 -1
  19. data/docs/doc/Doing/Configuration.html +2 -2
  20. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  21. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  22. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  23. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  24. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  25. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  26. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  27. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  28. data/docs/doc/Doing/Errors.html +1 -1
  29. data/docs/doc/Doing/Hooks.html +1 -1
  30. data/docs/doc/Doing/Item.html +1 -1
  31. data/docs/doc/Doing/Items.html +1 -1
  32. data/docs/doc/Doing/LogAdapter.html +1 -1
  33. data/docs/doc/Doing/Note.html +1 -1
  34. data/docs/doc/Doing/Pager.html +1 -1
  35. data/docs/doc/Doing/Plugins.html +1 -1
  36. data/docs/doc/Doing/Prompt.html +132 -18
  37. data/docs/doc/Doing/Section.html +1 -1
  38. data/docs/doc/Doing/TemplateString.html +2 -2
  39. data/docs/doc/Doing/Util/Backup.html +79 -2
  40. data/docs/doc/Doing/Util.html +1 -1
  41. data/docs/doc/Doing/WWID.html +90 -77
  42. data/docs/doc/Doing.html +2 -2
  43. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  44. data/docs/doc/GLI/Commands.html +1 -1
  45. data/docs/doc/GLI.html +1 -1
  46. data/docs/doc/Hash.html +1 -1
  47. data/docs/doc/PhraseParser/Operator.html +1 -1
  48. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  49. data/docs/doc/PhraseParser/Query.html +1 -1
  50. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  51. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  52. data/docs/doc/PhraseParser/TermClause.html +1 -1
  53. data/docs/doc/PhraseParser.html +1 -1
  54. data/docs/doc/Status.html +1 -1
  55. data/docs/doc/String.html +97 -1
  56. data/docs/doc/Symbol.html +36 -2
  57. data/docs/doc/Time.html +1 -1
  58. data/docs/doc/_index.html +1 -1
  59. data/docs/doc/file.README.html +2 -2
  60. data/docs/doc/index.html +2 -2
  61. data/docs/doc/method_list.html +299 -235
  62. data/docs/doc/top-level-namespace.html +1 -1
  63. data/docs/index.md +1 -1
  64. data/doing.rdoc +9 -2
  65. data/generate_completions.sh +1 -3
  66. data/lib/completion/_doing.zsh +1 -1
  67. data/lib/completion/doing.bash +2 -2
  68. data/lib/completion/doing.fish +2 -1
  69. data/lib/doing/completion/bash_completion.rb +2 -2
  70. data/lib/doing/completion/fish_completion.rb +2 -2
  71. data/lib/doing/completion/zsh_completion.rb +2 -2
  72. data/lib/doing/completion.rb +12 -2
  73. data/lib/doing/configuration.rb +1 -1
  74. data/lib/doing/log_adapter.rb +1 -0
  75. data/lib/doing/prompt.rb +47 -8
  76. data/lib/doing/string.rb +20 -0
  77. data/lib/doing/symbol.rb +4 -0
  78. data/lib/doing/util_backup.rb +22 -3
  79. data/lib/doing/version.rb +1 -1
  80. data/lib/doing/wwid.rb +75 -45
  81. data/scripts/generate_bash_completions.rb +2 -2
  82. metadata +2 -3
  83. data/lib/helpers/fuzzyfilefinder +0 -0
data/lib/doing/wwid.rb CHANGED
@@ -338,7 +338,8 @@ module Doing
338
338
  ## @option opt :back [Date] backdate
339
339
  ## @option opt :timed [Boolean] new item is timed entry, marks previous entry as @done
340
340
  ##
341
- def add_item(title, section = nil, opt = {})
341
+ def add_item(title, section = nil, opt)
342
+ opt ||= {}
342
343
  section ||= @config['current_section']
343
344
  @content.add_section(section, log: false)
344
345
  opt[:back] ||= opt[:date] ? opt[:date] : Time.now
@@ -401,7 +402,8 @@ module Doing
401
402
  ## @param paths [String] Path to JSON report file
402
403
  ## @param opt [Hash] Additional Options
403
404
  ##
404
- def import(paths, opt = {})
405
+ def import(paths, opt)
406
+ opt ||= {}
405
407
  Plugins.plugins[:import].each do |_, options|
406
408
  next unless opt[:type] =~ /^(#{options[:trigger].normalize_trigger})$/i
407
409
 
@@ -461,7 +463,8 @@ module Doing
461
463
  #
462
464
  # @return nothing
463
465
  #
464
- def repeat_item(item, opt = {})
466
+ def repeat_item(item, opt)
467
+ opt ||= {}
465
468
  if item.should_finish?
466
469
  if item.should_time?
467
470
  item.title.tag!('done', value: Time.now.strftime('%F %R'))
@@ -501,7 +504,8 @@ module Doing
501
504
  ##
502
505
  ## @param opt [Hash] Additional Options
503
506
  ##
504
- def repeat_last(opt = {})
507
+ def repeat_last(opt)
508
+ opt ||= {}
505
509
  opt[:section] ||= 'all'
506
510
  opt[:section] = guess_section(opt[:section])
507
511
  opt[:note] ||= []
@@ -523,7 +527,8 @@ module Doing
523
527
  ##
524
528
  ## @param opt [Hash] Additional Options
525
529
  ##
526
- def last_entry(opt = {})
530
+ def last_entry(opt)
531
+ opt ||= {}
527
532
  opt[:tag_bool] ||= :and
528
533
  opt[:section] ||= @config['current_section']
529
534
 
@@ -615,19 +620,19 @@ module Doing
615
620
  ## @param items [Array] The items to filter (if empty, filters all items)
616
621
  ## @param opt [Hash] The filter parameters
617
622
  ##
618
- ## @option opt [String] :section
619
- ## @option opt [Boolean] :unfinished
620
- ## @option opt [Array or String] :tag (Array or comma-separated string)
621
- ## @option opt [Symbol] :tag_bool (:and, :or, :not)
622
- ## @option opt [String] :search (string, optional regex with //)
623
- ## @option opt [Array] :date_filter [[Time]start, [Time]end]
624
- ## @option opt [Boolean] :only_timed
625
- ## @option opt [String] :before (Date/Time string, unparsed)
626
- ## @option opt [String] :after (Date/Time string, unparsed)
627
- ## @option opt [Boolean] :today
628
- ## @option opt [Boolean] :yesterday
629
- ## @option opt [Number] :count (Number to return)
630
- ## @option opt [String] :age ('old' or 'new')
623
+ ## @option opt [String] :section ('all')
624
+ ## @option opt [Boolean] :unfinished (false)
625
+ ## @option opt [Array or String] :tag ([]) Array or comma-separated string
626
+ ## @option opt [Symbol] :tag_bool (:and) :and, :or, :not
627
+ ## @option opt [String] :search ('') string, optional regex with `/string/`
628
+ ## @option opt [Array] :date_filter (nil) [[Time]start, [Time]end]
629
+ ## @option opt [Boolean] :only_timed (false)
630
+ ## @option opt [String] :before (nil) Date/Time string, unparsed
631
+ ## @option opt [String] :after (nil) Date/Time string, unparsed
632
+ ## @option opt [Boolean] :today (false) limit to entries from today
633
+ ## @option opt [Boolean] :yesterday (false) limit to entries from yesterday
634
+ ## @option opt [Number] :count (0) max entries to return
635
+ ## @option opt [String] :age (new) 'old' or 'new'
631
636
  ##
632
637
  def filter_items(items = Items.new, opt: {})
633
638
  time_rx = /^(\d{1,2}+(:\d{1,2}+)?( *(am|pm))?|midnight|noon)$/
@@ -784,7 +789,7 @@ module Doing
784
789
 
785
790
  output = Items.new
786
791
 
787
- if opt[:age] =~ /^o/i
792
+ if opt[:age] && opt[:age].normalize_age == :oldest
788
793
  output.concat(filtered_items.slice(0, count).reverse)
789
794
  else
790
795
  output.concat(filtered_items.reverse.slice(0, count))
@@ -800,7 +805,8 @@ module Doing
800
805
  ##
801
806
  ## Options hash is shared with #filter_items and #act_on
802
807
  ##
803
- def interactive(opt = {})
808
+ def interactive(opt)
809
+ opt ||= {}
804
810
  opt[:section] = opt[:section] ? guess_section(opt[:section]) : 'All'
805
811
 
806
812
  search = nil
@@ -820,7 +826,11 @@ module Doing
820
826
  }
821
827
  items = filter_items(Items.new, opt: filter_options)
822
828
 
823
- selection = Prompt.choose_from_items(items, include_section: opt[:section] =~ /^all$/i, **opt)
829
+ menu_options = %i[search query exact multiple show_if_single menu sort case].each_with_object({}) {
830
+ |k, hsh| hsh[k] = opt[k]
831
+ }
832
+
833
+ selection = Prompt.choose_from_items(items, include_section: opt[:section] =~ /^all$/i, **menu_options)
824
834
 
825
835
  raise NoResults, 'no items selected' if selection.nil? || selection.empty?
826
836
 
@@ -848,7 +858,8 @@ module Doing
848
858
  ## @option opt [Boolean] :again
849
859
  ## @option opt [Boolean] :resume
850
860
  ##
851
- def act_on(items, opt = {})
861
+ def act_on(items, opt)
862
+ opt ||= {}
852
863
  actions = %i[editor delete tag flag finish cancel archive output save_to again resume]
853
864
  has_action = false
854
865
  single = items.count == 1
@@ -1105,7 +1116,8 @@ module Doing
1105
1116
  ##
1106
1117
  ## @see #filter_items
1107
1118
  ##
1108
- def tag_last(opt = {})
1119
+ def tag_last(opt)
1120
+ opt ||= {}
1109
1121
  opt[:count] ||= 1
1110
1122
  opt[:archive] ||= false
1111
1123
  opt[:tags] ||= ['done']
@@ -1229,7 +1241,8 @@ module Doing
1229
1241
  ##
1230
1242
  ## @return [Item] the next chronological item in the index
1231
1243
  ##
1232
- def next_item(item, options = {})
1244
+ def next_item(item, options)
1245
+ options ||= {}
1233
1246
  items = filter_items(Items.new, opt: options)
1234
1247
 
1235
1248
  idx = items.index(item)
@@ -1287,7 +1300,8 @@ module Doing
1287
1300
  ## @option opt :back [Date] backdate new item
1288
1301
  ## @option opt :new_item [String] content to use for new item
1289
1302
  ## @option opt :note [Array] note content for new item
1290
- def stop_start(target_tag, opt = {})
1303
+ def stop_start(target_tag, opt)
1304
+ opt ||= {}
1291
1305
  tag = target_tag.dup
1292
1306
  opt[:section] ||= @config['current_section']
1293
1307
  opt[:archive] ||= false
@@ -1354,7 +1368,8 @@ module Doing
1354
1368
  ##
1355
1369
  ## Rename doing file with date and start fresh one
1356
1370
  ##
1357
- def rotate(opt = {})
1371
+ def rotate(opt)
1372
+ opt ||= {}
1358
1373
  keep = opt[:keep] || 0
1359
1374
  tags = []
1360
1375
  tags.concat(opt[:tag].split(/ *, */).map { |t| t.sub(/^@/, '').strip }) if opt[:tag]
@@ -1369,7 +1384,7 @@ module Doing
1369
1384
  counter = 0
1370
1385
  new_content = Items.new
1371
1386
 
1372
- @content.each do |item|
1387
+ section_items.each do |item|
1373
1388
  break if counter >= max
1374
1389
  if opt[:before]
1375
1390
  time_string = opt[:before]
@@ -1482,7 +1497,7 @@ module Doing
1482
1497
  ##
1483
1498
  ## @param opt [Hash] Additional Options
1484
1499
  ##
1485
- def list_section(opt = {}, items: Items.new)
1500
+ def list_section(opt, items: Items.new)
1486
1501
  opt[:config_template] ||= 'default'
1487
1502
 
1488
1503
  tpl_cfg = @config.dig('templates', opt[:config_template])
@@ -1504,7 +1519,8 @@ module Doing
1504
1519
  opt[:duration] ||= cfg['duration'] || false
1505
1520
  opt[:interval_format] ||= cfg['interval_format'] || 'text'
1506
1521
  opt[:count] ||= 0
1507
- opt[:age] ||= 'newest'
1522
+ opt[:age] ||= :newest
1523
+ opt[:age] = opt[:age].normalize_age
1508
1524
  opt[:format] ||= cfg['date_format']
1509
1525
  opt[:order] ||= cfg['order'] || 'asc'
1510
1526
  opt[:tag_order] ||= 'asc'
@@ -1559,7 +1575,8 @@ module Doing
1559
1575
  ## @param section [String] The source section
1560
1576
  ## @param options [Hash] Options
1561
1577
  ##
1562
- def archive(section = @config['current_section'], options = {})
1578
+ def archive(section = @config['current_section'], options)
1579
+ options ||= {}
1563
1580
  count = options[:keep] || 0
1564
1581
  destination = options[:destination] || 'Archive'
1565
1582
  tags = options[:tags] || []
@@ -1589,7 +1606,8 @@ module Doing
1589
1606
  ## @param output [String] output format
1590
1607
  ## @param opt [Hash] Options
1591
1608
  ##
1592
- def today(times = true, output = nil, opt = {})
1609
+ def today(times = true, output = nil, opt)
1610
+ opt ||= {}
1593
1611
  opt[:totals] ||= false
1594
1612
  opt[:sort_tags] ||= false
1595
1613
 
@@ -1637,7 +1655,8 @@ module Doing
1637
1655
  ## @param output [String] Output format
1638
1656
  ## @param opt [Hash] Additional Options
1639
1657
  ##
1640
- def list_date(dates, section, times = nil, output = nil, opt = {})
1658
+ def list_date(dates, section, times = nil, output = nil, opt)
1659
+ opt ||= {}
1641
1660
  opt[:totals] ||= false
1642
1661
  opt[:sort_tags] ||= false
1643
1662
  section = guess_section(section)
@@ -1666,7 +1685,8 @@ module Doing
1666
1685
  ## @param output [String] Output format
1667
1686
  ## @param opt [Hash] Additional Options
1668
1687
  ##
1669
- def yesterday(section, times = nil, output = nil, opt = {})
1688
+ def yesterday(section, times = nil, output = nil, opt)
1689
+ opt ||= {}
1670
1690
  opt[:totals] ||= false
1671
1691
  opt[:sort_tags] ||= false
1672
1692
  section = guess_section(section)
@@ -1701,7 +1721,8 @@ module Doing
1701
1721
  ## @param section [String] The section to show from, default Currently
1702
1722
  ## @param opt [Hash] Additional Options
1703
1723
  ##
1704
- def recent(count = 10, section = nil, opt = {})
1724
+ def recent(count = 10, section = nil, opt)
1725
+ opt ||= {}
1705
1726
  times = opt[:t] || true
1706
1727
  opt[:totals] ||= false
1707
1728
  opt[:sort_tags] ||= false
@@ -1720,10 +1741,16 @@ module Doing
1720
1741
  section ||= @config['current_section']
1721
1742
  section = guess_section(section)
1722
1743
 
1723
- list_section({ section: section, wrap_width: cfg['wrap_width'], count: count,
1724
- format: cfg['date_format'], template: cfg['template'],
1725
- order: 'asc', times: times, totals: opt[:totals],
1726
- sort_tags: opt[:sort_tags], tags_color: opt[:tags_color], config_template: 'recent' })
1744
+ opt[:section] = section
1745
+ opt[:wrap_width] = cfg['wrap_width']
1746
+ opt[:count] = count
1747
+ opt[:format] = cfg['date_format']
1748
+ opt[:template] = cfg['template']
1749
+ opt[:order] = 'asc'
1750
+ opt[:times] = times
1751
+ opt[:config_template] = 'recent'
1752
+
1753
+ list_section(opt)
1727
1754
  end
1728
1755
 
1729
1756
  ##
@@ -1776,13 +1803,14 @@ module Doing
1776
1803
  ## Does not repeat tags in a title, and only converts the first instance of an
1777
1804
  ## untagged keyword
1778
1805
  ##
1779
- ## @param text [String] The text to tag
1806
+ ## @param string [String] The text to tag
1780
1807
  ##
1781
- def autotag(text)
1782
- return unless text
1783
- return text unless @auto_tag
1808
+ def autotag(string)
1809
+ return unless string
1810
+ return string unless @auto_tag
1784
1811
 
1785
- original = text.dup
1812
+ original = string.dup
1813
+ text = string.dup
1786
1814
 
1787
1815
  current_tags = text.scan(/@\w+/).map { |t| t.sub(/^@/, '') }
1788
1816
  tagged = {
@@ -2091,7 +2119,8 @@ EOS
2091
2119
  ## @return [String] formatted output based on opt[:output]
2092
2120
  ## template trigger
2093
2121
  ##
2094
- def output(items, title, is_single, opt = {})
2122
+ def output(items, title, is_single, opt)
2123
+ opt ||= {}
2095
2124
  out = nil
2096
2125
 
2097
2126
  raise InvalidArgument, 'Unknown output format' unless opt[:output] =~ Plugins.plugin_regex(type: :export)
@@ -2135,7 +2164,8 @@ EOS
2135
2164
  ## section
2136
2165
  ## @param opt [Hash] Additional Options
2137
2166
  ##
2138
- def do_archive(section, destination, opt = {})
2167
+ def do_archive(section, destination, opt)
2168
+ opt ||= {}
2139
2169
  count = opt[:count] || 0
2140
2170
  tags = opt[:tags] || []
2141
2171
  bool = opt[:bool] || :and
@@ -30,7 +30,7 @@ class BashCompletions
30
30
  need_export = []
31
31
 
32
32
  @commands.each_with_index do |cmd, i|
33
- @bar.advance
33
+ @bar.advance(status: cmd[:commands].first)
34
34
 
35
35
  data = get_help_sections(cmd[:commands].first)
36
36
 
@@ -188,7 +188,7 @@ class BashCompletions
188
188
  data = get_help_sections
189
189
  @global_options = parse_options(data[:global_options])
190
190
  @commands = parse_commands(data[:commands])
191
- @bar = TTY::ProgressBar.new("\033[0;0;33mGenerating Bash completions: \033[0;35;40m[:bar]\033[0m", total: @commands.count, bar_format: :blade)
191
+ @bar = TTY::ProgressBar.new("\033[0;0;33mGenerating Bash completions: \033[0;35;40m[:bar] :status\033[0m", total: @commands.count, bar_format: :blade, status: '')
192
192
  @bar.resize(25)
193
193
  end
194
194
 
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: 2.1.6
4
+ version: 2.1.10
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-12-20 00:00:00.000000000 Z
11
+ date: 2021-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml
@@ -542,7 +542,6 @@ files:
542
542
  - lib/examples/plugins/wiki_export/templates/wiki.haml
543
543
  - lib/examples/plugins/wiki_export/templates/wiki_index.haml
544
544
  - lib/examples/plugins/wiki_export/wiki_export.rb
545
- - lib/helpers/fuzzyfilefinder
546
545
  - lib/helpers/fzf/.goreleaser.yml
547
546
  - lib/helpers/fzf/.rubocop.yml
548
547
  - lib/helpers/fzf/ADVANCED.md
Binary file