na 1.2.17 → 1.2.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 230088b77bc3f8e3aa56fe5ba96505678d0ef3b809a38eccf96fb8be2109cf3d
4
- data.tar.gz: 87d16ea051d5c9c8e719777399cc4c3bb8ee3806c8ccbffaba80e1a429784844
3
+ metadata.gz: 8c8bbd644e758263ac0301010b89259ad0e97debaba7d1cdfe51f4fd67e4c323
4
+ data.tar.gz: 8f0a1f3e385f8b82b2afd376d2316e43d993493bf10974fc82040de6d4b89a28
5
5
  SHA512:
6
- metadata.gz: 98e10fb95e67d9a86c89b34a5b21f5aefb61a66a239b205720a9ecf2979a5e57a39009c52cd17a12dde1a772e29b6ec3f3feb074d408ea233b5b64abb76d0494
7
- data.tar.gz: c7880dd277c7a82c12bc1781b5d1ed5be84b2eaf21a4e4dcbcc8ddd3d28820252cc3f67c57794b3239331a43ce81e303b087358d76ec32a40618d9bee3c4e367
6
+ metadata.gz: aad67239d2046f7347700da92676ae0c3652631413fbc0c17d533036007f0b5147d1d8b161b1b38aaecf124c5740077faf42b8dcc6cff6a76d37fe7398758d62
7
+ data.tar.gz: 2cf613349b29074b015e7394ba659b8200451eb950b965137b5c3b4a7a41108b98a70b4e66ac1bc3f6b23cd821b31de3a53db37cec8b662705af4af72042e334
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ### 1.2.19
2
+
3
+ 2023-01-17 16:49
4
+
5
+ #### IMPROVED
6
+
7
+ - `--nest` flag creates a flat list with project included in task title, `--omnifocus` creates OmniFocus-compatible project nesting
8
+
9
+ ### 1.2.18
10
+
11
+ 2023-01-17 13:38
12
+
13
+ #### IMPROVED
14
+
15
+ - Format tags OmniFocus wouldn't recognize as @tags(TAG) in --nest output
16
+ - Include notes in --nest output
17
+
1
18
  ### 1.2.17
2
19
 
3
20
  2023-01-17 11:23
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- na (1.2.17)
4
+ na (1.2.19)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  gli (~> 2.21.0)
7
7
  mdless (~> 1.0, >= 1.0.32)
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is 1.2.17
12
+ The current version of `na` is 1.2.19
13
13
  .
14
14
 
15
15
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
@@ -77,7 +77,7 @@ SYNOPSIS
77
77
  na [global options] command [command options] [arguments...]
78
78
 
79
79
  VERSION
80
- 1.2.17
80
+ 1.2.19
81
81
 
82
82
  GLOBAL OPTIONS
83
83
  -a, --[no-]add - Add a next action (deprecated, for backwards compatibility)
@@ -213,6 +213,7 @@ COMMAND OPTIONS
213
213
  --[no-]nest - Output actions nested by file
214
214
  --[no-]notes - Include notes in output
215
215
  -o, --or - Combine search tokens with OR, displaying actions matching ANY of the terms
216
+ --[no-]omnifocus - Output actions nested by file and project
216
217
  --proj, --project=PROJECT[/SUBPROJECT] - Show actions from a specific project (default: none)
217
218
  --save=TITLE - Save this search for future use (default: none)
218
219
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
@@ -275,6 +276,7 @@ COMMAND OPTIONS
275
276
  --in, --todo=TODO_FILE - Display matches from a known todo file (may be used more than once, default: none)
276
277
  --[no-]nest - Output actions nested by file
277
278
  --[no-]notes - Include notes in output
279
+ --[no-]omnifocus - Output actions nested by file and project
278
280
  --proj, --project=PROJECT[/SUBPROJECT] - Show actions from a specific project (default: none)
279
281
  --[no-]regex - Search query is regular expression
280
282
  --search=QUERY - Filter results using search terms (may be used more than once, default: none)
@@ -380,6 +382,7 @@ COMMAND OPTIONS
380
382
  --in, --todo=TODO_FILE - Display matches from a known todo file (may be used more than once, default: none)
381
383
  --[no-]nest - Output actions nested by file
382
384
  --[no-]notes - Include notes in output
