rubysl-iconv 1.0.1

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.
@@ -0,0 +1 @@
1
+ require "rubysl/iconv"
@@ -0,0 +1,2 @@
1
+ require "iconv/iconv"
2
+ require "rubysl/iconv/version"
@@ -0,0 +1,5 @@
1
+ module RubySL
2
+ module Iconv
3
+ VERSION = "1.0.1"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ require './lib/rubysl/iconv/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-iconv"
6
+ spec.version = RubySL::Iconv::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library iconv.}
10
+ spec.summary = %q{Ruby standard library iconv.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-iconv"
12
+ spec.license = "BSD"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.extensions = ["ext/rubysl/iconv/extconf.rb"]
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "mspec", "~> 1.5"
23
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv.charset_map" do
5
+ it "acts as a map" do
6
+ Iconv.charset_map.respond_to?(:[]).should be_true
7
+ Iconv.charset_map.respond_to?(:include?).should be_true
8
+ Iconv.charset_map.respond_to?(:to_hash).should be_true
9
+
10
+ Iconv.charset_map.include?("x-nonexistent-encoding").should be_false
11
+ end
12
+
13
+ # it "maps from canonical name to system dependent name" do
14
+ # end
15
+
16
+ it "returns nil when given an unknown encoding name" do
17
+ Iconv.charset_map["x-nonexistent-encoding"].should be_nil
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path('../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv#close" do
5
+ it "ignores multiple calls" do
6
+ conv1 = Iconv.new("us-ascii", "us-ascii")
7
+ conv1.close.should == ""
8
+ conv1.close.should be_nil
9
+ end
10
+
11
+ it "does not raise an exception if called inside an .open block" do
12
+ Iconv.open "us-ascii", "us-ascii" do |conv2|
13
+ conv2.close.should == ""
14
+ end
15
+ end
16
+
17
+ it "returns a string containing the byte sequence to change the output buffer to its initial shift state" do
18
+ Iconv.open "ISO-2022-JP", "UTF-8" do |cd|
19
+ cd.iconv("\343\201\262")
20
+ cd.close.should == encode("\e(B", "iso-2022-jp")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path('../shared/initialize_exceptions', __FILE__)
2
+ require File.expand_path('../fixtures/classes.rb', __FILE__)
3
+
4
+ ruby_version_is ''...'2.0' do
5
+ describe "Iconv.conv" do
6
+ it_behaves_like :iconv_initialize_exceptions, :conv, "test"
7
+
8
+ it "acts exactly as if opening a converter and invoking #iconv once" do
9
+ Iconv.conv("utf-8", "iso-8859-1", "expos\xe9").should == encode("expos\xc3\xa9", "utf-8")
10
+
11
+ str = mock("string-like")
12
+ str.should_receive(:to_str).and_return("cacha\xc3\xa7a")
13
+ Iconv.conv("iso-8859-1", "utf-8", str).should == encode("cacha\xe7a", "iso-8859-1")
14
+
15
+ Iconv.conv("utf-16", "us-ascii", "a").should equal_utf16("\xfe\xff\0a")
16
+ # each call is completely independent; never retain context!
17
+ Iconv.conv("utf-16", "us-ascii", "b").should equal_utf16("\xfe\xff\0b")
18
+
19
+ Iconv.conv("us-ascii", "iso-8859-1", nil).should == ""
20
+
21
+ Iconv.conv("utf-16", "utf-8", "").should == ""
22
+
23
+ lambda do
24
+ Iconv.conv("utf-8", "utf-8", "test\xff")
25
+ end.should raise_error(Iconv::IllegalSequence)
26
+
27
+ lambda do
28
+ Iconv.conv("utf-8", "utf-8", "euro \xe2")
29
+ end.should raise_error(Iconv::InvalidCharacter)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,53 @@
1
+ require File.expand_path('../../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv::Failure#failed" do
5
+ it "returns a substring of the original string passed to Iconv that starts at the character which caused the exception" do
6
+ lambda {
7
+ begin
8
+ Iconv.open "utf-8", "utf-8" do |conv|
9
+ conv.iconv "test \xff test \xff"
10
+ end
11
+ rescue Iconv::Failure => e
12
+ @ex = e
13
+ raise e
14
+ end
15
+ }.should raise_error(Iconv::Failure)
16
+ @ex.failed.should == "\xff test \xff"
17
+
18
+ lambda {
19
+ begin
20
+ Iconv.open "utf-8", "utf-8" do |conv|
21
+ conv.iconv "test \xe2\x82"
22
+ end
23
+ rescue Iconv::Failure => e
24
+ @ex = e
25
+ raise e
26
+ end
27
+ }.should raise_error(Iconv::Failure)
28
+ @ex.failed.should == "\xe2\x82"
29
+ end
30
+
31
+ it "for Iconv.iconv and Iconv.conv returns an array containing a single element when instantiated" do
32
+ lambda {
33
+ begin
34
+ Iconv.iconv("utf-8", "utf-8", "test \xff test")
35
+ rescue Iconv::Failure => e
36
+ @ex = e
37
+ raise e
38
+ end
39
+ }.should raise_error(Iconv::Failure)
40
+ @ex.failed.should == ["\xff test"]
41
+
42
+ lambda {
43
+ begin
44
+ Iconv.conv("utf-8", "utf-8", "test \xff test")
45
+ rescue Iconv::Failure => e
46
+ @ex = e
47
+ raise e
48
+ end
49
+ }.should raise_error(Iconv::Failure)
50
+ @ex.failed.should == ["\xff test"]
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv::Failure#inspect" do
5
+ it "includes information on the exception class name, #succes and #failed" do
6
+ lambda {
7
+ begin
8
+ Iconv.open "utf-8", "utf-8" do |conv|
9
+ conv.iconv "testing string \x80 until an error occurred"
10
+ end
11
+ rescue Iconv::Failure => e
12
+ @ex = e
13
+ raise e
14
+ end
15
+ }.should raise_error(Iconv::Failure)
16
+ inspection = @ex.inspect
17
+ inspection.should include(@ex.class.to_s)
18
+ inspection.should include(@ex.success.inspect)
19
+ inspection.should include(@ex.failed.inspect)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path('../../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv::Failure#success" do
5
+ it "for Iconv#iconv and Iconv.conv returns the substring of the original string passed which was translated successfully until the exception ocurred" do
6
+ lambda {
7
+ begin
8
+ Iconv.open "utf-8", "utf-8" do |conv|
9
+ conv.iconv "test \xff test \xff"
10
+ end
11
+ rescue Iconv::Failure => e
12
+ @ex = e
13
+ raise e
14
+ end
15
+ }.should raise_error(Iconv::Failure)
16
+ @ex.success.should == "test "
17
+
18
+ lambda {
19
+ begin
20
+ Iconv.conv "utf-8", "utf-8", "\xe2\x82"
21
+ rescue Iconv::Failure => e
22
+ @ex = e
23
+ raise e
24
+ end
25
+ }.should raise_error(Iconv::Failure)
26
+ @ex.success.should == ""
27
+ end
28
+
29
+ it "for Iconv.iconv returns an array containing all the strings that were translated successfully until the exception ocurred, in order" do
30
+ lambda {
31
+ begin
32
+ Iconv.iconv("utf-8", "utf-8", "\xfferror")
33
+ rescue Iconv::Failure => e
34
+ @ex = e
35
+ raise e
36
+ end
37
+ }.should raise_error(Iconv::Failure)
38
+ @ex.success.should == [""]
39
+
40
+ lambda {
41
+ begin
42
+ Iconv.iconv("utf-8", "utf-8", "test", "testing", "until\xfferror")
43
+ rescue Iconv::Failure => e
44
+ @ex = e
45
+ raise e
46
+ end
47
+ }.should raise_error(Iconv::Failure)
48
+ @ex.success.should == ["test", "testing", "until"]
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../fixtures/classes.rb', __FILE__)
2
+
3
+ ruby_version_is ''...'2.0' do
4
+ describe "Iconv::Failure" do
5
+ it "is a module" do
6
+ Iconv::Failure.should be_kind_of(Module)
7
+ Iconv::Failure.should_not be_kind_of(Class)
8
+ end
9
+
10
+ it "is included by Iconv::InvalidEncoding" do
11
+ Iconv::Failure.should be_ancestor_of(Iconv::InvalidEncoding)
12
+ end
13
+
14
+ it "is included by Iconv::IllegalSequence" do
15
+ Iconv::Failure.should be_ancestor_of(Iconv::IllegalSequence)
16
+ end
17
+
18
+ it "is included by Iconv::InvalidCharacter" do
19
+ Iconv::Failure.should be_ancestor_of(Iconv::InvalidCharacter)
20
+ end
21
+
22
+ it "is included by Iconv::OutOfRange" do
23
+ Iconv::Failure.should be_ancestor_of(Iconv::OutOfRange)
24
+ end
25
+
26
+ it "is included by Iconv::BrokenLibrary" do
27
+ Iconv::Failure.should be_ancestor_of(Iconv::BrokenLibrary)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ begin
2
+ require 'iconv'
3
+
4
+ module IconvSpecs
5
+ class IconvSubclass < Iconv
6
+ end
7
+ end
8
+ rescue LoadError
9
+ # do nothing
10
+ end
11
+
@@ -0,0 +1,211 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../shared/initialize_exceptions', __FILE__)
3
+ require File.expand_path('../fixtures/classes.rb', __FILE__)
4
+
5
+ # These specs assume the Iconv implementation supports at least
6
+ # the following encodings:
7
+ # us-ascii, utf-8, utf-16, utf-16be, utf-16le, iso-8859-1
8
+
9
+ ruby_version_is ''...'2.0' do
10
+ describe "Iconv#iconv" do
11
+ it "raises an ArgumentError when called on a closed converter" do
12
+ conv = Iconv.new("us-ascii", "us-ascii")
13
+ conv.close
14
+ lambda { conv.iconv("test") }.should raise_error(ArgumentError)
15
+ end
16
+
17
+ it "when given a string or string-like parameter returns a converted version of it" do
18
+ Iconv.open "utf-8", "iso-8859-1" do |conv|
19
+ conv.iconv("expos\xe9").should == "expos\xc3\xa9"
20
+
21
+ stringlike = mock("string-like")
22
+ stringlike.should_receive(:to_str).and_return("r\xe9sum\xe9")
23
+ conv.iconv(stringlike).should == "r\xc3\xa9sum\xc3\xa9"
24
+ end
25
+ end
26
+
27
+ it "keeps context between calls" do
28
+ Iconv.open "utf-16", "us-ascii" do |conv|
29
+ # BOM for first call of utf-16
30
+ conv.iconv("a").should equal_utf16("\xfe\xff\0a")
31
+ # no BOM for consecutive calls
32
+ conv.iconv("a").should equal_utf16("\0a")
33
+ end
34
+ end
35
+
36
+ it "when given a start and end position returns the substring" do
37
+ Iconv.open "us-ascii", "us-ascii" do |conv|
38
+ conv.iconv("testing", 1, 4).should == "esti"
39
+ conv.iconv("testing", 2, 1).should == "s"
40
+ end
41
+ end
42
+
43
+ it "when given a negative start position counts from the end of string" do
44
+ Iconv.open "us-ascii", "us-ascii" do |conv|
45
+ conv.iconv("testing", -7, 4).should == "test"
46
+ conv.iconv("testing", -3, 7).should == "ing"
47
+ end
48
+ end
49
+
50
+ it "when the end parameter is omitted or nil goes until the end of the string" do
51
+ Iconv.open "us-ascii", "us-ascii" do |conv|
52
+ conv.iconv("testing", 0).should == "testing"
53
+ conv.iconv("testing", 4).should == "ing"
54
+ conv.iconv("testing", 4, nil).should == "ing"
55
+ conv.iconv("testing", -3).should == "ing"
56
+ conv.iconv("testing", -4, nil).should == "ting"
57
+ end
58
+ end
59
+
60
+ ruby_bug "[ruby-core:17092]", "1.8.6.258" do
61
+ it "when given a positive length" do
62
+ Iconv.open "us-ascii", "us-ascii" do |conv|
63
+ conv.iconv("testing", 0, 4).should == "test"
64
+ conv.iconv("testing", 4, 6).should == "ing"
65
+ conv.iconv("substring", -6, 6).should == "string"
66
+ end
67
+ end
68
+
69
+ it "when given a negative length" do
70
+ Iconv.open "us-ascii", "us-ascii" do |conv|
71
+ conv.iconv("testing", 0, -1).should == "testing"
72
+ conv.iconv("testing", 2, -4).should == "sting"
73
+ conv.iconv("substring", -6, -4).should == "string"
74
+ end
75
+ end
76
+ end
77
+
78
+ it "raises Iconv::IllegalSequence when faced with an invalid byte for the source encoding" do
79
+ Iconv.open "utf-8", "utf-8" do |conv|
80
+ lambda { conv.iconv("test\x80") }.should raise_error(Iconv::IllegalSequence)
81
+ end
82
+ end
83
+
84
+ platform_is :linux, :darwin, :freebsd do
85
+ # glibc iconv and GNU libiconv wrongly raises EILSEQ.
86
+ # Linux, Darwin, and FreeBSD usually use them.
87
+ # NetBSD's libc iconv, Citrus iconv, correctly behaves as POSIX,
88
+ # but on NetBSD users may install GNU libiconv and use it.
89
+ it "raises Iconv::IllegalSequence when a character cannot be represented on the target encoding" do
90
+ Iconv.open "us-ascii", "utf-8" do |conv|
91
+ lambda { conv.iconv("euro \xe2\x82\xac") }.should raise_error(Iconv::IllegalSequence)
92
+ end
93
+ end
94
+ end
95
+
96
+ it "raises Iconv::InvalidCharacter when an incomplete character or shift sequence happens at the end of the input buffer" do
97
+ Iconv.open "utf-8", "utf-8" do |conv|
98
+ lambda { conv.iconv("euro \xe2") }.should raise_error(Iconv::InvalidCharacter)
99
+ lambda { conv.iconv("euro \xe2\x82") }.should raise_error(Iconv::InvalidCharacter)
100
+ end
101
+ Iconv.open "utf-16be", "utf-16be" do |conv|
102
+ lambda { conv.iconv("a") }.should raise_error(Iconv::InvalidCharacter)
103
+ end
104
+ end
105
+
106
+ ruby_bug "#17910", "1.8.6.114" do
107
+ it "sanitizes invalid upper bounds" do
108
+ Iconv.open "us-ascii", "us-ascii" do |conv|
109
+ conv.iconv("testing", 0, 99).should == "testing"
110
+ conv.iconv("testing", 10, 12).should == ""
111
+ end
112
+ end
113
+ end
114
+
115
+ it "returns a blank string on invalid lower bounds" do
116
+ Iconv.open "us-ascii", "us-ascii" do |conv|
117
+ conv.iconv("testing", -10, -8).should == ""
118
+ conv.iconv("testing", -8).should == ""
119
+ conv.iconv("testing", -9, 5).should == ""
120
+ end
121
+ end
122
+ end
123
+
124
+ describe "Iconv.iconv" do
125
+ it "converts a series of strings with a single converter" do
126
+ ary = [encode("\0a\0b\0c", "utf-16be"), encode("\0d\0e", "utf-16be")]
127
+ Iconv.iconv("utf-16be", "us-ascii", "abc", "de").should == ary
128
+ # BOM only on first string
129
+ Iconv.iconv("utf-16", "utf-8", "abc", "de").should equal_utf16(["\xfe\xff\0a\0b\0c", "\0d\0e"])
130
+ end
131
+
132
+ it "returns an empty array when given no strings to convert" do
133
+ Iconv.iconv("us-ascii", "utf-8").should == []
134
+ end
135
+
136
+ it_behaves_like :iconv_initialize_exceptions, :iconv, "test"
137
+
138
+ platform_is :linux, :darwin, :freebsd do
139
+ # //ignore is glibc iconv and GNU libiconv specific behavior, not POSIX
140
+ describe "using the ignore option" do
141
+ # This spec exists because some implementions of libiconv return
142
+ # an error for this sequence even though they consume all of the
143
+ # input and write the proper output. We want to be sure that those
144
+ # platforms ignore the error and give us the data back.
145
+ #
146
+ it "causes unknown bytes to be ignored" do
147
+ str = "f\303\266\303\266 bar" # this is foo bar, with umlate o's
148
+ Iconv.iconv('ascii//ignore', 'utf-8', str)[0].should == "f bar"
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ describe "The 'utf-8' encoder" do
155
+ it "emits proper representations for characters outside the Basic Multilingual Plane" do
156
+ Iconv.iconv("utf-8", "utf-16be", "\xd8\x40\xdc\x00").should == ["\xf0\xa0\x80\x80"]
157
+ end
158
+ end
159
+
160
+ describe "The 'utf-16' encoder" do
161
+
162
+ ruby_version_is "".."1.8.6p230" do
163
+ it "emits an empty string when the source input is empty" do
164
+ Iconv.iconv("utf-16", "us-ascii", "", "").should == ["", ""]
165
+ Iconv.open "utf-16", "utf-8" do |conv|
166
+ conv.iconv("").should == ""
167
+ conv.iconv("test", 1, 1).should == ""
168
+ conv.iconv("test", 3, -3).should == ""
169
+ conv.iconv("test", 1, -4).should == ""
170
+ end
171
+ end
172
+ end
173
+
174
+ ruby_version_is "1.8.6p238".."1.9" do
175
+ it "emits an empty string when the source input is empty" do
176
+ Iconv.iconv("utf-16", "us-ascii", "", "").should == ["", ""]
177
+ Iconv.open "utf-16", "utf-8" do |conv|
178
+ conv.iconv("").should == ""
179
+ conv.iconv("test", 1, 0).should == ""
180
+ end
181
+ end
182
+ end
183
+
184
+ it "emits a byte-order mark on first non-empty output" do
185
+ Iconv.iconv("utf-16", "us-ascii", "a").should equal_utf16(["\xfe\xff\0a"])
186
+ Iconv.iconv("utf-16", "utf-16", "\x80\x80", "\x81\x81").should equal_utf16(["\xfe\xff\x80\x80", "\x81\x81"])
187
+ end
188
+ end
189
+
190
+ describe "The 'utf-16be' decoder" do
191
+ it "does not emit a byte-order mark" do
192
+ Iconv.iconv("utf-16be", "utf-8", "ab").should == [encode("\0a\0b", "utf-16be")]
193
+ end
194
+
195
+ it "treats possible byte-order marks as regular characters" do
196
+ Iconv.iconv("utf-8", "utf-16be", "\xfe\xff\0a").should == ["\xef\xbb\xbfa"]
197
+ Iconv.iconv("utf-8", "utf-16be", "\xff\xfe\0a").should == ["\xef\xbf\xbea"]
198
+ end
199
+ end
200
+
201
+ describe "The 'utf-16le' decoder" do
202
+ it "does not emit a byte-order mark" do
203
+ Iconv.iconv("utf-16le", "utf-8", "ab").should == [encode("a\0b\0", "utf-16le")]
204
+ end
205
+
206
+ it "treats possible byte-order marks as regular characters" do
207
+ Iconv.iconv("utf-8", "utf-16le", "\xfe\xff\0a").should == ["\xef\xbf\xbe\xe6\x84\x80"]
208
+ Iconv.iconv("utf-8", "utf-16le", "\xff\xfe\0a").should == ["\xef\xbb\xbf\xe6\x84\x80"]
209
+ end
210
+ end
211
+ end