howzit 2.1.16 → 2.1.18

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: 3bf24c1aae4ef114065b9138801a83f07777932a38a5894b4ae63be3c02960f4
4
- data.tar.gz: 18a7bf1b8eb988b204479531618219fba11d49a70248cde01a1857b6bd9205ae
3
+ metadata.gz: 4c4fea8cf5770f7beb101c32a4596c4a4d58006d1378c95dd482e95052b2e672
4
+ data.tar.gz: d0e85f76ddf1dc2f02a0bfb7dc85f5495e749aa13bdda0ed773cb8ce11ff8fb7
5
5
  SHA512:
6
- metadata.gz: 5b43837936520805796c48529de8a88af3ceeaa455259e0ffbba351f4d2bc98706c1381974c072953438db8a38a215d9b817907783f62fd0ac24301e9d05fe94
7
- data.tar.gz: 9c2afbc1c49a902e65e9818ad6f8ce9df1b724c149307fe2d718abd1b9ef61405f1340403fde901c3cb8b67d877db793cedaaac752b2b974ba1881bde0efb21c
6
+ metadata.gz: bca6e7eb45d1c69862aa8e7ff25cd9ccf713826a61836d9d515f761eb1aee46ee6e5c90f5dfdbb120b02dcf0700023817a3fd5dd74a9538170188f8c23397eb9
7
+ data.tar.gz: e565bd5ff26d4788a72ecd776d39297ec11b2ffb1290b079496f4fdad3dc7faa4ccfebce8d725d9d503727cc06f4014bea34c6afff3bf70377d051594a033dfb
data/.irbrc CHANGED
@@ -1,6 +1,12 @@
1
1
  # frozen_string_literal: true
2
- `gem rdoc binbundle --ri`
2
+ IRB.conf[:AUTO_INDENT] = true
3
+
4
+ require "irb/completion"
5
+ require_relative "lib/conductor"
3
6
 
4
7
  # rubocop:disable Style/MixinUsage
5
8
  include Howzit # standard:disable all
6
9
  # rubocop:enable Style/MixinUsage
10
+
11
+ require "awesome_print"
12
+ AwesomePrint.irb!
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 2.1.18
2
+
3
+ 2025-01-01 09:53
4
+
5
+ #### IMPROVED
6
+
7
+ - Include named arguments when listing runnable topics
8
+
1
9
  ### 2.1.16
2
10
 
3
11
  2024-08-13 10:59
data/bin/howzit CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.unshift File.join(__dir__, '..', 'lib')
5
- require 'howzit'
4
+ $LOAD_PATH.unshift File.join(__dir__, "..", "lib")
5
+ require "howzit"
6
6
 
7
7
  Howzit::Color.coloring = $stdout.isatty
8
8
 
@@ -13,127 +13,127 @@ Howzit.named_arguments = {}
13
13
 
14
14
  OptionParser.new do |opts|
15
15
  opts.banner = "Usage: #{File.basename(__FILE__)} [OPTIONS] [TOPIC]"
16
- opts.separator ''
17
- opts.separator 'Show build notes for the current project (buildnotes.md).
18
- Include a topic name to see just that topic, or no argument to display all.'
19
- opts.separator ''
20
- opts.separator 'Options:'
16
+ opts.separator ""
17
+ opts.separator "Show build notes for the current project (buildnotes.md).
18
+ Include a topic name to see just that topic, or no argument to display all."
19
+ opts.separator ""
20
+ opts.separator "Options:"
21
21
 
22
22
  opts.separator " Behavior:\n\n" #=================================================================== BEHAVIOR
23
23
 
24
- opts.on('--ask', 'Request confirmation for all tasks when running a topic') { Howzit.options[:ask] = true }
24
+ opts.on("--ask", "Request confirmation for all tasks when running a topic") { Howzit.options[:ask] = true }
25
25
 
26
- opts.on('--default', 'Answer all prompts with default response') do
27
- raise '--default cannot be used with --yes or --no' if Howzit.options[:yes] || Howzit.options[:no]
26
+ opts.on("--default", "Answer all prompts with default response") do
27
+ raise "--default cannot be used with --yes or --no" if Howzit.options[:yes] || Howzit.options[:no]
28
28
 
29
29
  Howzit.options[:default] = true
30
30
  end
31
31
 
32
- opts.on('-f', '--force', 'Continue executing after an error') { Howzit.options[:force] = true }
32
+ opts.on("-f", "--force", "Continue executing after an error") { Howzit.options[:force] = true }
33
33
 
