ffi-hunspell 0.1.0 → 0.2.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/.gemtest +0 -0
- data/ChangeLog.md +8 -0
- data/LICENSE.txt +0 -3
- data/README.md +20 -6
- data/Rakefile +2 -1
- data/ffi-hunspell.gemspec +1 -1
- data/gemspec.yml +3 -3
- data/lib/ffi/hunspell/dictionary.rb +44 -10
- data/lib/ffi/hunspell/hunspell.rb +58 -4
- data/spec/dictionary_spec.rb +11 -12
- data/spec/hunspell_spec.rb +25 -0
- data/spec/spec_helper.rb +9 -1
- metadata +11 -8
data/.gemtest
ADDED
File without changes
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 0.2.0 / 2011-01-22
|
2
|
+
|
3
|
+
* Added {FFI::Hunspell.lang}.
|
4
|
+
* Added {FFI::Hunspell.lang=}.
|
5
|
+
* Added {FFI::Hunspell.directories}.
|
6
|
+
* Have {FFI::Hunspell::Dictionary.open} accept a language name, and search
|
7
|
+
{FFI::Hunspell.directories} for the dictionary files.
|
8
|
+
|
1
9
|
### 0.1.0 / 2010-10-05
|
2
10
|
|
3
11
|
* Initial release.
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# ffi-hunspell
|
2
2
|
|
3
|
-
* [
|
4
|
-
* [
|
3
|
+
* [Source](http://github.com/postmodern/ffi-hunspell)
|
4
|
+
* [Issues](http://github.com/postmodern/ffi-hunspell/issues)
|
5
|
+
* [Documentation](http://rubydoc.info/gems/ffi-hunspell)
|
5
6
|
* Postmodern (postmodern.mod3 at gmail.com)
|
6
7
|
|
7
8
|
## Description
|
@@ -14,14 +15,18 @@ Open a dictionary:
|
|
14
15
|
|
15
16
|
require 'ffi/hunspell'
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
FFI::Hunspell.dict do |dict|
|
19
|
+
# ...
|
20
|
+
end
|
20
21
|
|
21
|
-
FFI::Hunspell.dict('
|
22
|
+
FFI::Hunspell.dict('en_GB') do |dict|
|
22
23
|
# ...
|
23
24
|
end
|
24
25
|
|
26
|
+
dict = FFI::Hunspell.dict('en_GB')
|
27
|
+
# ...
|
28
|
+
dict.close
|
29
|
+
|
25
30
|
Check if a word is valid:
|
26
31
|
|
27
32
|
dict.check?('dog')
|
@@ -49,6 +54,15 @@ Suggest alternate spellings for a word:
|
|
49
54
|
|
50
55
|
$ sudo gem install ffi-hunspell
|
51
56
|
|
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
|
+
|
52
66
|
## License
|
53
67
|
|
54
68
|
See {file:LICENSE.txt} for license information.
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
|
4
4
|
begin
|
5
|
-
gem 'ore-tasks', '~> 0.
|
5
|
+
gem 'ore-tasks', '~> 0.2.0'
|
6
6
|
require 'ore/tasks'
|
7
7
|
|
8
8
|
Ore::Tasks.new
|
@@ -21,6 +21,7 @@ rescue LoadError => e
|
|
21
21
|
abort "Please run `gem install rspec` to install RSpec."
|
22
22
|
end
|
23
23
|
end
|
24
|
+
task :test => :spec
|
24
25
|
task :default => :spec
|
25
26
|
|
26
27
|
begin
|
data/ffi-hunspell.gemspec
CHANGED
data/gemspec.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
name: ffi-hunspell
|
2
|
-
version: 0.
|
2
|
+
version: 0.2.0
|
3
3
|
summary: FFI bindings for Hunspell
|
4
4
|
description: Ruby FFI bindings for Hunspell spell checker.
|
5
5
|
license: MIT
|
@@ -14,6 +14,6 @@ dependencies:
|
|
14
14
|
ffi: ~> 0.6.0
|
15
15
|
|
16
16
|
development_dependencies:
|
17
|
-
ore: ~> 0.2.0
|
18
|
-
|
17
|
+
ore-tasks: ~> 0.2.0
|
18
|
+
rspec: ~> 2.0.0
|
19
19
|
yard: ~> 0.6.0
|
@@ -2,8 +2,17 @@ require 'ffi/hunspell/hunspell'
|
|
2
2
|
|
3
3
|
module FFI
|
4
4
|
module Hunspell
|
5
|
+
#
|
6
|
+
# Represents a dictionary for a specific language.
|
7
|
+
#
|
5
8
|
class Dictionary
|
6
9
|
|
10
|
+
# The affix file extension
|
11
|
+
AFF_EXT = 'aff'
|
12
|
+
|
13
|
+
# The dictionary file extension
|
14
|
+
DIC_EXT = 'dic'
|
15
|
+
|
7
16
|
#
|
8
17
|
# Creates a new dictionary.
|
9
18
|
#
|
@@ -16,7 +25,18 @@ module FFI
|
|
16
25
|
# @param [String] key
|
17
26
|
# The optional key for encrypted dictionary files.
|
18
27
|
#
|
28
|
+
# @raise [RuntimeError]
|
29
|
+
# Either the affix or dic files did not exist.
|
30
|
+
#
|
19
31
|
def initialize(affix_path,dic_path,key=nil)
|
32
|
+
unless File.file?(affix_path)
|
33
|
+
raise("invalid affix path #{affix_path.inspect}")
|
34
|
+
end
|
35
|
+
|
36
|
+
unless File.file?(dic_path)
|
37
|
+
raise("invalid dic path #{dic_path.inspect}")
|
38
|
+
end
|
39
|
+
|
20
40
|
@ptr = if key
|
21
41
|
Hunspell.Hunspell_create_key(affix_path,dic_path,key)
|
22
42
|
else
|
@@ -27,8 +47,8 @@ module FFI
|
|
27
47
|
#
|
28
48
|
# Opens a Hunspell dictionary.
|
29
49
|
#
|
30
|
-
# @param [String]
|
31
|
-
# The
|
50
|
+
# @param [Symbol, String] name
|
51
|
+
# The name of the dictionary to open.
|
32
52
|
#
|
33
53
|
# @yield [dict]
|
34
54
|
# The given block will be passed the Hunspell dictionary.
|
@@ -39,17 +59,31 @@ module FFI
|
|
39
59
|
# @return [Dictionary]
|
40
60
|
# If no block is given, the open dictionary will be returned.
|
41
61
|
#
|
42
|
-
|
43
|
-
|
62
|
+
# @raise [RuntimeError]
|
63
|
+
# The dictionary files could not be found in any of the directories.
|
64
|
+
#
|
65
|
+
def self.open(name)
|
66
|
+
name = name.to_s
|
67
|
+
|
68
|
+
Hunspell.directories.each do |dir|
|
69
|
+
affix_path = File.join(dir,"#{name}.#{AFF_EXT}")
|
70
|
+
dic_path = File.join(dir,"#{name}.#{DIC_EXT}")
|
44
71
|
|
45
|
-
|
46
|
-
|
72
|
+
if (File.file?(affix_path) && File.file?(dic_path))
|
73
|
+
dict = self.new(affix_path,dic_path)
|
47
74
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
75
|
+
if block_given?
|
76
|
+
yield dict
|
77
|
+
|
78
|
+
dict.close
|
79
|
+
return nil
|
80
|
+
else
|
81
|
+
return dict
|
82
|
+
end
|
83
|
+
end
|
52
84
|
end
|
85
|
+
|
86
|
+
raise("unable to find the dictionary #{name.dump} in any of the directories")
|
53
87
|
end
|
54
88
|
|
55
89
|
#
|
@@ -27,11 +27,65 @@ module FFI
|
|
27
27
|
# attach_function :Hunspell_generate2, [:pointer, :pointer, :string, :pointer, :int], :int
|
28
28
|
#
|
29
29
|
|
30
|
+
# The language to default to, if no 'LANG' env variable was set.
|
31
|
+
DEFAULT_LANG = 'en_US'
|
32
|
+
|
33
|
+
#
|
34
|
+
# The default language.
|
35
|
+
#
|
36
|
+
# @return [String]
|
37
|
+
# The name of the default language.
|
38
|
+
#
|
39
|
+
# @since 0.2.0
|
40
|
+
#
|
41
|
+
def Hunspell.lang
|
42
|
+
@lang ||= if ENV['LANG']
|
43
|
+
ENV['LANG'].split('.',2).first
|
44
|
+
else
|
45
|
+
DEFAULT_LANG
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Sets the default language.
|
51
|
+
#
|
52
|
+
# @param [String] name
|
53
|
+
# The new language name.
|
54
|
+
#
|
55
|
+
# @return [String]
|
56
|
+
# The name of the new default language.
|
57
|
+
#
|
58
|
+
# @since 0.2.0
|
59
|
+
#
|
60
|
+
def Hunspell.lang=(new_lang)
|
61
|
+
@lang = new_lang.to_s
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# The directories to search for dictionary files.
|
66
|
+
#
|
67
|
+
# @return [Array]
|
68
|
+
# The directory paths.
|
69
|
+
#
|
70
|
+
# @since 0.2.0
|
71
|
+
#
|
72
|
+
def Hunspell.directories
|
73
|
+
@directories ||= [
|
74
|
+
'/usr/local/share/myspell',
|
75
|
+
'/usr/share/myspell'
|
76
|
+
]
|
77
|
+
end
|
78
|
+
|
79
|
+
# prepend the ~/.hunspell_default directory to DIRS
|
80
|
+
if (home = (ENV['HOME'] || ENV['HOMEPATH']))
|
81
|
+
directories.unshift(File.join(home,'.hunspell_default'))
|
82
|
+
end
|
83
|
+
|
30
84
|
#
|
31
85
|
# Opens a Hunspell dictionary.
|
32
86
|
#
|
33
|
-
# @param [String]
|
34
|
-
# The
|
87
|
+
# @param [Symbol, String] name
|
88
|
+
# The name of the dictionary to open.
|
35
89
|
#
|
36
90
|
# @yield [dict]
|
37
91
|
# The given block will be passed the Hunspell dictionary.
|
@@ -41,8 +95,8 @@ module FFI
|
|
41
95
|
#
|
42
96
|
# @return [nil]
|
43
97
|
#
|
44
|
-
def Hunspell.dict(
|
45
|
-
Dictionary.open(
|
98
|
+
def Hunspell.dict(name=Hunspell.lang,&block)
|
99
|
+
Dictionary.open(name,&block)
|
46
100
|
end
|
47
101
|
end
|
48
102
|
end
|
data/spec/dictionary_spec.rb
CHANGED
@@ -4,53 +4,52 @@ require 'ffi/hunspell/dictionary'
|
|
4
4
|
describe Hunspell::Dictionary do
|
5
5
|
subject { Hunspell::Dictionary }
|
6
6
|
|
7
|
-
let(:
|
8
|
-
let(:path) { File.join(root,'en_US') }
|
7
|
+
let(:lang) { 'en_US' }
|
9
8
|
|
10
|
-
let(:
|
11
|
-
let(:dic_path) { "#{
|
9
|
+
let(:affix_path) { File.join(Hunspell.directories.last,"#{lang}.aff") }
|
10
|
+
let(:dic_path) { File.join(Hunspell.directories.last,"#{lang}.dic") }
|
12
11
|
|
13
|
-
it "should open a dictionary file
|
14
|
-
subject.open(
|
12
|
+
it "should find and open a dictionary file for a given language" do
|
13
|
+
subject.open(lang) do |dict|
|
15
14
|
dict.should_not be_nil
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
18
|
it "should create a dictionary from '.aff' and '.dic' files" do
|
20
|
-
dict = subject.new(
|
19
|
+
dict = subject.new(affix_path,dic_path)
|
21
20
|
dict.should_not be_nil
|
22
21
|
|
23
22
|
dict.close
|
24
23
|
end
|
25
24
|
|
26
25
|
it "should close the dictionary" do
|
27
|
-
dict = subject.open(
|
26
|
+
dict = subject.open(lang)
|
28
27
|
dict.close
|
29
28
|
|
30
29
|
dict.should be_closed
|
31
30
|
end
|
32
31
|
|
33
32
|
it "should provide the encoding of the dictionary files" do
|
34
|
-
subject.open(
|
33
|
+
subject.open(lang) do |dict|
|
35
34
|
dict.encoding.should_not be_empty
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
it "should check if a word is valid" do
|
40
|
-
subject.open(
|
39
|
+
subject.open(lang) do |dict|
|
41
40
|
dict.should be_valid('dog')
|
42
41
|
dict.should_not be_valid('dxg')
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
45
|
it "should find the stems of a word" do
|
47
|
-
subject.open(
|
46
|
+
subject.open(lang) do |dict|
|
48
47
|
dict.stem('fishing').should == %w[fishing fish]
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
51
|
it "should suggest alternate spellings for words" do
|
53
|
-
subject.open(
|
52
|
+
subject.open(lang) do |dict|
|
54
53
|
dict.suggest('arbitrage').should == %w[
|
55
54
|
arbitrage
|
56
55
|
arbitrages
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ffi/hunspell/hunspell'
|
3
|
+
|
4
|
+
describe Hunspell do
|
5
|
+
it "should have a default language" do
|
6
|
+
subject.lang.should_not be_nil
|
7
|
+
subject.lang.should_not be_empty
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have directories to search within" do
|
11
|
+
subject.directories.should_not be_empty
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should open a dictionary file" do
|
15
|
+
subject.dict('en_US') do |dict|
|
16
|
+
dict.should_not be_nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should open the dictionary file for the default language" do
|
21
|
+
subject.dict do |dict|
|
22
|
+
dict.should_not be_nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Postmodern
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-22 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name: ore
|
36
|
+
name: ore-tasks
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
@@ -48,7 +48,7 @@ dependencies:
|
|
48
48
|
type: :development
|
49
49
|
version_requirements: *id002
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
51
|
+
name: rspec
|
52
52
|
prerelease: false
|
53
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
54
|
none: false
|
@@ -56,10 +56,10 @@ dependencies:
|
|
56
56
|
- - ~>
|
57
57
|
- !ruby/object:Gem::Version
|
58
58
|
segments:
|
59
|
-
- 0
|
60
|
-
- 1
|
61
59
|
- 2
|
62
|
-
|
60
|
+
- 0
|
61
|
+
- 0
|
62
|
+
version: 2.0.0
|
63
63
|
type: :development
|
64
64
|
version_requirements: *id003
|
65
65
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +86,7 @@ extensions: []
|
|
86
86
|
extra_rdoc_files:
|
87
87
|
- README.md
|
88
88
|
files:
|
89
|
+
- .gemtest
|
89
90
|
- .rspec
|
90
91
|
- .yardopts
|
91
92
|
- ChangeLog.md
|
@@ -98,6 +99,7 @@ files:
|
|
98
99
|
- lib/ffi/hunspell/dictionary.rb
|
99
100
|
- lib/ffi/hunspell/hunspell.rb
|
100
101
|
- spec/dictionary_spec.rb
|
102
|
+
- spec/hunspell_spec.rb
|
101
103
|
- spec/spec_helper.rb
|
102
104
|
has_rdoc: yard
|
103
105
|
homepage: http://github.com/postmodern/ffi-hunspell
|
@@ -133,3 +135,4 @@ specification_version: 3
|
|
133
135
|
summary: FFI bindings for Hunspell
|
134
136
|
test_files:
|
135
137
|
- spec/dictionary_spec.rb
|
138
|
+
- spec/hunspell_spec.rb
|