bychar 1.2.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +1 -0
- data/README.rdoc +38 -1
- data/bychar.gemspec +10 -3
- data/lib/bychar.rb +15 -50
- data/lib/impls/reader_bare.rb +15 -0
- data/lib/impls/reader_iobuf.rb +27 -0
- data/lib/impls/reader_strbuf.rb +33 -0
- data/test/huge_nuke_tcl.tcl +331 -0
- data/test/{test_bychar.rb → test_ioreader.rb} +17 -18
- data/test/test_reader.rb +45 -0
- data/test/test_strreader.rb +46 -0
- data/test/test_z_bench.rb +61 -0
- metadata +46 -35
@@ -5,54 +5,53 @@ class TestBychar < Test::Unit::TestCase
|
|
5
5
|
def test_reads_once
|
6
6
|
s = StringIO.new("This is a string")
|
7
7
|
|
8
|
-
reader = Bychar::
|
9
|
-
assert_equal "T", reader.
|
10
|
-
assert_equal "h", reader.
|
11
|
-
assert !reader.eof?
|
8
|
+
reader = Bychar::ReaderIOBuf.new(s)
|
9
|
+
assert_equal "T", reader.read_one_char!
|
10
|
+
assert_equal "h", reader.read_one_char!
|
12
11
|
end
|
13
12
|
|
14
13
|
def test_reads_set_buffer_size
|
15
14
|
s = StringIO.new("abcd")
|
16
15
|
flexmock(s).should_receive(:read).with(4).once.and_return("abcd")
|
17
|
-
reader = Bychar::
|
18
|
-
reader.
|
16
|
+
reader = Bychar::ReaderIOBuf.new(s, 4)
|
17
|
+
reader.read_one_char!
|
19
18
|
end
|
20
19
|
|
21
20
|
def test_reads_in_64kb_chunks_by_default
|
22
21
|
s = StringIO.new("abcd")
|
23
22
|
flexmock(s).should_receive(:read).with(Bychar::DEFAULT_BUFFER_SIZE).once.and_return("abcd")
|
24
|
-
reader = Bychar::
|
25
|
-
reader.
|
23
|
+
reader = Bychar::ReaderIOBuf.new(s)
|
24
|
+
reader.read_one_char!
|
26
25
|
end
|
27
26
|
|
28
27
|
def test_eof_with_empty
|
29
28
|
s = StringIO.new
|
30
|
-
reader = Bychar::
|
31
|
-
|
29
|
+
reader = Bychar::ReaderIOBuf.new(s)
|
30
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
32
31
|
end
|
33
32
|
|
34
33
|
def test_eof_with_io_at_eof
|
35
34
|
s = StringIO.new("foo")
|
36
35
|
s.read(3)
|
37
|
-
reader = Bychar::
|
38
|
-
|
36
|
+
reader = Bychar::ReaderIOBuf.new(s)
|
37
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
39
38
|
end
|
40
39
|
|
41
40
|
def test_eof_with_string_to_size
|
42
41
|
s = "Foobarboo another"
|
43
42
|
s = StringIO.new(s)
|
44
|
-
reader = Bychar::
|
45
|
-
s.length.times { reader.
|
46
|
-
|
43
|
+
reader = Bychar::ReaderIOBuf.new(s, 1)
|
44
|
+
s.length.times { reader.read_one_char! }
|
45
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
47
46
|
end
|
48
47
|
|
49
48
|
def test_read_one_byte_and_raise_at_eof
|
50
49
|
str = "Frobobo"
|
51
50
|
|
52
51
|
bytes = []
|
53
|
-
assert_raise(Bychar::
|
54
|
-
s = Bychar::
|
55
|
-
loop { bytes << s.
|
52
|
+
assert_raise(Bychar::EOF) do
|
53
|
+
s = Bychar::ReaderIOBuf.new(StringIO.new(str))
|
54
|
+
loop { bytes << s.read_one_char! }
|
56
55
|
end
|
57
56
|
|
58
57
|
assert_equal %w( F r o b o b o ), bytes
|
data/test/test_reader.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
class TestReader < Test::Unit::TestCase
|
5
|
+
def test_reads_once
|
6
|
+
s = StringIO.new("This is a string")
|
7
|
+
|
8
|
+
reader = Bychar.wrap(s)
|
9
|
+
assert_equal "T", reader.read_one_char!
|
10
|
+
assert_equal "h", reader.read_one_char!
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_eof_with_empty
|
14
|
+
s = StringIO.new
|
15
|
+
reader = Bychar.wrap(s)
|
16
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_eof_with_io_at_eof
|
20
|
+
s = StringIO.new("foo")
|
21
|
+
s.read(3)
|
22
|
+
reader = Bychar.wrap(s)
|
23
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_eof_with_string_to_size
|
27
|
+
s = "Foobarboo another"
|
28
|
+
s = StringIO.new(s)
|
29
|
+
reader = Bychar.wrap(s)
|
30
|
+
s.length.times { reader.read_one_char! }
|
31
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_read_one_byte_and_raise_at_eof
|
35
|
+
str = "Frobobo"
|
36
|
+
bytes = []
|
37
|
+
assert_raise(Bychar::EOF) do
|
38
|
+
s = Bychar.wrap(StringIO.new(str))
|
39
|
+
loop { bytes << s.read_one_char! }
|
40
|
+
end
|
41
|
+
|
42
|
+
assert_equal %w( F r o b o b o ), bytes
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
class TestStrReader < Test::Unit::TestCase
|
5
|
+
def test_reads_once
|
6
|
+
s = StringIO.new("This is a string")
|
7
|
+
|
8
|
+
reader = Bychar::ReaderIOBuf.new(s)
|
9
|
+
assert_equal "T", reader.read_one_char!
|
10
|
+
assert_equal "h", reader.read_one_char!
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_eof_with_empty
|
14
|
+
s = StringIO.new
|
15
|
+
reader = Bychar::ReaderStrbuf.new(s)
|
16
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_eof_with_io_at_eof
|
20
|
+
s = StringIO.new("foo")
|
21
|
+
s.read(3)
|
22
|
+
reader = Bychar::ReaderStrbuf.new(s)
|
23
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_eof_with_string_to_size
|
27
|
+
s = "Foobarboo another"
|
28
|
+
s = StringIO.new(s)
|
29
|
+
reader = Bychar::ReaderStrbuf.new(s)
|
30
|
+
s.length.times { reader.read_one_char! }
|
31
|
+
assert_raise(Bychar::EOF) { reader.read_one_char! }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_read_one_byte_and_raise_at_eof
|
35
|
+
str = "Frobobo"
|
36
|
+
|
37
|
+
bytes = []
|
38
|
+
assert_raise(Bychar::EOF) do
|
39
|
+
s = Bychar::ReaderStrbuf.new(StringIO.new(str))
|
40
|
+
loop { bytes << s.read_one_char! }
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal %w( F r o b o b o ), bytes
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class BenchReader
|
8
|
+
|
9
|
+
def initialize(reader_class)
|
10
|
+
@reader = reader_class
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_reader(io)
|
14
|
+
@reader.new(io)
|
15
|
+
end
|
16
|
+
|
17
|
+
def pick
|
18
|
+
get_reader(StringIO.new).class.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
File.open(File.dirname(__FILE__) + "/huge_nuke_tcl.tcl") do | io |
|
23
|
+
reader = get_reader(io)
|
24
|
+
begin
|
25
|
+
loop { reader.read_one_char! * 2 }
|
26
|
+
rescue Bychar::EOF
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Auto
|
33
|
+
def self.new(io)
|
34
|
+
Bychar.wrap(io)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class TestBenchmarkReaders < Test::Unit::TestCase
|
39
|
+
def test_perf
|
40
|
+
|
41
|
+
reader0 = BenchReader.new(Bychar::ReaderBare)
|
42
|
+
reader1 = BenchReader.new(Bychar::ReaderIOBuf)
|
43
|
+
reader2 = BenchReader.new(Bychar::ReaderStrbuf)
|
44
|
+
reader3 = BenchReader.new(Auto)
|
45
|
+
|
46
|
+
platform = "Platform-picked Bychar.wrap(io) #{reader3.pick}:"
|
47
|
+
|
48
|
+
require 'benchmark'
|
49
|
+
|
50
|
+
Benchmark.bm(5) do |x|
|
51
|
+
x.report("Bare IO using read(1):".ljust(platform.length)) { reader0.run }
|
52
|
+
x.report("Bychar using StringIO:".ljust(platform.length)) { reader1.run }
|
53
|
+
x.report("Bychar using a String buffer:".ljust(platform.length)) { reader2.run }
|
54
|
+
x.report(platform) { reader3.run }
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
assert true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
metadata
CHANGED
@@ -1,80 +1,82 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bychar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Julik Tarkhanov
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
16
|
-
|
17
|
-
none: false
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
18
17
|
requirements:
|
19
18
|
- - ~>
|
20
19
|
- !ruby/object:Gem::Version
|
21
20
|
version: '3.12'
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
21
|
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '3.12'
|
27
|
+
none: false
|
28
|
+
prerelease: false
|
29
|
+
type: :development
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: bundler
|
32
|
-
|
33
|
-
none: false
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
34
33
|
requirements:
|
35
34
|
- - ! '>='
|
36
35
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
38
|
-
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
version: !binary |-
|
37
|
+
MA==
|
41
38
|
none: false
|
39
|
+
requirement: !ruby/object:Gem::Requirement
|
42
40
|
requirements:
|
43
41
|
- - ! '>='
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
43
|
+
version: !binary |-
|
44
|
+
MA==
|
45
|
+
none: false
|
46
|
+
prerelease: false
|
47
|
+
type: :development
|
46
48
|
- !ruby/object:Gem::Dependency
|
47
49
|
name: jeweler
|
48
|
-
|
49
|
-
none: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
51
|
requirements:
|
51
52
|
- - ~>
|
52
53
|
- !ruby/object:Gem::Version
|
53
54
|
version: 1.8.4
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
55
|
none: false
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
58
57
|
requirements:
|
59
58
|
- - ~>
|
60
59
|
- !ruby/object:Gem::Version
|
61
60
|
version: 1.8.4
|
61
|
+
none: false
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
62
64
|
- !ruby/object:Gem::Dependency
|
63
65
|
name: flexmock
|
64
|
-
|
65
|
-
none: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
67
|
requirements:
|
67
68
|
- - ~>
|
68
69
|
- !ruby/object:Gem::Version
|
69
70
|
version: '0.8'
|
70
|
-
type: :development
|
71
|
-
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
71
|
none: false
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
74
73
|
requirements:
|
75
74
|
- - ~>
|
76
75
|
- !ruby/object:Gem::Version
|
77
76
|
version: '0.8'
|
77
|
+
none: false
|
78
|
+
prerelease: false
|
79
|
+
type: :development
|
78
80
|
description: ! ' Helps parsing IO char by char '
|
79
81
|
email: me@julik.nl
|
80
82
|
executables: []
|
@@ -91,34 +93,43 @@ files:
|
|
91
93
|
- Rakefile
|
92
94
|
- bychar.gemspec
|
93
95
|
- lib/bychar.rb
|
96
|
+
- lib/impls/reader_bare.rb
|
97
|
+
- lib/impls/reader_iobuf.rb
|
98
|
+
- lib/impls/reader_strbuf.rb
|
94
99
|
- test/helper.rb
|
95
|
-
- test/
|
100
|
+
- test/huge_nuke_tcl.tcl
|
101
|
+
- test/test_ioreader.rb
|
102
|
+
- test/test_reader.rb
|
103
|
+
- test/test_strreader.rb
|
104
|
+
- test/test_z_bench.rb
|
96
105
|
homepage: http://github.com/julik/bychar
|
97
106
|
licenses:
|
98
107
|
- MIT
|
99
|
-
post_install_message:
|
108
|
+
post_install_message:
|
100
109
|
rdoc_options: []
|
101
110
|
require_paths:
|
102
111
|
- lib
|
103
112
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
-
none: false
|
105
113
|
requirements:
|
106
114
|
- - ! '>='
|
107
115
|
- !ruby/object:Gem::Version
|
108
|
-
version: '0'
|
109
116
|
segments:
|
110
117
|
- 0
|
111
|
-
hash:
|
112
|
-
|
118
|
+
hash: 2
|
119
|
+
version: !binary |-
|
120
|
+
MA==
|
113
121
|
none: false
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
123
|
requirements:
|
115
124
|
- - ! '>='
|
116
125
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
126
|
+
version: !binary |-
|
127
|
+
MA==
|
128
|
+
none: false
|
118
129
|
requirements: []
|
119
|
-
rubyforge_project:
|
130
|
+
rubyforge_project:
|
120
131
|
rubygems_version: 1.8.24
|
121
|
-
signing_key:
|
132
|
+
signing_key:
|
122
133
|
specification_version: 3
|
123
134
|
summary: Helps parsing IO char by char
|
124
135
|
test_files: []
|