34
- opts.on('-m', '--matching TYPE', MATCHING_OPTIONS,
35
- 'Topics matching type', "(#{MATCHING_OPTIONS.join(', ')})") do |c|
34
+ opts.on("-m", "--matching TYPE", MATCHING_OPTIONS,
35
+ "Topics matching type", "(#{MATCHING_OPTIONS.join(", ")})") do |c|
36
36
  Howzit.options[:matching] = c
37
37
  end
38
38
 
39
- opts.on('--multiple TYPE', MULTIPLE_OPTIONS,
40
- 'Multiple result handling', "(#{MULTIPLE_OPTIONS.join(', ')}, default choose)") do |c|
39
+ opts.on("--multiple TYPE", MULTIPLE_OPTIONS,
40
+ "Multiple result handling", "(#{MULTIPLE_OPTIONS.join(", ")}, default choose)") do |c|
41
41
  Howzit.options[:multiple_matches] = c.to_sym
42
42
  end
43
43
 
44
- opts.on('-u', '--[no-]upstream', 'Traverse up parent directories for additional build notes') do |p|
44
+ opts.on("-u", "--[no-]upstream", "Traverse up parent directories for additional build notes") do |p|
45
45
  Howzit.options[:include_upstream] = p
46
46
  end
47
47
 
48
- opts.on('-y', '--yes', 'Answer yes to all prompts') do
49
- raise '--default cannot be used with --yes' if Howzit.options[:default]
48
+ opts.on("-y", "--yes", "Answer yes to all prompts") do
49
+ raise "--default cannot be used with --yes" if Howzit.options[:default]
50
50
 
51
51
  Howzit.options[:yes] = true
52
52
  end
53
53
 
54
- opts.on('-n', '--no', 'Answer no to all prompts') do
55
- raise '--default cannot be used with --no' if Howzit.options[:default]
54
+ opts.on("-n", "--no", "Answer no to all prompts") do
55
+ raise "--default cannot be used with --no" if Howzit.options[:default]
56
56
 
57
57
  Howzit.options[:no] = true
58
58
  end
59
59
 
60
60
  opts.separator "\n Listing:\n\n" #=================================================================== LISTING
61
61
 
62
- opts.on('-L', '--list-completions', 'List topics (completion-compatible)') do
62
+ opts.on("-L", "--list-completions", "List topics (completion-compatible)") do
63
63
  Howzit.options[:list_topics] = true
64
64
  Howzit.options[:list_topic_titles] = true
65
65
  end
66
66
 
67
- opts.on('-l', '--list', 'List available topics') do
67
+ opts.on("-l", "--list", "List available topics") do
68
68
  Howzit.options[:list_topics] = true
69
69
  end
70
70
 
71
- opts.on('-R', '--list-runnable [PATTERN]', 'List topics containing @ directives (verbose)') do |pat|
71
+ opts.on("-R", "--list-runnable [PATTERN]", "List topics containing @ directives (verbose)") do |pat|
72
72
  Howzit.options[:for_topic] = pat
73
73
  Howzit.options[:list_runnable] = true
74
74
  end
75
75
 
76
- opts.on('-T', '--task-list', 'List topics containing @ directives (completion-compatible)') do
76
+ opts.on("-T", "--task-list", "List topics containing @ directives (completion-compatible)") do
77
77
  Howzit.options[:list_runnable] = true
78
78
  Howzit.options[:list_runnable_titles] = true
79
79
  end
80
80
 
81
- opts.on('--templates', 'List available templates') do
81
+ opts.on("--templates", "List available templates") do
82
82
  out = []
83
83
  Dir.chdir(Howzit.config.template_folder)
84
- Dir.glob('*.md').each do |file|
85
- template = File.basename(file, '.md')
84
+ Dir.glob("*.md").each do |file|
85
+ template = File.basename(file, ".md")
86
86
  out.push(Howzit::Color.template("{Mk}template:{Yk}#{template}{x}"))
87
- out.push(Howzit::Color.template('{bk}[{bl}tasks{bk}]──────────────────────────────────────┐{x}'))
87
+ out.push(Howzit::Color.template("{bk}[{bl}tasks{bk}]──────────────────────────────────────┐{x}"))
88
88
  metadata = file.extract_metadata
89
89
  topics = Howzit::BuildNote.new(file: file).topics
90
90
  topics.each do |topic|
91
- out.push(Howzit::Color.template(" {bk}│{bw}-{x} {bcK}#{template}:#{topic.title.sub(/^.*?:/, '')}{x}"))
91
+ out.push(Howzit::Color.template(" {bk}│{bw}-{x} {bcK}#{template}:#{topic.title.sub(/^.*?:/, "")}{x}"))
92
92
  end
93
93
  unless metadata.empty?
94
94
  meta = []
