na 1.2.46 → 1.2.48

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: '0847ca8c8b5746d6e0f099c5bfc38d00dd01353acc7bceda6c5c6423ed16630f'
4
- data.tar.gz: 6e7eecaf402a4268826095e6b46b4f1fad26a7e454b6162a6ef113f04e91a660
3
+ metadata.gz: 979a9debf8199d1e1182caaefb4d412c03c66c0c9785fd1ac638af13d211686e
4
+ data.tar.gz: 16bdab2fa8d9f8c326351bcc4c92e29aa3fed23a1dc23acc2c72a22ca12ecd41
5
5
  SHA512:
6
- metadata.gz: 794d54bd290f665f51bb1d74846c83a4406ba76568132591ab19fe146bbbbce844be4e6fff2be05c73170f3666a87edc5446bf1380d1a7c8ded9848fbba9c4a9
7
- data.tar.gz: de1cea81c7612bf8beaa0b73243aa687e9325d46e0c93d139cda87d6792fb99a2614812671b68f6ae9961adde9040c669ce73c5ae1f39d1215820187345ca21b
6
+ metadata.gz: a0b05629b092b7e49c3b4c606ddb236387b9acf5edc6219a446ccebfc6a8ced5ab17629e78b5fc327c0eb0a4ec3203221e7b3a4d661cfcba224d44ae3798d48e
7
+ data.tar.gz: 702cfbe213a0aa67a249284511754613cd447cea62580a14982c4ef253d5b710a70438c5b6f27008b9a4191b3f52f0f2b5fa80de3a373c28c201f5c1dd043b00
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ### 1.2.48
2
+
3
+ 2023-09-08 10:19
4
+
5
+ #### FIXED
6
+
7
+ - Error when `na add --to PROJECT` was a project that didn't exist
8
+
9
+ ### 1.2.47
10
+
11
+ 2023-09-07 10:47
12
+
13
+ #### NEW
14
+
15
+ - `na update --search OLD_TEXT --replace NEW_TEXT` (added --replace)
16
+
17
+ #### IMPROVED
18
+
19
+ - When not showing notes, add an asterisk in the template note
20
+ - When showing notes, indent to the beginning of the action
21
+
1
22
  ### 1.2.46
2
23
 
3
24
  2023-09-06 21:25
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- na (1.2.46)
4
+ na (1.2.48)
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.46
12
+ The current version of `na` is 1.2.48
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.46
80
+ 1.2.48
81
81
 
82
82
  GLOBAL OPTIONS
83
83
  -a, --add - Add a next action (deprecated, for backwards compatibility)
@@ -503,7 +503,9 @@ COMMAND OPTIONS
503
503
  -p, --priority=PRIO - Add/change a priority level 1-5 (default: 0)
504
504
  --proj, --project=PROJECT[/SUBPROJECT] - Affect actions from a specific project (default: none)
505
505
  -r, --remove=TAG - Remove a tag from the action, use multiple times or combine multiple tags with a comma, wildcards (* and ?) allowed (may be used more than once, default: none)
506
+ --replace=TEXT - Use with --find to find and replace with new text. Enables --exact when used (default: none)
506
507
  --restore - Remove @done tag from action
508
+ --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
507
509
  -t, --tag=TAG - Add a tag to the action, @tag(values) allowed, use multiple times or combine multiple tags with a comma (may be used more than once, default: none)
508
510
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
509
511
  --to, --move=PROJECT - Move action to specific project (default: none)
@@ -556,6 +558,7 @@ COMMAND OPTIONS
556
558
  -n, --note - Prompt for additional notes. Input will be appended to any existing note. If STDIN input (piped) is detected, it will be used as a note.
557
559
  -o, --overwrite - Overwrite note instead of appending
558
560
  --proj, --project=PROJECT[/SUBPROJECT] - Affect actions from a specific project (default: none)
561
+ --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
559
562
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
560
563
  --to, --move=PROJECT - Move action to specific project (default: none)
561
564
  -x, --exact - Match pattern exactly
@@ -591,6 +594,7 @@ COMMAND OPTIONS
591
594
  -n, --note - Prompt for additional notes. Input will be appended to any existing note. If STDIN input (piped) is detected, it will be used as a note.
592
595
  -o, --overwrite - Overwrite note instead of appending
593
596
  --proj, --project=PROJECT[/SUBPROJECT] - Affect actions from a specific project (default: none)
597
+ --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
594
598
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
595
599
  -x, --exact - Match pattern exactly
596
600
 
@@ -37,6 +37,10 @@ class App
37
37
  c.desc 'Act on all matches immediately (no menu)'
38
38
  c.switch %i[all], negatable: false
39
39
 
