howzit 2.0.2 → 2.0.3

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: 5758dea871a182fc419de237ba35828396000307710b1680841bb774ea6994a2
4
- data.tar.gz: bdf200a5a60c0acd268e37adcfae6b187807a14766e8199970fbd1d3ac1e4e3d
3
+ metadata.gz: febb19742d97801e3dff8026e42e67997ee58e9de5c4e87cd5b9c6fc7ab20fef
4
+ data.tar.gz: 6de0abe65cd3860bf38ac516fbfdf566d2609f88d9c1d74cd51dba57ade056ac
5
5
  SHA512:
6
- metadata.gz: c6ec5058df211c32bdf02a33f99626822221317ee95eb16161d17e4ede96ae31b744a16aee328cead7c4e3bab5ca393f0911227234709622fea27f4026a6504f
7
- data.tar.gz: 7ce5c34e121fa6a3fa6fea662d21b3ccc60beba0e0fee8f0b87b0f8653e3d0e64c66f61cfdc978e0a4b1d425cb757fcf191ba4026262c1ce26225dad8b87897d
6
+ metadata.gz: 7ad5108294d5fca6e1e12e316311c4082ba82694a876d0c0b6ef41eb082041ca300144cdf4782c235245a1c30db031438dcfb4be1d2569af63f4fbbb3e81be7b
7
+ data.tar.gz: 66f51a8da16d89972ea0dbb7ecd209153d3e680d956e8a80d98af9288f014cf1367f89d3a1b42adf4471aace0da8ae2d5d75b6f617c602b5cd272c1361e8c3e9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ### 2.0.3
2
+
3
+ 2022-08-04 05:31
4
+
5
+ #### IMPROVED
6
+
7
+ - General code cleanup
8
+ - Attempt at os agnostic @copy command, hopefully works on Windows and Linux systems
9
+
10
+ #### FIXED
11
+
12
+ - Not displaying action if title is missing
13
+
1
14
  ### 2.0.2
2
15
 
3
16
  2022-08-03 18:26
@@ -41,9 +41,9 @@ module Howzit
41
41
  # Output a list of topic titles
42
42
  def list
43
43
  output = []
44
- output.push(Color.template("{bg}Topics:{x}\n"))
44
+ output.push("{bg}Topics:{x}\n".c)
45
45
  @topics.each do |topic|
46
- output.push(Color.template("- {bw}#{topic.title}{x}"))
46
+ output.push("- {bw}#{topic.title}{x}".c)
47
47
  end
48
48
  output.join("\n")
49
49
  end
@@ -66,7 +66,7 @@ module Howzit
66
66
 
67
67
  def list_runnable
68
68
  output = []
69
- output.push(Color.template(%({bg}"Runnable" Topics:{x}\n)))
69
+ output.push(%({bg}"Runnable" Topics:{x}\n).c)
70
70
  @topics.each do |topic|
71
71
  s_out = []
72
72
 
@@ -75,7 +75,7 @@ module Howzit
75
75
  end
76
76
 
77
77
  unless s_out.empty?
78
- output.push(Color.template("- {bw}#{topic.title}{x}"))
78
+ output.push("- {bw}#{topic.title}{x}".c)
79
79
  output.push(s_out.join("\n"))
80
80
  end
81
81
  end
@@ -95,9 +95,9 @@ module Howzit
95
95
  default = !$stdout.isatty || Howzit.options[:default]
96
96
  # First make sure there isn't already a buildnotes file
97
97
  if note_file
98
- fname = Color.template("{by}#{note_file}{bw}")
98
+ fname = "{by}#{note_file}{bw}".c
99
99
  unless default
100
- res = Prompt.yn("#{fname} exists and appears to be a build note, continue anyway?", false)
100
+ res = Prompt.yn("#{fname} exists and appears to be a build note, continue anyway?", default: false)
101
101
  unless res
102
102
  puts 'Canceled'
103
103
  Process.exit 0
@@ -109,20 +109,20 @@ module Howzit
109
109
  if default
110
110
  input = title
111
111
  else
112
- printf Color.template("{bw}Project name {xg}[#{title}]{bw}: {x}")
112
+ printf "{bw}Project name {xg}[#{title}]{bw}: {x}".c
113
113
  input = $stdin.gets.chomp