95
- meta << metadata['required'].split(/\s*,\s*/).map { |m| "*{bw}#{m}{xw}" } if metadata.key?('required')
96
- meta << metadata['optional'].split(/\s*,\s*/).map(&:to_s) if metadata.key?('optional')
97
- out.push(Howzit::Color.template('{bk}[{bl}meta{bk}]───────────────────────────────────────┤{x}'))
98
- out.push(Howzit::Color.template(" {bk}│ {xw}#{meta.join(', ')}{x}"))
95
+ meta << metadata["required"].split(/\s*,\s*/).map { |m| "*{bw}#{m}{xw}" } if metadata.key?("required")
96
+ meta << metadata["optional"].split(/\s*,\s*/).map(&:to_s) if metadata.key?("optional")
97
+ out.push(Howzit::Color.template("{bk}[{bl}meta{bk}]───────────────────────────────────────┤{x}"))
98
+ out.push(Howzit::Color.template(" {bk}│ {xw}#{meta.join(", ")}{x}"))
99
99
  end
100
- out.push(Howzit::Color.template(' {bk}└───────────────────────────────────────────┘{x}'))
100
+ out.push(Howzit::Color.template(" {bk}└───────────────────────────────────────────┘{x}"))
101
101
  end
102
102
  Howzit::Util.page out.join("\n")
103
103
  Process.exit 0
104
104
  end
105
105
 
106
- opts.on('--templates-c', 'List available templates in a format for completion') do
106
+ opts.on("--templates-c", "List available templates in a format for completion") do
107
107
  out = []
108
108
  Dir.chdir(Howzit.config.template_folder)
109
- Dir.glob('*.md').each do |file|
110
- template = File.basename(file, '.md')
109
+ Dir.glob("*.md").each do |file|
110
+ template = File.basename(file, ".md")
111
111
  out.push(template)
112
112
  end
113
113
  puts out.join("\n")
114
114
  Process.exit 0
115
115
  end
116
116
 
117
- opts.on('--title-only', 'Output title only') do
117
+ opts.on("--title-only", "Output title only") do
118
118
  Howzit.options[:output_title] = true
119
119
  Howzit.options[:title_only] = true
120
120
  end
121
121
 
122
122
  opts.separator("\n Commands:\n\n") #=================================================================== COMMANDS
123
123
 
124
- opts.on('-c', '--create', 'Create a skeleton build note in the current working directory') do
124
+ opts.on("-c", "--create", "Create a skeleton build note in the current working directory") do
125
125
  Howzit.buildnote.create_note
126
126
  Process.exit 0
127
127
  end
128
128
 
129
- opts.on('--config-get [KEY]', 'Display the configuration settings or setting for a specific key') do |k|
129
+ opts.on("--config-get [KEY]", "Display the configuration settings or setting for a specific key") do |k|
130
130
  if k.nil?
131
131
  Howzit::Config::DEFAULTS.sort_by { |key, _| key }.each do |key, _|
132
132
  print "#{key}: "
133
133
  p Howzit.options[key]
134
134
  end
135
135
  else
136
- k.sub!(/^:/, '')
136
+ k.sub!(/^:/, "")
137
137
  if Howzit.options.key?(k.to_sym)
138
138
  puts Howzit.options[k.to_sym]
139
139
  else
@@ -143,12 +143,12 @@ OptionParser.new do |opts|
143
143
  Process.exit 0
144
144
  end
145
145
 
146
- opts.on('--config-set KEY=VALUE', 'Set a config value (must be a valid key)') do |key|
147
- raise 'Argument must be KEY=VALUE' unless key =~ /\S=\S/
146
+ opts.on("--config-set KEY=VALUE", "Set a config value (must be a valid key)") do |key|
147
+ raise "Argument must be KEY=VALUE" unless key =~ /\S=\S/
148
148
 
149
149
  parts = key.split(/=/)
150
- k = parts.shift.sub(/^:/, '')
151
- v = parts.join(' ')
150
+ k = parts.shift.sub(/^:/, "")
151
+ v = parts.join(" ")
152
152
 
153
153
  if Howzit.options.key?(k.to_sym)
154
154
  Howzit.options[k.to_sym] = v.to_config_value(Howzit.options[k.to_sym])
@@ -160,103 +160,103 @@ OptionParser.new do |opts|
160
160
  end
161
161
 
162
162
  desc = %(Edit buildnotes file in current working directory using default editor)
163
- opts.on('-e', '--edit', desc) do
163
+ opts.on("-e", "--edit", desc) do
164
164
  Howzit.buildnote.edit
165
165
  Process.exit 0
166
166
  end
167
167
 