385
+ --[no-]omnifocus - Output actions nested by file and project
383
386
  --proj, --project=PROJECT[/SUBPROJECT] - Show actions from a specific project (default: none)
384
387
  --[no-]regex - Search query is regular expression
385
388
  --search=QUERY - Filter results using search terms (may be used more than once, default: none)
data/bin/na CHANGED
@@ -118,6 +118,9 @@ class App
118
118
  c.desc 'Output actions nested by file'
119
119
  c.switch %[nest]
120
120
 
121
+ c.desc 'Output actions nested by file and project'
122
+ c.switch %[omnifocus]
123
+
121
124
  c.action do |global_options, options, args|
122
125
  if global_options[:add]
123
126
  cmd = ['add']
@@ -128,6 +131,8 @@ class App
128
131
  exit run(cmd)
129
132
  end
130
133
 
134
+ options[:nest] = true if options[:omnifocus]
135
+
131
136
  depth = if global_options[:recurse] && options[:depth].nil? && global_options[:depth] == 1
132
137
  3
133
138
  else
@@ -199,7 +204,7 @@ class App
199
204
  project: options[:project],
200
205
  require_na: require_na)
201
206
 
202
- NA.output_actions(actions, depth, files: files, notes: options[:notes], nest: options[:nest])
207
+ NA.output_actions(actions, depth, files: files, notes: options[:notes], nest: options[:nest], nest_projects: options[:omnifocus])
203
208
  end
204
209
  end
205
210
 
@@ -658,12 +663,18 @@ class App
658
663
  c.desc 'Output actions nested by file'
659
664
  c.switch %[nest]
660
665
 
666
+ c.desc 'Output actions nested by file and project'
667
+ c.switch %[omnifocus]
668
+
661
669
  c.action do |global_options, options, args|
670
+ options[:nest] = true if options[:omnifocus]
671
+
662
672
  if options[:save]
663
673
  title = options[:save].gsub(/[^a-z0-9]/, '_').gsub(/_+/, '_')
