ffi-aspell 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gems ADDED
@@ -0,0 +1,5 @@
1
+ ffi
2
+ rake
3
+ redcarpet
4
+ yard
5
+ bacon
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg/*.gem
2
+ doc
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use --create 1.9.3@ffi-aspell
data/.yardopts ADDED
@@ -0,0 +1,9 @@
1
+ ./lib/ffi/**/*.rb
2
+ -m markdown
3
+ -M redcarpet
4
+ -o ./doc
5
+ -r ./README.md
6
+ --private
7
+ --protected
8
+ -
9
+ LICENSE
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012, Yorick Peterse
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # FFI::Aspell
2
+
3
+ FFI::Aspell is an FFI binding for the Aspell library. It was mainly written as
4
+ [Raspell][raspell], a C binding for Aspell, is buggy and no longer maintained by
5
+ the main author as of April 2012.
6
+
7
+ ## Requirements
8
+
9
+ * FFI: `gem install ffi`
10
+ * Aspell (`sudo pacman -S aspell` if you're on Arch Linux)
11
+
12
+ ## Usage
13
+
14
+ Install the gem:
15
+
16
+ $ gem install ffi-aspell
17
+
18
+ Load it:
19
+
20
+ require 'ffi/aspell'
21
+
22
+ The primary class is `FFI::Aspell::Speller`, this class can be used to check for
23
+ spelling errors and the like:
24
+
25
+ speller = FFI::Aspell::Speller.new('en_US')
26
+
27
+ if speller.correct?('cookie')
28
+ puts 'The word "cookie" is correct'
29
+ else
30
+ puts 'The word "cookie" is incorrect'
31
+ end
32
+
33
+ For more information see the YARD documentation.
34
+
35
+ ## Hacking & Contributing
36
+
37
+ 1. Make sure that Aspell and the English and Dutch dictionaries for it are
38
+ installed as well. On Arch Linux this can be done by running `sudo pacman -S
39
+ aspell aspell-en aspell-nl`.
40
+ 2. Import the gems using RVM: `rvm gemset import .gems`.
41
+ 3. Run the tests to see if everything is working: `rake test`
42
+ 4. Hack away!
43
+
44
+ ## Coding Standards
45
+
46
+ * FFI functions go in FFI::Aspell
47
+ * Attached function names should resemble the C function names as much as
48
+ possible.
49
+ * No more than 80 characters per line of code.
50
+ * Document your code, pull requests with big changes but without documentation
51
+ will be rejected.
52
+ * Git commits should be signed off, this can be done by running `git commit
53
+ --sign`. Commits that are not signed off will be rejected.
54
+ * Follow the Git commit standards are described here:
55
+ <http://ramaze.net/documentation/file.contributing.html#Commit_Messages>.
56
+ * Test your code! Pull requests without tests will not be accepted.
57
+
58
+ ## License
59
+
60
+ The code in this repository is licensed under the MIT license. A copy of this
61
+ license can be found in the file "LICENSE" in the root directory of this
62
+ repository.
63
+
64
+ [raspell]: https://github.com/evan/raspell
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ Dir['./task/*.rake'].each { |task| import(task) }
2
+
3
+ task :default => :test
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../lib/ffi/aspell/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'ffi-aspell'
5
+ s.version = FFI::Aspell::VERSION
6
+ s.date = '2012-04-26'
7
+ s.authors = ['Yorick Peterse']
8
+ s.email = 'yorickpeterse@gmail.com'
9
+ s.summary = 'FFI bindings for Aspell'
10
+ s.homepage = 'https://github.com/YorickPeterse/ffi-aspell'
11
+ s.description = s.summary
12
+ s.files = `git ls-files`.split("\n")
13
+ s.has_rdoc = 'yard'
14
+
15
+ s.add_dependency('ffi', ['>= 1.0.11'])
16
+
17
+ s.add_development_dependency('rake', ['>= 0.9.2.2'])
18
+ s.add_development_dependency('yard',['>= 0.7.5'])
19
+ s.add_development_dependency('redcarpet', ['>= 2.1.1'])
20
+ s.add_development_dependency('bacon', ['>= 1.1.0'])
21
+ end
@@ -4,9 +4,90 @@ module FFI
4
4
  # The Speller class is used for spell checking individual words as well as
5
5
  # generating a list of suggestions.
6
6
  #
7
+ # ## Usage
8
+ #
9
+ # First you'll have to create a new instance:
10
+ #
11
+ # speller = FFI::Aspell::Speller.new
12
+ #
13
+ # When creating a new instance you can specify the language as well as a set
14
+ # of arbitrary Aspell options (e.g. the personal wordlist file). The
15
+ # language can be set in the first parameter, other options are set as a
16
+ # hash in the second parameter:
17
+ #
18
+ # speller = FFI::Aspell::Speller.new('nl', :personal => 'aspell.nl.pws')
19
+ #
20
+ # Unlike Raspell the keys of the hash used for additional options can be
21
+ # both strings and symbols.
22
+ #
23
+ # Once an instance has been created you can change the options, check the
24
+ # spelling of a word or retrieve a list of suggestions.
25
+ #
26
+ # ### Options
27
+ #
28
+ # There are four methods for dealing with Aspell options:
29
+ #
30
+ # * {FFI::Aspell::Speller#set}
31
+ # * {FFI::Aspell::Speller#get}
32
+ # * {FFI::Aspell::Speller#get_default}
33
+ # * {FFI::Aspell::Speller#reset}
34
+ #
35
+ # There are also two extra methods which can be used to set the suggestion
36
+ # mode, both these methods are simply shortcuts and use the `#set()` method
37
+ # for actually setting the values:
38
+ #
39
+ # speller.suggestion_mode = 'fast'
40
+ #
41
+ # if speller.suggestion_mode == 'fast'
42
+ # # ...
43
+ # end
44
+ #
45
+ # Setting an option:
46
+ #
47
+ # speller.set('lang', 'en_US')
48
+ #
49
+ # Retrieving an option:
50
+ #
51
+ # speller.get('lang')
52
+ #
53
+ # Resetting an option:
54
+ #
55
+ # speller.reset('lang')
56
+ #
57
+ # ### Checking a Word
58
+ #
59
+ # Checking the spelling of a word is done using
60
+ # {FFI::Aspell::Speller#correct?}. This method takes a string containing the
61
+ # word to verify and returns `true` if the word is spelled correctly and
62
+ # `false` otherwise:
63
+ #
64
+ # speller.correct?('cookie') # => true
65
+ # speller.correct?('cookei') # => false
66
+ #
67
+ # ### Suggestions
68
+ #
69
+ # Suggestions can be generated using {FFI::Aspell::Speller.suggestions}.
70
+ # This method returns an array containing all the possible suggestions based
71
+ # on the suggestion mode that is being used:
72
+ #
73
+ # speller.suggestions('cookei') # => ["cookie", ...]
74
+ #
75
+ # For more information see the documentation of the individual methods in
76
+ # this class.
77
+ #
7
78
  # @since 13-04-2012
79
+ # @todo Currently this class creates a new speller object every time
80
+ # {FFI::Aspell::Speller#correct?} and similar methods are called. I'm not
81
+ # entirely sure if this is needed, if not it should be modified.
8
82
  #
9
83
  class Speller
84
+ ##
85
+ # Array containing the possible suggestion modes to use.
86
+ #
87
+ # @since 18-04-2012
88
+ #
89
+ SUGGESTION_MODES = ['ultra', 'fast', 'normal', 'bad-spellers']
90
+
10
91
  ##
11
92
  # Creates a new instance of the class, sets the language as well as the
12
93
  # options specified in the `options` hash.
@@ -16,8 +97,12 @@ module FFI
16
97
  # @param [Hash] options A hash containing extra configuration options,
17
98
  # such as the "personal" option to set.
18
99
  #
19
- def initialize(language, options = {})
100
+ def initialize(language = nil, options = {})
101
+ @config = Aspell.config_new
20
102
 
103
+ options['lang'] = language if language
104
+
105
+ options.each { |k, v| set(k, v) }
21
106
  end
22
107
 
23
108
  ##
@@ -28,7 +113,64 @@ module FFI
28
113
  # @return [TrueClass|FalseClass]
29
114
  #
30
115
  def correct?(word)
116
+ unless word.is_a?(String)
117
+ raise(TypeError, "Expected String but got #{word.class} instead")
118
+ end
119
+
120
+ speller = Aspell.speller_new(@config)
121
+ correct = Aspell.speller_check(speller, word.to_s, word.length)
122
+
123
+ Aspell.speller_delete(speller)
31
124
 
125
+ return correct
126
+ end
127
+
128
+ ##
129
+ # Returns an array containing words suggested as an alternative to the
130
+ # specified word.
131
+ #
132
+ # @since 13-04-2012
133
+ # @param [String] word The word for which to generate a suggestion list.
134
+ # @return [Array]
135
+ #
136
+ def suggestions(word)
137
+ unless word.is_a?(String)
138
+ raise(TypeError, "Expected String but got #{word.class} instead")
139
+ end
140
+
141
+ speller = Aspell.speller_new(@config)
142
+ list = Aspell.speller_suggest(speller, word, word.length)
143
+ suggestions = []
144
+ elements = Aspell.word_list_elements(list)
145
+
146
+ while word = Aspell.string_enumeration_next(elements)
147
+ suggestions << word
148
+ end
149
+
150
+ Aspell.string_enumeration_delete(elements)
151
+ Aspell.speller_delete(speller)
152
+
153
+ return suggestions
154
+ end
155
+
156
+ ##
157
+ # Sets the suggestion mode for {FFI::Aspell::Speller#suggestions}.
158
+ #
159
+ # @since 13-04-2012
160
+ # @param [String] mode The suggestion mode to use.
161
+ #
162
+ def suggestion_mode=(mode)
163
+ set('sug-mode', mode)
164
+ end
165
+
166
+ ##
167
+ # Returns the suggestion mode that's currently used.
168
+ #
169
+ # @since 13-04-2012
170
+ # @return [String]
171
+ #
172
+ def suggestion_mode
173
+ return get('sug-mode')
32
174
  end
33
175
 
34
176
  ##
@@ -38,23 +180,92 @@ module FFI
38
180
  # @param [#to_s] key The configuration key to set.
39
181
  # @param [#to_s] value The value of the configuration key.
40
182
  # @raise [FFI::Aspell::ConfigError] Raised when the configuration value
41
- # could not be set.
183
+ # could not be set or when an incorrect suggestion mode was given.
42
184
  #
43
185
  def set(key, value)
186
+ unless key.respond_to?(:to_s)
187
+ raise(TypeError, 'Configuration keys should respond to #to_s()')
188
+ end
189
+
190
+ unless value.respond_to?(:to_s)
191
+ raise(TypeError, 'Configuration values should respond to #to_s()')
192
+ end
193
+
194
+ if key == 'sug-mode' and !SUGGESTION_MODES.include?(value)
195
+ raise(ConfigError, "The suggestion mode #{value} is invalid")
196
+ end
44
197
 
198
+ unless Aspell.config_replace(@config, key.to_s, value.to_s)
199
+ raise(ConfigError, "Failed to set the configuration item #{key}")
200
+ end
45
201
  end
46
202
 
47
203
  ##
48
204
  # Retrieves the value of the specified configuration item.
49
205
  #
50
206
  # @since 13-04-2012
51
- # @param [String] key The configuration key to retrieve.
207
+ # @param [#to_s] key The configuration key to retrieve.
52
208
  # @return [String]
53
209
  # @raise [FFI::Aspell::ConfigError] Raised when the configuration item
54
210
  # does not exist.
55
211
  #
56
212
  def get(key)
213
+ unless key.respond_to?(:to_s)
214
+ raise(TypeError, 'Configuration keys should respond to #to_s()')
215
+ end
216
+
217
+ value = Aspell.config_retrieve(@config, key.to_s)
218
+
219
+ if value
220
+ return value
221
+ else
222
+ raise(ConfigError, "The configuration item #{key} does not exist")
223
+ end
224
+ end
225
+
226
+ ##
227
+ # Retrieves the default value for the given configuration key.
228
+ #
229
+ # @since 13-04-2012
230
+ # @param [#to_s] key The name of the configuration key.
231
+ # @return [String]
232
+ # @raise [FFI::Aspell::ConfigError] Raised when the configuration item
233
+ # does not exist.
234
+ #
235
+ def get_default(key)
236
+ unless key.respond_to?(:to_s)
237
+ raise(TypeError, 'Configuration keys should respond to #to_s()')
238
+ end
239
+
240
+ value = Aspell.config_retrieve_default(@config, key.to_s)
241
+
242
+ if value
243
+ return value
244
+ else
245
+ raise(ConfigError, "The configuration item #{key} does not exist")
246
+ end
247
+ end
248
+
249
+ ##
250
+ # Resets a configuration item to its default value.
251
+ #
252
+ # @since 13-04-2012
253
+ # @param [#to_s] key The name of the configuration item to reset.
254
+ # @raise [FFI::Aspell::ConfigError] Raised when the configuration item
255
+ # could not be reset.
256
+ #
257
+ def reset(key)
258
+ unless key.respond_to?(:to_s)
259
+ raise(TypeError, 'Configuration keys should respond to #to_s()')
260
+ end
57
261
 
262
+ unless Aspell.config_remove(@config, key.to_s)
263
+ raise(
264
+ ConfigError,
265
+ "The configuration item #{key} could not be reset, most likely " \
266
+ "it doesn't exist"
267
+ )
268
+ end
58
269
  end
59
270
  end # Speller
60
271
  end # Aspell
@@ -1,5 +1,5 @@
1
1
  module FFI
2
2
  module Aspell
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end # Aspell
5
5
  end # FFI
data/lib/ffi/aspell.rb CHANGED
@@ -1,13 +1,22 @@
1
1
  require 'ffi'
2
2
 
3
- $:.unshift(File.expand_path('../', __FILE__))
4
-
5
- require 'aspell/error'
6
- require 'aspell/speller'
3
+ require File.expand_path('../aspell/error', __FILE__)
4
+ require File.expand_path('../aspell/speller', __FILE__)
5
+ require File.expand_path('../aspell/version', __FILE__)
7
6
 
8
7
  module FFI
9
8
  ##
10
- # FFI::Aspell is an FFI binding for the Aspell spell checking library.
9
+ # FFI::Aspell is an FFI binding for the Aspell spell checking library. Basic
10
+ # usage is as following:
11
+ #
12
+ # require 'ffi/aspell'
13
+ #
14
+ # speller = FFI::Aspell::Speller.new
15
+ #
16
+ # speller.correct?('cookie') # => true
17
+ # speller.correct?('cookei') # => false
18
+ #
19
+ # For more information see {FFI::Aspell::Speller}.
11
20
  #
12
21
  # @since 13-04-2012
13
22
  #
@@ -15,41 +24,235 @@ module FFI
15
24
  extend FFI::Library
16
25
  ffi_lib 'aspell'
17
26
 
18
- # Configuration functions.
27
+ ##
28
+ # Creates a pointer for a configuration struct.
29
+ #
30
+ # @since 24-04-2012
31
+ # @method config_new
32
+ # @scope class
33
+ # @return [FFI::Pointer]
34
+ #
19
35
  attach_function 'config_new',
20
36
  'new_aspell_config',
21
37
  [],
22
38
  :pointer
23
39
 
40
+ ##
41
+ # Retrieves the value of a given configuration item. The value is returned
42
+ # as a string or nil upon failure.
43
+ #
44
+ # @example
45
+ # config = FFI::Aspell.config_new
46
+ # value = FFI::Aspell.config_retrieve(config, 'lang')
47
+ #
48
+ # puts value # => "en_US"
49
+ #
50
+ # @since 24-04-2012
51
+ # @method config_retrieve(config, key)
52
+ # @scope class
53
+ # @param [FFI::Pointer] config A pointer to a configuration struct.
54
+ # @param [String] key The name of the configuration item to retrieve.
55
+ # @return [String]
56
+ #
24
57
  attach_function 'config_retrieve',
25
58
  'aspell_config_retrieve',
26
59
  [:pointer, :string],
27
60
  :string
28
61
 
29
- attach_function 'config_get_default',
62
+ ##
63
+ # Retrieves the default value of a configuration item.
64
+ #
65
+ # @since 24-04-2012
66
+ # @method config_retrieve_default(config, key)
67
+ # @scope class
68
+ # @see FFI::Aspell.config_retrieve
69
+ #
70
+ attach_function 'config_retrieve_default',
30
71
  'aspell_config_get_default',
31
72
  [:pointer, :string],
32
73
  :string
33
74
 
75
+ ##
76
+ # Sets the new value of the specified configuration item.
77
+ #
78
+ # @example
79
+ # config = FFI::Aspell.config_new
80
+ #
81
+ # FFI::Aspell.config_replace(config, 'lang', 'nl')
82
+ #
83
+ # @since 24-04-2012
84
+ # @method config_replace(config, key, value)
85
+ # @scope class
86
+ # @param [FFI::Pointer] config Pointer to the configuration struct.
87
+ # @param [String] key The name of the configuration item to set.
88
+ # @param [String] value The new value of the configuration item.
89
+ # @return [TrueClass|FalseClass]
90
+ #
34
91
  attach_function 'config_replace',
35
92
  'aspell_config_replace',
36
93
  [:pointer, :string, :string],
37
94
  :bool
38
95
 
96
+ ##
97
+ # Sets the value of the specified configuration item back to its default
98
+ # value.
99
+ #
100
+ # @example
101
+ # config = FFI::Aspell.config_new
102
+ #
103
+ # FFI::Aspell.config_replace(config, 'lang', 'nl')
104
+ # FFI::Aspell.config_remove(config, 'lang')
105
+ #
106
+ # @since 24-04-2012
107
+ # @method config_remove(config, key)
108
+ # @scope class
109
+ # @param [FFI::Pointer] config Pointer to the configuration struct.
110
+ # @param [String] key The name of the configuration item to reset.
111
+ # @return [TrueClass|FalseClass]
112
+ #
39
113
  attach_function 'config_remove',
40
114
  'aspell_config_remove',
41
115
  [:pointer, :string],
42
116
  :bool
43
117
 
44
118
  # Spell checking related functions.
119
+
120
+ ##
121
+ # Creates a pointer to a speller struct.
122
+ #
123
+ # @example
124
+ # config = FFI::Aspell.config_new
125
+ # speller = FFI::Aspell.speller_new(config)
126
+ #
127
+ # @since 24-04-2012
128
+ # @method speller_new(config)
129
+ # @scope class
130
+ # @param [FFI::Pointer] config The configuration struct to use for the
131
+ # speller.
132
+ # @return [FFI::Pointer]
133
+ #
45
134
  attach_function 'speller_new',
46
135
  'new_aspell_speller',
47
136
  [:pointer],
48
137
  :pointer
49
138
 
139
+ ##
140
+ # Removes a speller pointer and frees the memory associated with said
141
+ # pointer.
142
+ #
143
+ # @since 24-04-2012
144
+ # @method speller_delete(speller)
145
+ # @scope class
146
+ # @param [FFI::Pointer] speller The pointer to remove.
147
+ #
148
+ attach_function 'speller_delete',
149
+ 'delete_aspell_speller',
150
+ [:pointer],
151
+ :void
152
+
153
+ ##
154
+ # Checks if a given word is spelled correctly or not. If the word is valid
155
+ # `true` will be returned, `false` otherwise.
156
+ #
157
+ # @example
158
+ # config = FFI::Aspell.config_new
159
+ # speller = FFI::Aspell.speller_new(config)
160
+ # word = 'cookie'
161
+ # valid = FFI::Aspell.speller_check(speller, word, word.length)
162
+ #
163
+ # if valid
164
+ # puts 'The word "cookie" is valid'
165
+ # else
166
+ # puts 'The word "cookie" is invalid'
167
+ # end
168
+ #
169
+ # @since 24-04-2012
170
+ # @method speller_check(speller, word, length)
171
+ # @scope class
172
+ # @param [FFI::Pointer] speller Pointer to a speller struct to use.
173
+ # @param [String] word The word to check.
174
+ # @param [Fixnum] length The length of the word.
175
+ # @return [TrueClass|FalseClass]
176
+ #
50
177
  attach_function 'speller_check',
51
178
  'aspell_speller_check',
52
179
  [:pointer, :string, :int],
53
180
  :bool
181
+
182
+ # Functions for dealing with suggestions.
183
+
184
+ ##
185
+ # Returns a pointer that can be used to retrieve a list of suggestions for a
186
+ # given word.
187
+ #
188
+ # @since 24-04-2012
189
+ # @method speller_suggest(speller, word, length)
190
+ # @see FFI::Aspell.speller_check
191
+ # @return [FFI::Pointer]
192
+ #
193
+ attach_function 'speller_suggest',
194
+ 'aspell_speller_suggest',
195
+ [:pointer, :string, :int],
196
+ :pointer
197
+
198
+ ##
199
+ # Returns a pointer to a list which can be used by
200
+ # {FFI::Aspell.string_enumeration_next} to retrieve all the suggested words.
201
+ #
202
+ # @since 24-04-2012
203
+ # @method word_list_elements(suggestions)
204
+ # @scope class
205
+ # @param [FFI::Pointer] suggestions A pointer with suggestions as returned
206
+ # by {FFI::Aspell.speller_suggest}
207
+ # @return [FFI::Pointer]
208
+ #
209
+ attach_function 'word_list_elements',
210
+ 'aspell_word_list_elements',
211
+ [:pointer],
212
+ :pointer
213
+
214
+ ##
215
+ # Removes the pointer returned by {FFI::Aspell.word_list_elements} and frees
216
+ # the associated memory.
217
+ #
218
+ # @since 24-04-2012
219
+ # @method string_enumeration_delete(elements)
220
+ # @scope class
221
+ # @param [FFI::Pointer] elements A pointer for a list of elements as
222
+ # returned by {FFI::Aspell.word_list_elements}.
223
+ #
224
+ attach_function 'string_enumeration_delete',
225
+ 'delete_aspell_string_enumeration',
226
+ [:pointer],
227
+ :void
228
+
229
+ ##
230
+ # Retrieves the next item in the list of suggestions.
231
+ #
232
+ # @example
233
+ # speller = FFI::Aspell.speller_new(FFI::Aspell.config_new)
234
+ # word = 'cookie'
235
+ # list = FFI::Aspell.speller_suggest(speller, word, word.length)
236
+ # elements = FFI::Aspell.word_list_elements(list)
237
+ # words = []
238
+ #
239
+ # while word = FFI::Aspell.string_enumeration_next(elements)
240
+ # words << word
241
+ # end
242
+ #
243
+ # FFI::Aspell.string_enumeration_delete(elements)
244
+ # FFI::Aspell.speller_delete(speller)
245
+ #
246
+ # @since 24-04-2012
247
+ # @method string_enumeration_next(elements)
248
+ # @scope class
249
+ # @param [FFI::Pointer] elements Pointer to a list of elements as returned
250
+ # by {FFI::Aspell.word_list_elements}.
251
+ # @return [String|NilClass]
252
+ #
253
+ attach_function 'string_enumeration_next',
254
+ 'aspell_string_enumeration_next',
255
+ [:pointer],
256
+ :string
54
257
  end # Aspell
55
258
  end # FFI
data/pkg/.gitkeep ADDED
File without changes
@@ -0,0 +1,98 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'FFI::Aspell::Speller' do
4
+ it 'Set the language in the constructor' do
5
+ FFI::Aspell::Speller.new.get('lang').should == 'en_US'
6
+ FFI::Aspell::Speller.new('en').get('lang').should == 'en'
7
+ FFI::Aspell::Speller.new('nl').get('lang').should == 'nl'
8
+ end
9
+
10
+ it 'Set options in the constructor' do
11
+ FFI::Aspell::Speller.new.get('personal').should == '.aspell.en_US.pws'
12
+
13
+ FFI::Aspell::Speller.new('en', :personal => 'foo') \
14
+ .get(:personal).should == 'foo'
15
+ end
16
+
17
+ it 'Raise when setting a non existing option' do
18
+ should.raise(FFI::Aspell::ConfigError) do
19
+ FFI::Aspell::Speller.new.set('foo', 'bar')
20
+ end
21
+ end
22
+
23
+ it 'Raise when retrieving a non existing option' do
24
+ should.raise(FFI::Aspell::ConfigError) do
25
+ FFI::Aspell::Speller.new.get('foo')
26
+ end
27
+ end
28
+
29
+ it 'Retrieve the default value of an option' do
30
+ FFI::Aspell::Speller.new.get_default('personal') \
31
+ .should == '.aspell.en_US.pws'
32
+ end
33
+
34
+ it 'Reset an option to its default value' do
35
+ speller = FFI::Aspell::Speller.new
36
+
37
+ speller.set('personal', 'foo')
38
+
39
+ speller.get('personal').should == 'foo'
40
+
41
+ speller.reset('personal')
42
+
43
+ speller.get('personal').should == '.aspell.en_US.pws'
44
+ end
45
+
46
+ it 'Validate various English words' do
47
+ speller = FFI::Aspell::Speller.new('en')
48
+
49
+ speller.correct?('cookie').should == true
50
+ speller.correct?('werld').should == false
51
+ speller.correct?('house').should == true
52
+ speller.correct?('huis').should == false
53
+ end
54
+
55
+ it 'Validate various Dutch words' do
56
+ speller = FFI::Aspell::Speller.new('nl')
57
+
58
+ speller.correct?('koekje').should == true
59
+ speller.correct?('werld').should == false
60
+ speller.correct?('huis').should == true
61
+ end
62
+
63
+ it 'Change the language of an existing speller object' do
64
+ speller = FFI::Aspell::Speller.new
65
+
66
+ speller.correct?('house').should == true
67
+ speller.correct?('huis').should == false
68
+
69
+ speller.set('lang', 'nl')
70
+
71
+ speller.correct?('house').should == true
72
+ speller.correct?('huis').should == true
73
+ end
74
+
75
+ it 'Use an English personal word list' do
76
+ speller = FFI::Aspell::Speller.new('en')
77
+
78
+ speller.correct?('github').should == false
79
+ speller.correct?('nodoc').should == false
80
+
81
+ speller.set(:personal, File.join(FIXTURES, 'personal.en.pws'))
82
+
83
+ speller.correct?('github').should == true
84
+ speller.correct?('nodoc').should == true
85
+ end
86
+
87
+ it 'Use a Dutch personal word list' do
88
+ speller = FFI::Aspell::Speller.new('nl')
89
+
90
+ speller.correct?('github').should == false
91
+ speller.correct?('nodoc').should == false
92
+
93
+ speller.set(:personal, File.join(FIXTURES, 'personal.nl.pws'))
94
+
95
+ speller.correct?('github').should == true
96
+ speller.correct?('nodoc').should == true
97
+ end
98
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'FFI::Aspell::Speller#suggestions' do
4
+ it 'Return a list of word suggestions using the default mode' do
5
+ speller = FFI::Aspell::Speller.new
6
+ suggestions = speller.suggestions('cookei')
7
+
8
+ suggestions.include?('coke').should == true
9
+ suggestions.include?('cookie').should == true
10
+ suggestions.include?('cooked').should == true
11
+ end
12
+
13
+ it 'Return a list of word suggestions using the "bad-spellers" mode' do
14
+ speller = FFI::Aspell::Speller.new
15
+
16
+ # Get the amount of suggestions for the normal mode. The "bad-spellers" mode
17
+ # should result in a lot more possible suggestions.
18
+ normal_length = speller.suggestions('cookei').length
19
+
20
+ speller.suggestion_mode = 'bad-spellers'
21
+ suggestions = speller.suggestions('cookei')
22
+
23
+ suggestions.include?('coke').should == true
24
+ suggestions.include?('cookie').should == true
25
+ suggestions.include?('cooked').should == true
26
+
27
+ suggestions.length.should > normal_length
28
+ end
29
+
30
+ it 'Raise an error when an invalid suggestion mode is used' do
31
+ speller = FFI::Aspell::Speller.new
32
+
33
+ should.raise(FFI::Aspell::ConfigError) do
34
+ speller.suggestion_mode = 'does-not-exist'
35
+ end
36
+
37
+ speller.suggestion_mode.should == 'normal'
38
+
39
+ should.not.raise(FFI::Aspell::ConfigError) do
40
+ speller.suggestion_mode = 'ultra'
41
+ end
42
+
43
+ speller.suggestion_mode.should == 'ultra'
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ personal_ws-1.1 en 2 utf-8
2
+ github
3
+ nodoc
@@ -0,0 +1,3 @@
1
+ personal_ws-1.1 nl 2 utf-8
2
+ github
3
+ nodoc
data/spec/helper.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'bacon'
2
+ require File.expand_path('../../lib/ffi/aspell', __FILE__)
3
+
4
+ Bacon.extend(Bacon::TapOutput)
5
+ Bacon.summary_on_exit
6
+
7
+ FIXTURES = File.expand_path('../fixtures', __FILE__)
data/task/build.rake ADDED
@@ -0,0 +1,15 @@
1
+ namespace :build do
2
+ desc 'Builds a new Gem'
3
+ task :gem do
4
+ root = File.expand_path('../../', __FILE__)
5
+ gemspec = Gem::Specification.load(File.join(root, 'ffi-aspell.gemspec'))
6
+ name = "#{gemspec.name}-#{gemspec.version.version}.gem"
7
+ path = File.join(root, name)
8
+ pkg = File.join(root, 'pkg', name)
9
+
10
+ # Build and install the gem
11
+ sh('gem', 'build', File.join(root, 'ffi-aspell.gemspec'))
12
+ sh('mv' , path, pkg)
13
+ sh('gem', 'install', pkg)
14
+ end
15
+ end
data/task/memory.rake ADDED
@@ -0,0 +1,50 @@
1
+ # Cheap way of benchmarking the memory usage of various parts of the FFI
2
+ # binding.
3
+ def benchmark_block(amount = 10000)
4
+ require File.expand_path('../../lib/ffi/aspell', __FILE__)
5
+
6
+ start_mem = `ps -o rss= #{Process.pid}`.to_f
7
+
8
+ amount.times { yield }
9
+
10
+ mem = ((`ps -o rss= #{Process.pid}`.to_f - start_mem) / 1024).round(2)
11
+
12
+ puts "Memory increase in Megabytes: #{mem} MB"
13
+ end
14
+
15
+ namespace :memory do
16
+ memory = proc { `ps -o rss= #{Process.pid}`.to_i }
17
+
18
+ desc 'Show memory usage of Aspell.speller_new'
19
+ task :speller, [:amount] do |task, args|
20
+ args.with_defaults(:amount => 10000)
21
+
22
+ benchmark_block(args.amount) do
23
+ speller = FFI::Aspell.speller_new(FFI::Aspell.config_new)
24
+
25
+ FFI::Aspell.speller_delete(speller)
26
+ end
27
+ end
28
+
29
+ desc 'Show memory usage of Speller#correct?'
30
+ task :correct, [:amount] do |task, args|
31
+ args.with_defaults(:amount => 10000)
32
+
33
+ benchmark_block(args.amount) do
34
+ speller = FFI::Aspell::Speller.new
35
+
36
+ speller.correct?('cookie')
37
+ end
38
+ end
39
+
40
+ desc 'Show memory usage of Speller#suggestions'
41
+ task :suggestions, [:amount] do |task, args|
42
+ args.with_defaults(:amount => 10000)
43
+
44
+ benchmark_block(args.amount) do
45
+ speller = FFI::Aspell::Speller.new
46
+
47
+ speller.suggestions('cookei')
48
+ end
49
+ end
50
+ end
data/task/test.rake ADDED
@@ -0,0 +1,4 @@
1
+ desc 'Runs all the tests using Bacon'
2
+ task :test do
3
+ Dir['./spec/ffi/aspell/**/*.rb'].sort.each { |spec| require(spec) }
4
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-aspell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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: 2012-04-13 00:00:00.000000000 Z
12
+ date: 2012-04-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.0.11
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.2.2
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.2.2
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: yard
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -81,10 +97,27 @@ executables: []
81
97
  extensions: []
82
98
  extra_rdoc_files: []
83
99
  files:
84
- - ./lib/ffi/aspell.rb
85
- - ./lib/ffi/aspell/version.rb
86
- - ./lib/ffi/aspell/error.rb
87
- - ./lib/ffi/aspell/speller.rb
100
+ - .gems
101
+ - .gitignore
102
+ - .rvmrc
103
+ - .yardopts
104
+ - LICENSE
105
+ - README.md
106
+ - Rakefile
107
+ - ffi-aspell.gemspec
108
+ - lib/ffi/aspell.rb
109
+ - lib/ffi/aspell/error.rb
110
+ - lib/ffi/aspell/speller.rb
111
+ - lib/ffi/aspell/version.rb
112
+ - pkg/.gitkeep
113
+ - spec/ffi/aspell/speller.rb
114
+ - spec/ffi/aspell/suggestions.rb
115
+ - spec/fixtures/personal.en.pws
116
+ - spec/fixtures/personal.nl.pws
117
+ - spec/helper.rb
118
+ - task/build.rake
119
+ - task/memory.rake
120
+ - task/test.rake
88
121
  homepage: https://github.com/YorickPeterse/ffi-aspell
89
122
  licenses: []
90
123
  post_install_message:
@@ -105,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
138
  version: '0'
106
139
  requirements: []
107
140
  rubyforge_project:
108
- rubygems_version: 1.8.19
141
+ rubygems_version: 1.8.23
109
142
  signing_key:
110
143
  specification_version: 3
111
144
  summary: FFI bindings for Aspell