jtag 0.1.18 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/jtag +226 -188
  3. data/lib/jtag/version.rb +1 -1
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 072e652c6a5dfe8fa5140e7f2f7af1072826e3af41c6d89c030880cedf54041b
4
- data.tar.gz: 99a3969d116038f099991f500d242b9c3fef1934c4ce24bcfbf8a5b27fb8a83e
3
+ metadata.gz: 71af8eca8dc4710dbb6d924c08a68cc834ab90e15f29d533809bdc1a2e269c6a
4
+ data.tar.gz: 964a8e7a5bc147edbd6006d2721ec57d89ca11fd77e77b189f5c0bfa8e6691db
5
5
  SHA512:
6
- metadata.gz: 3bbca2f392910ab5d86b25a280cf1be8e350b03b34e2fa281f128edeb22a760bb67e604036289a278e2a85d7053ea4d510674e5df8ee8271b9e1ec8820e84575
7
- data.tar.gz: fe8dca46e901ebba1cb289c76b4293725cbf91252ee17a95e3f9e9c7dd11697b416691a8b77a300c1caf7499c055b3f7d6466a70aebb436c709f3c64c282add7
6
+ metadata.gz: 13c13c4f35e36c9a9015082a370127bcc2e83f0d7682e1821390fc949534b45d0d134cadcbbe057a669582f16039cc7e7cc1a6f05e1d17edeec92f9663d371b0
7
+ data.tar.gz: 3c0b420b164c1f5fe67e09a6bd4827195c84fe51a8adb6ae153189ec18d75dc649820b3b7c539b780d37d1d311acc2309beeae4f3df59795a57039253ea8f12b
data/bin/jtag CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
- require 'gli'
4
- require 'jtag'
3
+ require "gli"
4
+ require "jtag"
5
+ require "fcntl"
5
6
 
6
7
  include GLI::App
7
8
 
8
- program_desc 'Autotagging for Jekyll'
9
+ program_desc "Autotagging for Jekyll"
9
10
 
10
11
  version Jtag::VERSION
11
12
 
@@ -20,15 +21,24 @@ def config_files_complete?
20
21
  true
21
22
  end
22
23
 
23
- desc 'Debug level'
24
- default_value '0'
25
- arg_name 'debug_level'
24
+ class ::String
25
+ def file_list?
26
+ self.strip.split("\n").each do |line|
27
+ return false unless File.exist?(line)
28
+ end
29
+ true
30
+ end
31
+ end
32
+
33
+ desc "Debug level"
34
+ default_value "0"
35
+ arg_name "debug_level"
26
36
  flag %i[d debug], :must_match => /\d+/, :type => Integer, :default_value => 0
27
37
 
28
- desc 'Run silently'
38
+ desc "Run silently"
29
39
  switch %i[s silent]
30
40
 
31
- desc 'Perform case-insensitive matches and searches'
41
+ desc "Perform case-insensitive matches and searches"
32
42
  switch %i[i case_insensitive]
33
43
 
34
44
  desc "Test (dry run, don't update files)"
@@ -36,7 +46,7 @@ long_desc "Run all commands and show results on the command line, but don't over
36
46
  default_value false
37
47
  switch %i[t test]
38
48
 
39
- def console_log(msg="", options={})
49
+ def console_log(msg = "", options = {})
40
50
  err = options[:err] || false
41
51
  options[:log] ||= false
42
52
 
@@ -57,13 +67,13 @@ def console_log(msg="", options={})
57
67
  end
58
68
  end
59
69
 
60
- desc 'Update and notify user of configuration files location'
70
+ desc "Update and notify user of configuration files location"
61
71
  command :config do |c|
62
- c.desc 'Reset all configuration files to default values'
63
- c.switch [:r,'reset']
72
+ c.desc "Reset all configuration files to default values"
73
+ c.switch [:r, "reset"]
64
74
 
65
75
  c.skips_pre
66
- c.action do |global_options,options,args|
76
+ c.action do |global_options, options, args|
67
77
  if options[:r]
68
78
  print "Are you sure you want to reset all config files? y/N: "
69
79
  response = STDIN.gets.strip
@@ -77,24 +87,22 @@ command :config do |c|
77
87
  end
78
88
  end
79
89
 