40
+ c.desc 'Filter results using search terms'
41
+ c.arg_name 'QUERY'
42
+ c.flag %i[search find grep], multiple: true
43
+
40
44
  c.desc 'Interpret search pattern as regular expression'
41
45
  c.switch %i[e regex], negatable: false
42
46
 
@@ -48,9 +52,13 @@ class App
48
52
  c.flag %i[in todo]
49
53
 
50
54
  c.action do |global, options, args|
55
+ args.concat(options[:search])
56
+
51
57
  if options[:done]
52
58
  options[:tagged] << 'done'
53
59
  options[:all] = true
60
+ else
61
+ options[:tagged] << '-done'
54
62
  end
55
63
 
56
64
  options[:done] = true
@@ -40,6 +40,10 @@ class App
40
40
  c.arg_name 'DEPTH'
41
41
  c.flag %i[d depth], must_match: /^[1-9]$/, type: :integer, default_value: 1
42
42
 
43
+ c.desc 'Filter results using search terms'
44
+ c.arg_name 'QUERY'
45
+ c.flag %i[search find grep], multiple: true
46
+
43
47
  c.desc 'Match actions containing tag. Allows value comparisons'
44
48
  c.arg_name 'TAG'
45
49
  c.flag %i[tagged], multiple: true
@@ -54,6 +58,8 @@ class App
54
58
  c.switch %i[x exact], negatable: false
55
59
 
56
60
  c.action do |global, options, args|
61
+ args.concat(options[:search])
62
+
57
63
  options[:finish] = true
58
64
  options[:f] = true
59
65
  options[:to] = 'Archive' if options[:archive] && !options[:to]
@@ -55,6 +55,10 @@ class App
55
55
  c.arg_name 'TAG'
56
56
  c.flag %i[r remove], multiple: true
57
57
 
58
+ c.desc 'Use with --find to find and replace with new text. Enables --exact when used'
59
+ c.arg_name 'TEXT'
60
+ c.flag %i[replace]
61
+
58
62
  c.desc 'Add a @done tag to action'
59
63
  c.switch %i[f finish], negatable: false
60
64
 
@@ -79,6 +83,10 @@ class App
79
83
  c.arg_name 'DEPTH'
80
84
  c.flag %i[d depth], must_match: /^[1-9]$/, type: :integer, default_value: 1
81
85
 
86
+ c.desc 'Filter results using search terms'
87
+ c.arg_name 'QUERY'
88
+ c.flag %i[search find grep], multiple: true
89
+
82
90
  c.desc 'Match actions containing tag. Allows value comparisons'
83
91
  c.arg_name 'TAG'
84
92
  c.flag %i[tagged], multiple: true
@@ -95,6 +103,8 @@ class App
95
103
  c.action do |global_options, options, args|
96
104
  reader = TTY::Reader.new
97
105
 
106
+ args.concat(options[:search])
107
+
98
108
  append = options[:at] ? options[:at] =~ /^[ae]/i : global_options[:add_at] =~ /^[ae]/i
99
109
 
100
110
  if options[:restore] || (!options[:remove].nil? && options[:remove].include?('done'))
@@ -106,6 +116,8 @@ class App
106
116
  options[:tagged] << '-done'
107
117
  end
108
118
 
119
+ options[:exact] = true unless options[:replace].nil?
120
+
109
121
  action = if args.count.positive?
110
122
  args.join(' ').strip
111
123
  else
@@ -244,6 +256,7 @@ class App
244
256
  priority: priority,
245
257
  project: options[:project],
246
258
  remove_tag: remove_tags,
259
+ replace: options[:replace],
247
260
  tagged: tags)
248
261
  end
249
262
  end
data/lib/na/action.rb CHANGED
@@ -95,13 +95,6 @@ module NA
95
95
  file_tpl = "#{template[:file]}#{file} {x}"
96
96
  filename = NA::Color.template(file_tpl)
97
97
 
