Skip to content

Commit

Permalink
Add newline_before_multiline_output
Browse files Browse the repository at this point in the history
  • Loading branch information
mrkn committed Jan 20, 2020
1 parent 6b053ca commit 9eb1801
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lib/irb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,13 @@ def prompt(prompt, ltype, indent, line_no) # :nodoc:
end

def output_value # :nodoc:
printf @context.return_format, @context.inspect_last_value
str = @context.inspect_last_value
multiline_p = str.each_line.take(2).length > 1
if multiline_p && @context.newline_before_multiline_output?
printf @context.return_format, "\n#{str}"
else
printf @context.return_format, str
end
end

# Outputs the local variables to this current session, including
Expand Down
20 changes: 20 additions & 0 deletions lib/irb/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ def initialize(irb, workspace = nil, input_method = nil)
if @echo_on_assignment.nil?
@echo_on_assignment = false
end

@newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
if @newline_before_multiline_output.nil?
@newline_before_multiline_output = true
end
end

# The top-level workspace, see WorkSpace#main
Expand Down Expand Up @@ -253,6 +258,20 @@ def main
# a = "omg"
# #=> omg
attr_accessor :echo_on_assignment
# Whether a newline is put before multiline output.
#
# Uses IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT] if available,
# or defaults to +true+.
#
# "abc\ndef"
# #=>
# abc
# def
# IRB.CurrentContext.newline_before_multiline_output = false
# "abc\ndef"
# #=> abc
# def
attr_accessor :newline_before_multiline_output
# Whether verbose messages are displayed or not.
#
# A copy of the default <code>IRB.conf[:VERBOSE]</code>
Expand Down Expand Up @@ -287,6 +306,7 @@ def main
alias ignore_eof? ignore_eof
alias echo? echo
alias echo_on_assignment? echo_on_assignment
alias newline_before_multiline_output? newline_before_multiline_output

# Returns whether messages are displayed or not.
def verbose?
Expand Down
31 changes: 31 additions & 0 deletions test/irb/test_context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -216,5 +216,36 @@ def test_echo_on_assignment_conf
assert(irb.context.echo?, "echo? should be true by default")
assert(irb.context.echo_on_assignment?, "echo_on_assignment? should be true when IRB.conf[:ECHO_ON_ASSIGNMENT] is set to true")
end

def test_multiline_output_on_default_inspector
main = Object.new
def main.inspect
"abc\ndef"
end
input = TestInputMethod.new([
"self"
])
irb = IRB::Irb.new(IRB::WorkSpace.new(main), input)
irb.context.return_format = "=> %s\n"

# The default
irb.context.newline_before_multiline_output = true
out, err = capture_io do
irb.eval_input
end
assert_empty err
assert_equal("=> \nabc\ndef\n",
out)

# No newline before multiline output
input.reset
irb.context.newline_before_multiline_output = false
out, err = capture_io do
irb.eval_input
end
assert_empty err
assert_equal("=> abc\ndef\n",
out)
end
end
end

0 comments on commit 9eb1801

Please sign in to comment.