na 1.1.14 → 1.1.16

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: 2324b729bcc5e20eab3e063427fa5c6480274ea844fe72117e7f25c7e9801764
4
- data.tar.gz: 68d00ee26f320e14afd0e6a72a072b2cf30c82beaaf7818962b90e7fa0884914
3
+ metadata.gz: 53c4f2d9b3198892662e241d57c5d5bea699736112e91bba9551b7a393b57e06
4
+ data.tar.gz: 8bfd9f4bfbdd36bd0547a11e7ec88a43873f21aa1a3b9069020884a866646bdd
5
5
  SHA512:
6
- metadata.gz: b6b7fd0066ba41b9fa184ab3231cb8d7b68e68526bc380f21f2b12048de1c4a4eae24d2da8e47abe95c2389536e90ee32fa35ebdf786570745b8153c72d65e4a
7
- data.tar.gz: 320264ba4f636f8a68804f7767bd09a4c2105adf684b603514d933003f06f72e2cebb978476a659c2a7ee716fbdaadf7f9fd507c3985ec2dc870162da2751414
6
+ metadata.gz: 33855d0a87b71590afb538be498addfa793a13f3a6865b6c9ccfc1691ded319c98df726f4960f95d70202d38106ec5a1c728c29d40b3e477b597f873d289b3fc
7
+ data.tar.gz: ce9ac4455e0018b2ff8df66d93c938779f831b8db722551a525e8bf49c1240b51038420d46a60d1e76c7d4ccd0d1964eadcfd5d28020667fd2c5ab78e9f3f1cc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ### 1.1.16
2
+
3
+ 2022-10-06 16:47
4
+
5
+ #### NEW
6
+
7
+ - `--in todo/path` flag for `find` and `tagged` commands to specify a todo file from history
8
+
9
+ ### 1.1.15
10
+
11
+ 2022-10-06 16:12
12
+
13
+ #### CHANGED
14
+
15
+ - If no + or ! tokens are given in search, default to AND search for tokens
16
+
17
+ #### IMPROVED
18
+
19
+ - Better handling of color in search highlighting
20
+
21
+ #### FIXED
22
+
23
+ - --regex search broken
24
+
1
25
  ### 1.1.14
2
26
 
3
27
  2022-10-06 12:30
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- na (1.1.14)
4
+ na (1.1.16)
5
+ chronic (~> 0.10, >= 0.10.2)
5
6
  gli (~> 2.21.0)
6
7
  tty-reader (~> 0.9, >= 0.9.0)
7
8
  tty-screen (~> 0.8, >= 0.8.1)
@@ -10,6 +11,7 @@ PATH
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
14
+ chronic (0.10.2)
13
15
  gli (2.21.0)
14
16
  minitest (5.16.3)
15
17
  rake (0.9.6)
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.1.14
12
+ The current version of `na` is 1.1.16
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.
data/bin/na CHANGED
@@ -249,6 +249,10 @@ class App
249
249
  c.arg_name 'DEPTH'
250
250
  c.flag %i[d depth], type: :integer, must_match: /^\d+$/
251
251
 
252
+ c.desc 'Show actions from a specific todo file in history'
253
+ c.arg_name 'TODO_PATH'
254
+ c.flag %i[in]
255
+
252
256
  c.desc 'Show actions from a specific project'
253
257
  c.arg_name 'PROJECT[/SUBPROJECT]'
254
258
  c.flag %i[proj project]
@@ -269,23 +273,39 @@ class App
269
273
  tokens = Regexp.new(args.join(' '), Regexp::IGNORECASE)
270
274
  else
271
275
  tokens = []
276
+ all_req = args.join(' ') !~ /[+!\-]/
277
+
272
278
  args.join(' ').split(/ /).each do |arg|
273
279
  m = arg.match(/^(?<req>[+\-!])?(?<tok>.*?)$/)
274
280
  tokens.push({
275
281
  token: m['tok'],
276
- required: !m['req'].nil? && m['req'] == '+',
282
+ required: all_req || (!m['req'].nil? && m['req'] == '+'),
277
283
  negate: !m['req'].nil? && m['req'] =~ /[!\-]/
278
284
  })
279
285
  end
280
286
  end
281
287
 
288
+ todo = nil
289
+ if options[:in]
290
+ todo = [{
291
+ token: options[:in],
292
+ required: true
293
+ }]
294
+ end
295
+
282
296
  files, actions = NA.parse_actions(depth: depth,
297
+ query: todo,
283
298
  search: tokens,
284
299
  negate: options[:invert],
285
300
  regex: options[:regex],
286
301
  project: options[:project],
287
302
  require_na: false)
288
- regexes = tokens.delete_if { |token| token[:negate] }.map { |token| token[:token] }
303
+ if tokens.is_a?(Array)
304
+ regexes = tokens.delete_if { |token| token[:negate] }.map { |token| token[:token] }
305
+ else
306
+ regexes = [tokens]
307
+ end
308
+
289
309
  NA.output_actions(actions, depth, files: files, regexes: regexes)
290
310
  end
291
311
  end
@@ -305,6 +325,10 @@ class App
305
325
  c.default_value 1
306
326
  c.flag %i[d depth], type: :integer, must_match: /^\d+$/
307
327
 
328
+ c.desc 'Show actions from a specific todo file in history'
329
+ c.arg_name 'TODO_PATH'
330
+ c.flag %i[in]
331
+
308
332
  c.desc 'Show actions from a specific project'
309
333
  c.arg_name 'PROJECT[/SUBPROJECT]'
310
334
  c.flag %i[proj project]
@@ -322,7 +346,7 @@ class App
322
346
  tags = []
323
347
  args.join(',').split(/ *, */).each do |arg|
324
348
  # TODO: <> comparisons do nothing right now
325
- m = arg.match(/^(?<req>[+\-!])?(?<tag>[^ =<>*$\^]+)(?:(?<op>[=<>*$\^]+)(?<val>\S+))?$/)
349
+ m = arg.match(/^(?<req>[+\-!])?(?<tag>[^ =<>*$\^]+)(?:(?<op>[=<>*$\^]+)(?<val>.*?))?$/)
326
350
  tags.push({
327
351
  tag: m['tag'],
328
352
  comp: m['op'],
@@ -332,7 +356,16 @@ class App
332
356
  })
333
357
  end
334
358
 
359
+ todo = nil
360
+ if options[:in]
361
+ todo = [{
362
+ token: options[:in],
363
+ required: true
364
+ }]
365
+ end
366
+
335
367
  files, actions = NA.parse_actions(depth: depth,
368
+ query: todo,
336
369
  tag: tags,
337
370
  negate: options[:invert],
338
371
  project: options[:project],
data/lib/na/action.rb CHANGED
@@ -136,26 +136,54 @@ module NA
136
136
 
137
137
  return false if tag_val.nil?
138
138
 
139
- return case tag[:comp]
140
- when /^>$/
141
- tag_val.to_f > val.to_f
142
- when /^<$/
143
- tag_val.to_f < val.to_f
144
- when /^<=$/
145
- tag_val.to_f <= val.to_f
146
- when /^>=$/
147
- tag_val.to_f >= val.to_f
148
- when /^==?$/
149
- tag_val =~ /^#{val.wildcard_to_rx}$/
150
- when /^\$=$/
151
- tag_val =~ /#{val.wildcard_to_rx}$/i
152
- when /^\*=$/
153
- tag_val =~ /#{val.wildcard_to_rx}/i
154
- when /^\^=$/
155
- tag_val =~ /^#{val.wildcard_to_rx}/
156
- else
157
- false
158
- end
139
+ begin
140
+ tag_date = Time.parse(tag_val)
141
+ date = Chronic.parse(val)
142
+
143
+ puts "Comparing #{tag_date} #{tag[:comp]} #{date}" if NA.verbose
144
+
145
+ case tag[:comp]
146
+ when /^>$/
147
+ tag_date > date
148
+ when /^<$/
149
+ tag_date < date
150
+ when /^<=$/
151
+ tag_date <= date
152
+ when /^>=$/
153
+ tag_date >= date
154
+ when /^==?$/
155
+ tag_date == date
156
+ when /^\$=$/
157
+ tag_val =~ /#{val.wildcard_to_rx}/i
158
+ when /^\*=$/
159
+ tag_val =~ /#{val.wildcard_to_rx}/i
160
+ when /^\^=$/
161
+ tag_val =~ /^#{val.wildcard_to_rx}/
162
+ else
163
+ false
164
+ end
165
+ rescue
166
+ case tag[:comp]
167
+ when /^>$/
168
+ tag_val.to_f > val.to_f
169
+ when /^<$/
170
+ tag_val.to_f < val.to_f
171
+ when /^<=$/
172
+ tag_val.to_f <= val.to_f
173
+ when /^>=$/
174
+ tag_val.to_f >= val.to_f
175
+ when /^==?$/
176
+ tag_val =~ /^#{val.wildcard_to_rx}$/
177
+ when /^\$=$/
178
+ tag_val =~ /#{val.wildcard_to_rx}$/i
179
+ when /^\*=$/
180
+ tag_val =~ /#{val.wildcard_to_rx}/i
181
+ when /^\^=$/
182
+ tag_val =~ /^#{val.wildcard_to_rx}/
183
+ else
184
+ false
185
+ end
186
+ end
159
187
  end
160
188
 
161
189
  def scan_tags
data/lib/na/string.rb CHANGED
@@ -15,7 +15,7 @@ class ::String
15
15
  ##
16
16
  ## @return [String] string with @tags highlighted
17
17
  ##
18
- def highlight_tags(color: '{m}', value: '{y}', parens: '{m}', last_color: '{g}')
18
+ def highlight_tags(color: '{m}', value: '{y}', parens: '{m}', last_color: '{xg}')
19
19
  tag_color = NA::Color.template(color)
20
20
  paren_color = NA::Color.template(parens)
21
21
  value_color = NA::Color.template(value)
@@ -23,13 +23,19 @@ class ::String
23
23
  "\\1#{tag_color}\\2#{paren_color}\\3#{value_color}\\4#{paren_color}\\5#{last_color}")
24
24
  end
25
25
 
26
- def highlight_search(regexes, color: '{y}')
26
+ def highlight_search(regexes, color: '{y}', last_color: '{xg}')
27
27
  string = dup
28
28
  color = NA::Color.template(color)
29
29
  regexes.each do |rx|
30
30
  next if rx.nil?
31
31
 
32
- string.gsub!(/(#{rx.wildcard_to_rx})/i, "#{color}\\1#{NA::Color.template('{xg}')}")
32
+ rx = Regexp.new(rx.wildcard_to_rx, Regexp::IGNORECASE) if rx.is_a?(String)
33
+
34
+ string.gsub!(rx) do
35
+ m = Regexp.last_match
36
+ last = m.pre_match.last_color
37
+ "#{color}#{m[0]}#{NA::Color.template(last)}"
38
+ end
33
39
  end
34
40
  string
35
41
  end
@@ -62,7 +68,7 @@ class ::String
62
68
  end
63
69
 
64
70
  def wildcard_to_rx
65
- gsub(/\./, '\\.').gsub(/\*/, '.*?').gsub(/\?/, '.')
71
+ gsub(/\./, '\\.').gsub(/\*/, '[^ ]*?').gsub(/\?/, '.')
66
72
  end
67
73
 
68
74
  def cap_first!
data/lib/na/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Na
2
- VERSION = '1.1.14'
2
+ VERSION = '1.1.16'
3
3
  end
data/lib/na.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'na/version'
4
+ require 'time'
4
5
  require 'fileutils'
5
6
  require 'shellwords'
7
+ require 'chronic'
6
8
  require 'tty-screen'
7
9
  require 'tty-reader'
8
10
  require 'tty-which'
data/na.gemspec CHANGED
@@ -30,4 +30,5 @@ spec = Gem::Specification.new do |s|
30
30
  s.add_runtime_dependency('tty-reader', '~> 0.9', '>= 0.9.0')
31
31
  s.add_runtime_dependency('tty-screen', '~> 0.8', '>= 0.8.1')
32
32
  s.add_runtime_dependency('tty-which', '~> 0.5', '>= 0.5.0')
33
+ s.add_runtime_dependency('chronic', '~> 0.10', '>= 0.10.2')
33
34
  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.1.13<!--END VER-->.
12
+ The current version of `na` is <!--VER-->1.1.15<!--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.1.14
4
+ version: 1.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
@@ -146,6 +146,26 @@ dependencies:
146
146
  - - ">="
147
147
  - !ruby/object:Gem::Version
148
148
  version: 0.5.0
149
+ - !ruby/object:Gem::Dependency
150
+ name: chronic
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '0.10'
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 0.10.2
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.10'
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 0.10.2
149
169
  description: A tool for managing a TaskPaper file of project todos for the current
150
170
  directory. Easily create "next actions" to come back to, add tags and priorities,
151
171
  and notes. Add prompt hooks to display your next actions automatically when cd'ing