bychar 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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::Reader.new(s)
9
- assert_equal "T", reader.read_one_byte
10
- assert_equal "h", reader.read_one_byte
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::Reader.new(s, 4)
18
- reader.read_one_byte
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::Reader.new(s)
25
- reader.read_one_byte
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::Reader.new(s)
31
- assert s.eof?
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::Reader.new(s)
38
- assert reader.eof?
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::Reader.new(s, 1)
45
- s.length.times { reader.read_one_byte }
46
- assert reader.eof?
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::EOFError) do
54
- s = Bychar::Reader.new(StringIO.new(str))
55
- loop { bytes << s.read_one_byte! }
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
@@ -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: 1.2.1
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-15 00:00:00.000000000 Z
12
+ date: 2013-03-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc
16
- requirement: !ruby/object:Gem::Requirement
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
- requirement: !ruby/object:Gem::Requirement
33
- none: false
32
+ version_requirements: !ruby/object:Gem::Requirement
34
33
  requirements:
35
34
  - - ! '>='
36
35
  - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
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: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- requirement: !ruby/object:Gem::Requirement
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/test_bychar.rb
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: -2517849728634494655
112
- required_rubygems_version: !ruby/object:Gem::Requirement
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: '0'
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: []