114
114
  title = input unless input.empty?
115
115
  end
116
116
  summary = ''
117
117
  unless default
118
- printf Color.template('{bw}Project summary: {x}')
118
+ printf '{bw}Project summary: {x}'.c
119
119
  input = $stdin.gets.chomp
120
120
  summary = input unless input.empty?
121
121
  end
122
122
 
123
123
  fname = 'buildnotes.md'
124
124
  unless default
125
- printf Color.template("{bw}Build notes filename (must begin with 'howzit' or 'build')\n{xg}[#{fname}]{bw}: {x}")
125
+ printf "{bw}Build notes filename (must begin with 'howzit' or 'build')\n{xg}[#{fname}]{bw}: {x}".c
126
126
  input = $stdin.gets.chomp
127
127
  fname = input unless input.empty?
128
128
  end
@@ -153,8 +153,8 @@ module Howzit
153
153
  EOBUILDNOTES
154
154
 
155
155
  if File.exist?(fname) && !default
156
- file = Color.template("{by}#{fname}")
157
- res = Prompt.yn("Are you absolutely sure you want to overwrite #{file}", false)
156
+ file = "{by}#{fname}".c
157
+ res = Prompt.yn("Are you absolutely sure you want to overwrite #{file}", default: false)
158
158
 
159
159
  unless res
160
160
  puts 'Canceled'
@@ -164,7 +164,7 @@ module Howzit
164
164
 
165
165
  File.open(fname, 'w') do |f|
166
166
  f.puts note
167
- puts Color.template("{by}Build notes for #{title} written to #{fname}")
167
+ puts "{by}Build notes for #{title} written to #{fname}".c
168
168
  end
169
169
  end
170
170
 
@@ -259,8 +259,8 @@ module Howzit
259
259
  required = t_meta['required'].strip.split(/\s*,\s*/)
260
260
  required.each do |req|
261
261
  unless @metadata.keys.include?(req.downcase)