168
- opts.on('--edit-config', "Edit configuration file using default editor") do
168
+ opts.on("--edit-config", "Edit configuration file using default editor") do
169
169
  Howzit.config.editor
170
170
  Process.exit 0
171
171
  end
172
172
 
173
- opts.on('--edit-template NAME', 'Create or edit a template') do |template|
173
+ opts.on("--edit-template NAME", "Create or edit a template") do |template|
174
174
  Howzit.buildnote.edit_template(template)
175
175
  Process.exit 0
176
176
  end
177
177
 
178
- opts.on('--grep PATTERN', 'Display sections matching a search pattern') do |pat|
178
+ opts.on("--grep PATTERN", "Display sections matching a search pattern") do |pat|
179
179
  Howzit.options[:grep] = pat
180
180
  end
181
181
 
182
- opts.on('--hook', 'Copy a link to the build note file, ready for pasting into Hook.app or other notes') do
182
+ opts.on("--hook", "Copy a link to the build note file, ready for pasting into Hook.app or other notes") do
183
183
  Howzit.buildnote.hook
184
184
  Process.exit 0
185
185
  end
186
186
 
187
- opts.on('-r', '--run', 'Execute @run, @open, and/or @copy commands for given topic') do
187
+ opts.on("-r", "--run", "Execute @run, @open, and/or @copy commands for given topic") do
188
188
  Howzit.options[:run] = true
189
189
  end
190
190
 
191
- opts.on('-s', '--select', 'Select topic from menu') do
191
+ opts.on("-s", "--select", "Select topic from menu") do
192
192
  Howzit.options[:choose] = true
193
193
  end
194
194
 
195
195
  opts.separator("\n Formatting:\n\n") #=================================================================== FORMATTING
196
196
 
197
- opts.on('--[no-]color', 'Colorize output (default on)') do |c|
197
+ opts.on("--[no-]color", "Colorize output (default on)") do |c|
198
198
  Howzit.options[:color] = c
199
199
  Howzit.options[:highlight] = false unless c
200
200
  end
201
201
 
202
- opts.on('--header-format TYPE', HEADER_FORMAT_OPTIONS,
203
- "Formatting style for topic titles (#{HEADER_FORMAT_OPTIONS.join(', ')})") do |t|
202
+ opts.on("--header-format TYPE", HEADER_FORMAT_OPTIONS,
203
+ "Formatting style for topic titles (#{HEADER_FORMAT_OPTIONS.join(", ")})") do |t|
204
204
  Howzit.options[:header_format] = t
205
205
  end
206
206
 
207
- opts.on('--[no-]md-highlight', 'Highlight Markdown syntax (default on), requires mdless or mdcat') do |m|
207
+ opts.on("--[no-]md-highlight", "Highlight Markdown syntax (default on), requires mdless or mdcat") do |m|
208
208
  Howzit.options[:highlight] = Howzit.options[:color] ? m : false
209
209
  end
210
210
 
211
- opts.on('--[no-]pager', 'Paginate output (default on)') do |p|
211
+ opts.on("--[no-]pager", "Paginate output (default on)") do |p|
212
212
  Howzit.options[:paginate] = p
213
213
  end
214
214
 
215
- opts.on('--show-code', 'Display the content of fenced run blocks') do
215
+ opts.on("--show-code", "Display the content of fenced run blocks") do
216
216
  Howzit.options[:show_all_code] = true
217
217
  end
218
218
 
219
- opts.on('-t', '--title', 'Output title with build notes') do
219
+ opts.on("-t", "--title", "Output title with build notes") do
220
220
  Howzit.options[:output_title] = true
221
221
  end
222
222
 
223
- opts.on('-w', '--wrap COLUMNS', 'Wrap to specified width (default 80, 0 to disable)') do |w|
223
+ opts.on("-w", "--wrap COLUMNS", "Wrap to specified width (default 80, 0 to disable)") do |w|
224
224
  Howzit.options[:wrap] = w.to_i
225
225
  end
226
226
 
227
227
  opts.separator("\n Logging:\n\n") #=================================================================== LOGGING
228
228
 
229
- opts.on('-d', '--debug', 'Show debug messages (and all messages)') do
229
+ opts.on("-d", "--debug", "Show debug messages (and all messages)") do
230
230
  Howzit.options[:log_level] = 0
231
231
  Howzit.console.reset_level
232
232
  end
233
233
 
234
- opts.on('-q', '--quiet', 'Silence info message') do
234
+ opts.on("-q", "--quiet", "Silence info message") do
235
235
  Howzit.options[:log_level] = 4
236
236
  Howzit.console.reset_level
237
237
  end
238
238
 