664
674
  NA.save_search(title, "#{NA.command_line.join(' ').sub(/ --save[= ]*\S+/, '').split(' ').map { |t| %("#{t}") }.join(' ')}")
665
675
  end
666
676
 
677
+
667
678
  depth = if global_options[:recurse] && options[:depth].nil? && global_options[:depth] == 1
668
679
  3
669
680
  else
@@ -731,7 +742,7 @@ class App
731
742
  [tokens]
732
743
  end
733
744
 
734
- NA.output_actions(actions, depth, files: files, regexes: regexes, notes: options[:notes], nest: options[:nest])
745
+ NA.output_actions(actions, depth, files: files, regexes: regexes, notes: options[:notes], nest: options[:nest], nest_projects: options[:omnifocus])
735
746
  end
736
747
  end
737
748
 
@@ -792,7 +803,12 @@ class App
792
803
  c.desc 'Output actions nested by file'
793
804
  c.switch %[nest]
794
805
 
806
+ c.desc 'Output actions nested by file and project'
807
+ c.switch %[omnifocus]
808
+
795
809
  c.action do |global_options, options, args|
810
+ options[:nest] = true if options[:omnifocus]
811
+
796
812
  if options[:save]
797
813
  title = options[:save].gsub(/[^a-z0-9]/, '_').gsub(/_+/, '_')
798
814
  NA.save_search(title, "#{NA.command_line.join(' ').sub(/ --save[= ]*\S+/, '').split(' ').map { |t| %("#{t}") }.join(' ')}")
@@ -871,7 +887,7 @@ class App
871
887
  else
872
888
  [tokens]
873
889
  end
874
- NA.output_actions(actions, depth, files: files, regexes: regexes, notes: options[:notes], nest: options[:nest])
890
+ NA.output_actions(actions, depth, files: files, regexes: regexes, notes: options[:notes], nest: options[:nest], nest_projects: options[:omnifocus])
875
891
  end
876
892
  end
877
893
 
@@ -414,7 +414,7 @@ module NA
414
414
  current_parent = current_parent[par]
415
415
  end
416
416
 
417
- current_parent[:actions].push(a.action)
417
+ current_parent[:actions].push(a)
418
418
  end
419
419
  parents
420
420
  end
@@ -425,7 +425,27 @@ module NA
425
425
  children.each do |k, v|
426
426
  if k.to_s =~ /actions/
427
427
  indent += "\t"
428
- v.each { |a| out.push("#{indent}- #{a}")}
428
+
429
+ v.each do |a|
430
+ item = "#{indent}- #{a.action}"
431
+
432
+ unless a.tags.empty?
433
+ tags = []
434
+ a.tags.each do |key, val|
435
+ next if key =~ /^(due|flagged|done)$/
436
+
437
+ tag = key
438
+ tag += "-#{val}" unless val.nil? || val.empty?
439
+ tags.push(tag)
440
+ end
441
+
442
+ item += " @tags(#{tags.join(',')})" unless tags.empty?
443
+ end
444
+
445
+ item += "\n#{indent}\t#{a.note.join("\n#{indent}\t")}" unless a.note.empty?
446
+
447
+ out.push(item)
448
+ end
429
449
  else
430
450
  out.push("#{indent}#{k}:")
431
451
  out.concat(output_children(v, level + 1))
@@ -442,31 +462,50 @@ module NA
442
462
  ## @param files [Array] The files actions originally came from
443
463
  ## @param regexes [Array] The regexes used to gather actions
444
464
  ##
445
- def output_actions(actions, depth, files: nil, regexes: [], notes: false, nest: false)
465
+ def output_actions(actions, depth, files: nil, regexes: [], notes: false, nest: false, nest_projects: false)
446
466
  return if files.nil?
447
467
 
448
468
  if nest
449
469
  template = '%parent%action'
450
470
 
451
471
  parent_files = {}
472
+ out = []
452
473
 
453
- actions.each do |action|
454
- if parent_files.key?(action.file)
455
- parent_files[action.file].push(action)
456
- else
457
- parent_files[action.file] = [action]
474
+ if nest_projects
475
+ actions.each do |action|
476
+ if parent_files.key?(action.file)
477
+ parent_files[action.file].push(action)
478
+ else
479
+ parent_files[action.file] = [action]
480
+ end
458
481
  end
459
- end
460
482
 
461
- out = []
462
- parent_files.each do |file, actions|
463
- projects = project_hierarchy(actions)
464
- out.push("#{file.sub(%r{^./}, '')}:")
465
- out.concat(output_children(projects, 0))
483
+ parent_files.each do |file, acts|
484
+ projects = project_hierarchy(acts)
485
+ out.push("#{file.sub(%r{^./}, '').shorten_path}:")
486
+ out.concat(output_children(projects, 0))
487
+ end
488
+ else
489
+ template = '%parent%action'
490
+
491
+ actions.each do |action|
492
+ if parent_files.key?(action.file)
493
+ parent_files[action.file].push(action)
494
+ else
495
+ parent_files[action.file] = [action]
496
+ end
497
+ end
498
+
499
+ parent_files.each do |k, v|
500
+ out.push("#{k.sub(%r{^\./}, '')}:")
501
+ v.each do |a|
502
+ out.push("\t- [#{a.parent.join('/')}] #{a.action}")
503
+ out.push("\t\t#{a.note.join("\n\t\t")}") unless a.note.empty?
504
+ end
505
+ end
466
506
  end
467
507
  puts out.join("\n")
468
508
  else
469
-
470
509
  template = if files.count.positive?
471
510
  if files.count == 1
472
511
  '%parent%action'
data/lib/na/string.rb CHANGED
@@ -167,6 +167,15 @@ class ::String
167
167
  end
168
168
  end
169
169
 
170
+ ##
171
+ ## Replace home directory with tilde
172
+ ##
173
+ ## @return [String] shortened path
174
+ ##
175
+ def shorten_path
176
+ sub(/^#{ENV['HOME']}/, '~')
177
+ end
178
+
170
179
  private
171
180
 
172
181
  def matches_none(regexes)
data/lib/na/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Na
2
- VERSION = '1.2.17'
2
+ VERSION = '1.2.19'
3
3
  end
data/src/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is <!--VER-->1.2.16<!--END VER-->.
12
+ The current version of `na` is <!--VER-->1.2.18<!--END VER-->.
13
13
 
14
14
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
15
15
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: na
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.17
4
+ version: 1.2.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra