ffi-icu 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +6 -0
- data/LICENSE +1 -1
- data/README.md +3 -1
- data/Rakefile +1 -3
- data/ffi-icu.gemspec +3 -7
- data/lib/ffi-icu.rb +2 -0
- data/lib/ffi-icu/lib.rb +58 -49
- data/lib/ffi-icu/version.rb +1 -1
- data/spec/chardet_spec.rb +8 -9
- data/spec/collation_spec.rb +14 -15
- data/spec/transliteration_spec.rb +8 -8
- metadata +63 -39
data/.travis.yml
ADDED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,8 @@ ffi-icu
|
|
3
3
|
|
4
4
|
Simple FFI wrappers for things I need from ICU. For the full thing, check out [ICU4R](http://icu4r.rubyforge.org/) instead.
|
5
5
|
|
6
|
+
[![Build Status](https://secure.travis-ci.org/jarib/ffi-icu.png)](http://travis-ci.org/jarib/ffi-icu)
|
7
|
+
|
6
8
|
Gem
|
7
9
|
---
|
8
10
|
|
@@ -113,4 +115,4 @@ Note on Patches/Pull Requests
|
|
113
115
|
Copyright
|
114
116
|
=========
|
115
117
|
|
116
|
-
Copyright (c) 2010-
|
118
|
+
Copyright (c) 2010-2012 Jari Bakken. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -14,14 +14,12 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
|
|
14
14
|
spec.rcov = true
|
15
15
|
end
|
16
16
|
|
17
|
-
task :spec
|
18
|
-
|
19
17
|
task :default => :spec
|
20
18
|
|
21
19
|
begin
|
22
20
|
require 'yard'
|
23
21
|
YARD::Rake::YardocTask.new
|
24
|
-
rescue
|
22
|
+
rescue LoadError
|
25
23
|
task :yardoc do
|
26
24
|
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
27
25
|
end
|
data/ffi-icu.gemspec
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
1
|
require File.expand_path("../lib/ffi-icu/version", __FILE__)
|
7
2
|
|
8
3
|
Gem::Specification.new do |s|
|
@@ -24,7 +19,8 @@ Gem::Specification.new do |s|
|
|
24
19
|
s.rdoc_options = ["--charset=UTF-8"]
|
25
20
|
s.summary = %q{Simple Ruby FFI wrappers for things I need from ICU.}
|
26
21
|
|
27
|
-
s.add_runtime_dependency
|
28
|
-
s.add_development_dependency
|
22
|
+
s.add_runtime_dependency "ffi", ["~> 1.0.9"]
|
23
|
+
s.add_development_dependency "rspec", ["~> 2.5.0"]
|
24
|
+
s.add_development_dependency "rake", ["~> 0.9.2"]
|
29
25
|
end
|
30
26
|
|
data/lib/ffi-icu.rb
CHANGED
data/lib/ffi-icu/lib.rb
CHANGED
@@ -8,60 +8,69 @@ module ICU
|
|
8
8
|
module Lib
|
9
9
|
extend FFI::Library
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
}
|
18
|
-
|
19
|
-
# FIXME: this is incredibly ugly, figure out some better way
|
20
|
-
def self.find_icu
|
21
|
-
suffix = ''
|
22
|
-
|
23
|
-
# let the user tell us where the lib is
|
24
|
-
if ENV['FFI_ICU_LIB']
|
25
|
-
libs = ENV['FFI_ICU_LIB'].split(",")
|
26
|
-
ffi_lib(*libs)
|
27
|
-
|
28
|
-
if ENV['FFI_ICU_VERSION_SUFFIX']
|
29
|
-
return ENV['FFI_ICU_VERSION_SUFFIX']
|
30
|
-
elsif num = libs.first[/\d+$/]
|
31
|
-
return num.split(//).join("_")
|
11
|
+
def self.search_paths
|
12
|
+
@search_paths ||= begin
|
13
|
+
if ENV['FFI_ICU_LIB']
|
14
|
+
[ ENV['FFI_ICU_LIB'] ]
|
15
|
+
elsif FFI::Platform::IS_WINDOWS
|
16
|
+
ENV['PATH'].split(File::PATH_SEPARATOR)
|
32
17
|
else
|
33
|
-
|
18
|
+
[ '/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}' ]
|
34
19
|
end
|
35
20
|
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.find_lib(lib)
|
24
|
+
Dir.glob(search_paths.map { |path|
|
25
|
+
File.expand_path(File.join(path, lib))
|
26
|
+
}).first
|
27
|
+
end
|
36
28
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
29
|
+
def self.load_icu
|
30
|
+
# First find the library
|
31
|
+
lib_names = case ICU.platform
|
32
|
+
when :osx
|
33
|
+
[find_lib("libicucore.#{FFI::Platform::LIBSUFFIX}")]
|
34
|
+
when :linux
|
35
|
+
[find_lib("libicui18n.#{FFI::Platform::LIBSUFFIX}.??"),
|
36
|
+
find_lib("libicutu.#{FFI::Platform::LIBSUFFIX}.??")]
|
37
|
+
when :windows
|
38
|
+
[find_lib("icuuc??.#{FFI::Platform::LIBSUFFIX}"),
|
39
|
+
find_lib("icuin??.#{FFI::Platform::LIBSUFFIX}")]
|
40
|
+
end
|
41
|
+
|
42
|
+
lib_names.compact! if lib_names
|
43
|
+
|
44
|
+
if not lib_names or lib_names.length == 0
|
45
|
+
raise LoadError, "Could not find ICU on #{ICU.platform.inspect}, patches appreciated!"
|
52
46
|
end
|
53
47
|
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
# And now try to load the library
|
49
|
+
begin
|
50
|
+
libs = ffi_lib(*lib_names)
|
51
|
+
rescue LoadError => ex
|
52
|
+
raise LoadError, "no idea how to load ICU on #{ICU.platform.inspect}, patches appreciated! (#{ex.message})"
|
53
|
+
end
|
57
54
|
|
58
|
-
|
59
|
-
|
55
|
+
# And last figure out the version we just loaded
|
56
|
+
icu_version(libs)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.icu_version(libs)
|
60
|
+
version = nil
|
61
|
+
|
62
|
+
libs.find do |lib|
|
63
|
+
# Get the version - sure would be nice if libicu exported this in a function
|
64
|
+
# we could just call cause this is super fugly!
|
65
|
+
match = lib.name.match(/(\d\d)\.#{FFI::Platform::LIBSUFFIX}/) ||
|
66
|
+
lib.name.match(/#{FFI::Platform::LIBSUFFIX}\.(\d\d)/)
|
67
|
+
if match
|
68
|
+
version = match[1]
|
69
|
+
end
|
60
70
|
end
|
61
71
|
|
62
|
-
|
63
|
-
|
64
|
-
raise LoadError, "no idea how to load ICU on #{ICU.platform.inspect}, patches appreciated! (#{ex.message})"
|
72
|
+
# Note this may return nil, like on OSX
|
73
|
+
version
|
65
74
|
end
|
66
75
|
|
67
76
|
def self.check_error
|
@@ -101,8 +110,8 @@ module ICU
|
|
101
110
|
end
|
102
111
|
end
|
103
112
|
|
104
|
-
|
105
|
-
suffix =
|
113
|
+
version = load_icu
|
114
|
+
suffix = version ? "_#{version}" : ""
|
106
115
|
|
107
116
|
attach_function :u_errorName, "u_errorName#{suffix}", [:int], :string
|
108
117
|
attach_function :uenum_count, "uenum_count#{suffix}", [:pointer, :pointer], :int
|
@@ -190,7 +199,7 @@ module ICU
|
|
190
199
|
:default, 4,
|
191
200
|
:nfkc, 5,
|
192
201
|
:fcd, 6
|
193
|
-
|
202
|
+
]
|
194
203
|
|
195
204
|
attach_function :unorm_normalize, "unorm_normalize#{suffix}", [:pointer, :int32_t, :normalization_mode, :int32_t, :pointer, :int32_t, :pointer], :int32_t
|
196
205
|
|
@@ -211,7 +220,7 @@ module ICU
|
|
211
220
|
:kana_limit, 400,
|
212
221
|
:ideo, 400,
|
213
222
|
:ideo_limit, 400
|
214
|
-
|
223
|
+
]
|
215
224
|
|
216
225
|
attach_function :ubrk_countAvailable, "ubrk_countAvailable#{suffix}", [], :int32_t
|
217
226
|
attach_function :ubrk_getAvailable, "ubrk_getAvailable#{suffix}", [:int32_t], :string
|
data/lib/ffi-icu/version.rb
CHANGED
data/spec/chardet_spec.rb
CHANGED
@@ -4,16 +4,16 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe ICU::CharDet::Detector do
|
6
6
|
|
7
|
-
|
7
|
+
let(:detector) { ICU::CharDet::Detector.new }
|
8
8
|
|
9
9
|
it "should recognize UTF-8" do
|
10
|
-
m =
|
10
|
+
m = detector.detect("æåø")
|
11
11
|
m.name.should == "UTF-8"
|
12
12
|
m.language.should be_kind_of(String)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "has a list of detectable charsets" do
|
16
|
-
cs =
|
16
|
+
cs = detector.detectable_charsets
|
17
17
|
cs.should be_kind_of(Array)
|
18
18
|
cs.should_not be_empty
|
19
19
|
|
@@ -21,18 +21,17 @@ describe ICU::CharDet::Detector do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should disable / enable the input filter" do
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
detector.input_filter_enabled?.should be_false
|
25
|
+
detector.input_filter_enabled = true
|
26
|
+
detector.input_filter_enabled?.should be_true
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should should set declared encoding" do
|
30
|
-
|
30
|
+
detector.declared_encoding = "UTF-8"
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should detect several matching encodings" do
|
34
|
-
|
35
|
-
r.should be_instance_of(Array)
|
34
|
+
detector.detect_all("foo bar").should be_instance_of(Array)
|
36
35
|
end
|
37
36
|
|
38
37
|
end
|
data/spec/collation_spec.rb
CHANGED
@@ -11,15 +11,14 @@ module ICU
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe Collator do
|
14
|
-
|
15
|
-
before { @c = Collator.new("nb") }
|
14
|
+
let(:collator) { Collator.new("nb") }
|
16
15
|
|
17
16
|
it "should collate an array of strings" do
|
18
|
-
|
17
|
+
collator.collate(%w[å ø æ]).should == %w[æ ø å]
|
19
18
|
end
|
20
19
|
|
21
20
|
it "raises an error if argument does not respond to :sort" do
|
22
|
-
lambda {
|
21
|
+
lambda { collator.collate(1) }.should raise_error(ArgumentError)
|
23
22
|
end
|
24
23
|
|
25
24
|
it "should return available locales" do
|
@@ -30,30 +29,30 @@ module ICU
|
|
30
29
|
end
|
31
30
|
|
32
31
|
it "should return the locale of the collator" do
|
33
|
-
l =
|
32
|
+
l = collator.locale
|
34
33
|
l.should == "nb"
|
35
34
|
end
|
36
35
|
|
37
36
|
it "should compare two strings" do
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
collator.compare("blåbærsyltetøy", "blah").should == 1
|
38
|
+
collator.compare("blah", "blah").should == 0
|
39
|
+
collator.compare("baah", "blah").should == -1
|
41
40
|
end
|
42
41
|
|
43
42
|
it "should know if a string is greater than another" do
|
44
|
-
|
45
|
-
|
43
|
+
collator.should be_greater("z", "a")
|
44
|
+
collator.should_not be_greater("a", "z")
|
46
45
|
end
|
47
46
|
|
48
47
|
it "should know if a string is greater or equal to another" do
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
collator.should be_greater_or_equal("z", "a")
|
49
|
+
collator.should be_greater_or_equal("z", "z")
|
50
|
+
collator.should_not be_greater_or_equal("a", "z")
|
52
51
|
end
|
53
52
|
|
54
53
|
it "should know if a string is equal to another" do
|
55
|
-
|
56
|
-
|
54
|
+
collator.should be_equal("a", "a")
|
55
|
+
collator.should_not be_equal("a", "b")
|
57
56
|
end
|
58
57
|
|
59
58
|
end
|
@@ -5,17 +5,17 @@ require "spec_helper"
|
|
5
5
|
module ICU
|
6
6
|
describe Transliteration::Transliterator do
|
7
7
|
|
8
|
-
def
|
9
|
-
|
8
|
+
def transliterator_for(*args)
|
9
|
+
Transliteration::Transliterator.new(*args)
|
10
10
|
end
|
11
11
|
|
12
12
|
[
|
13
|
-
|
14
|
-
|
15
|
-
].each do |
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
["Any-Hex", "abcde", "\\u0061\\u0062\\u0063\\u0064\\u0065"],
|
14
|
+
["Lower", "ABC", "abc"]
|
15
|
+
].each do |id, input, output|
|
16
|
+
it "should transliterate #{id}" do
|
17
|
+
tl = transliterator_for(id)
|
18
|
+
tl.transliterate(input).should == output
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
metadata
CHANGED
@@ -1,51 +1,76 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-icu
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Jari Bakken
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2010-08-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: ffi
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
18
|
+
requirements:
|
21
19
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 1.0.9
|
24
22
|
type: :runtime
|
25
|
-
|
26
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.9
|
30
|
+
- !ruby/object:Gem::Dependency
|
27
31
|
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.5.0
|
38
|
+
type: :development
|
28
39
|
prerelease: false
|
29
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
41
|
none: false
|
31
|
-
requirements:
|
42
|
+
requirements:
|
32
43
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
44
|
+
- !ruby/object:Gem::Version
|
34
45
|
version: 2.5.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.2
|
35
54
|
type: :development
|
36
|
-
|
37
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2
|
62
|
+
description: Provides charset detection, locale sensitive collation and more. Depends
|
63
|
+
on libicu.
|
38
64
|
email: jari.bakken@gmail.com
|
39
65
|
executables: []
|
40
|
-
|
41
66
|
extensions: []
|
42
|
-
|
43
|
-
extra_rdoc_files:
|
67
|
+
extra_rdoc_files:
|
44
68
|
- LICENSE
|
45
69
|
- README.md
|
46
|
-
files:
|
70
|
+
files:
|
47
71
|
- .document
|
48
72
|
- .gitignore
|
73
|
+
- .travis.yml
|
49
74
|
- Gemfile
|
50
75
|
- LICENSE
|
51
76
|
- README.md
|
@@ -73,32 +98,30 @@ files:
|
|
73
98
|
- test.c
|
74
99
|
homepage: http://github.com/jarib/ffi-icu
|
75
100
|
licenses: []
|
76
|
-
|
77
101
|
post_install_message:
|
78
|
-
rdoc_options:
|
102
|
+
rdoc_options:
|
79
103
|
- --charset=UTF-8
|
80
|
-
require_paths:
|
104
|
+
require_paths:
|
81
105
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
107
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
88
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
113
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version:
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
94
118
|
requirements: []
|
95
|
-
|
96
119
|
rubyforge_project:
|
97
|
-
rubygems_version: 1.8.
|
120
|
+
rubygems_version: 1.8.21
|
98
121
|
signing_key:
|
99
122
|
specification_version: 3
|
100
123
|
summary: Simple Ruby FFI wrappers for things I need from ICU.
|
101
|
-
test_files:
|
124
|
+
test_files:
|
102
125
|
- spec/break_iterator_spec.rb
|
103
126
|
- spec/chardet_spec.rb
|
104
127
|
- spec/collation_spec.rb
|
@@ -106,3 +129,4 @@ test_files:
|
|
106
129
|
- spec/spec.opts
|
107
130
|
- spec/spec_helper.rb
|
108
131
|
- spec/transliteration_spec.rb
|
132
|
+
has_rdoc:
|