239
- opts.on('--verbose', 'Show all messages') do
239
+ opts.on("--verbose", "Show all messages") do
240
240
  Howzit.options[:log_level] = 1
241
241
  Howzit.console.reset_level
242
242
  end
243
243
 
244
244
  opts.separator("\n Misc:\n\n") #=================================================================== MISC
245
245
 
246
- opts.on('-h', '--help', 'Display this screen') do
246
+ opts.on("-h", "--help", "Display this screen") do
247
247
  Howzit::Util.page opts.to_s
248
248
  Process.exit 0
249
249
  end
250
250
 
251
- opts.on('-v', '--version', 'Display version number') do
251
+ opts.on("-v", "--version", "Display version number") do
252
252
  puts "#{File.basename(__FILE__)} v#{Howzit::VERSION}"
253
253
  Process.exit 0
254
254
  end
255
255
  end.parse!(args)
256
256
 
257
- trap('INT') do
257
+ trap("INT") do
258
258
  puts
259
- puts 'Cancelled'
259
+ puts "Cancelled"
260
260
  Process.exit 0
261
261
  end
262
262
 
@@ -57,7 +57,7 @@ module Howzit
57
57
  ## @param template [String] The template title
58
58
  ##
59
59
  def edit_template(template)
60
- file = template.sub(/(\.md)?$/i, '.md')
60
+ file = template.sub(/(\.md)?$/i, ".md")
61
61
  file = File.join(Howzit.config.template_folder, file)
62
62
  edit_template_file(file)
63
63
  end
@@ -72,7 +72,7 @@ module Howzit
72
72
 
73
73
  @topics.filter do |topic|
74
74
  rx = term.to_rx
75
- topic.title.downcase.sub(/ *\(.*?\) *$/, '') =~ rx
75
+ topic.title.downcase.sub(/ *\(.*?\) *$/, "") =~ rx
76
76
  end
77
77
  end
78
78
 
@@ -84,7 +84,7 @@ module Howzit
84
84
  title = "#{title} project notes"
85
85
  url = "[#{title}](file://#{note_file})"
86
86
  Util.os_copy(url)
87
- Howzit.console.info('Link copied to clipboard.')
87
+ Howzit.console.info("Link copied to clipboard.")
88
88
  end
89
89
 
90
90
  ##
@@ -115,7 +115,13 @@ module Howzit
115
115
  ## @return [Array] array of topic titles
116
116
  ##
117
117
  def list_topics
118
- @topics.map(&:title)
118
+ @topics.map do |topic|
119
+ title = topic.title
120
+ unless topic.named_args.empty?
121
+ title += "(#{topic.named_args.keys.join(", ")})"
122
+ end
123
+ title
124
+ end
119
125
  end
120
126
 
121
127
  ##
@@ -137,7 +143,13 @@ module Howzit
137
143
  def list_runnable_completions
138
144
  output = []
139
145
  @topics.each do |topic|
140
- output.push(topic.title) if topic.tasks.count.positive?
146
+ if topic.tasks.count.positive?
147
+ title = topic.title
148
+ unless topic.named_args.empty?
149
+ title += "(#{topic.named_args.keys.join(", ")})"
150
+ end
151
+ output.push(title)
152
+ end
141
153
  end
142
154
  output.join("\n")
143
155
  end
@@ -159,7 +171,12 @@ module Howzit
159
171
 
160
172
  next if s_out.empty?
161
173
 
162
- output.push("- {bw}#{topic.title}{x}".c)
174
+ title = topic.title
175
+ unless topic.named_args.empty?
176
+ title += " {dy}({xy}#{topic.named_args.keys.join(", ")}{dy}){x}"
177
+ end
178
+
179
+ output.push("- {g}#{title}{x}".c)
163
180
  output.push(s_out.join("\n"))
164
181
  end
165
182
 
@@ -182,7 +199,7 @@ module Howzit
182
199
  ## @param prompt [Boolean] confirm file creation?
183
200
  ##
184
201
  def create_template_file(file, prompt: false)
185
- trap('SIGINT') do
202
+ trap("SIGINT") do
186
203
  Howzit.console.info "\nCancelled"
187
204
  exit!
188
205
  end
@@ -194,7 +211,7 @@ module Howzit
194
211
  Process.exit 0 unless res
195
212
  end
196
213
 
197
- title = File.basename(file, '.md')
214
+ title = File.basename(file, ".md")
198
215
 
199
216
  note = <<~EOBUILDNOTES
200
217
  # #{title}
@@ -206,12 +223,12 @@ module Howzit
206
223
  if File.exist?(file) && !default
207
224
  file = "{by}#{file}".c
208
225
  unless Prompt.yn("Are you sure you want to overwrite #{file}", default: false)
