howzit 2.0.14 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
data/lib/howzit/prompt.rb CHANGED
@@ -75,18 +75,32 @@ module Howzit
75
75
  ## options and accepts a numeric response
76
76
  ##
77
77
  ## @param matches [Array] The options list
78
+ ## @param height [Symbol] height of fzf menu
79
+ ## (:auto adjusts height to
80
+ ## number of options, anything
81
+ ## else gets max height for
82
+ ## terminal)
78
83
  ##
79
84
  ## @return [Array] the selected results
80
85
  ##
81
- def choose(matches)
86
+ def choose(matches, height: :auto)
87
+ return [] if !$stdout.isatty || matches.count.zero?
88
+
82
89
  if Util.command_exist?('fzf')
90
+ height = if height == :auto
91
+ matches.count + 3
92
+ else
93
+ TTY::Screen.rows
94
+ end
95
+
83
96
  settings = [
84
97
  '-0',
85
98
  '-1',
86
99
  '-m',
87
- "--height=#{matches.count + 3}",
100
+ "--height=#{height}",
88
101
  '--header="Use tab to mark multiple selections, enter to display/run"',
89
- '--prompt="Select a section > "'
102
+ '--prompt="Select a section > "',
103
+ '--preview="howzit {}"'
90
104
  ]
91
105
  res = `echo #{Shellwords.escape(matches.join("\n"))} | fzf #{settings.join(' ')}`.strip
92
106
  if res.nil? || res.empty?
@@ -96,6 +110,8 @@ module Howzit
96
110
  return res.split(/\n/)
97
111
  end
98
112
 
113
+ return matches if matches.count == 1
114
+
99
115
  res = matches[0..9]
100
116
  stty_save = `stty -g`.chomp
101
117
 
@@ -120,7 +136,7 @@ module Howzit
120
136
  puts 'Out of range'
121
137
  options_list(matches)
122
138
  end
123
- rescue Interrupt
139
+ ensure
124
140
  system('stty', stty_save)
125
141
  exit
126
142
  end
@@ -16,6 +16,22 @@ module Howzit
16
16
  true
17
17
  end
18
18
 
