howzit 2.0.9 → 2.0.10
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/CHANGELOG.md +9 -0
- data/lib/howzit/buildnote.rb +160 -11
- data/lib/howzit/colors.rb +3 -0
- data/lib/howzit/console_logger.rb +1 -0
- data/lib/howzit/hash.rb +2 -2
- data/lib/howzit/task.rb +1 -0
- data/lib/howzit/version.rb +1 -1
- data/lib/howzit.rb +11 -0
- metadata +1 -2
- data/lib/howzit/buildnotes.rb +0 -1252
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd8307dc1bdbf51c7a78333c5880990b0bf82acb3fb2401d9e9969fe312ce125
|
4
|
+
data.tar.gz: 72ef1a744da1debcd5faf9ff9ee170eae3389b04e585cd652450eb65ba177c30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: affa665e5f83a8b836f5fe0a3d3c8e178d6fc880bcf3cecfe13afe44e61f4392831a45ff57f1a412a6ae7878f5cd7c00cd541aea1d780eb2b61aa01247268855
|
7
|
+
data.tar.gz: 85449c9184c5927d56acbd00e4086f11a9f4ee85085bfe07c12eb3e7b27e71c00eccee203fd73bda94919dfef000ead8f99f61e275b4d73700b442e25caa38c9
|
data/CHANGELOG.md
CHANGED
data/lib/howzit/buildnote.rb
CHANGED
@@ -7,10 +7,27 @@ module Howzit
|
|
7
7
|
|
8
8
|
attr_reader :metadata, :title
|
9
9
|
|
10
|
+
##
|
11
|
+
## Initialize a build note
|
12
|
+
##
|
13
|
+
## @param file [String] The path to the build note file
|
14
|
+
## @param args [Array] additional args
|
15
|
+
##
|
10
16
|
def initialize(file: nil, args: [])
|
11
17
|
@topics = []
|
12
|
-
|
13
|
-
|
18
|
+
if note_file.nil?
|
19
|
+
res = Prompt.yn('No build notes file found, create one?', default: true)
|
20
|
+
|
21
|
+
create_note if res
|
22
|
+
Process.exit 0
|
23
|
+
end
|
24
|
+
content = Util.read_file(note_file)
|
25
|
+
if content.nil? || content.empty?
|
26
|
+
Howzit.console.error("{br}No content found in build note (#{note_file}){x}".c)
|
27
|
+
Process.exit 1
|
28
|
+
else
|
29
|
+
@metadata = content.split(/^#/)[0].strip.get_metadata
|
30
|
+
end
|
14
31
|
|
15
32
|
read_help(file)
|
16
33
|
end
|
@@ -19,14 +36,25 @@ module Howzit
|
|
19
36
|
puts "#<Howzit::BuildNote @topics=[#{@topics.count}]>"
|
20
37
|
end
|
21
38
|
|
39
|
+
##
|
40
|
+
## Public method to begin processing the build note based on command line options
|
41
|
+
##
|
22
42
|
def run
|
23
43
|
process
|
24
44
|
end
|
25
45
|
|
46
|
+
##
|
47
|
+
## Public method to open build note in editor
|
48
|
+
##
|
26
49
|
def edit
|
27
50
|
edit_note
|
28
51
|
end
|
29
52
|
|
53
|
+
##
|
54
|
+
## Find a topic based on a fuzzy match
|
55
|
+
##
|
56
|
+
## @param term [String] The search term
|
57
|
+
##
|
30
58
|
def find_topic(term)
|
31
59
|
@topics.filter do |topic|
|
32
60
|
rx = term.to_rx
|
@@ -34,11 +62,19 @@ module Howzit
|
|
34
62
|
end
|
35
63
|
end
|
36
64
|
|
65
|
+
##
|
66
|
+
## Call grep on all topics, filtering out those that don't match
|
67
|
+
##
|
68
|
+
## @param term [String] The search pattern
|
69
|
+
##
|
37
70
|
def grep(term)
|
38
71
|
@topics.filter { |topic| topic.grep(term) }
|
39
72
|
end
|
40
73
|
|
41
74
|
# Output a list of topic titles
|
75
|
+
#
|
76
|
+
# @return [String] formatted list of topics in build note
|
77
|
+
#
|
42
78
|
def list
|
43
79
|
output = []
|
44
80
|
output.push("{bg}Topics:{x}\n".c)
|
@@ -48,14 +84,32 @@ module Howzit
|
|
48
84
|
output.join("\n")
|
49
85
|
end
|
50
86
|
|
87
|
+
|
88
|
+
##
|
89
|
+
## Return an array of topic titles
|
90
|
+
##
|
91
|
+
## @return [Array] array of topic titles
|
92
|
+
##
|
51
93
|
def list_topics
|
52
94
|
@topics.map { |topic| topic.title }
|
53
95
|
end
|
54
96
|
|
97
|
+
##
|
98
|
+
## Return a list of topic titles suitable for shell completion
|
99
|
+
##
|
100
|
+
## @return [String] newline-separated list of topic titles
|
101
|
+
##
|
55
102
|
def list_completions
|
56
103
|
list_topics.join("\n")
|
57
104
|
end
|
58
105
|
|
106
|
+
##
|
107
|
+
## Return a list of topics containing @directives,
|
108
|
+
## suitable for shell completion
|
109
|
+
##
|
110
|
+
## @return [String] newline-separated list of topic
|
111
|
+
## titles
|
112
|
+
##
|
59
113
|
def list_runnable_completions
|
60
114
|
output = []
|
61
115
|
@topics.each do |topic|
|
@@ -64,6 +118,12 @@ module Howzit
|
|
64
118
|
output.join("\n")
|
65
119
|
end
|
66
120
|
|
121
|
+
##
|
122
|
+
## Return a formatted list of topics containing
|
123
|
+
## @directives suitable for console output
|
124
|
+
##
|
125
|
+
## @return [String] formatted list
|
126
|
+
##
|
67
127
|
def list_runnable
|
68
128
|
output = []
|
69
129
|
output.push(%({bg}"Runnable" Topics:{x}\n).c)
|
@@ -82,6 +142,11 @@ module Howzit
|
|
82
142
|
output.join("\n")
|
83
143
|
end
|
84
144
|
|
145
|
+
##
|
146
|
+
## Read the help file contents
|
147
|
+
##
|
148
|
+
## @param file [String] The filepath
|
149
|
+
##
|
85
150
|
def read_file(file)
|
86
151
|
read_help_file(file)
|
87
152
|
end
|
@@ -210,6 +275,13 @@ module Howzit
|
|
210
275
|
buildnotes.reverse
|
211
276
|
end
|
212
277
|
|
278
|
+
##
|
279
|
+
## Test if the filename matches the conditions to be a build note
|
280
|
+
##
|
281
|
+
## @param filename [String] The filename to test
|
282
|
+
##
|
283
|
+
## @return [Boolean] true if filename passes test
|
284
|
+
##
|
213
285
|
def build_note?(filename)
|
214
286
|
return false if filename.downcase !~ /^(howzit[^.]*|build[^.]+)/
|
215
287
|
|
@@ -218,6 +290,11 @@ module Howzit
|
|
218
290
|
true
|
219
291
|
end
|
220
292
|
|
293
|
+
##
|
294
|
+
## Glob current directory for valid build note filenames
|
295
|
+
##
|
296
|
+
## @return [String] file path
|
297
|
+
##
|
221
298
|
def glob_note
|
222
299
|
filename = nil
|
223
300
|
# Check for a build note file in the current folder. Filename must start
|
@@ -232,6 +309,13 @@ module Howzit
|
|
232
309
|
filename
|
233
310
|
end
|
234
311
|
|
312
|
+
##
|
313
|
+
## Search for a valid build note, checking current
|
314
|
+
## directory, git top level directory, and parent
|
315
|
+
## directories
|
316
|
+
##
|
317
|
+
## @return [String] filepath
|
318
|
+
##
|
235
319
|
def find_note_file
|
236
320
|
filename = glob_note
|
237
321
|
|
@@ -253,6 +337,11 @@ module Howzit
|
|
253
337
|
File.expand_path(filename)
|
254
338
|
end
|
255
339
|
|
340
|
+
##
|
341
|
+
## Search upstream directories for build notes
|
342
|
+
##
|
343
|
+
## @return [Array] array of build note paths
|
344
|
+
##
|
256
345
|
def read_upstream
|
257
346
|
buildnotes = glob_upstream
|
258
347
|
|
@@ -263,6 +352,13 @@ module Howzit
|
|
263
352
|
topics_dict
|
264
353
|
end
|
265
354
|
|
355
|
+
##
|
356
|
+
## Test to ensure that any `required` metadata in a
|
357
|
+
## template is fulfilled by the build note
|
358
|
+
##
|
359
|
+
## @param template [String] The template to read
|
360
|
+
## from
|
361
|
+
##
|
266
362
|
def ensure_requirements(template)
|
267
363
|
t_leader = Util.read_file(template).split(/^#/)[0].strip
|
268
364
|
if t_leader.length > 0
|
@@ -271,8 +367,8 @@ module Howzit
|
|
271
367
|
required = t_meta['required'].strip.split(/\s*,\s*/)
|
272
368
|
required.each do |req|
|
273
369
|
unless @metadata.keys.include?(req.downcase)
|
274
|
-
Howzit.console.error %({
|
275
|
-
Howzit.console.error %({
|
370
|
+
Howzit.console.error %({bRw}ERROR:{xbr} Missing required metadata key from template '{bw}#{File.basename(template, '.md')}{xr}'{x}).c
|
371
|
+
Howzit.console.error %({br}Please define {by}#{req.downcase}{xr} in build notes{x}).c
|
276
372
|
Process.exit 1
|
277
373
|
end
|
278
374
|
end
|
@@ -280,6 +376,11 @@ module Howzit
|
|
280
376
|
end
|
281
377
|
end
|
282
378
|
|
379
|
+
##
|
380
|
+
## Read a list of topics from an included template
|
381
|
+
##
|
382
|
+
## @param content [String] The template contents
|
383
|
+
##
|
283
384
|
def get_template_topics(content)
|
284
385
|
leader = content.split(/^#/)[0].strip
|
285
386
|
|
@@ -327,10 +428,16 @@ module Howzit
|
|
327
428
|
template_topics
|
328
429
|
end
|
329
430
|
|
330
|
-
|
331
|
-
|
431
|
+
##
|
432
|
+
## Import the contents of a filename as new topics
|
433
|
+
##
|
434
|
+
## @param mtch [MatchData] the filename match from
|
435
|
+
## the include directive
|
436
|
+
##
|
437
|
+
def include_file(mtch)
|
438
|
+
file = File.expand_path(mtch[1])
|
332
439
|
|
333
|
-
return
|
440
|
+
return mtch[0] unless File.exist?(file)
|
334
441
|
|
335
442
|
content = Util.read_file(file)
|
336
443
|
home = ENV['HOME']
|
@@ -345,6 +452,11 @@ module Howzit
|
|
345
452
|
end
|
346
453
|
end
|
347
454
|
|
455
|
+
##
|
456
|
+
## Get the title of the build note (top level header)
|
457
|
+
##
|
458
|
+
## @param truncate [Integer] Truncate to width
|
459
|
+
##
|
348
460
|
def note_title(truncate = 0)
|
349
461
|
help = Util.read_file(note_file)
|
350
462
|
title = help.match(/(?:^(\S.*?)(?=\n==)|^# ?(.*?)$)/)
|
@@ -357,7 +469,13 @@ module Howzit
|
|
357
469
|
title && truncate.positive? ? title.trunc(truncate) : title
|
358
470
|
end
|
359
471
|
|
360
|
-
# Read in the build notes file and output a hash of
|
472
|
+
# Read in the build notes file and output a hash of
|
473
|
+
# "Title" => contents
|
474
|
+
#
|
475
|
+
# @param path [String] The build note path
|
476
|
+
#
|
477
|
+
# @return [Array] array of Topics
|
478
|
+
#
|
361
479
|
def read_help_file(path = nil)
|
362
480
|
topics = []
|
363
481
|
|
@@ -365,6 +483,11 @@ module Howzit
|
|
365
483
|
|
366
484
|
help = Util.read_file(filename)
|
367
485
|
|
486
|
+
if help.nil? || help.empty?
|
487
|
+
Howzit.console.error("{br}No content found in #{filename}{x}".c)
|
488
|
+
Process.exit 1
|
489
|
+
end
|
490
|
+
|
368
491
|
@title = note_title
|
369
492
|
|
370
493
|
help.gsub!(/@include\((.*?)\)/) do
|
@@ -403,6 +526,11 @@ module Howzit
|
|
403
526
|
topics
|
404
527
|
end
|
405
528
|
|
529
|
+
##
|
530
|
+
## Read build note and include upstream topics
|
531
|
+
##
|
532
|
+
## @param path [String] The build note path
|
533
|
+
##
|
406
534
|
def read_help(path = nil)
|
407
535
|
@topics = read_help_file(path)
|
408
536
|
return unless path.nil? && Howzit.options[:include_upstream]
|
@@ -412,8 +540,17 @@ module Howzit
|
|
412
540
|
upstream_topics.each do |topic|
|
413
541
|
@topics.push(topic) unless find_topic(title.sub(/^.+:/, '')).count.positive?
|
414
542
|
end
|
543
|
+
|
544
|
+
if note_file && @topics.empty?
|
545
|
+
Howzit.console.error("{br}Note file found but no topics detected in #{note_file}{x}".c)
|
546
|
+
Process.exit 1
|
547
|
+
end
|
548
|
+
|
415
549
|
end
|
416
550
|
|
551
|
+
##
|
552
|
+
## Open build note in editor
|
553
|
+
##
|
417
554
|
def edit_note
|
418
555
|
editor = Howzit.options.fetch(:editor, ENV['EDITOR'])
|
419
556
|
|
@@ -431,7 +568,16 @@ module Howzit
|
|
431
568
|
end
|
432
569
|
end
|
433
570
|
|
434
|
-
|
571
|
+
##
|
572
|
+
## Run or print a topic
|
573
|
+
##
|
574
|
+
## @param topic [Topic] The topic
|
575
|
+
## @param run [Boolean] execute directives if
|
576
|
+
## true
|
577
|
+
## @param single [Boolean] is being output as a
|
578
|
+
## single topic
|
579
|
+
##
|
580
|
+
def process_topic(topic, run, single: false)
|
435
581
|
new_topic = topic.dup
|
436
582
|
|
437
583
|
# Handle variable replacement
|
@@ -445,6 +591,9 @@ module Howzit
|
|
445
591
|
output.nil? ? '' : output.join("\n")
|
446
592
|
end
|
447
593
|
|
594
|
+
##
|
595
|
+
## Search and process the build note
|
596
|
+
##
|
448
597
|
def process
|
449
598
|
output = []
|
450
599
|
|
@@ -537,10 +686,10 @@ module Howzit
|
|
537
686
|
|
538
687
|
if !topic_matches.empty?
|
539
688
|
# If we found a match
|
540
|
-
topic_matches.each { |topic_match| output.push(process_topic(topic_match, Howzit.options[:run], true)) }
|
689
|
+
topic_matches.each { |topic_match| output.push(process_topic(topic_match, Howzit.options[:run], single: true)) }
|
541
690
|
else
|
542
691
|
# If there's no argument or no match found, output all
|
543
|
-
topics.each { |k| output.push(process_topic(k, false, false)) }
|
692
|
+
topics.each { |k| output.push(process_topic(k, false, single: false)) }
|
544
693
|
end
|
545
694
|
Howzit.options[:paginate] = false if Howzit.options[:run]
|
546
695
|
Util.show(output.join("\n").strip, Howzit.options)
|
data/lib/howzit/colors.rb
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
module Howzit
|
5
5
|
# Terminal output color functions.
|
6
6
|
module Color
|
7
|
+
# Regexp to match excape sequences
|
7
8
|
ESCAPE_REGEX = /(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
|
9
|
+
|
8
10
|
# All available color names. Available as methods and string extensions.
|
9
11
|
#
|
10
12
|
# @example Use a color as a method. Color reset will be added to end of string.
|
@@ -79,6 +81,7 @@ module Howzit
|
|
79
81
|
[:default, '0;39']
|
80
82
|
].map(&:freeze).freeze
|
81
83
|
|
84
|
+
# Array of attribute keys only
|
82
85
|
ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
|
83
86
|
|
84
87
|
# Returns true if Howzit::Color supports the +feature+.
|
data/lib/howzit/hash.rb
CHANGED
@@ -41,7 +41,7 @@ class ::Hash
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def stringify_keys!
|
44
|
-
|
44
|
+
replace stringify_keys
|
45
45
|
end
|
46
46
|
|
47
47
|
# Turn all keys into symbols
|
@@ -50,6 +50,6 @@ class ::Hash
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def symbolize_keys!
|
53
|
-
|
53
|
+
replace symbolize_keys
|
54
54
|
end
|
55
55
|
end
|
data/lib/howzit/task.rb
CHANGED
data/lib/howzit/version.rb
CHANGED
data/lib/howzit.rb
CHANGED
@@ -24,11 +24,22 @@ require 'tty/screen'
|
|
24
24
|
require 'tty/box'
|
25
25
|
# require 'tty/prompt'
|
26
26
|
|
27
|
+
# Main config dir
|
27
28
|
CONFIG_DIR = '~/.config/howzit'
|
29
|
+
|
30
|
+
# Config file name
|
28
31
|
CONFIG_FILE = 'howzit.yaml'
|
32
|
+
|
33
|
+
# Ignore file name
|
29
34
|
IGNORE_FILE = 'ignore.yaml'
|
35
|
+
|
36
|
+
# Available options for matching method
|
30
37
|
MATCHING_OPTIONS = %w[partial exact fuzzy beginswith].freeze
|
38
|
+
|
39
|
+
# Available options for multiple_matches method
|
31
40
|
MULTIPLE_OPTIONS = %w[first best all choose].freeze
|
41
|
+
|
42
|
+
# Available options for header formatting
|
32
43
|
HEADER_FORMAT_OPTIONS = %w[border block].freeze
|
33
44
|
|
34
45
|
# Main module for howzit
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: howzit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Terpstra
|
@@ -297,7 +297,6 @@ files:
|
|
297
297
|
- lib/.rubocop.yml
|
298
298
|
- lib/howzit.rb
|
299
299
|
- lib/howzit/buildnote.rb
|
300
|
-
- lib/howzit/buildnotes.rb
|
301
300
|
- lib/howzit/colors.rb
|
302
301
|
- lib/howzit/config.rb
|
303
302
|
- lib/howzit/console_logger.rb
|