262
- warn Color.template(%({xr}ERROR: Missing required metadata key from template '{bw}#{File.basename(template, '.md')}{xr}'{x}))
263
- warn Color.template(%({xr}Please define {by}#{req.downcase}{xr} in build notes{x}))
262
+ warn %({xr}ERROR: Missing required metadata key from template '{bw}#{File.basename(template, '.md')}{xr}'{x}).c
263
+ warn %({xr}Please define {by}#{req.downcase}{xr} in build notes{x}).c
264
264
  Process.exit 1
265
265
  end
266
266
  end
@@ -410,7 +410,7 @@ module Howzit
410
410
  raise "Invalid editor (#{editor})" unless Util.valid_command?(editor)
411
411
 
412
412
  if note_file.nil?
413
- res = Prompt.yn('No build notes file found, create one?', true)
413
+ res = Prompt.yn('No build notes file found, create one?', default: true)
414
414
 
415
415
  create_note if res
416
416
  edit_note
@@ -500,7 +500,7 @@ module Howzit
500
500
  matches = find_topic(s)
501
501
 
502
502
  if matches.empty?
503
- output.push(Color.template(%({bR}ERROR:{xr} No topic match found for {bw}#{s}{x}\n)))
503
+ output.push(%({bR}ERROR:{xr} No topic match found for {bw}#{s}{x}\n).c)
504
504
  else
505
505
  case Howzit.options[:multiple_matches]
506
506
  when :first
data/lib/howzit/prompt.rb CHANGED
@@ -4,16 +4,18 @@ module Howzit
4
4
  # Command line prompt utils
5
5
  module Prompt
6
6
  class << self
7
- def yn(prompt, default = true)
8
- return default if !$stdout.isatty
7
+ def yn(prompt, default: true)
8
+ return default unless $stdout.isatty
9
9
 
10
- system 'stty cbreak'
11
- yn = color_single_options(default ? %w[Y n] : %w[y N])
12
- $stdout.syswrite "\e[1;37m#{prompt} #{yn}\e[1;37m? \e[0m"
13
- res = $stdin.sysread 1
14
- res.chomp!
15
- puts
16
- system 'stty cooked'
10
+ return default if Howzit.options[:default]
11
+
12
+ system 'stty cbreak'
13
+ yn = color_single_options(default ? %w[Y n] : %w[y N])
14
+ $stdout.syswrite "\e[1;37m#{prompt} #{yn}\e[1;37m? \e[0m"
15
+ res = $stdin.sysread 1
16
+ res.chomp!
17
+ puts
18
+ system 'stty cooked'
17
19
  res.empty? ? default : res =~ /y/i
18
20
  end
19
21
 
@@ -28,6 +28,10 @@ module Howzit
28
28
  end
29
29
  end
30
30
 
31
+ def c
32
+ Color.template(self)
33
+ end
34
+
31
35
  def to_rx
32
36
  case Howzit.options[:matching]
33
37
  when 'exact'
data/lib/howzit/topic.rb CHANGED
@@ -28,14 +28,14 @@ module Howzit
28
28
  if @tasks.count.positive?
29
29
  unless @prereqs.empty?
30
30
  puts @prereqs.join("\n\n")
31
- res = Prompt.yn('This task has prerequisites, have they been met?', true)
31
+ res = Prompt.yn('This task has prerequisites, have they been met?', default: true)
32
32
  Process.exit 1 unless res
33
33
 
34
34
  end
35
35
 
36
36
  @tasks.each do |task|
37
37
  if task.type == :block
38
- warn Color.template("{bg}Running block {bw}#{title}{x}") if Howzit.options[:log_level] < 2
38
+ warn "{bg}Running block {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
39
39
  block = task.action
40
40
  script = Tempfile.new('howzit_script')
41
41
  begin
@@ -49,22 +49,23 @@ module Howzit
49
49
  script.unlink
50
50
  end
51
51
  else
52
+ title = Howzit.options[:show_all_code] ? task.action : task.title
52
53
  case task.type
53
54
  when :include
54
55
  matches = Howzit.buildnote.find_topic(task.action)
55
56
  raise "Topic not found: #{task.action}" if matches.empty?
56
57
 
57
- warn Color.template("{by}Running tasks from {bw}#{matches[0].title}{x}") if Howzit.options[:log_level] < 2
58
+ $stderr.puts "{by}Running tasks from {bw}#{matches[0].title}{x}".c if Howzit.options[:log_level] < 2
58
59
  output.push(matches[0].run(nested: true))
59
- warn Color.template("{by}End include: #{matches[0].tasks.count} tasks") if Howzit.options[:log_level] < 2
60
+ $stderr.puts "{by}End include: #{matches[0].tasks.count} tasks".c if Howzit.options[:log_level] < 2
60
61
  tasks += matches[0].tasks.count
61
62
  when :run
62
- warn Color.template("{bg}Running {bw}#{task.title}{x}") if Howzit.options[:log_level] < 2
63
+ $stderr.puts "{bg}Running {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
63
64
  system(task.action)
64
65
  tasks += 1
65
66
  when :copy
66
- warn Color.template("{bg}Copied {bw}#{task.title}{bg} to clipboard{x}") if Howzit.options[:log_level] < 2
67
- `echo #{Shellwords.escape(task.action)}'\\c'|pbcopy`
67
+ $stderr.puts "{bg}Copied {bw}#{title}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
68
+ os_copy(task.action)
68
69
  tasks += 1
69
70
  when :open
70
71
  os_open(task.action)
@@ -73,28 +74,52 @@ module Howzit
73
74
  end
74
75
  end
75
76
  else
76
- warn Color.template("{r}--run: No {br}@directive{xr} found in {bw}#{key}{x}")
77
+ warn "{r}--run: No {br}@directive{xr} found in {bw}#{key}{x}".c
77
78
  end
78
- output.push(Color.template("{bm}Ran #{tasks} #{tasks == 1 ? 'task' : 'tasks'}{x}")) if Howzit.options[:log_level] < 2 && !nested
79
+ output.push("{bm}Ran #{tasks} #{tasks == 1 ? 'task' : 'tasks'}{x}".c) if Howzit.options[:log_level] < 2 && !nested
79
80
 
80
81
  puts postreqs.join("\n\n") unless postreqs.empty?
81
82
 
82
83
  output
83
84
  end
84
85
 
86
+ def os_copy(string)
87
+ os = RbConfig::CONFIG['target_os']
88
+ out = "{bg}Copying {bw}#{string}".c
89
+ case os
90
+ when /darwin.*/i
91
+ warn "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
92
+ `echo #{Shellwords.escape(string)}'\\c'|pbcopy`
93
+ when /mingw|mswin/i
94
+ warn "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
95
+ `echo #{Shellwords.escape(string)} | clip`
96
+ else
97
+ if 'xsel'.available?
98
+ warn "#{out} (Linux, xsel){x}".c if Howzit.options[:log_level] < 2
99
+ `echo #{Shellwords.escape(string)}'\\c'|xsel -i`
100
+ elsif 'xclip'.available?
101
+ warn "#{out} (Linux, xclip){x}".c if Howzit.options[:log_level] < 2
102
+ `echo #{Shellwords.escape(string)}'\\c'|xclip -i`
103
+ else
104
+ warn out if Howzit.options[:log_level] < 2
105
+ warn 'Unable to determine executable for clipboard.'
106
+ end
107
+ end
108
+ end
109
+
85
110
  def os_open(command)
86
111
  os = RbConfig::CONFIG['target_os']
87
- out = Color.template("{bg}Opening {bw}#{command}")
112
+ out = "{bg}Opening {bw}#{command}".c
88
113
  case os
89
114
  when /darwin.*/i
90
- warn Color.template("#{out} (macOS){x}") if Howzit.options[:log_level] < 2
115
+ warn "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
91
116
  `open #{Shellwords.escape(command)}`
92
117
  when /mingw|mswin/i
93
- warn Color.template("#{out} (Windows){x}") if Howzit.options[:log_level] < 2
118
+ warn "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
94
119
  `start #{Shellwords.escape(command)}`
95
120
  else
96
121
  if 'xdg-open'.available?
97
- warn Color.template("#{out} (Linux){x}") if Howzit.options[:log_level] < 2
122
+ warn "#{out} (Linux){x}".c if Howzit.options[:log_level] < 2
98
123
  `xdg-open #{Shellwords.escape(command)}`
99
124
  else
100
125
  warn out if Howzit.options[:log_level] < 2
@@ -120,7 +145,6 @@ module Howzit
120
145
  when /@(before|after|prereq|end)/
121
146
  next
122
147
  when /@include\((.*?)\)/
123
-
124
148
  m = Regexp.last_match
125
149
  matches = Howzit.buildnote.find_topic(m[1])
126
150
  unless matches.empty?
@@ -157,7 +181,7 @@ module Howzit
157
181
  m = Regexp.last_match
158
182
  cmd = m[1]
159
183
  obj = m[2]
160
- title = m[3].nil? ? obj : m[3]
184
+ title = m[3].empty? ? obj : m[3]
161
185
  icon = case cmd
162
186
  when 'run'
163
187
  "\u{25B6}"
@@ -167,21 +191,21 @@ module Howzit
167
191
  "\u{279A}"
168
192
  end
169
193
 
170
- output.push(Color.template("{bmK}#{icon} {bwK}#{title.gsub(/\\n/, '\​n')}{x}"))
194
+ output.push("{bmK}#{icon} {bwK}#{title.gsub(/\\n/, '\​n')}{x}".c)
171
195
  when /(`{3,})run *(.*?)$/i
172
196
  m = Regexp.last_match
173
197
  desc = m[2].length.positive? ? "Block: #{m[2]}" : 'Code Block'
174
- output.push(Color.template("{bmK}\u{25B6} {bwK}#{desc}{x}\n```"))
198
+ output.push("{bmK}\u{25B6} {bwK}#{desc}{x}\n```".c)
175
199
  when /@@@run *(.*?)$/i
176
200
  m = Regexp.last_match
177
201
  desc = m[1].length.positive? ? "Block: #{m[1]}" : 'Code Block'
178
- output.push(Color.template("{bmK}\u{25B6} {bwK}#{desc}{x}"))
202
+ output.push("{bmK}\u{25B6} {bwK}#{desc}{x}".c)
179
203
  else
180
- l.wrap!(Howzit.options[:wrap]) if (Howzit.options[:wrap]).positive?
204
+ l.wrap!(Howzit.options[:wrap]) if Howzit.options[:wrap].positive?
181
205
  output.push(l)
182
206
  end
183
207
  end
184
- output.push('') # FIXME: Is this where the extra line is coming from?
208
+ output.push('')
185
209
  end
186
210
 
187
211
  private
@@ -219,10 +243,10 @@ module Howzit
219
243
  runnable << Howzit::Task.new(:include, title, obj)
220
244
  when /run/i
221
245
  title = c[3] || obj
222
- # warn Color.template("{bg}Running {bw}#{obj}{x}") if Howzit.options[:log_level] < 2
246
+ # warn "{bg}Running {bw}#{obj}{x}".c if Howzit.options[:log_level] < 2
223
247
  runnable << Howzit::Task.new(:run, title, obj)
224
248
  when /copy/i
225
- # warn Color.template("{bg}Copied {bw}#{obj}{bg} to clipboard{x}") if Howzit.options[:log_level] < 2
249
+ # warn "{bg}Copied {bw}#{obj}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
226
250
  runnable << Howzit::Task.new(:copy, title, Shellwords.escape(obj))
227
251
  when /open|url/i
228
252
  runnable << Howzit::Task.new(:open, title, obj)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Primary module for this gem.
3
4
  module Howzit
4
5
  # Current Howzit version.
5
- VERSION = '2.0.2'.freeze
6
+ VERSION = '2.0.3'
6
7
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Howzit::BuildNote do
6
+ subject(:how) { @hz }
7
+
8
+ describe ".note_file" do
9
+ it "locates a build note file" do
10
+ expect(how.note_file).not_to be_empty
11
+ expect(how.note_file).to match /builda.md$/
12
+ end
13
+ end
14
+
15
+ describe ".grep" do
16
+ it "finds topic containing 'bermuda'" do
17
+ expect(how.grep('bermuda').map { |topic| topic.title }).to include('Topic Tropic')
18
+ end
19
+ it "does not return non-matching topic" do
20
+ expect(how.grep('bermuda').map { |topic| topic.title }).not_to include('Topic Balogna')
21
+ end
22
+ end
23
+
24
+ describe ".find_topic" do
25
+ it "finds the Topic Tropic topic" do
26
+ matches = how.find_topic('tropic')
27
+ expect(matches.count).to eq 1
28
+ expect(matches[0].title).to eq 'Topic Tropic'
29
+ end
30
+ it "fuzzy matches" do
31
+ Howzit.options[:matching] = 'fuzzy'
32
+ matches = how.find_topic('trpc')
33
+ expect(matches.count).to eq 1
34
+ expect(matches[0].title).to eq 'Topic Tropic'
35
+ end
36
+ it "succeeds with partial match" do
37
+ Howzit.options[:matching] = 'partial'
38
+ matches = how.find_topic('trop')
39
+ expect(matches.count).to eq 1
40
+ expect(matches[0].title).to eq 'Topic Tropic'
41
+ end
42
+ it "succeeds with beginswith match" do
43
+ Howzit.options[:matching] = 'beginswith'
44
+ matches = how.find_topic('topic')
45
+ expect(matches.count).to eq 3
46
+ expect(matches[0].title).to eq 'Topic Balogna'
47
+ end
48
+ it "succeeds with exact match" do
49
+ Howzit.options[:matching] = 'exact'
50
+ matches = how.find_topic('topic tropic')
51
+ expect(matches.count).to eq 1
52
+ expect(matches[0].title).to eq 'Topic Tropic'
53
+ end
54
+ it "fails with incomplete exact match" do
55
+ Howzit.options[:matching] = 'exact'
56
+ matches = how.find_topic('topic trop')
57
+ expect(matches.count).to eq 0
58
+ end
59
+ end
60
+
61
+ describe ".topics" do
62
+ it "contains 4 topics" do
63
+ expect(how.list_topics.count).to eq 3
64
+ end
65
+ it "outputs a newline-separated string for completion" do
66
+ expect(how.list_completions.scan(/\n/).count).to eq 2
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,22 @@
1
+ # spec
2
+
3
+
4
+
5
+ ## File Structure
6
+
7
+ Where are the main editable files? Is there a dist/build folder that should be ignored?
8
+
9
+ ## Build
10
+
11
+ What build system/parameters does this use?
12
+
13
+ @run(./build command)
14
+
15
+ ## Deploy
16
+
17
+ What are the procedures/commands to deploy this project?
18
+
19
+ ## Other
20
+
21
+ Version control notes, additional gulp/rake/make/etc tasks...
22
+
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Howzit::BuildNote do
@@ -9,102 +11,3 @@ describe Howzit::BuildNote do
9
11
  end
10
12
  end
11
13
  end
12
-
13
- describe Howzit::Task do
14
- subject(:task) { Howzit::Task.new(:run, 'List Directory', 'ls') }
15
-
16
- describe ".new" do
17
- it "makes a new task instance" do
18
- expect(task).to be_a Howzit::Task
19
- end
20
- end
21
- end
22
-
23
- describe Howzit::Topic do
24
- title = 'Test Title'
25
- content = 'Test Content'
26
- subject(:topic) { Howzit::Topic.new(title, content) }
27
-
28
- describe ".new" do
29
- it "makes a new topic instance" do
30
- expect(topic).to be_a Howzit::Topic
31
- end
32
- it "has the correct title" do
33
- expect(topic.title).to eq title
34
- end
35
- it "has the correct content" do
36
- expect(topic.content).to eq content
37
- end
38
- end
39
- end
40
-
41
- describe Howzit::BuildNote do
42
- Dir.chdir('spec')
43
- Howzit.options[:include_upstream] = false
44
- Howzit.options[:default] = true
45
- hz = Howzit.buildnote
46
- hz.create_note
47
-
48
- subject(:how) { hz }
49
-
50
- describe ".note_file" do
51
- it "locates a build note file" do
52
- expect(how.note_file).not_to be_empty
53
- end
54
- end
55
-
56
- describe ".grep" do
57
- it "finds topic containing 'editable'" do
58
- expect(how.grep('editable').map { |topic| topic.title }).to include('File Structure')
59
- end
60
- it "does not return non-matching topic" do
61
- expect(how.grep('editable').map { |topic| topic.title }).not_to include('Build')
62
- end
63
- end
64
-
65
- describe ".find_topic" do
66
- it "finds the File Structure topic" do
67
- matches = how.find_topic('file struct')
68
- expect(matches.count).to eq 1
69
- expect(matches[0].title).to eq 'File Structure'
70
- end
71
- it "fuzzy matches" do
72
- Howzit.options[:matching] = 'fuzzy'
73
- matches = how.find_topic('flestct')
74
- expect(matches.count).to eq 1
75
- expect(matches[0].title).to eq 'File Structure'
76
- end
77
- it "succeeds with partial match" do
78
- Howzit.options[:matching] = 'partial'
79
- matches = how.find_topic('structure')
80
- expect(matches.count).to eq 1
81
- expect(matches[0].title).to eq 'File Structure'
82
- end
83
- it "succeeds with beginswith match" do
84
- Howzit.options[:matching] = 'beginswith'
85
- matches = how.find_topic('file')
86
- expect(matches.count).to eq 1
87
- expect(matches[0].title).to eq 'File Structure'
88
- end
89
- it "succeeds with exact match" do
90
- Howzit.options[:matching] = 'exact'
91
- matches = how.find_topic('file structure')
92
- expect(matches.count).to eq 1
93
- expect(matches[0].title).to eq 'File Structure'
94
- end
95
- it "fails with incomplete exact match" do
96
- Howzit.options[:matching] = 'exact'
97
- matches = how.find_topic('file struct')
98
- expect(matches.count).to eq 0
99
- end
100
- end
101
-
102
- describe ".topics" do
103
- it "contains 4 topics" do
104
- expect(how.list_topics.count).to eq 4
105
- end
106
- it "outputs a newline-separated string for completion" do
107
- expect(how.list_completions.scan(/\n/).count).to eq 3
108
- end
109
- end
110
- end
data/spec/spec_helper.rb CHANGED
@@ -13,7 +13,52 @@ require 'howzit'
13
13
 
14
14
  RSpec.configure do |c|
15
15
  c.expect_with(:rspec) { |e| e.syntax = :expect }
16
+
16
17
  c.before(:each) do
17
18
  allow(FileUtils).to receive(:remove_entry_secure).with(anything)
19
+ save_buildnote
20
+ Howzit.options[:include_upstream] = false
21
+ Howzit.options[:default] = true
22
+ @hz = Howzit.buildnote
23
+ end
24
+
25
+ c.after(:each) do
26
+ delete_buildnote
18
27
  end
19
28
  end
29
+
30
+ def save_buildnote
31
+ note = <<~EONOTE
32
+ # Howzit Test
33
+
34
+ ## Topic Balogna
35
+
36
+ @before
37
+ This should be a prerequisite.
38
+ @end
39
+
40
+ @run(ls -1 &> /dev/null) Null Output
41
+ @include(Topic Tropic)
42
+
43
+ @after
44
+ This should be a postrequisite.
45
+ @end
46
+
47
+ ## Topic Banana
48
+
49
+ This is just another topic.
50
+
51
+ - It has a list in it
52
+ - That's pretty fun, right?
53
+
54
+ ## Topic Tropic
55
+
56
+ Bermuda, Bahama, something something wanna.
57
+ @copy(Balogna) Just some balogna
58
+ EONOTE
59
+ File.open('builda.md', 'w') { |f| f.puts note }
60
+ end
61
+
62
+ def delete_buildnote
63
+ FileUtils.rm('builda.md')
64
+ end
data/spec/task_spec.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Howzit::Task do
6
+ subject(:task) { Howzit::Task.new(:run, 'List Directory', 'ls') }
7
+
8
+ describe ".new" do
9
+ it "makes a new task instance" do
10
+ expect(task).to be_a Howzit::Task
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Howzit::Topic do
6
+ title = 'Test Title'
7
+ content = 'Test Content'
8
+ subject(:topic) { Howzit::Topic.new(title, content) }
9
+
10
+ describe ".new" do
11
+ it "makes a new topic instance" do
12
+ expect(topic).to be_a Howzit::Topic
13
+ end
14
+ it "has the correct title" do
15
+ expect(topic.title).to eq title
16
+ end
17
+ it "has the correct content" do
18
+ expect(topic.content).to eq content
19
+ end
20
+ end
21
+ end
22
+
23
+ describe Howzit::Topic do
24
+ subject(:topic) { @hz.find_topic('Topic Balogna')[0] }
25
+
26
+ describe ".title" do
27
+ it "has the correct title" do
28
+ expect(topic.title).to match /Topic Balogna/
29
+ end
30
+ end
31
+
32
+ describe ".tasks" do
33
+ it "has 2 tasks" do
34
+ expect(topic.tasks.count).to eq 2
35
+ end
36
+ end
37
+
38
+ describe ".prereqs" do
39
+ it "has prereq" do
40
+ expect(topic.prereqs.count).to eq 1
41
+ end
42
+ it "has postreq" do
43
+ expect(topic.postreqs.count).to eq 1
44
+ end
45
+ end
46
+
47
+ describe ".run" do
48
+ Howzit.options[:default] = true
49
+ it "shows prereq and postreq" do
50
+ expect { topic.run }.to output(/prerequisite/).to_stdout
51
+ expect { topic.run }.to output(/postrequisite/).to_stdout
52
+ end
53
+ it "Copies to clipboard" do
54
+ expect {
55
+ ENV['RUBYOPT'] = '-W1'
56
+ Howzit.options[:log_level] = 0
57
+ topic.run
58
+ }.to output(/Copied/).to_stderr
59
+ end
60
+ end
61
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howzit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-03 00:00:00.000000000 Z
11
+ date: 2022-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -280,8 +280,12 @@ files:
280
280
  - lib/howzit/util.rb
281
281
  - lib/howzit/version.rb
282
282
  - spec/.rubocop.yml
283
+ - spec/buildnote_spec.rb
284
+ - spec/buildnotes.md.bak
283
285
  - spec/ruby_gem_spec.rb
284
286
  - spec/spec_helper.rb
287
+ - spec/task_spec.rb
288
+ - spec/topic_spec.rb
285
289
  - update_readmes.rb
286
290
  homepage: https://github.com/ttscoff/howzit
287
291
  licenses:
@@ -309,5 +313,9 @@ summary: Provides a way to access Markdown project notes by topic with query cap
309
313
  and the ability to execute the tasks it describes.
310
314
  test_files:
311
315
  - spec/.rubocop.yml
316
+ - spec/buildnote_spec.rb
317
+ - spec/buildnotes.md.bak
312
318
  - spec/ruby_gem_spec.rb
313
319
  - spec/spec_helper.rb
320
+ - spec/task_spec.rb
321
+ - spec/topic_spec.rb