19
+ ##
20
+ ## Get the title of the build note (top level header)
21
+ ##
22
+ ## @param truncate [Integer] Truncate to width
23
+ ##
24
+ def note_title(file, truncate = 0)
25
+ title = match(/(?:^(\S.*?)(?=\n==)|^# ?(.*?)$)/)
26
+ title = if title
27
+ title[1].nil? ? title[2] : title[1]
28
+ else
29
+ file.sub(/(\.\w+)?$/, '')
30
+ end
31
+
32
+ title && truncate.positive? ? title.trunc(truncate) : title
33
+ end
34
+
19
35
  ##
20
36
  ## Replace slash escaped characters in a string with a
21
37
  ## zero-width space that will prevent a shell from
@@ -275,9 +291,9 @@ module Howzit
275
291
  data = {}
276
292
  meta.each do |k, v|
277
293
  case k
278
- when /^templ\w+$/
294
+ when /^te?m?pl(ate)?s?$/
279
295
  data['template'] = v
280
- when /^req\w+$/
296
+ when /^req\w*$/
281
297
  data['required'] = v
282
298
  else
283
299
  data[k] = v
data/lib/howzit/task.rb CHANGED
@@ -8,23 +8,179 @@ module Howzit
8
8
  ##
9
9
  ## Initialize a Task object
10
10
  ##
11
- def initialize(params, optional: false, default: true)
12
- @type = params[:type]
13
- @title = params[:title]
14
- @action = params[:action].render_arguments
15
- @parent = params[:parent] || nil
11
+ ## @param attributes [Hash] the task attributes
12
+ ## @param optional [Boolean] Task requires
13
+ ## confirmation
14
+ ## @param default [Boolean] Default response
15
+ ## for confirmation dialog
16
+ ##
17
+ ## @option attributes :type [Symbol] task type (:block, :run, :include, :copy)
18
+ ## @option attributes :title [String] task title
19
+ ## @option attributes :action [String] task action
20
+ ## @option attributes :parent [String] title of nested (included) topic origin
21
+ def initialize(attributes, optional: false, default: true)
22
+ @type = attributes[:type] || :run
23
+ @title = attributes[:title] || nil
24
+ @action = attributes[:action].render_arguments || nil
25
+ @parent = attributes[:parent] || nil
16
26
  @optional = optional
17
27
  @default = default
18
28
  end
19
29
 
30
+ ##
31
+ ## Inspect
32
+ ##
33
+ ## @return [String] description
34
+ ##
20
35
  def inspect
21
36
  %(<#Howzit::Task @type=:#{@type} @title="#{@title}" @block?=#{@action.split(/\n/).count > 1}>)
22
37
  end
23
38
 
39
+ ##
40
+ ## Output string representation
41
+ ##
42
+ ## @return [String] string representation of the object.
43
+ ##
24
44
  def to_s
25
45
  @title
26
46
  end
27
47
 
48
+ ##
49
+ ## Execute a block type
50
+ ##
51
+ def run_block
52
+ Howzit.console.info "{bg}Running block {bw}#{@title}{x}".c if Howzit.options[:log_level] < 2
53
+ block = @action
54
+ script = Tempfile.new('howzit_script')
55
+ begin
56
+ script.write(block)
57
+ script.close
58
+ File.chmod(0o777, script.path)
59
+ system(%(/bin/sh -c "#{script.path}"))
60
+ ensure
61
+ script.close
62
+ script.unlink
63
+ end
64
+ end
65
+
66
+ ##
67
+ ## Execute an include task
68
+ ##
69
+ ## @return [Array] [[Array] output, [Integer] number of tasks executed]
70
+ ##
71
+ def run_include
72
+ output = []
73
+ matches = Howzit.buildnote.find_topic(@action)
74
+ raise "Topic not found: #{@action}" if matches.empty?
75
+
76
+ $stderr.puts "{by}Running tasks from {bw}#{matches[0].title}{x}".c if Howzit.options[:log_level] < 2
77
+ output.concat(matches[0].run(nested: true))
78
+ $stderr.puts "{by}End include: #{matches[0].tasks.count} tasks{x}".c if Howzit.options[:log_level] < 2
79
+ [output, matches[0].tasks.count]
80
+ end
81
+
82
+ ##
83
+ ## Execute a run task
84
+ ##
85
+ def run_run
86
+ title = Howzit.options[:show_all_code] ? @action : @title
87
+ $stderr.puts "{bg}Running {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
88
+ system(@action)
89
+ end
90
+
91
+ ##
92
+ ## Execute a copy task
93
+ ##
94
+ def run_copy
95
+ title = Howzit.options[:show_all_code] ? @action : @title
96
+ $stderr.puts "{bg}Copied {bw}#{title}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
97
+ os_copy(@action)
98
+ end
99
+
100
+ ##
101
+ ## Platform-agnostic copy-to-clipboard
102
+ ##
103
+ ## @param string [String] The string to copy
104
+ ##
105
+ def os_copy(string)
106
+ os = RbConfig::CONFIG['target_os']
107
+ out = "{bg}Copying {bw}#{string}".c
108
+ case os
109
+ when /darwin.*/i
110
+ $stderr.puts "#{out} (macOS){x}".c if Howzit.options[:log_level].zero?
111
+ `echo #{Shellwords.escape(string)}'\\c'|pbcopy`
112
+ when /mingw|mswin/i
113
+ $stderr.puts "#{out} (Windows){x}".c if Howzit.options[:log_level].zero?
114
+ `echo #{Shellwords.escape(string)} | clip`
115
+ else
116
+ if 'xsel'.available?
117
+ $stderr.puts "#{out} (Linux, xsel){x}".c if Howzit.options[:log_level].zero?
118
+ `echo #{Shellwords.escape(string)}'\\c'|xsel -i`
119
+ elsif 'xclip'.available?
120
+ $stderr.puts "#{out} (Linux, xclip){x}".c if Howzit.options[:log_level].zero?
121
+ `echo #{Shellwords.escape(string)}'\\c'|xclip -i`
122
+ else
123
+ $stderr.puts out if Howzit.options[:log_level].zero?
124
+ $stderr.puts 'Unable to determine executable for clipboard.'
125
+ end
126
+ end
127
+ end
128
+
129
+ ##
130
+ ## Platform-agnostic open command
131
+ ##
132
+ ## @param command [String] The command
133
+ ##
134
+ def os_open(command)
135
+ os = RbConfig::CONFIG['target_os']
136
+ out = "{bg}Opening {bw}#{command}".c
137
+ case os
138
+ when /darwin.*/i
139
+ Howzit.console.debug "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
140
+ `open #{Shellwords.escape(command)}`
141
+ when /mingw|mswin/i
142
+ Howzit.console.debug "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
143
+ `start #{Shellwords.escape(command)}`
144
+ else
145
+ if 'xdg-open'.available?
146
+ Howzit.console.debug "#{out} (Linux){x}".c if Howzit.options[:log_level] < 2
147
+ `xdg-open #{Shellwords.escape(command)}`
148
+ else
149
+ Howzit.console.debug out if Howzit.options[:log_level] < 2
150
+ Howzit.console.debug 'Unable to determine executable for `open`.'
151
+ end
152
+ end
153
+ end
154
+
155
+ ##
156
+ ## Execute the task
157
+ ##
158
+ def run
159
+ output = []
160
+ tasks = 1
161
+ if @type == :block
162
+ run_block
163
+ else
164
+ case @type
165
+ when :include
166
+ output, tasks = run_include
167
+ when :run
168
+ run_run
169
+ when :copy
170
+ run_copy
171
+ when :open
172
+ os_open(@action)
173
+ end
174
+ end
175
+
176
+ [output, tasks]
177
+ end
178
+
179
+ ##
180
+ ## Output terminal-formatted list item
181
+ ##
182
+ ## @return [String] List representation of the object.
183
+ ##
28
184
  def to_list
29
185
  " * #{@type}: #{@title.preserve_escapes}"
30
186
  end
data/lib/howzit/topic.rb CHANGED
@@ -56,52 +56,16 @@ module Howzit
56
56
  task_count = Howzit.buildnote.find_topic(task.action)[0].tasks.count
57
57
  " (#{task_count} tasks)"
58
58
  else
59
- ""
59
+ ''
60
60
  end
61
61
  q = %({bg}#{task.type.to_s.capitalize} {xw}"{bw}#{task.title}{xw}"#{note}{x}).c
62
62
  res = Prompt.yn(q, default: task.default)
63
63
  next unless res
64
64
 
65
65
  end
66
-
67
- if task.type == :block
68
- Howzit.console.info "{bg}Running block {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
69
- block = task.action
70
- script = Tempfile.new('howzit_script')
71
- begin
72
- script.write(block)
73
- script.close
74
- File.chmod(0777, script.path)
75
- system(%(/bin/sh -c "#{script.path}"))
76
- tasks += 1
77
- ensure
78
- script.close
79
- script.unlink
80
- end
81
- else
82
- title = Howzit.options[:show_all_code] ? task.action : task.title
83
- case task.type
84
- when :include
85
- matches = Howzit.buildnote.find_topic(task.action)
86
- raise "Topic not found: #{task.action}" if matches.empty?
87
-
88
- $stderr.puts "{by}Running tasks from {bw}#{matches[0].title}{x}".c if Howzit.options[:log_level] < 2
89
- output.push(matches[0].run(nested: true))
90
- $stderr.puts "{by}End include: #{matches[0].tasks.count} tasks{x}".c if Howzit.options[:log_level] < 2
91
- tasks += matches[0].tasks.count
92
- when :run
93
- $stderr.puts "{bg}Running {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
94
- system(task.action)
95
- tasks += 1
96
- when :copy
97
- $stderr.puts "{bg}Copied {bw}#{title}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
98
- os_copy(task.action)
99
- tasks += 1
100
- when :open
101
- os_open(task.action)
102
- tasks += 1
103
- end
104
- end
66
+ run_output, total = task.run
67
+ output.concat(run_output)
68
+ tasks += total
105
69
  end
106
70
  else
107
71
  Howzit.console.warn "{r}--run: No {br}@directive{xr} found in {bw}#{@title}{x}".c
@@ -113,61 +77,6 @@ module Howzit
113
77
  output
114
78
  end
115
79
 
116
- ##
117
- ## Platform-agnostic copy-to-clipboard
118
- ##
119
- ## @param string [String] The string to copy
120
- ##
121
- def os_copy(string)
122
- os = RbConfig::CONFIG['target_os']
123
- out = "{bg}Copying {bw}#{string}".c
124
- case os
125
- when /darwin.*/i
126
- $stderr.puts "#{out} (macOS){x}".c if Howzit.options[:log_level].zero?
127
- `echo #{Shellwords.escape(string)}'\\c'|pbcopy`
128
- when /mingw|mswin/i
129
- $stderr.puts "#{out} (Windows){x}".c if Howzit.options[:log_level].zero?
130
- `echo #{Shellwords.escape(string)} | clip`
131
- else
132
- if 'xsel'.available?
133
- $stderr.puts "#{out} (Linux, xsel){x}".c if Howzit.options[:log_level].zero?
134
- `echo #{Shellwords.escape(string)}'\\c'|xsel -i`
135
- elsif 'xclip'.available?
136
- $stderr.puts "#{out} (Linux, xclip){x}".c if Howzit.options[:log_level].zero?
137
- `echo #{Shellwords.escape(string)}'\\c'|xclip -i`
138
- else
139
- $stderr.puts out if Howzit.options[:log_level].zero?
140
- $stderr.puts 'Unable to determine executable for clipboard.'
141
- end
142
- end
143
- end
144
-
145
- ##
146
- ## Platform-agnostic open command
147
- ##
148
- ## @param command [String] The command
149
- ##
150
- def os_open(command)
151
- os = RbConfig::CONFIG['target_os']
152
- out = "{bg}Opening {bw}#{command}".c
153
- case os
154
- when /darwin.*/i
155
- Howzit.console.debug "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
156
- `open #{Shellwords.escape(command)}`
157
- when /mingw|mswin/i
158
- Howzit.console.debug "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
159
- `start #{Shellwords.escape(command)}`
160
- else
161
- if 'xdg-open'.available?
162
- Howzit.console.debug "#{out} (Linux){x}".c if Howzit.options[:log_level] < 2
163
- `xdg-open #{Shellwords.escape(command)}`
164
- else
165
- Howzit.console.debug out if Howzit.options[:log_level] < 2
166
- Howzit.console.debug 'Unable to determine executable for `open`.'
167
- end
168
- end
169
- end
170
-
171
80
  # Output a topic with fancy title and bright white text.
172
81
  #
173
82
  # @param options [Hash] The options
@@ -228,6 +137,7 @@ module Howzit
228
137
  cmd = m[:cmd]
229
138
  obj = m[:action]
230
139
  title = m[:title].empty? ? obj : m[:title].strip
140
+ title = Howzit.options[:show_all_code] ? obj : title
231
141
  optional = m[:optional] =~ /[?!]+/ ? true : false
232
142
  default = m[:optional] =~ /!/ ? false : true
233
143
  option = if optional
@@ -313,7 +223,7 @@ module Howzit
313
223
  default = c[:optional] =~ /!/ ? false : true
314
224
  obj = c[:action]
315
225
  title = c[:title].nil? ? obj : c[:title].strip
316
-
226
+ title = Howzit.options[:show_all_code] ? obj : title
317
227
  case cmd
318
228
  when /include/i
319
229
  # matches = Howzit.buildnote.find_topic(obj)
data/lib/howzit/util.rb CHANGED
@@ -4,7 +4,6 @@ module Howzit
4
4
  # Util class
5
5
  module Util
6
6
  class << self
7
-
8
7
  ##
9
8
  ## Read a file with UTF-8 encoding and
10
9
  ## leading/trailing whitespace removed
@@ -90,7 +89,7 @@ module Howzit
90
89
  args = case pg
91
90
  when 'delta'
92
91
  '--pager="less -FXr"'
93
- when /^(less|more)$/
92
+ when 'less'
94
93
  '-FXr'
95
94
  when 'bat'
96
95
  if Howzit.options[:highlight]
@@ -117,6 +116,11 @@ module Howzit
117
116
 
118
117
  # Paginate the output
119
118
  def page(text)
119
+ unless $stdout.isatty
120
+ puts text
121
+ return
122
+ end
123
+
120
124
  read_io, write_io = IO.pipe
121
125
 
122
126
  input = $stdin
@@ -153,6 +157,7 @@ module Howzit
153
157
  options = {
154
158
  color: true,
155
159
  highlight: false,
160
+ paginate: true,
156
161
  wrap: 0
157
162
  }
158
163
 
@@ -168,7 +173,7 @@ module Howzit
168
173
 
169
174
  output = `echo #{Shellwords.escape(string.strip)}#{pipes}`.strip
170
175
 
171
- if Howzit.options[:paginate]
176
+ if options[:paginate] && Howzit.options[:paginate]
172
177
  page(output)
173
178
  else
174
179
  puts output
@@ -3,5 +3,5 @@
3
3
  # Primary module for this gem.
4
4
  module Howzit
5
5
  # Current Howzit version.
6
- VERSION = '2.0.14'
6
+ VERSION = '2.0.17'
7
7
  end
data/lib/howzit.rb CHANGED
@@ -55,18 +55,30 @@ module Howzit
55
55
  @config ||= Config.new
56
56
  end
57
57
 
58
+ ##
59
+ ## Array for tracking inclusions and avoiding duplicates in output
60
+ ##
58
61
  def inclusions
59
62
  @inclusions ||= []
60
63
  end
61
64
 
65
+ ##
66
+ ## Module storage for Howzit::Config.options
67
+ ##
62
68
  def options
63
69
  config.options
64
70
  end
65
71
 
72
+ ##
73
+ ## Module storage for buildnote
74
+ ##
66
75
  def buildnote
67
76
  @buildnote ||= BuildNote.new
68
77
  end
69
78
 
79
+ ##
80
+ ## Convenience method for logging with Howzit.console.warn, etc.
81
+ ##
70
82
  def console
71
83
  @console ||= Howzit::ConsoleLogger.new(options[:log_level])
72
84
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Howzit::Prompt do
6
+ subject(:prompt) { Howzit::Prompt }
7
+
8
+ describe '.yn' do
9
+ it 'returns default response' do
10
+ Howzit.options[:default] = true
11
+ expect(prompt.yn('Test prompt', default: true)).to be_truthy
12
+ expect(prompt.yn('Test prompt', default: false)).not_to be_truthy
13
+ end
14
+ end
15
+
16
+ describe '.color_single_options' do
17
+ it 'returns uncolored string' do
18
+ Howzit::Color.coloring = false
19
+ expect(prompt.color_single_options(%w[y n])).to eq "[y/n]"
20
+ end
21
+ end
22
+
23
+ describe '.options_list' do
24
+ it 'creates a formatted list of options' do
25
+ options = %w[one two three four five].each_with_object([]) do |x, arr|
26
+ arr << "Option item #{x}"
27
+ end
28
+ expect { prompt.options_list(options) }.to output(/ 2 \) Option item two/).to_stdout
29
+ end
30
+ end
31
+
32
+ describe '.choose' do
33
+ it 'returns a single match' do
34
+ expect(prompt.choose(['option 1']).count).to eq 1
35
+ end
36
+ end
37
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,11 @@
1
- # require 'simplecov'
1
+ # frozen_string_literal: true
2
2
 
3
- # SimpleCov.start
4
-
5
- # if ENV['CI'] == 'true'
6
- # require 'codecov'
7
- # SimpleCov.formatter = SimpleCov::Formatter::Codecov
8
- # else
9
- # SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
10
- # end
3
+ unless ENV['CI'] == 'true'
4
+ # SimpleCov::Formatter::Codecov # For CI
5
+ require 'simplecov'
6
+ SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
7
+ SimpleCov.start
8
+ end
11
9
 
12
10
  require 'howzit'
13
11
  require 'cli-test'
data/spec/task_spec.rb CHANGED
@@ -6,8 +6,7 @@ describe Howzit::Task do
6
6
  subject(:task) do
7
7
  Howzit::Task.new({ type: :run,
8
8
  title: 'List Directory',
9
- action: 'ls',
10
- parent: nil })
9
+ action: 'ls &> /dev/null' })
11
10
  end
12
11
 
13
12
  describe ".new" do
@@ -15,4 +14,10 @@ describe Howzit::Task do
15
14
  expect(task).to be_a Howzit::Task
16
15
  end
17
16
  end
17
+
18
+ describe ".to_s" do
19
+ it "outputs title string" do
20
+ expect(task.to_s).to match(/List Directory/)
21
+ end
22
+ end
18
23
  end
data/spec/topic_spec.rb CHANGED
@@ -7,14 +7,14 @@ describe Howzit::Topic do
7
7
  content = 'Test Content'
8
8
  subject(:topic) { Howzit::Topic.new(title, content) }
9
9
 
10
- describe ".new" do
11
- it "makes a new topic instance" do
10
+ describe '.new' do
11
+ it 'makes a new topic instance' do
12
12
  expect(topic).to be_a Howzit::Topic
13
13
  end
14
- it "has the correct title" do
14
+ it 'has the correct title' do
15
15
  expect(topic.title).to eq title
16
16
  end
17
- it "has the correct content" do
17
+ it 'has the correct content' do
18
18
  expect(topic.content).to eq content
19
19
  end
20
20
  end
@@ -23,34 +23,49 @@ end
23
23
  describe Howzit::Topic do
24
24
  subject(:topic) { @hz.find_topic('Topic Balogna')[0] }
25
25
 
26
- describe ".title" do
27
- it "has the correct title" do
28
- expect(topic.title).to match /Topic Balogna/
26
+ describe '.title' do
27
+ it 'has the correct title' do
28
+ expect(topic.title).to match(/Topic Balogna/)
29
29
  end
30
30
  end
31
31
 
32
- describe ".tasks" do
33
- it "has 2 tasks" do
32
+ describe '.tasks' do
33
+ it 'has 2 tasks' do
34
34
  expect(topic.tasks.count).to eq 2
35
35
  end
36
36
  end
37
37
 
38
- describe ".prereqs" do
39
- it "has prereq" do
38
+ describe '.prereqs' do
39
+ it 'has prereq' do
40
40
  expect(topic.prereqs.count).to eq 1
41
41
  end
42
- it "has postreq" do
42
+ end
43
+
44
+ describe '.postreqs' do
45
+ it 'has postreq' do
43
46
  expect(topic.postreqs.count).to eq 1
44
47
  end
45
48
  end
46
49
 
47
- describe ".run" do
50
+ describe '.grep' do
51
+ it 'returns true for matching pattern in content' do
52
+ expect(topic.grep('prereq.*?ite')).to be_truthy
53
+ end
54
+ it 'returns true for matching pattern in title' do
55
+ expect(topic.grep('bal.*?na')).to be_truthy
56
+ end
57
+ it 'fails on bad pattern' do
58
+ expect(topic.grep('xxx+')).to_not be_truthy
59
+ end
60
+ end
61
+
62
+ describe '.run' do
48
63
  Howzit.options[:default] = true
49
- it "shows prereq and postreq" do
64
+ it 'shows prereq and postreq' do
50
65
  expect { topic.run }.to output(/prerequisite/).to_stdout
51
66
  expect { topic.run }.to output(/postrequisite/).to_stdout
52
67
  end
53
- it "Copies to clipboard" do
68
+ it 'Copies to clipboard' do
54
69
  expect {
55
70
  ENV['RUBYOPT'] = '-W1'
56
71
  Howzit.options[:log_level] = 0
@@ -58,4 +73,19 @@ describe Howzit::Topic do
58
73
  }.to output(/Copied/).to_stderr
59
74
  end
60
75
  end
76
+
77
+ describe '.print_out' do
78
+ Howzit.options[:header_format] = :block
79
+ Howzit.options[:color] = false
80
+ it 'prints the topic title' do
81
+ expect(topic.print_out({single: true, header: true}).join("\n").uncolor).to match(/▌Topic Balogna/)
82
+ end
83
+ it 'prints a task title' do
84
+ expect(topic.print_out({single: true, header: true}).join("\n").uncolor).to match(/▶ Null Output/)
85
+ end
86
+ it 'prints task action with --show-code' do
87
+ Howzit.options[:show_all_code] = true
88
+ expect(topic.print_out({single: true, header: true}).join("\n").uncolor).to match(/▶ ls -1/)
89
+ end
90
+ end
61
91
  end