Skip to content

Commit 960a685

Browse files
authored
read without size always returns a String. (#10)
1 parent 968ba48 commit 960a685

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

lib/io/stream/readable.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ def read(size = nil, buffer = nil)
8383
until @done
8484
fill_read_buffer
8585
end
86+
87+
if buffer
88+
buffer.replace(@read_buffer)
89+
@read_buffer.clear
90+
else
91+
buffer = @read_buffer
92+
@read_buffer = StringBuffer.new
93+
end
94+
95+
# Read without size always returns a non-nil value, even if it is an empty string.
96+
return buffer
8697
end
8798

8899
return consume_read_buffer(size, buffer)

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Fix EOF behavior to match Ruby IO semantics: `read()` returns empty string `""` at EOF while `read(size)` returns `nil` at EOF.
6+
37
## v0.9.0
48

59
- Add support for `buffer` parameter in `read`, `read_exactly`, and `read_partial` methods to allow reading into a provided buffer.

test/io/stream/buffered.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,17 @@
139139
expect(client.read).to be == "Hello World"
140140
expect(client).to be(:eof?)
141141
end
142-
142+
143+
it "reads until done" do
144+
server.close
145+
146+
# Subsequent reads should return nil:
147+
expect(client.read(1)).to be_nil
148+
149+
# Reading with no length should return an empty string:
150+
expect(client.read).to be == ""
151+
end
152+
143153
it "reads only the amount requested" do
144154
server.write "Hello World"
145155
server.close
@@ -714,7 +724,7 @@ def before
714724
with "#close" do
715725
it "should close the stream" do
716726
server.close
717-
expect(client.read).to be_nil
727+
expect(client.read).to be == ""
718728

719729
expect(server.closed?).to be_truthy
720730
expect(client.closed?).to be_falsey

0 commit comments

Comments
 (0)