209
- Howzit.console.info('Cancelled')
226
+ Howzit.console.info("Cancelled")
210
227
  Process.exit 0
211
228
  end
212
229
  end
213
230
 
214
- File.open(file, 'w') do |f|
231
+ File.open(file, "w") do |f|
215
232
  f.puts note
216
233
  Howzit.console.info("{by}Template {bw}#{title}{by} written to {bw}#{file}{x}".c)
217
234
  end
@@ -226,7 +243,7 @@ module Howzit
226
243
 
227
244
  # Create a buildnotes skeleton
228
245
  def create_note(prompt: false)
229
- trap('SIGINT') do
246
+ trap("SIGINT") do
230
247
  Howzit.console.info "\nCancelled"
231
248
  exit!
232
249
  end
@@ -234,7 +251,7 @@ module Howzit
234
251
  default = !$stdout.isatty || Howzit.options[:default]
235
252
 
236
253
  if prompt && !default
237
- res = Prompt.yn('No build notes file found, create one?', default: true)
254
+ res = Prompt.yn("No build notes file found, create one?", default: true)
238
255
  Process.exit 0 unless res
239
256
  end
240
257
 
@@ -257,14 +274,14 @@ module Howzit
257
274
  input = $stdin.gets.chomp
258
275
  title = input unless input.empty?
259
276
  end
260
- summary = ''
277
+ summary = ""
261
278
  unless default
262
- printf '{bw}Project summary: {x}'.c
279
+ printf "{bw}Project summary: {x}".c
263
280
  input = $stdin.gets.chomp
264
281
  summary = input unless input.empty?
265
282
  end
266
283
 
267
- fname = 'buildnotes.md'
284
+ fname = "buildnotes.md"
268
285
  unless default
269
286
  printf "{bw}Build notes filename (must begin with 'howzit' or 'build')\n{xg}[#{fname}]{bw}: {x}".c
270
287
  input = $stdin.gets.chomp
@@ -299,12 +316,12 @@ module Howzit
299
316
  if File.exist?(fname) && !default
300
317
  file = "{by}#{fname}".c
301
318
  unless Prompt.yn("Are you absolutely sure you want to overwrite #{file}", default: false)
302
- Howzit.console.info('Canceled')
319
+ Howzit.console.info("Canceled")
303
320
  Process.exit 0
304
321
  end
305
322
  end
306
323
 
307
- File.open(fname, 'w') do |f|
324
+ File.open(fname, "w") do |f|
308
325
  f.puts note
309
326
  Howzit.console.info("{by}Build notes for {bw}#{title}{by} written to {bw}#{fname}{x}".c)
310
327
  end
@@ -340,15 +357,15 @@ module Howzit
340
357
  return mtch[0] unless File.exist?(file)
341
358
 
342
359
  content = Util.read_file(file)
