ffi-hunspell 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ before_install:
3
+ - sudo apt-get install libhunspell-dev hunspell-en-us
4
+ - gem install ffi rubygems-tasks rspec yard
5
+ rvm:
6
+ - 1.9.3
7
+ - 2.0.0
8
+ - jruby-19mode
9
+ - rbx-19mode
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: rbx-18mode
13
+ - rvm: rbx-19mode
14
+ script: rake test
@@ -1,3 +1,11 @@
1
+ ### 0.3.0 / 2013-05-01
2
+
3
+ * Detect Ubuntu's hunspell directory (`/usr/share/hunspell`).
4
+ * {FFI::Hunspell::Dictionary#encoding} now returns an `Encoding` object.
5
+ * Encode Strings returned from {FFI::Hunspell::Dictionary#stem} and
6
+ {FFI::Hunspell::Dictionary#suggestions} to match the dictionary's native
7
+ encoding.
8
+
1
9
  ### 0.2.6 / 2013-02-05
2
10
 
3
11
  * Removed the env dependency.
data/README.md CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  * [Source](https://github.com/postmodern/ffi-hunspell)
4
4
  * [Issues](https://github.com/postmodern/ffi-hunspell/issues)
5
- * [Documentation](http://rubydoc.info/gems/ffi-hunspell)
5
+ * [Documentation](http://rubydoc.info/gems/ffi-hunspell/frames)
6
6
  * [Email](postmodern.mod3 at gmail.com)
7
7
 
8
+ [![Build Status](https://secure.travis-ci.org/postmodern/ffi-hunspell.png?branch=master)](https://travis-ci.org/postmodern/ffi-hunspell)
9
+
8
10
  ## Description
9
11
 
10
12
  Ruby FFI bindings for [Hunspell][libhunspell].
@@ -54,15 +56,6 @@ Suggest alternate spellings for a word:
54
56
 
55
57
  $ gem install ffi-hunspell
56
58
 
57
- ## Known Issues
58
-
59
- Some Linux distributions do not install the `libhunspell-1.2.so`
60
- shared library file, but instead installs `libhunspell-1.2.so.0`.
61
- Simply create a symbolic link to the hunspell shared library,
62
- so that {FFI::Hunspell} can find the library:
63
-
64
- # ln -s /usr/lib/libhunspell-1.2.so.0 /usr/lib/libhunspell-1.2.so
65
-
66
59
  ## License
67
60
 
68
61
  Copyright (c) 2010-2013 Hal Brodigan
@@ -2,126 +2,59 @@
2
2
 
3
3
  require 'yaml'
4
4
 
5
- Gem::Specification.new do |gemspec|
6
- files = if File.directory?('.git')
7
- `git ls-files`.split($/)
8
- elsif File.directory?('.hg')
9
- `hg manifest`.split($/)
10
- elsif File.directory?('.svn')
11
- `svn ls -R`.split($/).select { |path| File.file?(path) }
12
- else
13
- Dir['{**/}{.*,*}'].select { |path| File.file?(path) }
14
- end
5
+ Gem::Specification.new do |gem|
6
+ gemspec = YAML.load_file('gemspec.yml')
15
7
 
16
- filter_files = lambda { |paths|
17
- case paths
18
- when Array
19
- (files & paths)
20
- when String
21
- (files & Dir[paths])
22
- end
23
- }
24
-
25
- version = {
26
- :file => 'lib/ffi/hunspell/version.rb',
27
- :constant => 'FFI::Hunspell::VERSION'
28
- }
29
-
30
- defaults = {
31
- 'name' => File.basename(File.dirname(__FILE__)),
32
- 'files' => files,
33
- 'executables' => filter_files['bin/*'].map { |path| File.basename(path) },
34
- 'test_files' => filter_files['{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'],
35
- 'extra_doc_files' => filter_files['*.{txt,rdoc,md,markdown,tt,textile}'],
36
- }
37
-
38
- metadata = defaults.merge(YAML.load_file('gemspec.yml'))
39
-
40
- gemspec.name = metadata.fetch('name',defaults[:name])
41
- gemspec.version = if metadata['version']
42
- metadata['version']
43
- elsif File.file?(version[:file])
44
- require File.join('.',version[:file])
45
- eval(version[:constant])
46
- end
47
-
48
- gemspec.summary = metadata.fetch('summary',metadata['description'])
49
- gemspec.description = metadata.fetch('description',metadata['summary'])
50
-
51
- case metadata['license']
52
- when Array
53
- gemspec.licenses = metadata['license']
54
- when String
55
- gemspec.license = metadata['license']
56
- end
57
-
58
- case metadata['authors']
59
- when Array
60
- gemspec.authors = metadata['authors']
61
- when String
62
- gemspec.author = metadata['authors']
63
- end
8
+ gem.name = gemspec.fetch('name')
9
+ gem.version = gemspec.fetch('version') do
10
+ lib_dir = File.join(File.dirname(__FILE__),'lib')
11
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
64
12
 
65
- gemspec.email = metadata['email']
66
- gemspec.homepage = metadata['homepage']
13
+ require 'ffi/hunspell/version'
14
+ FFI::Hunspell::VERSION
15
+ end
67
16
 
68
- case metadata['require_paths']
69
- when Array
70
- gemspec.require_paths = metadata['require_paths']
71
- when String
72
- gemspec.require_path = metadata['require_paths']
73
- end
17
+ gem.summary = gemspec['summary']
18
+ gem.description = gemspec['description']
19
+ gem.licenses = Array(gemspec['license'])
20
+ gem.authors = Array(gemspec['authors'])
21
+ gem.email = gemspec['email']
22
+ gem.homepage = gemspec['homepage']
74
23
 
75
- gemspec.files = filter_files[metadata['files']]
24
+ glob = lambda { |patterns| gem.files & Dir[*patterns] }
76
25
 
77
- gemspec.executables = metadata['executables']
78
- gemspec.extensions = metadata['extensions']
26
+ gem.files = `git ls-files`.split($/)
27
+ gem.files = glob[gemspec['files']] if gemspec['files']
79
28
 
80
- if Gem::VERSION < '1.7.'
81
- gemspec.default_executable = gemspec.executables.first
29
+ gem.executables = gemspec.fetch('executables') do
30
+ glob['bin/*'].map { |path| File.basename(path) }
82
31
  end
32
+ gem.default_executable = gem.executables.first if Gem::VERSION < '1.7.'
83
33
 
84
- gemspec.test_files = filter_files[metadata['test_files']]
85
-
86
- unless gemspec.files.include?('.document')
87
- gemspec.extra_rdoc_files = metadata['extra_doc_files']
88
- end
89
-
90
- gemspec.post_install_message = metadata['post_install_message']
91
- gemspec.requirements = metadata['requirements']
92
-
93
- if gemspec.respond_to?(:required_ruby_version=)
94
- gemspec.required_ruby_version = metadata['required_ruby_version']
95
- end
34
+ gem.extensions = glob[gemspec['extensions'] || 'ext/**/extconf.rb']
35
+ gem.test_files = glob[gemspec['test_files'] || '{test/{**/}*_test.rb']
36
+ gem.extra_rdoc_files = glob[gemspec['extra_doc_files'] || '*.{txt,md}']
96
37
 
97
- if gemspec.respond_to?(:required_rubygems_version=)
98
- gemspec.required_rubygems_version = metadata['required_ruby_version']
99
- end
38
+ gem.require_paths = Array(gemspec.fetch('require_paths') {
39
+ %w[ext lib].select { |dir| File.directory?(dir) }
40
+ })
100
41
 
101
- parse_versions = lambda { |versions|
102
- case versions
103
- when Array
104
- versions.map { |v| v.to_s }
105
- when String
106
- versions.split(/,\s*/)
107
- end
108
- }
42
+ gem.requirements = gemspec['requirements']
43
+ gem.required_ruby_version = gemspec['required_ruby_version']
44
+ gem.required_rubygems_version = gemspec['required_rubygems_version']
45
+ gem.post_install_message = gemspec['post_install_message']
109
46
 
110
- if metadata['dependencies']
111
- metadata['dependencies'].each do |name,versions|
112
- gemspec.add_dependency(name,parse_versions[versions])
113
- end
114
- end
47
+ split = lambda { |string| string.split(/,\s*/) }
115
48
 
116
- if metadata['runtime_dependencies']
117
- metadata['runtime_dependencies'].each do |name,versions|
118
- gemspec.add_runtime_dependency(name,parse_versions[versions])
49
+ if gemspec['dependencies']
50
+ gemspec['dependencies'].each do |name,versions|
51
+ gem.add_dependency(name,split[versions])
119
52
  end
120
53
  end
121
54
 
122
- if metadata['development_dependencies']
123
- metadata['development_dependencies'].each do |name,versions|
124
- gemspec.add_development_dependency(name,parse_versions[versions])
55
+ if gemspec['development_dependencies']
56
+ gemspec['development_dependencies'].each do |name,versions|
57
+ gem.add_development_dependency(name,split[versions])
125
58
  end
126
59
  end
127
60
  end
@@ -1,15 +1,17 @@
1
1
  name: ffi-hunspell
2
- version: 0.2.6
2
+ version: 0.3.0
3
3
  summary: FFI bindings for Hunspell
4
- description: Ruby FFI bindings for Hunspell spell checker.
4
+ description: Ruby FFI bindings for the Hunspell spell checker.
5
5
  license: MIT
6
6
  authors: Postmodern
7
7
  email: postmodern.mod3@gmail.com
8
- homepage: https://github.com/postmodern/ffi-hunspell
8
+ homepage: https://github.com/postmodern/ffi-hunspell#readme
9
9
  has_yard: true
10
10
 
11
11
  requirements: libhunspell >= 1.2.0
12
12
 
13
+ required_ruby_version: ">= 1.9.1"
14
+
13
15
  dependencies:
14
16
  ffi: ~> 1.0
15
17
 
@@ -37,10 +37,8 @@ module FFI
37
37
  raise("invalid dic path #{dic_path.inspect}")
38
38
  end
39
39
 
40
- @ptr = if key
41
- Hunspell.Hunspell_create_key(affix_path,dic_path,key)
42
- else
43
- Hunspell.Hunspell_create(affix_path,dic_path)
40
+ @ptr = if key then Hunspell.Hunspell_create_key(affix_path,dic_path,key)
41
+ else Hunspell.Hunspell_create(affix_path,dic_path)
44
42
  end
45
43
  end
46
44
 
@@ -59,7 +57,7 @@ module FFI
59
57
  # @return [Dictionary]
60
58
  # If no block is given, the open dictionary will be returned.
61
59
  #
62
- # @raise [RuntimeError]
60
+ # @raise [ArgumentError]
63
61
  # The dictionary files could not be found in any of the directories.
64
62
  #
65
63
  def self.open(name)
@@ -67,7 +65,7 @@ module FFI
67
65
 
68
66
  Hunspell.directories.each do |dir|
69
67
  affix_path = File.join(dir,"#{name}.#{AFF_EXT}")
70
- dic_path = File.join(dir,"#{name}.#{DIC_EXT}")
68
+ dic_path = File.join(dir,"#{name}.#{DIC_EXT}")
71
69
 
72
70
  if (File.file?(affix_path) && File.file?(dic_path))
73
71
  dict = self.new(affix_path,dic_path)
@@ -83,7 +81,7 @@ module FFI
83
81
  end
84
82
  end
85
83
 
86
- raise("unable to find the dictionary #{name.dump} in any of the directories")
84
+ raise(ArgumentError,"unable to find the dictionary #{name.dump} in any of the directories")
87
85
  end
88
86
 
89
87
  #
@@ -99,11 +97,13 @@ module FFI
99
97
  #
100
98
  # The encoding of the dictionary file.
101
99
  #
102
- # @return [String]
100
+ # @return [Encoding]
103
101
  # The encoding of the dictionary file.
104
102
  #
105
103
  def encoding
106
- Hunspell.Hunspell_get_dic_encoding(self)
104
+ @encoding ||= Encoding.const_get(
105
+ Hunspell.Hunspell_get_dic_encoding(self).gsub('-','_')
106
+ )
107
107
  end
108
108
 
109
109
  #
@@ -163,14 +163,14 @@ module FFI
163
163
 
164
164
  FFI::MemoryPointer.new(:pointer) do |output|
165
165
  count = Hunspell.Hunspell_stem(self,output,word.to_s)
166
- ptr = output.get_pointer(0)
166
+ ptr = output.get_pointer(0)
167
167
 
168
168
  if count > 0
169
169
  stems = ptr.get_array_of_string(0,count)
170
170
  end
171
171
  end
172
172
 
173
- return stems
173
+ return stems.map { |word| force_encoding(word) }
174
174
  end
175
175
 
176
176
  #
@@ -187,14 +187,14 @@ module FFI
187
187
 
188
188
  FFI::MemoryPointer.new(:pointer) do |output|
189
189
  count = Hunspell.Hunspell_suggest(self,output,word.to_s)
190
- ptr = output.get_pointer(0)
190
+ ptr = output.get_pointer(0)
191
191
 
192
192
  if count > 0
193
193
  suggestions = ptr.get_array_of_string(0,count)
194
194
  end
195
195
  end
196
196
 
197
- return suggestions
197
+ return suggestions.map { |word| force_encoding(word) }
198
198
  end
199
199
 
200
200
  #
@@ -219,6 +219,21 @@ module FFI
219
219
  @ptr
220
220
  end
221
221
 
222
+ protected
223
+
224
+ #
225
+ # Encodes a String into the dictionary's encoding.
226
+ #
227
+ # @param [String] string
228
+ # The unencoded String.
229
+ #
230
+ # @return [String]
231
+ # The encoded String.
232
+ #
233
+ def force_encoding(string)
234
+ string.force_encoding(encoding)
235
+ end
236
+
222
237
  end
223
238
  end
224
239
  end
@@ -68,6 +68,8 @@ module FFI
68
68
  # Debian
69
69
  '/usr/local/share/myspell/dicts',
70
70
  '/usr/share/myspell/dicts',
71
+ # Ubuntu
72
+ '/usr/share/hunspell',
71
73
  # Fedora
72
74
  '/usr/local/share/myspell',
73
75
  '/usr/share/myspell',
@@ -35,6 +35,14 @@ describe Hunspell::Dictionary do
35
35
 
36
36
  dict.should be_closed
37
37
  end
38
+
39
+ context "when given an unknown dictionary name" do
40
+ it "should raise an ArgumentError" do
41
+ lambda {
42
+ subject.open('foo')
43
+ }.should raise_error(ArgumentError)
44
+ end
45
+ end
38
46
  end
39
47
 
40
48
  subject { described_class.new(affix_path,dic_path) }
@@ -42,7 +50,7 @@ describe Hunspell::Dictionary do
42
50
  after(:all) { subject.close }
43
51
 
44
52
  it "should provide the encoding of the dictionary files" do
45
- subject.encoding.should_not be_empty
53
+ subject.encoding.should == Encoding::ISO_8859_1
46
54
  end
47
55
 
48
56
  it "should check if a word is valid" do
@@ -55,6 +63,12 @@ describe Hunspell::Dictionary do
55
63
  subject.stem('fishing').should == %w[fishing fish]
56
64
  end
57
65
 
66
+ it "should force_encode all strings" do
67
+ subject.suggest('fishing').all? { |string|
68
+ string.encoding == subject.encoding
69
+ }.should be_true
70
+ end
71
+
58
72
  context "when there are no stems" do
59
73
  it "should return []" do
60
74
  subject.stem("zzzzzzz").should == []
@@ -64,13 +78,19 @@ describe Hunspell::Dictionary do
64
78
 
65
79
  describe "#suggest" do
66
80
  it "should suggest alternate spellings for words" do
67
- subject.suggest('arbitrage').should == %w[
68
- arbitrage
69
- arbitrages
70
- arbitrager
71
- arbitraged
72
- arbitrate
73
- ]
81
+ subject.suggest('arbitrage').should include(*[
82
+ 'arbitrage',
83
+ 'arbitrages',
84
+ 'arbitrager',
85
+ 'arbitraged',
86
+ 'arbitrate'
87
+ ])
88
+ end
89
+
90
+ it "should force_encode all strings" do
91
+ subject.suggest('arbitrage').all? { |string|
92
+ string.encoding == subject.encoding
93
+ }.should be_true
74
94
  end
75
95
 
76
96
  context "when there are no suggestions" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-hunspell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-05 00:00:00.000000000 Z
12
+ date: 2013-05-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -75,7 +75,7 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0.7'
78
- description: Ruby FFI bindings for Hunspell spell checker.
78
+ description: Ruby FFI bindings for the Hunspell spell checker.
79
79
  email: postmodern.mod3@gmail.com
80
80
  executables: []
81
81
  extensions: []
@@ -87,6 +87,7 @@ files:
87
87
  - .gemtest
88
88
  - .gitignore
89
89
  - .rspec
90
+ - .travis.yml
90
91
  - .yardopts
91
92
  - ChangeLog.md
92
93
  - LICENSE.txt
@@ -100,7 +101,7 @@ files:
100
101
  - spec/dictionary_spec.rb
101
102
  - spec/hunspell_spec.rb
102
103
  - spec/spec_helper.rb
103
- homepage: https://github.com/postmodern/ffi-hunspell
104
+ homepage: https://github.com/postmodern/ffi-hunspell#readme
104
105
  licenses:
105
106
  - MIT
106
107
  post_install_message:
@@ -112,7 +113,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
113
  requirements:
113
114
  - - ! '>='
114
115
  - !ruby/object:Gem::Version
115
- version: '0'
116
+ version: 1.9.1
116
117
  required_rubygems_version: !ruby/object:Gem::Requirement
117
118
  none: false
118
119
  requirements:
@@ -122,10 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
123
  requirements:
123
124
  - libhunspell >= 1.2.0
124
125
  rubyforge_project:
125
- rubygems_version: 1.8.24
126
+ rubygems_version: 1.8.25
126
127
  signing_key:
127
128
  specification_version: 3
128
129
  summary: FFI bindings for Hunspell
129
- test_files:
130
- - spec/dictionary_spec.rb
131
- - spec/hunspell_spec.rb
130
+ test_files: []