Skip to content

Commit 3343846

Browse files
Indent multiline messages in say_status
This prevents multiline status messages from breaking the left margin. As an example, before this commit: ``` status1 single line status2 multiline line 1 multiline line 2 multiline line 3 status3 multiline indent 0 multiline indent 2 multiline indent 4 status4 single line ``` And after this commit: ``` status1 single line status2 multiline line 1 multiline line 2 multiline line 3 status3 multiline indent 0 multiline indent 2 multiline indent 4 status4 single line ```
1 parent ff37cba commit 3343846

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

lib/thor/shell/basic.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,14 @@ def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/)
109109
def say_status(status, message, log_status = true)
110110
return if quiet? || log_status == false
111111
spaces = " " * (padding + 1)
112-
color = log_status.is_a?(Symbol) ? log_status : :green
113-
114112
status = status.to_s.rjust(12)
113+
margin = " " * status.length + spaces
114+
115+
color = log_status.is_a?(Symbol) ? log_status : :green
115116
status = set_color status, color, true if color
116117

117-
buffer = "#{status}#{spaces}#{message}"
118-
buffer = "#{buffer}\n" unless buffer.end_with?("\n")
118+
message = message.to_s.chomp.gsub(/(?<!\A)^/, margin)
119+
buffer = "#{status}#{spaces}#{message}\n"
119120

120121
stdout.print(buffer)
121122
stdout.flush

spec/shell/basic_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,20 @@ def shell
186186
shell.say_status(:create, "")
187187
end
188188

189+
it "indents a multiline message" do
190+
status = :foobar
191+
lines = ["first line", "second line", " third line", " fourth line"]
192+
193+
expect($stdout).to receive(:print) do |string|
194+
formatted_status = string[/^\s*#{status}\s*/]
195+
margin = " " * formatted_status.length
196+
197+
expect(string).to eq(formatted_status + lines.join("\n#{margin}") + "\n")
198+
end
199+
200+
shell.say_status(status, lines.join("\n") + "\n")
201+
end
202+
189203
it "does not print a message if base is muted" do
190204
expect(shell).to receive(:mute?).and_return(true)
191205
expect($stdout).not_to receive(:print)

0 commit comments

Comments
 (0)