343
- home = ENV['HOME']
344
- short_path = File.dirname(file.sub(/^#{home}/, '~'))
360
+ home = ENV["HOME"]
361
+ short_path = File.dirname(file.sub(/^#{home}/, "~"))
345
362
  prefix = "#{short_path}/#{File.basename(file)}:"
346
363
  parts = content.split(/^##+/)
347
364
  parts.shift
348
365
  if parts.empty?
349
366
  content
350
367
  else
351
- "## #{parts.join('## ')}".gsub(/^(##+ *)(?=\S)/, "\\1#{prefix}")
368
+ "## #{parts.join("## ")}".gsub(/^(##+ *)(?=\S)/, "\\1#{prefix}")
352
369
  end
353
370
  end
354
371
 
@@ -365,15 +382,15 @@ module Howzit
365
382
 
366
383
  t_meta = t_leader.metadata
367
384
 
368
- return unless t_meta.key?('required')
385
+ return unless t_meta.key?("required")
369
386
 
370
- required = t_meta['required'].strip.split(/\s*,\s*/)
387
+ required = t_meta["required"].strip.split(/\s*,\s*/)
371
388
  required.each do |req|
372
389
  next if @metadata.keys.include?(req.downcase)
373
390
 
374
391
  Howzit.console.error %({bRw}ERROR:{xbr} Missing required metadata key from template '{bw}#{File.basename(
375
- template, '.md'
376
- )}{xr}'{x}).c
392
+ template, ".md"
393
+ )}{xr}'{x}).c
377
394
  Howzit.console.error %({br}Please define {by}#{req.downcase}{xr} in build notes{x}).c
378
395
  Process.exit 1
379
396
  end
@@ -391,8 +408,8 @@ module Howzit
391
408
  subtopics = nil
392
409
 
393
410
  if template =~ /\[(.*?)\]$/
394
- subtopics = Regexp.last_match[1].split(/\s*\|\s*/).map { |t| t.gsub(/\*/, '.*?') }
395
- template.sub!(/\[.*?\]$/, '').strip
411
+ subtopics = Regexp.last_match[1].split(/\s*\|\s*/).map { |t| t.gsub(/\*/, ".*?") }
412
+ template.sub!(/\[.*?\]$/, "").strip
396
413
  end
397
414
 
398
415
  [template, subtopics]
@@ -412,7 +429,7 @@ module Howzit
412
429
  templates.each do |template|
413
430
  template, subtopics = detect_subtopics(template)
414
431
 
415
- file = template.sub(/(\.md)?$/i, '.md')
432
+ file = template.sub(/(\.md)?$/i, ".md")
416
433
  file = File.join(Howzit.config.template_folder, file)
417
434
 
418
435
  next unless File.exist?(file)
@@ -476,7 +493,7 @@ module Howzit
476
493
  buildnotes = []
477
494
  filename = nil
478
495
 
479
- while dir != '/' && (dir =~ %r{[A-Z]:/}).nil?
496
+ while dir != "/" && (dir =~ %r{[A-Z]:/}).nil?
480
497
  Dir.chdir(dir)
481
498
  filename = glob_note
482
499
  unless filename.nil?
@@ -499,7 +516,7 @@ module Howzit
499
516
  ## @return [String] file path
500
517
  ##
501
518
  def glob_note
502
- Dir.glob('*.{txt,md,markdown}').select(&:build_note?).sort[0]
519
+ Dir.glob("*.{txt,md,markdown}").select(&:build_note?).sort[0]
503
520
  end
504
521
 
505
522
  ##
@@ -512,9 +529,9 @@ module Howzit
512
529
  def find_note_file
513
530
  filename = glob_note
514
531
 
515
- if filename.nil? && 'git'.available?
532
+ if filename.nil? && "git".available?
516
533
  proj_dir = `git rev-parse --show-toplevel 2>/dev/null`.strip
517
- unless proj_dir == ''
534
+ unless proj_dir == ""
518
535
  Dir.chdir(proj_dir)
519
536
  filename = glob_note
520
537
  end
@@ -558,8 +575,8 @@ module Howzit
558
575
 
559
576
  data = leader.metadata
560
577
 
561
- if data.key?('template')
562
- templates = data['template'].strip.split(/\s*,\s*/)
578
+ if data.key?("template")
579
+ templates = data["template"].strip.split(/\s*,\s*/)
563
580
 
564
581
  template_topics.concat(gather_templates(templates))
565
582
  end
@@ -601,13 +618,13 @@ module Howzit
601
618
 
602
619
  lines = sect.split(/\n/)
603
620
  title = lines.slice!(0).strip
604
- prefix = ''
621
+ prefix = ""
605
622
  if path && path != note_file
606
623
  if path =~ /#{Howzit.config.template_folder}/
607
- short_path = File.basename(path, '.md')
624
+ short_path = File.basename(path, ".md")
608
625
  else
609
- home = ENV['HOME']
610
- short_path = File.dirname(path.sub(/^#{home}/, '~'))
626
+ home = ENV["HOME"]
627
+ short_path = File.dirname(path.sub(/^#{home}/, "~"))
611
628
  prefix = "_from #{short_path}_\n\n"
612
629
  end
613
630
  title = "#{short_path}:#{title}"
@@ -619,7 +636,7 @@ module Howzit
619
636
  end
620
637
 
621
638
  template_topics.each do |topic|
622
- topics.push(topic) unless find_topic(topic.title.sub(/^.+:/, '')).count.positive?
639
+ topics.push(topic) unless find_topic(topic.title.sub(/^.+:/, "")).count.positive?
623
640
  end
624
641
 
625
642
  topics
@@ -638,7 +655,7 @@ module Howzit
638
655
  upstream_topics = read_upstream
639
656
 
640
657
  upstream_topics.each do |topic|
641
- @topics.push(topic) unless find_topic(topic.title.sub(/^.+:/, '')).count.positive?
658
+ @topics.push(topic) unless find_topic(topic.title.sub(/^.+:/, "")).count.positive?
642
659
  end
643
660
  Howzit.has_read_upstream = true
644
661
  end
@@ -653,11 +670,11 @@ module Howzit
653
670
  ## Open build note in editor
654
671
  ##
655
672
  def edit_note
656
- editor = Howzit.options.fetch(:editor, ENV['EDITOR'])
673
+ editor = Howzit.options.fetch(:editor, ENV["EDITOR"])
657
674
 
658
675
  editor = Howzit.config.update_editor if editor.nil?
659
676
 
660
- raise 'No editor defined' if editor.nil?
677
+ raise "No editor defined" if editor.nil?
661
678
 
662
679
  raise "Invalid editor (#{editor})" unless Util.valid_command?(editor)
663
680
 
@@ -671,7 +688,7 @@ module Howzit
671
688
  ## @param template [String] The template name
672
689
  ##
673
690
  def create_template(template)
674
- file = template.sub(/(\.md)?$/i, '.md')
691
+ file = template.sub(/(\.md)?$/i, ".md")
675
692
  file = File.join(Howzit.config.template_folder, file)
676
693
  create_template_file(file, prompt: false)
677
694
  end
@@ -680,11 +697,11 @@ module Howzit
680
697
  ## Open template in editor
681
698
  ##
682
699
  def edit_template_file(file)
683
- editor = Howzit.options.fetch(:editor, ENV['EDITOR'])
700
+ editor = Howzit.options.fetch(:editor, ENV["EDITOR"])
684
701
 
685
702
  editor = Howzit.config.update_editor if editor.nil?
686
703
 
687
- raise 'No editor defined' if editor.nil?
704
+ raise "No editor defined" if editor.nil?
688
705
 
689
706
  raise "Invalid editor (#{editor})" unless Util.valid_command?(editor)
690
707
 
@@ -705,12 +722,12 @@ module Howzit
705
722
  new_topic = topic.is_a?(String) ? find_topic(topic)[0] : topic.dup
706
723
 
707
724
  output = if run
708
- new_topic.run
709
- else
710
- new_topic.print_out({ single: single })
711
- end
725
+ new_topic.run
726
+ else
727
+ new_topic.print_out({ single: single })
728
+ end
712
729
 
713
- output.nil? ? '' : output.join("\n\n")
730
+ output.nil? ? "" : output.join("\n\n")
714
731
  end
715
732
 
716
733
  ##
@@ -731,7 +748,7 @@ module Howzit
731
748
  Process.exit(0)
732
749
  elsif Howzit.options[:output_title] && !Howzit.options[:run]
733
750
  if @title && !@title.empty?
734
- header = @title.format_header({ hr: "\u{2550}", color: '{bwK}' })
751
+ header = @title.format_header({ hr: "\u{2550}", color: "{bwK}" })
735
752
  output.push("#{header}\n")
736
753
  end
737
754
  end
@@ -770,9 +787,9 @@ module Howzit
770
787
  elsif Howzit.options[:choose]
771
788
  titles = Prompt.choose(list_topics, height: :max)
772
789
  titles.each { |title| topic_matches.push(find_topic(title)[0]) }
773
- # If there are arguments use those to search for a matching topic
790
+ # If there are arguments use those to search for a matching topic
774
791
  elsif !Howzit.cli_args.empty?
775
- search = Howzit.cli_args.join(' ').strip.downcase.split(/ *, */).map(&:strip)
792
+ search = Howzit.cli_args.join(" ").strip.downcase.split(/ *, */).map(&:strip)
776
793
 
777
794
  search.each do |s|
778
795
  matches = find_topic(s)
@@ -791,7 +808,7 @@ module Howzit
791
808
  titles = matches.map(&:title)
792
809
  res = Prompt.choose(titles)
793
810
  old_matching = Howzit.options[:matching]
794
- Howzit.options[:matching] = 'exact'
811
+ Howzit.options[:matching] = "exact"
795
812
  res.each { |title| topic_matches.concat(find_topic(title)) }
796
813
  Howzit.options[:matching] = old_matching
797
814
  end
@@ -3,5 +3,5 @@
3
3
  # Primary module for this gem.
4
4
  module Howzit
5
5
  # Current Howzit version.
6
- VERSION = '2.1.16'
6
+ VERSION = '2.1.18'
7
7
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howzit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.16
4
+ version: 2.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-08-13 00:00:00.000000000 Z
10
+ date: 2025-01-01 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -334,7 +333,6 @@ homepage: https://github.com/ttscoff/howzit
334
333
  licenses:
335
334
  - MIT
336
335
  metadata: {}
337
- post_install_message:
338
336
  rdoc_options: []
339
337
  require_paths:
340
338
  - lib
@@ -349,8 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
349
347
  - !ruby/object:Gem::Version
350
348
  version: '0'
351
349
  requirements: []
352
- rubygems_version: 3.2.15
353
- signing_key:
350
+ rubygems_version: 3.6.2
354
351
  specification_version: 4
355
352
  summary: Provides a way to access Markdown project notes by topic with query capabilities
356
353
  and the ability to execute the tasks it describes.