80
- def write_config(atomic=false)
81
- gem_root = Gem.loaded_specs['jtag'].full_gem_path
82
- gem_lib = File.join(gem_root, 'lib')
83
- config_source = File.join(gem_lib,'/jtag/config_files')
84
-
85
-
90
+ def write_config(atomic = false)
91
+ gem_root = Gem.loaded_specs["jtag"].full_gem_path
92
+ gem_lib = File.join(gem_root, "lib")
93
+ config_source = File.join(gem_lib, "/jtag/config_files")
86
94
 
87
95
  unless File.directory?(@config_target) || atomic
88
- FileUtils.cp_r(config_source,@config_target)
96
+ FileUtils.cp_r(config_source, @config_target)
89
97
  console_log "Configuration files are located in the folder: " + @config_target
90
98
  console_log %Q{Make sure that "tags_location" in config.yml is set to your tags.json url.}
91
99
  console_log "Configuration files written to #{@config_target}"
92
100
  end
93
101
 
94
102
  @config_files.each do |file|
95
- unless File.exist?(File.join(@config_target,file))
96
- source_file = File.join(config_source,file)
97
- target_file = File.join(@config_target,file)
103
+ unless File.exist?(File.join(@config_target, file))
104
+ source_file = File.join(config_source, file)
105
+ target_file = File.join(@config_target, file)
98
106
  FileUtils.cp(source_file, target_file)
99
107
  console_log "Config file #{file} added."
100
108
  end
@@ -104,66 +112,66 @@ def write_config(atomic=false)
104
112
  console_log %Q{Make sure that "tags_location" in the config.yml file is set to your tags json file.}
105
113
  end
106
114
 
107
- desc 'List tags, optionally filter for keywords/regular expressions (OR)'
108
- long_desc 'This command can be used to find the exact format for a given tag to keep spaces, underscores, capitalization and pluralization consistent'
109
- arg_name 'keyword', :multiple
115
+ desc "List tags, optionally filter for keywords/regular expressions (OR)"
116
+ long_desc "This command can be used to find the exact format for a given tag to keep spaces, underscores, capitalization and pluralization consistent"
117
+ arg_name "keyword", :multiple
110
118
  command :search do |c|
111
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
112
- c.arg_name 'output_format'
113
- c.default_value 'yaml'
119
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
120
+ c.arg_name "output_format"
121
+ c.default_value "yaml"
114
122
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/i, :type => String
115
123
 
116
- c.desc 'Include tag counts'
117
- c.arg_name 'counts'
124
+ c.desc "Include tag counts"
125
+ c.arg_name "counts"
118
126
  c.default_value false
119
127
  c.switch %i[c counts]
120
128
 
121
- c.action do |global_options,options,args|
122
- tags = @jt.get_tags({:counts => true})
129
+ c.action do |global_options, options, args|
130
+ tags = @jt.get_tags({ :counts => true })
123
131
  if args.length > 0
124
132
  re = args.join("|")
