doing 1.0.56 → 1.0.61
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 -5
- data/bin/doing +24 -6
- data/lib/doing/version.rb +1 -1
- data/lib/doing/wwid.rb +87 -83
- 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: 406fa23f47c83c1b9b3c8fa1cd0e193761c0b13e7ec31f75fdf43b1375769d18
|
4
|
+
data.tar.gz: 2c7f30f6acfac0fb33266dd62ce204099c0358cef88e19de8f26c9e9a4f866f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 547c64a9fbfdb026a0ecaf1b4b0ae203306907ddbdc7cff76062b82312293e36eb170b8874f3aa643e19a8f2d3310aea472f23b12128b7b9eeb300956210ca68
|
7
|
+
data.tar.gz: 37d3819348c3167b6c77a34f8e7e2311015c3975e8595303e04c1d89cb28d7d8a83d7dfea810440b846621d90fd8e7bd1538dd9e3f607a2002284d1405474de8
|
data/README.md
CHANGED
@@ -29,14 +29,10 @@ _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.60<!--END VER-->.
|
33
33
|
|
34
34
|
$ [sudo] gem install doing
|
35
35
|
|
36
|
-
To install the _latest_ version, use `--pre`:
|
37
|
-
|
38
|
-
$ [sudo] gem install --pre doing
|
39
|
-
|
40
36
|
Only use `sudo` if your environment requires it. If you're using the system Ruby on a Mac, for example, it will likely be necessary. If `gem install doing` fails, then run `sudo gem install doing` and provide your administrator password.
|
41
37
|
|
42
38
|
Run `doing config` to open your `~/.doingrc` file in the editor defined in the `$EDITOR` environment variable. Set up your `doing_file` right away (where you want entries to be stored), and cover the rest after you've read the docs.
|
data/bin/doing
CHANGED
@@ -572,7 +572,7 @@ command [:again, :resume] do |c|
|
|
572
572
|
|
573
573
|
c.desc 'Boolean used to combine multiple tags'
|
574
574
|
c.arg_name 'BOOLEAN'
|
575
|
-
c.flag [:bool], must_match: /^(and|or|not)$/i, default_value: '
|
575
|
+
c.flag [:bool], must_match: /^(and|or|not)$/i, default_value: 'AND'
|
576
576
|
|
577
577
|
c.desc 'Note'
|
578
578
|
c.arg_name 'TEXT'
|
@@ -1230,14 +1230,17 @@ desc 'Move entries between sections'
|
|
1230
1230
|
arg_name 'SECTION_NAME'
|
1231
1231
|
default_value wwid.current_section
|
1232
1232
|
command :archive do |c|
|
1233
|
-
c.desc '
|
1234
|
-
c.arg_name '
|
1235
|
-
c.flag %i[k keep],
|
1233
|
+
c.desc 'How many items to keep (ignored if archiving by tag or search)'
|
1234
|
+
c.arg_name 'X'
|
1235
|
+
c.flag %i[k keep], must_match: /^\d+$/, type: Integer
|
1236
1236
|
|
1237
1237
|
c.desc 'Move entries to'
|
1238
1238
|
c.arg_name 'SECTION_NAME'
|
1239
1239
|
c.flag %i[t to], default_value: 'Archive'
|
1240
1240
|
|
1241
|
+
c.desc 'Label moved items with @from(SECTION_NAME)'
|
1242
|
+
c.switch [:label], default_value: true, negatable: true
|
1243
|
+
|
1241
1244
|
c.desc 'Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.'
|
1242
1245
|
c.arg_name 'TAG'
|
1243
1246
|
c.flag [:tag]
|
@@ -1246,21 +1249,36 @@ command :archive do |c|
|
|
1246
1249
|
c.arg_name 'BOOLEAN'
|
1247
1250
|
c.flag [:bool], must_match: /(and|or|not)/i, default_value: 'AND'
|
1248
1251
|
|
1252
|
+
c.desc 'Search filter'
|
1253
|
+
c.arg_name 'QUERY'
|
1254
|
+
c.flag [:search]
|
1255
|
+
|
1249
1256
|
c.action do |_global_options, options, args|
|
1250
1257
|
if args.empty?
|
1251
1258
|
section = wwid.current_section
|
1252
1259
|
tags = []
|
1260
|
+
elsif args[0] =~ /^all/i
|
1261
|
+
section = 'all'
|
1253
1262
|
elsif args[0] =~ /^@\S+/
|
1254
1263
|
section = 'all'
|
1255
1264
|
tags = args.map { |t| t.sub(/^@/, '').strip }
|
1256
1265
|
else
|
1257
1266
|
section = args[0].cap_first
|
1258
|
-
tags = args.length > 1 ? args[1..].map { |t| t.sub(/^@/, '').strip } :
|
1267
|
+
tags = args.length > 1 ? args[1..].map { |t| t.sub(/^@/, '').strip } : []
|
1259
1268
|
end
|
1260
1269
|
|
1270
|
+
raise '--keep and --count can\'t be used together' if options[:keep] && options[:count]
|
1271
|
+
|
1261
1272
|
tags.concat(options[:tag].split(/ *, */).map { |t| t.sub(/^@/, '').strip }) if options[:tag]
|
1262
1273
|
|
1263
|
-
|
1274
|
+
opts = {
|
1275
|
+
bool: options[:bool],
|
1276
|
+
destination: options[:to],
|
1277
|
+
keep: options[:keep],
|
1278
|
+
search: options[:search],
|
1279
|
+
tags: tags
|
1280
|
+
}
|
1281
|
+
wwid.archive(section, opts)
|
1264
1282
|
end
|
1265
1283
|
end
|
1266
1284
|
|
data/lib/doing/version.rb
CHANGED
data/lib/doing/wwid.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'deep_merge'
|
4
4
|
require 'open3'
|
5
|
+
require 'pp'
|
5
6
|
|
6
7
|
##
|
7
8
|
## @brief Hash helpers
|
@@ -707,6 +708,11 @@ class WWID
|
|
707
708
|
@results.push(%(No previous entry found))
|
708
709
|
return
|
709
710
|
end
|
711
|
+
unless last.has_tags?(['done'], 'ALL')
|
712
|
+
new_item = last.dup
|
713
|
+
new_item['title'] += " @done(#{Time.now.strftime('%F %R')})"
|
714
|
+
update_item(last, new_item)
|
715
|
+
end
|
710
716
|
# Remove @done tag
|
711
717
|
title = last['title'].sub(/\s*@done(\(.*?\))?/, '').chomp
|
712
718
|
section = opt[:in].nil? ? last['section'] : guess_section(opt[:in])
|
@@ -736,8 +742,6 @@ class WWID
|
|
736
742
|
end
|
737
743
|
items = combined['items'].dup.sort_by { |item| item['date'] }.reverse
|
738
744
|
sec_arr.push(items[0]['section'])
|
739
|
-
|
740
|
-
sec_arr = sections
|
741
745
|
else
|
742
746
|
sec_arr = [guess_section(opt[:section])]
|
743
747
|
end
|
@@ -800,12 +804,12 @@ class WWID
|
|
800
804
|
if @content.key?(section)
|
801
805
|
|
802
806
|
items = @content[section]['items'].dup.sort_by { |item| item['date'] }.reverse
|
803
|
-
|
807
|
+
idx = 0
|
804
808
|
done_date = Time.now
|
805
809
|
next_start = Time.now
|
806
810
|
count = (opt[:count]).zero? ? items.length : opt[:count]
|
807
811
|
items.map! do |item|
|
808
|
-
break if
|
812
|
+
break if idx == count
|
809
813
|
|
810
814
|
tag_match = opt[:tag].nil? || opt[:tag].empty? ? true : item.has_tags?(opt[:tag], opt[:tag_bool])
|
811
815
|
search_match = opt[:search].nil? || opt[:search].empty? ? true : item.matches_search?(opt[:search])
|
@@ -854,7 +858,7 @@ class WWID
|
|
854
858
|
item['title'] = title
|
855
859
|
end
|
856
860
|
|
857
|
-
|
861
|
+
idx += 1
|
858
862
|
end
|
859
863
|
|
860
864
|
item
|
@@ -886,6 +890,17 @@ class WWID
|
|
886
890
|
write(@doing_file)
|
887
891
|
end
|
888
892
|
|
893
|
+
def update_item(old_item, new_item)
|
894
|
+
section = old_item['section']
|
895
|
+
|
896
|
+
section_items = @content[section]['items']
|
897
|
+
s_idx = section_items.index(old_item)
|
898
|
+
|
899
|
+
section_items[s_idx] = new_item
|
900
|
+
@results.push("Entry updated: #{section_items[s_idx]['title']}")
|
901
|
+
@content[section]['items'] = section_items
|
902
|
+
end
|
903
|
+
|
889
904
|
##
|
890
905
|
## @brief Edit the last entry
|
891
906
|
##
|
@@ -1014,7 +1029,8 @@ class WWID
|
|
1014
1029
|
# @param tag (String) Tag to replace
|
1015
1030
|
# @param opt (Hash) Additional Options
|
1016
1031
|
#
|
1017
|
-
def stop_start(
|
1032
|
+
def stop_start(target_tag, opt = {})
|
1033
|
+
tag = target_tag.dup
|
1018
1034
|
opt[:section] ||= @current_section
|
1019
1035
|
opt[:archive] ||= false
|
1020
1036
|
opt[:back] ||= Time.now
|
@@ -1535,31 +1551,24 @@ class WWID
|
|
1535
1551
|
## section
|
1536
1552
|
##
|
1537
1553
|
## @param section (String) The source section
|
1538
|
-
## @param
|
1539
|
-
## @param destination (String) The destination section
|
1540
|
-
## @param tags (Array) Tags to archive
|
1541
|
-
## @param bool (String) Tag boolean combinator
|
1554
|
+
## @param options (Hash) Options
|
1542
1555
|
##
|
1543
|
-
def archive(section = 'Currently',
|
1556
|
+
def archive(section = 'Currently', options = {})
|
1557
|
+
count = options[:keep] || 0
|
1558
|
+
destination = options[:destination] || 'Archive'
|
1559
|
+
tags = options[:tags] || []
|
1560
|
+
bool = options[:bool] || 'AND'
|
1561
|
+
|
1544
1562
|
section = choose_section if section.nil? || section =~ /choose/i
|
1545
|
-
archive_all = section =~
|
1563
|
+
archive_all = section =~ /^all$/i # && !(tags.nil? || tags.empty?)
|
1546
1564
|
section = guess_section(section) unless archive_all
|
1547
1565
|
|
1548
|
-
add_section('Archive') if destination =~
|
1566
|
+
add_section('Archive') if destination =~ /^archive$/i && !sections.include?('Archive')
|
1549
1567
|
|
1550
1568
|
destination = guess_section(destination)
|
1551
1569
|
|
1552
1570
|
if sections.include?(destination) && (sections.include?(section) || archive_all)
|
1553
|
-
|
1554
|
-
to_archive = sections.dup
|
1555
|
-
to_archive.delete(destination)
|
1556
|
-
to_archive.each do |source, _v|
|
1557
|
-
do_archive(source, destination, { count: count, tags: tags, bool: bool, label: true })
|
1558
|
-
end
|
1559
|
-
else
|
1560
|
-
do_archive(section, destination, { count: count, tags: tags, bool: bool, label: true })
|
1561
|
-
end
|
1562
|
-
|
1571
|
+
do_archive(section, destination, { count: count, tags: tags, bool: bool, search: options[:search], label: options[:label] })
|
1563
1572
|
write(doing_file)
|
1564
1573
|
else
|
1565
1574
|
raise 'Either source or destination does not exist'
|
@@ -1573,74 +1582,69 @@ class WWID
|
|
1573
1582
|
## @param destination (String) The destination section
|
1574
1583
|
## @param opt (Hash) Additional Options
|
1575
1584
|
##
|
1576
|
-
def do_archive(
|
1577
|
-
count = opt[:count] ||
|
1578
|
-
tags
|
1579
|
-
bool
|
1580
|
-
label = opt[:label] ||
|
1585
|
+
def do_archive(sect, destination, opt = {})
|
1586
|
+
count = opt[:count] || 0
|
1587
|
+
tags = opt[:tags] || []
|
1588
|
+
bool = opt[:bool] || 'AND'
|
1589
|
+
label = opt[:label] || true
|
1581
1590
|
|
1582
|
-
|
1583
|
-
|
1591
|
+
if sect =~ /^all$/i
|
1592
|
+
all_sections = sections.dup
|
1593
|
+
all_sections.delete(destination)
|
1594
|
+
else
|
1595
|
+
all_sections = [sect]
|
1596
|
+
end
|
1584
1597
|
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
del = true if item['title'] =~ /@#{tag}/i
|
1598
|
+
counter = 0
|
1599
|
+
|
1600
|
+
all_sections.each do |section|
|
1601
|
+
items = @content[section]['items']
|
1602
|
+
|
1603
|
+
moved_items = []
|
1604
|
+
if !tags.empty? || opt[:search]
|
1605
|
+
items.delete_if do |item|
|
1606
|
+
if (!tags.empty? && item.has_tags?(tags, bool) || (opt[:search] && item.matches_search?(opt[:search].to_s)))
|
1607
|
+
moved_items.push(item)
|
1608
|
+
counter += 1
|
1609
|
+
true
|
1610
|
+
else
|
1611
|
+
false
|
1600
1612
|
end
|
1601
|
-
|
1602
|
-
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1606
|
-
del = false if item['title'] =~ /@#{tag}/i
|
1613
|
+
end
|
1614
|
+
moved_items.each do |item|
|
1615
|
+
if label && section != 'Currently'
|
1616
|
+
item['title'] =
|
1617
|
+
item['title'].sub(/(?:@from\(.*?\))?(.*)$/, "\\1 @from(#{section})")
|
1607
1618
|
end
|
1608
|
-
moved_items.push(item) if del
|
1609
|
-
del
|
1610
1619
|
end
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
|
1620
|
+
|
1621
|
+
@content[section]['items'] = items
|
1622
|
+
@content[destination]['items'].concat(moved_items)
|
1623
|
+
@results.push("Archived #{moved_items.length} items from #{section} to #{destination}")
|
1624
|
+
else
|
1625
|
+
count = items.length if count == 0 || items.length < count
|
1626
|
+
|
1627
|
+
@content[section]['items'] = if count.zero?
|
1628
|
+
[]
|
1629
|
+
else
|
1630
|
+
items[0..count - 1]
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
items.map! do |item|
|
1634
|
+
if label && section != 'Currently'
|
1635
|
+
item['title'] =
|
1636
|
+
item['title'].sub(/(?:@from\(.*?\))?(.*)$/, "\\1 @from(#{section})")
|
1637
|
+
end
|
1638
|
+
item
|
1616
1639
|
end
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
else
|
1622
|
-
count = items.length if items.length < count
|
1623
|
-
|
1624
|
-
@content[section]['items'] = if count.zero?
|
1625
|
-
[]
|
1626
|
-
else
|
1627
|
-
items[0..count - 1]
|
1628
|
-
end
|
1629
|
-
|
1630
|
-
items.map! do |item|
|
1631
|
-
if label && section != 'Currently'
|
1632
|
-
item['title'] =
|
1633
|
-
item['title'].sub(/(?:@from\(.*?\))?(.*)$/, "\\1 @from(#{section})")
|
1640
|
+
if items.count > count
|
1641
|
+
@content[destination]['items'].concat(items[count..-1])
|
1642
|
+
else
|
1643
|
+
@content[destination]['items'].concat(items)
|
1634
1644
|
end
|
1635
|
-
item
|
1636
|
-
end
|
1637
|
-
if items.count > count
|
1638
|
-
@content[destination]['items'].concat(items[count..-1])
|
1639
|
-
else
|
1640
|
-
@content[destination]['items'].concat(items)
|
1641
|
-
end
|
1642
1645
|
|
1643
|
-
|
1646
|
+
@results.push("Archived #{items.length - count} items from #{section} to #{destination}")
|
1647
|
+
end
|
1644
1648
|
end
|
1645
1649
|
end
|
1646
1650
|
|
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.61
|
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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|