98
- # Add notes if needed
99
- note = if notes && @note.count.positive?
100
- NA::Color.template("\n#{@note.map { |l| " #{template[:note]}• #{l}{x}" }.join("\n")}")
101
- else
102
- ''
103
- end
104
-
105
98
  # colorize the action and highlight tags
106
99
  @action.gsub!(/\{(.*?)\}/, '\\{\1\\}')
107
100
  action = NA::Color.template("#{template[:action]}#{@action.sub(/ @#{NA.na_tag}\b/, '')}{x}")
@@ -112,9 +105,27 @@ module NA
112
105
 
113
106
  if detect_width
114
107
  width = TTY::Screen.columns
115
- prefix = NA::Color.uncolor(pretty(template: { templates: { output: template[:templates][:output].sub(/%action/, '') } }, detect_width: false))
108
+ prefix = NA::Color.uncolor(pretty(template: { templates: { output: template[:templates][:output].sub(/%action/, '').sub(/%note/, '') } }, detect_width: false))
116
109
  indent = prefix.length
110
+
111
+ # Add notes if needed
112
+ note = if notes && @note.count.positive?
113
+ NA::Color.template(@note.wrap(width, indent, template[:note]))
114
+ elsif !notes && @note.count.positive?
115
+ action += "#{template[:note]}*"
116
+ else
117
+ ''
118
+ end
119
+
117
120
  action = action.wrap(width, indent)
121
+ else
122
+ note = if notes && @note.count.positive?
123
+ NA::Color.template("\n#{@note.map { |l| " #{template[:note]}• #{l.wrap(width, indent)}{x}" }.join("\n")}")
124
+ elsif !notes && @note.count.positive?
125
+ action += "#{template[:note]}*"
126
+ else
127
+ ''
128
+ end
118
129
  end
119
130
 
120
131
  # Replace variables in template string and output colorized
data/lib/na/actions.rb CHANGED
@@ -79,7 +79,7 @@ module NA
79
79
 
80
80
  files.map { |f| NA.notify(f, debug: true) } if files
81
81
 
82
- output = map { |action| action.pretty(template: { output: template }, regexes: regexes, notes: notes) }
82
+ output = map { |action| action.pretty(template: { templates: { output: template } }, regexes: regexes, notes: notes) }
83
83
  NA::Pager.page(output.join("\n"))
84
84
  end
85
85
  end
data/lib/na/array.rb CHANGED
@@ -10,4 +10,11 @@ class ::Array
10
10
  def remove_bad
11
11
  compact.map { |x| x.is_a?(String) ? x.strip : x }.select(&:good?)
12
12
  end
13
+
14
+ def wrap(width, indent, color)
15
+ map! do |l|
16
+ "#{color}#{' ' * indent }• #{l.wrap(width, indent)}{x}"
17
+ end
18
+ "\n#{join("\n")}"
19
+ end
13
20
  end
data/lib/na/colors.rb CHANGED
@@ -84,7 +84,7 @@ module NA
84
84
  # Array of attribute keys only
85
85
  ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
86
86
 
87
- # Returns true if NA::Color supports the +feature+.
87
+ # Returns true if Color supports the +feature+.
88
88
  #
89
89
  # The feature :clear, that is mixing the clear color attribute into String,
90
90
  # is only supported on ruby implementations, that do *not* already
@@ -244,6 +244,7 @@ module NA
244
244
  project: nil,
245
245
  move: nil,
246
246
  remove_tag: [],
247
+ replace: nil,
247
248
  tagged: nil)
248
249
 
249
250
  projects = find_projects(target)
@@ -278,6 +279,15 @@ module NA
278
279
  projects.select { |proj| proj.project =~ /^#{add.parent.join(':')}$/ }.first
279
280
  end
280
281
 
282
+ res = NA.yn(NA::Color.template("#{NA.theme[:warning]}Project #{NA.theme[:file]}#{move}#{NA.theme[:warning]} doesn't exist, add it"), default: true)
283
+
284
+ if res
285
+ target_proj = insert_project(target, project, projects)
286
+ projects << target_proj
287
+ else
288
+ NA.notify("#{NA.theme[:error]}Cancelled", exit_code: 1)
289
+ end
290
+
281
291
  NA.notify("#{NA.theme[:error]}Error parsing project #{NA.theme[:filename]}#{target}", exit_code: 1) if target_proj.nil?
282
292
 
283
293
  indent = "\t" * target_proj.indent
@@ -328,6 +338,9 @@ module NA
328
338
  action.note = new_note
329
339
  end
330
340
 
341
+ # If replace is defined, use search to search and replace text in action
342
+ action.action.sub!(Regexp.new(Regexp.escape(search), Regexp::IGNORECASE), replace) if replace
343
+
331
344
  action.process(priority: priority, finish: finish, add_tag: add_tag, remove_tag: remove_tag)
332
345
 
333
346
  target_proj = if target_proj
data/lib/na/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Na
2
- VERSION = '1.2.46'
2
+ VERSION = '1.2.48'
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.45<!--END VER-->.
12
+ The current version of `na` is <!--VER-->1.2.47<!--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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: na
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.46
4
+ version: 1.2.48
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-07 00:00:00.000000000 Z
11
+ date: 2023-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -246,7 +246,6 @@ files:
246
246
  - na.rdoc
247
247
  - scripts/fixreadme.rb
248
248
  - src/_README.md
249
- - test2.txt
250
249
  homepage: https://brettterpstra.com/projects/na/
251
250
  licenses:
252
251
  - MIT
data/test2.txt DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- comment: 2023
3
- keywords:
4
- ---
5
-
6
- Inbox:
7
- - Test @na