125
- tags.delete_if {|tag|
126
- if tag && tag['name'] =~ /(#{re})/i
133
+ tags.delete_if { |tag|
134
+ if tag && tag["name"] =~ /(#{re})/i
127
135
  false
128
136
  else
129
137
  true
130
138
  end
131
139
  }
132
140
  if options[:c]
133
- tags.map! {|tag| "#{tag['name']} (#{tag['count']})" }
141
+ tags.map! { |tag| "#{tag["name"]} (#{tag["count"]})" }
134
142
  else
135
- tags.map! {|tag| tag['name'] }
143
+ tags.map! { |tag| tag["name"] }
136
144
  end
137
- output_tags(tags,{ :format => options[:format] })
145
+ output_tags(tags, { :format => options[:format] })
138
146
  else
139
- tags.delete_if {|tag| !tag }
147
+ tags.delete_if { |tag| !tag }
140
148
  if options[:c]
141
- tags.map! {|tag| "#{tag['name']} (#{tag['count']})" }
149
+ tags.map! { |tag| "#{tag["name"]} (#{tag["count"]})" }
142
150
  else
143
- tags.map! {|tag| tag['name'] }
151
+ tags.map! { |tag| tag["name"] }
144
152
  end
145
- output_tags(tags,{ :format => options[:format] })
153
+ output_tags(tags, { :format => options[:format] })
146
154
  end
147
155
  end
148
156
  end
149
157
 
150
- desc 'List posts with tag(s)'
151
- arg_name 'tags', :multiple
158
+ desc "List posts with tag(s)"
159
+ arg_name "tags", :multiple
152
160
  command :posts_tagged do |c|
153
- c.desc 'Boolean operator for multiple tags (AND/OR/NOT)'
154
- c.arg_name 'bool'
155
- c.default_value 'OR'
161
+ c.desc "Boolean operator for multiple tags (AND/OR/NOT)"
162
+ c.arg_name "bool"
163
+ c.default_value "OR"
156
164
  c.flag %i[b bool], :must_match => /(AND|OR|NOT)/i, :type => String
157
165
 
158
- c.desc 'Format to use when outputting file list: list, json, plist, csv or yaml. Defaults to list.'
159
- c.arg_name 'output_format'
160
- c.default_value 'list'
166
+ c.desc "Format to use when outputting file list: list, json, plist, csv or yaml. Defaults to list."
167
+ c.arg_name "output_format"
168
+ c.default_value "list"
161
169
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
162
170
 
163
- c.desc 'If output format is list, print without newlines.'
171
+ c.desc "If output format is list, print without newlines."
164
172
  c.switch [:print0]
165
173
 
166
- c.action do |global_options,options,args|
174
+ c.action do |global_options, options, args|
167
175
  bool = options[:bool].upcase
168
176
  files = []
169
177
  tags = []
@@ -176,30 +184,33 @@ command :posts_tagged do |c|
176
184
  tags.push(arg)
177
185
  end
178
186
  end
187
+
188
+ files.concat(@piped_content.split("\n")) if @piped_content
189
+
179
190
  if files.empty?
180
191
  if @jt.default_post_location && File.exist?(File.dirname(@jt.default_post_location))
181
192
  files = Dir.glob(@jt.default_post_location)
182
193
  end
183
194
  end
184
195
  exit_now! "No valid filename in arguments" if files.empty?
185
- files.each {|file|
196
+ files.each { |file|
186
197
  if File.exist?(file)
187
198
  post_tags = @jt.post_tags(file)
188
199
 
189
200
  if bool == "AND"
190
201
  matched = 0
191
- tags.each {|tag|
202
+ tags.each { |tag|
192
203
  matched += 1 if post_tags.include?(tag)
193
204
  }
194
205
  matches.push(file) if matched == tags.length
195
206
  elsif bool == "NOT"
196
207
  matched = false
197
- tags.each {|tag|
208
+ tags.each { |tag|
198
209
  matched = true if post_tags.include?(tag)
199
210
  }
200
211
  matches.push(file) unless matched
201
212
  else
202
- tags.each {|tag|
213
+ tags.each { |tag|
203
214
  if post_tags.include?(tag)
204
215
  matches.push(file) unless matches.include?(file)
205
216
  end
@@ -214,23 +225,23 @@ command :posts_tagged do |c|
214
225
  if matches.empty?
215
226
  console_log "No matching files found for #{search_string}"
216
227
  else
217
- console_log "(#{search_string})", {:err => true}
228
+ console_log "(#{search_string})", { :err => true }
218
229
  output_tags(matches, { :format => options[:format], :print0 => options[:print0], :grouping => "files" })
219
230
  end
220
231
  end
221
232
  end
222
233
 
223
- desc 'Show tags with fewer than X posts attached to them, optionally removing them from specified posts'
224
- arg_name 'file_pattern', :multiple
234
+ desc "Show tags with fewer than X posts attached to them, optionally removing them from specified posts"
235
+ arg_name "file_pattern", :multiple
225
236
  command :loners do |c|
226
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
227
- c.arg_name 'output_format'
228
- c.default_value 'yaml'
237
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
238
+ c.arg_name "output_format"
239
+ c.default_value "yaml"
229
240
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
230
241
 
231
- c.desc 'Upper limit for how many posts a tag can be attached to and still be a loner'
232
- c.arg_name 'max'
233
- c.default_value '2'
242
+ c.desc "Upper limit for how many posts a tag can be attached to and still be a loner"
243
+ c.arg_name "max"
244
+ c.default_value "2"
234
245
  c.flag %i[m max], :default_value => 2, :must_match => /^\d+$/
235
246
 
236
247
  c.desc "Remove tags with fewer than X posts attached"
@@ -239,17 +250,17 @@ command :loners do |c|
239
250
  c.desc "Display output without attached occurence counts"
240
251
  c.switch [:no_counts], :default_value => false
241
252
 
242
- c.desc 'Output a file list of tags that can be edited and passed back in for removing'
243
- c.arg_name 'filename'
253
+ c.desc "Output a file list of tags that can be edited and passed back in for removing"
254
+ c.arg_name "filename"
244
255
  c.flag %i[e edit], :default_value => false, :type => String
245
256
 
246
- c.action do |global_options,options,args|
257
+ c.action do |global_options, options, args|
247
258
  max = options[:m].to_i
248
- loner_tags = @jt.get_tags({:counts => true})
259
+ loner_tags = @jt.get_tags({ :counts => true })
249
260
  loner_tags.delete_if { |tag|
250
- tag.class == FalseClass || tag['count'] > max
261
+ tag.class == FalseClass || tag["count"] > max
251
262
  }
252
- loner_tags.sort_by! {|tag| tag['count']}
263
+ loner_tags.sort_by! { |tag| tag["count"] }
253
264
 
254
265
  exit_now! "No tags matched the criteria" if loner_tags.empty? || loner_tags.nil?
255
266
 
@@ -261,10 +272,10 @@ command :loners do |c|
261
272
  $1.next! + $2
262
273
  end
263
274
  else
264
- path.sub!(/(\.[^\.]+?)?$/,'01\1')
275
+ path.sub!(/(\.[^\.]+?)?$/, '01\1')
265
276
  end
266
277
  end
267
- File.open(path, 'w+') do |f|
278
+ File.open(path, "w+") do |f|
268
279
  f.puts "# Edit this file to remove tags you want to keep,"
269
280
  f.puts "# then run `jtag remove -p '#{path}' [/path/to/posts/*.md]`"
270
281
  f.puts "# to remove any tags left in the file."
@@ -273,18 +284,18 @@ command :loners do |c|
273
284
  f.puts "# be automatically ignored when reading the list back in."
274
285
  f.puts "#"
275
286
  f.puts "# Lines beginning with a # are comments (ignored), but you probably figured that out."
276
- loner_tags.each{ |t|
277
- f.printf "% 3d |\t%s\n", t['count'], t['name']
287
+ loner_tags.each { |t|
288
+ f.printf "% 3d |\t%s\n", t["count"], t["name"]
278
289
  }
279
290
  end
280
291
 
281
292
  console_log "A list of results and instructions for use have been written to #{path}."
282
- if ENV['EDITOR']
293
+ if ENV["EDITOR"]
283
294
  console_log
284
- print "Would you like to open the file in #{ENV['EDITOR']} now? (y/N) "
295
+ print "Would you like to open the file in #{ENV["EDITOR"]} now? (y/N) "
285
296
  input = STDIN.gets
286
297
  if input =~ /^y/i
287
- system "#{ENV['EDITOR']} '#{path}'"
298
+ system "#{ENV["EDITOR"]} '#{path}'"
288
299
  end
289
300
  end
290
301
  elsif options[:r]
@@ -293,13 +304,16 @@ command :loners do |c|
293
304
  arg = args.pop
294
305
  files.push(arg) if File.exist?(arg)
295
306
  end
307
+
308
+ files.concat(@piped_content.split("\n")) if @piped_content
309
+
296
310
  if files.empty?
297
311
  if @jt.default_post_location && File.exist?(File.dirname(@jt.default_post_location))
298
312
  files = Dir.glob(@jt.default_post_location)
299
313
  end
300
314
  end
301
315
  exit_now! "No valid filename in arguments" if files.empty?
302
- files.each {|file|
316
+ files.each { |file|
303
317
  tags = @jt.post_tags(file)
304
318
  loner_tags.each { |d|
305
319
  tags.delete_if { |tag|
@@ -317,69 +331,76 @@ command :loners do |c|
317
331
 
318
332
  console_log
319
333
  console_log File.basename(file) + ":"
320
- output_tags(tags, :format => options[:format], :filename => file )
334
+ output_tags(tags, :format => options[:format], :filename => file)
321
335
  }
322
336
  else
323
- output_tags(loner_tags.map{|tag|
324
- count = options[:no_counts] ? "" : " (#{tag['count']})"
325
- "#{tag['name']}#{count}"}, :format => options[:format] )
337
+ output_tags(loner_tags.map { |tag|
338
+ count = options[:no_counts] ? "" : " (#{tag["count"]})"
339
+ "#{tag["name"]}#{count}"
340
+ }, :format => options[:format])
326
341
  end
327
342
  end
328
343
  end
329
344
 
330
-
331
- desc 'Show the current tags for posts'
332
- arg_name 'file_pattern', :multiple
345
+ desc "Show the current tags for posts"
346
+ arg_name "file_pattern", :multiple
333
347
  command :tags do |c|
334
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
335
- c.arg_name 'output_format'
336
- c.default_value 'yaml'
348
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
349
+ c.arg_name "output_format"
350
+ c.default_value "yaml"
337
351
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
338
352
 
339
- c.action do |global_options,options,args|
353
+ c.action do |global_options, options, args|
354
+ files = []
355
+ args.length.times do
356
+ arg = args.pop
357
+ if File.exist?(arg)
358
+ files.push(arg)
359
+ end
360
+ end
361
+
362
+ files.concat(@piped_content.split("\n")) if @piped_content && @piped_content.file_list?
363
+
364
+ tags = []
365
+ files.each do |file|
366
+ tags.concat(@jt.post_tags(file)) if File.exist?(file)
340
367
 
341
- if @piped_content
342
- tags = @jt.post_tags(@piped_content, true)
343
- if args.length > 1
368
+ if args.length > 0
344
369
  console_log
345
- console_log 'STDIN:'
346
- end
347
- if tags.empty? || tags.nil?
348
- console_log "No tags in post", {:err => true}
349
- else
350
- output_tags(tags,{ :format => options[:format] })
370
+ console_log "STDIN:"
351
371
  end
352
372
  end
353
- args.each{|file|
354
- if File.exist?(file)
355
- tags = @jt.post_tags(file)
356
- if args.length > 1
357
- console_log
358
- console_log File.basename(file) + ":"
359
- end
360
- if tags.empty? || tags.nil?
361
- console_log "No tags in post", {:err => true}
362
- else
363
- output_tags(tags,{ :format => options[:format], :filename => file })
364
- end
365
- else
366
- raise "File not found: #{file}"
367
- end
368
- }
373
+
374
+ if tags.empty? || tags.nil?
375
+ console_log "No tags in post", { :err => true }
376
+ else
377
+ tags.sort!
378
+ tags.uniq!
379
+ output_tags(tags, { :format => options[:format] })
380
+ end
369
381
  end
370
382
  end
371
383
 
372
-
373
- desc 'Sort the existing tags for posts'
374
- arg_name 'file_pattern', :multiple
384
+ desc "Sort the existing tags for posts"
385
+ arg_name "file_pattern", :multiple
375
386
  command :sort do |c|
376
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
377
- c.arg_name 'output_format'
378
- c.default_value 'yaml'
387
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
388
+ c.arg_name "output_format"
389
+ c.default_value "yaml"
379
390
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
380
391
 
381
- c.action do |global_options,options,args|
382
- args.each{|file|
392
+ c.action do |global_options, options, args|
393
+ files = []
394
+ args.length.times do
395
+ arg = args.pop
396
+ if File.exist?(arg)
397
+ files.push(arg)
398
+ end
399
+ end
400
+
401
+ files.concat(@piped_content.split("\n")) if @piped_content
402
+
403
+ files.each do |file|
383
404
  tags = @jt.post_tags(file)
384
405
  tags.uniq!
385
406
  tags.sort!
@@ -390,21 +411,21 @@ command :sort do |c|
390
411
  console_log File.basename(file) + ":"
391
412
 
392
413
  if tags.empty? || tags.nil?
393
- console_log "No tags in post", {:err => true}
414
+ console_log "No tags in post", { :err => true }
394
415
  else
395
- output_tags(tags,{ :format => options[:format], :filename => file })
416
+ output_tags(tags, { :format => options[:format], :filename => file })
396
417
  end
397
- }
418
+ end
398
419
  end
399
420
  end
400
421
 
401
- desc 'Merge multiple tags into one'
402
- long_desc 'Scans the specified posts for any of the tags, merging any found into the last one in the list'
403
- arg_name 'tags to merge merge_tag'
422
+ desc "Merge multiple tags into one"
423
+ long_desc "Scans the specified posts for any of the tags, merging any found into the last one in the list"
424
+ arg_name "tags to merge merge_tag"
404
425
  command :merge do |c|
405
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
406
- c.arg_name 'output_format'
407
- c.default_value 'yaml'
426
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
427
+ c.arg_name "output_format"
428
+ c.default_value "yaml"
408
429
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
409
430
 
410
431
  c.action do |global_options, options, args|
@@ -418,6 +439,9 @@ command :merge do |c|
418
439
  tags.push(arg)
419
440
  end
420
441
  end
442
+
443
+ files.concat(@piped_content.split("\n")) if @piped_content
444
+
421
445
  if files.empty?
422
446
  if @jt.default_post_location && File.exist?(File.dirname(@jt.default_post_location))
423
447
  files = Dir.glob(@jt.default_post_location)
@@ -428,8 +452,8 @@ command :merge do |c|
428
452
  tags.reverse!
429
453
  merge_tag = tags.pop
430
454
  console_log %Q{Merging #{tags.join(", ")} to #{merge_tag}}
431
- files.each {|file|
432
- new_tags = @jt.merge_tags(tags,merge_tag,file)
455
+ files.each { |file|
456
+ new_tags = @jt.merge_tags(tags, merge_tag, file)
433
457
  next unless new_tags
434
458
  unless global_options[:t]
435
459
  @jt.update_file_tags(file, new_tags)
@@ -439,20 +463,18 @@ command :merge do |c|
439
463
 
440
464
  console_log
441
465
  console_log File.basename(file) + ":"
442
- output_tags(new_tags,{ :format => options[:format], :filename => file })
443
-
466
+ output_tags(new_tags, { :format => options[:format], :filename => file })
444
467
  }
445
468
  end
446
469
  end
447
470
 
448
-
449
- desc 'Blacklist a specific tag'
450
- arg_name 'tag [tag2...]'
471
+ desc "Blacklist a specific tag"
472
+ arg_name "tag [tag2...]"
451
473
  command :blacklist do |c|
452
474
  c.desc "Remove (unblacklist) the arguments"
453
- c.switch [:r,'remove']
475
+ c.switch [:r, "remove"]
454
476
 
455
- c.action do |global_options,options,args|
477
+ c.action do |global_options, options, args|
456
478
  if options[:r]
457
479
  @jt.unblacklist(args)
458
480
  console_log "Removed #{args.join(", ")} from blacklist."
@@ -463,17 +485,16 @@ command :blacklist do |c|
463
485
  end
464
486
  end
465
487
 
466
- desc 'Add tags to post(s)'
467
- arg_name 'tags', :multiple
468
- arg_name 'file_pattern'
488
+ desc "Add tags to post(s)"
489
+ arg_name "tags", :multiple
490
+ arg_name "file_pattern"
469
491
  command :add do |c|
470
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
471
- c.arg_name 'output_format'
472
- c.default_value 'yaml'
492
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
493
+ c.arg_name "output_format"
494
+ c.default_value "yaml"
473
495
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
474
496
 
475
-
476
- c.action do |global_options,options,args|
497
+ c.action do |global_options, options, args|
477
498
  files = []
478
499
  new_tags = []
479
500
  args.length.times do
@@ -484,6 +505,9 @@ command :add do |c|
484
505
  new_tags.push(arg)
485
506
  end
486
507
  end
508
+
509
+ files.concat(@piped_content.split("\n")) if @piped_content
510
+
487
511
  if files.empty?
488
512
  if @jt.default_post_location && File.exist?(File.dirname(@jt.default_post_location))
489
513
  files = Dir.glob(@jt.default_post_location)
@@ -492,7 +516,7 @@ command :add do |c|
492
516
  exit_now! "No valid filename in arguments" if files.empty?
493
517
  exit_now! "No tags found in arguments" if new_tags.empty?
494
518
 
495
- files.each {|file|
519
+ files.each { |file|
496
520
  tags = @jt.post_tags(file)
497
521
  tags.concat(new_tags)
498
522
  tags.uniq!
@@ -509,20 +533,20 @@ command :add do |c|
509
533
  end
510
534
  end
511
535
 
512
- desc 'Remove tags from post(s)'
513
- arg_name 'tags', :multiple
536
+ desc "Remove tags from post(s)"
537
+ arg_name "tags", :multiple
514
538
  command :remove do |c|
515
- c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml.'
516
- c.arg_name 'output_format'
517
- c.default_value 'yaml'
539
+ c.desc "Format to use when outputting tags to console: list, json, plist, csv or yaml. Defaults to yaml."
540
+ c.arg_name "output_format"
541
+ c.default_value "yaml"
518
542
  c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist)$/, :type => String
519
543
 
520
- c.desc 'A filepath to a list of tags to be removed'
521
- c.long_desc 'One tag per line, and leading numbers and pipes (|) will be ignored. This file format is generated automatically by the `loners` command, but any text file will do the trick.'
522
- c.arg_name 'input_file'
544
+ c.desc "A filepath to a list of tags to be removed"
545
+ c.long_desc "One tag per line, and leading numbers and pipes (|) will be ignored. This file format is generated automatically by the `loners` command, but any text file will do the trick."
546
+ c.arg_name "input_file"
523
547
  c.flag %i[p path], :type => String
524
548
 
525
- c.action do |global_options,options,args|
549
+ c.action do |global_options, options, args|
526
550
  files = []
527
551
  remove_tags = []
528
552
  args.length.times do
@@ -533,6 +557,9 @@ command :remove do |c|
533
557
  remove_tags.push(arg) unless options[:p]
534
558
  end
535
559
  end
560
+
561
+ files.concat(@piped_content.split("\n")) if @piped_content
562
+
536
563
  if files.empty?
537
564
  if @jt.default_post_location && File.exist?(File.dirname(@jt.default_post_location))
538
565
  files = Dir.glob(@jt.default_post_location)
@@ -543,7 +570,7 @@ command :remove do |c|
543
570
  if options[:p]
544
571
  path = File.expand_path(options[:p])
545
572
  exit_now! "Input file does not appear to be where you think it is." unless File.exist?(path)
546
- IO.read(path).each_line {|l|
573
+ IO.read(path).each_line { |l|
547
574
  next if l =~ /^\s*#/
548
575
  if l =~ /^(?:[\s\d])*(?:\|\s*)?(\S.*?)$/
549
576
  remove_tags.push($1.strip)
@@ -554,7 +581,7 @@ command :remove do |c|
554
581
 
555
582
  exit_now! "No tags found in input, my work here is done" if remove_tags.empty?
556
583
 
557
- files.each {|file|
584
+ files.each { |file|
558
585
  tags = @jt.post_tags(file)
559
586
  remove_tags.each { |d|
560
587
  tags.delete_if { |tag|
@@ -572,32 +599,41 @@ command :remove do |c|
572
599
 
573
600
  console_log
574
601
  console_log File.basename(file) + ":"
575
- output_tags(tags,{ :format => options[:format], :filename => file })
602
+ output_tags(tags, { :format => options[:format], :filename => file })
576
603
  }
577
604
  end
578
605
  end
579
606
 
580
- desc 'Generate a list of recommended tags, optionally updating the file'
581
- arg_name 'file_pattern', :multiple
607
+ desc "Generate a list of recommended tags, updating the file (unless dry run)"
608
+ arg_name "file_pattern", :multiple
582
609
  command :tag do |c|
583
610
  c.desc 'Format to use when outputting tags to console: list, json, plist, csv or yaml. Use "complete" to output full text when input is STDIN.'
584
- c.arg_name 'output_format'
585
- c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist|complete)$/, :type => String, :default_value => 'yaml'
611
+ c.arg_name "output_format"
612
+ c.flag %i[f format], :must_match => /^(csv|list|yaml|json|plist|complete)$/, :type => String, :default_value => "yaml"
586
613
 
587
614
  c.action do |global_options, options, args|
588
- if @piped_content
615
+ if @piped_content && !@piped_content.file_list?
589
616
  suggestions = @jt.suggest(@piped_content)
590
617
  if args.length > 0
591
618
  console_log
592
- console_log 'STDIN:', :err => true
619
+ console_log "STDIN:", :err => true
593
620
  end
594
- if options[:format] == 'complete'
621
+ if options[:format] == "complete"
595
622
  @jt.update_file_tags(@piped_content, suggestions, true)
596
623
  else
597
624
  output_tags(suggestions, :format => options[:format], :filename => nil)
598
625
  end
599
626
  end
600
- args.each {|file|
627
+
628
+ files = []
629
+ args.length.times do
630
+ arg = args.pop
631
+ files.push(arg) if File.exist?(arg)
632
+ end
633
+
634
+ files.concat(@piped_content.split("\n")) if @piped_content && @piped_content.file_list?
635
+
636
+ files.each do |file|
601
637
  if File.exist?(File.expand_path(file))
602
638
  input = IO.read(File.expand_path(file))
603
639
  suggestions = @jt.suggest(input)
@@ -616,26 +652,26 @@ command :tag do |c|
616
652
  console_log
617
653
  console_log File.basename(file) + ":", :err => true, :log => true
618
654
  end
619
- output_tags(suggestions, :format => options[:format], :filename => file )
655
+ output_tags(suggestions, :format => options[:format], :filename => file)
620
656
  end
621
657
  suggestions = nil
622
658
  else
623
659
  raise "No such file: #{file}"
624
660
  end
625
- }
661
+ end
626
662
  end
627
663
  end
628
664
 
629
- def output_tags(tags,options)
630
- format = options[:format] || 'yaml'
665
+ def output_tags(tags, options)
666
+ format = options[:format] || "yaml"
631
667
  print0 = options[:print0] || false
632
668
  filename = options[:filename] || false
633
669
  case format
634
- when 'list'
670
+ when "list"
635
671
  unless print0
636
672
  console_log tags.join("\n")
637
673
  else
638
- console_log tags.map {|tag|
674
+ console_log tags.map { |tag|
639
675
  if tag.strip =~ /\b\s\b/
640
676
  %Q{"#{tag.strip}"}
641
677
  else
@@ -643,19 +679,19 @@ def output_tags(tags,options)
643
679
  end
644
680
  }.join(" ")
645
681
  end
646
- when 'csv'
682
+ when "csv"
647
683
  console_log tags.to_csv
648
- when 'json'
684
+ when "json"
649
685
  out = {}
650
- out['tags'] = tags
651
- out['path'] = filename if filename
686
+ out["tags"] = tags
687
+ out["path"] = filename if filename
652
688
  console_log out.to_json
653
- when 'plist'
689
+ when "plist"
654
690
  out = {}
655
- out['path'] = filename if filename
691
+ out["path"] = filename if filename
656
692
  console_log tags.to_plist
657
693
  else
658
- out = {}
694
+ out = {}
659
695
  options[:grouping] ||= "tags"
660
696
  out[options[:grouping]] = tags
661
697
  console_log out.to_yaml
@@ -677,29 +713,31 @@ pre do |global, command, options, args|
677
713
  # on that command only
678
714
  @silent = global[:silent]
679
715
 
680
- @logfile = File.open(File.join(Dir.tmpdir, "jtag_actions.log"), 'a')
716
+ Signal.trap("PIPE", "EXIT")
717
+
718
+ @logfile = File.open(File.join(Dir.tmpdir, "jtag_actions.log"), "a")
681
719
 
682
720
  @log = Logger.new(@logfile, shift_age = 7, shift_size = 1048576)
683
721
 
684
722
  unless config_files_complete?
685
723
  write_config
686
- console_log "Missing config files written to #{@config_target}. Please check your configuration.", {:err => true}
724
+ console_log "Missing config files written to #{@config_target}. Please check your configuration.", { :err => true }
687
725
  return false
688
726
  end
689
727
 
690
728
  configfile = File.expand_path("~/.jtag/config.yml")
691
729
 
692
- global[:config] = YAML::load(File.open(configfile,"r"))
730
+ global[:config] = YAML::load(File.open(configfile, "r"))
693
731
  global[:support] = File.expand_path("~/.jtag")
694
732
 
695
- @piped_content = STDIN.stat.size > 0 ? STDIN.read : nil
733
+ @piped_content = $stdin.read if $stdin.fcntl(Fcntl::F_GETFL, 0) == 0 || $stdin.stat.pipe?
696
734
 
697
735
  @jt = JTag.new(global[:support], global[:config])
698
736
 
699
737
  true
700
738
  end
701
739
 
702
- post do |global,command,options,args|
740
+ post do |global, command, options, args|
703
741
  # Post logic here
704
742
  # Use skips_post before a command to skip this
705
743
  # block on that command only
data/lib/jtag/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jtag
2
- VERSION = '0.1.18'
2
+ VERSION = '0.1.19'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jtag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-17 00:00:00.000000000 Z
11
+ date: 2024-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  requirements: []
127
- rubygems_version: 3.4.0.dev
127
+ rubygems_version: 3.2.16
128
128
  signing_key:
129
129
  specification_version: 4
130
130
  summary: Auto-tagging and tagging tools for Jekyll