wordnet 0.0.5
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/ChangeLog +720 -0
- data/LICENSE +27 -0
- data/README +93 -0
- data/Rakefile +291 -0
- data/Rakefile.local +46 -0
- data/convertdb.rb +417 -0
- data/examples/addLacedBoots.rb +27 -0
- data/examples/clothesWithCollars.rb +36 -0
- data/examples/clothesWithTongues.rb +28 -0
- data/examples/distance.rb +37 -0
- data/examples/domainTree.rb +27 -0
- data/examples/gcs.rb +54 -0
- data/examples/holonymTree.rb +27 -0
- data/examples/hypernymTree.rb +28 -0
- data/examples/hyponymTree.rb +28 -0
- data/examples/memberTree.rb +27 -0
- data/examples/meronymTree.rb +29 -0
- data/lib/wordnet.rb +87 -0
- data/lib/wordnet/constants.rb +301 -0
- data/lib/wordnet/lexicon.rb +430 -0
- data/lib/wordnet/synset.rb +908 -0
- data/rake/dependencies.rb +76 -0
- data/rake/helpers.rb +384 -0
- data/rake/manual.rb +755 -0
- data/rake/packaging.rb +112 -0
- data/rake/publishing.rb +303 -0
- data/rake/rdoc.rb +35 -0
- data/rake/style.rb +62 -0
- data/rake/svn.rb +469 -0
- data/rake/testing.rb +192 -0
- data/rake/verifytask.rb +64 -0
- data/spec/lib/helpers.rb +155 -0
- data/spec/wordnet/lexicon_spec.rb +248 -0
- data/spec/wordnet/synset_spec.rb +288 -0
- data/utils.rb +838 -0
- metadata +216 -0
data/rake/testing.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
#
|
2
|
+
# Rake tasklib for testing tasks
|
3
|
+
# $Id: testing.rb 39 2008-08-22 01:27:56Z deveiant $
|
4
|
+
#
|
5
|
+
# Authors:
|
6
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
7
|
+
#
|
8
|
+
|
9
|
+
COVERAGE_MINIMUM = 85.0 unless defined?( COVERAGE_MINIMUM )
|
10
|
+
SPEC_FILES = [] unless defined?( SPEC_FILES )
|
11
|
+
TEST_FILES = [] unless defined?( TEST_FILES )
|
12
|
+
|
13
|
+
COMMON_SPEC_OPTS = ['-c', '-f', 's'] unless defined?( COMMON_SPEC_OPTS )
|
14
|
+
|
15
|
+
COVERAGE_TARGETDIR = BASEDIR + 'coverage' unless defined?( COVERAGE_TARGETDIR )
|
16
|
+
RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' unless
|
17
|
+
defined?( RCOV_EXCLUDES )
|
18
|
+
|
19
|
+
|
20
|
+
desc "Run all defined tests"
|
21
|
+
task :test do
|
22
|
+
unless SPEC_FILES.empty?
|
23
|
+
log "Running specs"
|
24
|
+
Rake::Task['spec:quiet'].invoke
|
25
|
+
end
|
26
|
+
|
27
|
+
unless TEST_FILES.empty?
|
28
|
+
log "Running unit tests"
|
29
|
+
Rake::Task[:unittests].invoke
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
### RSpec specifications
|
35
|
+
begin
|
36
|
+
gem 'rspec', '>= 1.1.3'
|
37
|
+
require 'spec/rake/spectask'
|
38
|
+
|
39
|
+
### Task: spec
|
40
|
+
Spec::Rake::SpecTask.new( :spec ) do |task|
|
41
|
+
task.spec_files = SPEC_FILES
|
42
|
+
task.libs += [LIBDIR]
|
43
|
+
task.spec_opts = COMMON_SPEC_OPTS
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
namespace :spec do
|
48
|
+
desc "Run rspec every time there's a change to one of the files"
|
49
|
+
task :autotest do
|
50
|
+
require 'autotest/rspec'
|
51
|
+
|
52
|
+
autotester = Autotest::Rspec.new
|
53
|
+
autotester.exceptions = %r{\.svn|\.skel}
|
54
|
+
autotester.run
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
desc "Generate quiet output"
|
59
|
+
Spec::Rake::SpecTask.new( :quiet ) do |task|
|
60
|
+
task.spec_files = SPEC_FILES
|
61
|
+
task.spec_opts = ['-f', 'p', '-D']
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Generate HTML output for a spec run"
|
65
|
+
Spec::Rake::SpecTask.new( :html ) do |task|
|
66
|
+
task.spec_files = SPEC_FILES
|
67
|
+
task.spec_opts = ['-f','h', '-D']
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Generate plain-text output for a CruiseControl.rb build"
|
71
|
+
Spec::Rake::SpecTask.new( :text ) do |task|
|
72
|
+
task.spec_files = SPEC_FILES
|
73
|
+
task.spec_opts = ['-f','p']
|
74
|
+
end
|
75
|
+
end
|
76
|
+
rescue LoadError => err
|
77
|
+
task :no_rspec do
|
78
|
+
$stderr.puts "Specification tasks not defined: %s" % [ err.message ]
|
79
|
+
end
|
80
|
+
|
81
|
+
task :spec => :no_rspec
|
82
|
+
namespace :spec do
|
83
|
+
task :autotest => :no_rspec
|
84
|
+
task :quiet => :no_rspec
|
85
|
+
task :html => :no_rspec
|
86
|
+
task :text => :no_rspec
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
### Test::Unit tests
|
92
|
+
begin
|
93
|
+
require 'rake/testtask'
|
94
|
+
|
95
|
+
Rake::TestTask.new( :unittests ) do |task|
|
96
|
+
task.libs += [LIBDIR]
|
97
|
+
task.test_files = TEST_FILES
|
98
|
+
task.verbose = true
|
99
|
+
end
|
100
|
+
|
101
|
+
rescue LoadError => err
|
102
|
+
task :no_test do
|
103
|
+
$stderr.puts "Test tasks not defined: %s" % [ err.message ]
|
104
|
+
end
|
105
|
+
|
106
|
+
task :unittests => :no_rspec
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
### RCov (via RSpec) tasks
|
111
|
+
begin
|
112
|
+
gem 'rcov'
|
113
|
+
gem 'rspec', '>= 1.1.3'
|
114
|
+
|
115
|
+
### Task: coverage (via RCov)
|
116
|
+
### Task: rcov
|
117
|
+
desc "Build test coverage reports"
|
118
|
+
unless SPEC_FILES.empty?
|
119
|
+
Spec::Rake::SpecTask.new( :coverage ) do |task|
|
120
|
+
task.spec_files = SPEC_FILES
|
121
|
+
task.libs += [LIBDIR]
|
122
|
+
task.spec_opts = ['-f', 'p', '-b']
|
123
|
+
task.rcov_opts = RCOV_OPTS
|
124
|
+
task.rcov = true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
unless TEST_FILES.empty?
|
128
|
+
require 'rcov/rcovtask'
|
129
|
+
|
130
|
+
Rcov::RcovTask.new do |task|
|
131
|
+
task.libs += [LIBDIR]
|
132
|
+
task.test_files = TEST_FILES
|
133
|
+
task.verbose = true
|
134
|
+
task.rcov_opts = RCOV_OPTS
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
task :rcov => [:coverage] do; end
|
140
|
+
|
141
|
+
### Other coverage tasks
|
142
|
+
namespace :coverage do
|
143
|
+
desc "Generate a detailed text coverage report"
|
144
|
+
Spec::Rake::SpecTask.new( :text ) do |task|
|
145
|
+
task.spec_files = SPEC_FILES
|
146
|
+
task.rcov_opts = RCOV_OPTS + ['--text-report']
|
147
|
+
task.rcov = true
|
148
|
+
end
|
149
|
+
|
150
|
+
desc "Show differences in coverage from last run"
|
151
|
+
Spec::Rake::SpecTask.new( :diff ) do |task|
|
152
|
+
task.spec_files = SPEC_FILES
|
153
|
+
task.spec_opts = ['-f', 'p', '-b']
|
154
|
+
task.rcov_opts = RCOV_OPTS - ['--save'] + ['--text-coverage-diff']
|
155
|
+
task.rcov = true
|
156
|
+
end
|
157
|
+
|
158
|
+
### Task: verify coverage
|
159
|
+
desc "Build coverage statistics"
|
160
|
+
VerifyTask.new( :verify => :rcov ) do |task|
|
161
|
+
task.threshold = COVERAGE_MINIMUM
|
162
|
+
end
|
163
|
+
|
164
|
+
desc "Run RCov in 'spec-only' mode to check coverage from specs"
|
165
|
+
Spec::Rake::SpecTask.new( :speconly ) do |task|
|
166
|
+
task.spec_files = SPEC_FILES
|
167
|
+
task.rcov_opts = ['--exclude', RCOV_EXCLUDES, '--text-report', '--save']
|
168
|
+
task.rcov = true
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
task :clobber_coverage do
|
173
|
+
rmtree( COVERAGE_TARGETDIR )
|
174
|
+
end
|
175
|
+
|
176
|
+
rescue LoadError => err
|
177
|
+
task :no_rcov do
|
178
|
+
$stderr.puts "Coverage tasks not defined: RSpec+RCov tasklib not available: %s" %
|
179
|
+
[ err.message ]
|
180
|
+
end
|
181
|
+
|
182
|
+
task :coverage => :no_rcov
|
183
|
+
task :clobber_coverage
|
184
|
+
task :rcov => :no_rcov
|
185
|
+
namespace :coverage do
|
186
|
+
task :text => :no_rcov
|
187
|
+
task :diff => :no_rcov
|
188
|
+
end
|
189
|
+
task :verify => :no_rcov
|
190
|
+
end
|
191
|
+
|
192
|
+
|
data/rake/verifytask.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#####################################################################
|
2
|
+
### S U B V E R S I O N T A S K S A N D H E L P E R S
|
3
|
+
#####################################################################
|
4
|
+
|
5
|
+
require 'rake/tasklib'
|
6
|
+
|
7
|
+
#
|
8
|
+
# Work around the inexplicable behaviour of the original RDoc::VerifyTask, which
|
9
|
+
# errors if your coverage isn't *exactly* the threshold.
|
10
|
+
#
|
11
|
+
|
12
|
+
# A task that can verify that the RCov coverage doesn't
|
13
|
+
# drop below a certain threshold. It should be run after
|
14
|
+
# running Spec::Rake::SpecTask.
|
15
|
+
class VerifyTask < Rake::TaskLib
|
16
|
+
|
17
|
+
COVERAGE_PERCENTAGE_PATTERN =
|
18
|
+
%r{<tt class='coverage_code'>(\d+\.\d+)%</tt>}
|
19
|
+
|
20
|
+
# Name of the task. Defaults to :verify_rcov
|
21
|
+
attr_accessor :name
|
22
|
+
|
23
|
+
# Path to the index.html file generated by RCov, which
|
24
|
+
# is the file containing the total coverage.
|
25
|
+
# Defaults to 'coverage/index.html'
|
26
|
+
attr_accessor :index_html
|
27
|
+
|
28
|
+
# Whether or not to output details. Defaults to true.
|
29
|
+
attr_accessor :verbose
|
30
|
+
|
31
|
+
# The threshold value (in percent) for coverage. If the
|
32
|
+
# actual coverage is not equal to this value, the task will raise an
|
33
|
+
# exception.
|
34
|
+
attr_accessor :threshold
|
35
|
+
|
36
|
+
def initialize( name=:verify )
|
37
|
+
@name = name
|
38
|
+
@index_html = 'coverage/index.html'
|
39
|
+
@verbose = true
|
40
|
+
yield self if block_given?
|
41
|
+
raise "Threshold must be set" if @threshold.nil?
|
42
|
+
define
|
43
|
+
end
|
44
|
+
|
45
|
+
def define
|
46
|
+
desc "Verify that rcov coverage is at least #{threshold}%"
|
47
|
+
|
48
|
+
task @name do
|
49
|
+
total_coverage = nil
|
50
|
+
if match = File.read( index_html ).match( COVERAGE_PERCENTAGE_PATTERN )
|
51
|
+
total_coverage = Float( match[1] )
|
52
|
+
else
|
53
|
+
raise "Couldn't find the coverage percentage in #{index_html}"
|
54
|
+
end
|
55
|
+
|
56
|
+
puts "Coverage: #{total_coverage}% (threshold: #{threshold}%)" if verbose
|
57
|
+
if total_coverage < threshold
|
58
|
+
raise "Coverage must be at least #{threshold}% but was #{total_coverage}%"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# vim: set nosta noet ts=4 sw=4:
|
data/spec/lib/helpers.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wordnet'
|
5
|
+
rescue LoadError
|
6
|
+
unless Object.const_defined?( :Gem )
|
7
|
+
require 'rubygems'
|
8
|
+
retry
|
9
|
+
end
|
10
|
+
raise
|
11
|
+
end
|
12
|
+
|
13
|
+
module WordNet::SpecHelpers
|
14
|
+
|
15
|
+
###############
|
16
|
+
module_function
|
17
|
+
###############
|
18
|
+
|
19
|
+
### Create a temporary working directory and return
|
20
|
+
### a Pathname object for it.
|
21
|
+
def make_tempdir
|
22
|
+
dirname = "%s.%d.%0.4f" % [
|
23
|
+
'wordnet_spec',
|
24
|
+
Process.pid,
|
25
|
+
(Time.now.to_f % 3600),
|
26
|
+
]
|
27
|
+
tempdir = Pathname.new( Dir.tmpdir ) + dirname
|
28
|
+
tempdir.mkpath
|
29
|
+
|
30
|
+
return tempdir
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# Override the badly-formatted output of the RSpec HTML formatter
|
36
|
+
require 'spec/runner/formatter/html_formatter'
|
37
|
+
|
38
|
+
class Spec::Runner::Formatter::HtmlFormatter
|
39
|
+
def example_failed( example, counter, failure )
|
40
|
+
failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
|
41
|
+
|
42
|
+
unless @header_red
|
43
|
+
@output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>"
|
44
|
+
@header_red = true
|
45
|
+
end
|
46
|
+
|
47
|
+
unless @example_group_red
|
48
|
+
css_class = 'example_group_%d' % [current_example_group_number]
|
49
|
+
@output.puts " <script type=\"text/javascript\">makeRed('#{css_class}');</script>"
|
50
|
+
@example_group_red = true
|
51
|
+
end
|
52
|
+
|
53
|
+
move_progress()
|
54
|
+
|
55
|
+
@output.puts " <dd class=\"spec #{failure_style}\">",
|
56
|
+
" <span class=\"failed_spec_name\">#{h(example.description)}</span>",
|
57
|
+
" <div class=\"failure\" id=\"failure_#{counter}\">"
|
58
|
+
if failure.exception
|
59
|
+
backtrace = format_backtrace( failure.exception.backtrace )
|
60
|
+
message = failure.exception.message
|
61
|
+
|
62
|
+
@output.puts " <div class=\"message\"><code>#{h message}</code></div>",
|
63
|
+
" <div class=\"backtrace\"><pre>#{backtrace}</pre></div>"
|
64
|
+
end
|
65
|
+
|
66
|
+
if extra = extra_failure_content( failure )
|
67
|
+
@output.puts( extra )
|
68
|
+
end
|
69
|
+
|
70
|
+
@output.puts " </div>",
|
71
|
+
" </dd>"
|
72
|
+
@output.flush
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
alias_method :default_global_styles, :global_styles
|
77
|
+
|
78
|
+
def global_styles
|
79
|
+
css = default_global_styles()
|
80
|
+
css << %Q{
|
81
|
+
/* Stuff added by #{__FILE__} */
|
82
|
+
|
83
|
+
/* Overrides */
|
84
|
+
#rspec-header {
|
85
|
+
-webkit-box-shadow: #333 0 2px 5px;
|
86
|
+
margin-bottom: 1em;
|
87
|
+
}
|
88
|
+
|
89
|
+
.example_group dt {
|
90
|
+
-webkit-box-shadow: #333 0 2px 3px;
|
91
|
+
}
|
92
|
+
|
93
|
+
/* Style for log output */
|
94
|
+
dd.log-message {
|
95
|
+
background: #eee;
|
96
|
+
padding: 0 2em;
|
97
|
+
margin: 0.2em 1em;
|
98
|
+
border-bottom: 1px dotted #999;
|
99
|
+
border-top: 1px dotted #999;
|
100
|
+
text-indent: -1em;
|
101
|
+
}
|
102
|
+
|
103
|
+
/* Parts of the message */
|
104
|
+
dd.log-message .log-time {
|
105
|
+
font-weight: bold;
|
106
|
+
}
|
107
|
+
dd.log-message .log-time:after {
|
108
|
+
content: ": ";
|
109
|
+
}
|
110
|
+
dd.log-message .log-level {
|
111
|
+
font-variant: small-caps;
|
112
|
+
border: 1px solid #ccc;
|
113
|
+
padding: 1px 2px;
|
114
|
+
}
|
115
|
+
dd.log-message .log-name {
|
116
|
+
font-size: 1.2em;
|
117
|
+
color: #1e51b2;
|
118
|
+
}
|
119
|
+
dd.log-message .log-name:before { content: "«"; }
|
120
|
+
dd.log-message .log-name:after { content: "»"; }
|
121
|
+
|
122
|
+
dd.log-message .log-message-text {
|
123
|
+
padding-left: 4px;
|
124
|
+
font-family: Monaco, "Andale Mono", "Vera Sans Mono", mono;
|
125
|
+
}
|
126
|
+
|
127
|
+
|
128
|
+
/* Distinguish levels */
|
129
|
+
dd.log-message.debug { color: #666; }
|
130
|
+
dd.log-message.info {}
|
131
|
+
|
132
|
+
dd.log-message.warn,
|
133
|
+
dd.log-message.error {
|
134
|
+
background: #ff9;
|
135
|
+
}
|
136
|
+
dd.log-message.error .log-level,
|
137
|
+
dd.log-message.error .log-message-text {
|
138
|
+
color: #900;
|
139
|
+
}
|
140
|
+
dd.log-message.fatal {
|
141
|
+
background: #900;
|
142
|
+
color: white;
|
143
|
+
font-weight: bold;
|
144
|
+
border: 0;
|
145
|
+
}
|
146
|
+
dd.log-message.fatal .log-name {
|
147
|
+
color: white;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
return css
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
|
@@ -0,0 +1,248 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
BEGIN {
|
4
|
+
require 'pathname'
|
5
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
6
|
+
|
7
|
+
libdir = basedir + 'lib'
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
10
|
+
}
|
11
|
+
|
12
|
+
begin
|
13
|
+
require 'fileutils'
|
14
|
+
require 'tmpdir'
|
15
|
+
require 'bdb'
|
16
|
+
require 'spec/runner'
|
17
|
+
require 'spec/lib/helpers'
|
18
|
+
|
19
|
+
require 'wordnet/lexicon'
|
20
|
+
rescue LoadError
|
21
|
+
unless Object.const_defined?( :Gem )
|
22
|
+
require 'rubygems'
|
23
|
+
retry
|
24
|
+
end
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
#####################################################################
|
31
|
+
### C O N T E X T S
|
32
|
+
#####################################################################
|
33
|
+
|
34
|
+
describe WordNet::Lexicon do
|
35
|
+
include WordNet::SpecHelpers
|
36
|
+
|
37
|
+
TEST_WORDS = {
|
38
|
+
'activity' => WordNet::Noun,
|
39
|
+
'sword' => WordNet::Noun,
|
40
|
+
'density' => WordNet::Noun,
|
41
|
+
'burly' => WordNet::Adjective,
|
42
|
+
'wispy' => WordNet::Adjective,
|
43
|
+
'traditional' => WordNet::Adjective,
|
44
|
+
'sit' => WordNet::Verb,
|
45
|
+
'take' => WordNet::Verb,
|
46
|
+
'joust' => WordNet::Verb,
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
before( :each ) do
|
51
|
+
@path = make_tempdir()
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
after( :each ) do
|
56
|
+
FileUtils.rm_rf @path, :verbose => $DEBUG
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
#################################################################
|
62
|
+
### T E S T S
|
63
|
+
#################################################################
|
64
|
+
|
65
|
+
it "defaults to being in :readonly mode" do
|
66
|
+
env = stub( "bdb environment handle", :open_db => nil )
|
67
|
+
BDB::Env.should_receive( :new ).
|
68
|
+
with( @path.to_s, WordNet::Lexicon::ENV_FLAGS_RO, WordNet::Lexicon::ENV_OPTIONS ).
|
69
|
+
and_return( env )
|
70
|
+
|
71
|
+
lex = WordNet::Lexicon.new( @path.to_s )
|
72
|
+
|
73
|
+
lex.should be_readonly()
|
74
|
+
lex.should_not be_readwrite()
|
75
|
+
end
|
76
|
+
|
77
|
+
it "can be created in :writable mode" do
|
78
|
+
env = stub( "bdb environment handle", :open_db => nil )
|
79
|
+
BDB::Env.should_receive( :new ).
|
80
|
+
with( @path.to_s, WordNet::Lexicon::ENV_FLAGS_RW, WordNet::Lexicon::ENV_OPTIONS ).
|
81
|
+
and_return( env )
|
82
|
+
|
83
|
+
lex = WordNet::Lexicon.new( @path.to_s, :writable )
|
84
|
+
|
85
|
+
lex.should_not be_readonly()
|
86
|
+
lex.should be_readwrite()
|
87
|
+
end
|
88
|
+
|
89
|
+
it "passes a read/write flagset to BDB when created in :readwrite mode" do
|
90
|
+
env = stub( "bdb environment handle", :open_db => nil )
|
91
|
+
BDB::Env.should_receive( :new ).
|
92
|
+
with( @path.to_s, WordNet::Lexicon::ENV_FLAGS_RW, WordNet::Lexicon::ENV_OPTIONS ).
|
93
|
+
and_return( env )
|
94
|
+
|
95
|
+
lex = WordNet::Lexicon.new( @path.to_s, :readwrite )
|
96
|
+
|
97
|
+
lex.should_not be_readonly()
|
98
|
+
lex.should be_readwrite()
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
describe "created in readonly mode" do
|
103
|
+
|
104
|
+
before( :each ) do
|
105
|
+
@env = mock( "bdb environment handle" )
|
106
|
+
BDB::Env.stub!( :new ).and_return( @env )
|
107
|
+
@env.stub!( :open_db )
|
108
|
+
|
109
|
+
@lexicon = WordNet::Lexicon.new( @path.to_s, :readonly )
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
it "doesn't try to remove logs" do
|
114
|
+
@env.should_not_receive( :log_archive )
|
115
|
+
@lexicon.clean_logs
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
describe "created in readwrite mode" do
|
123
|
+
|
124
|
+
before( :each ) do
|
125
|
+
@env = mock( "bdb environment handle" )
|
126
|
+
BDB::Env.stub!( :new ).and_return( @env )
|
127
|
+
@env.stub!( :open_db )
|
128
|
+
|
129
|
+
@lexicon = WordNet::Lexicon.new( @path.to_s, :readwrite )
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
it "can be closed" do
|
134
|
+
@env.should_receive( :close )
|
135
|
+
@lexicon.close
|
136
|
+
end
|
137
|
+
|
138
|
+
it "provides a delegator for the checkpoint method of the underlying database" do
|
139
|
+
@env.should_receive( :checkpoint )
|
140
|
+
@lexicon.checkpoint
|
141
|
+
end
|
142
|
+
|
143
|
+
it "provides an interface to clean up database transaction logs" do
|
144
|
+
@env.should_receive( :log_archive ).with( BDB::ARCH_ABS ).
|
145
|
+
and_return([ :log1, :log2 ])
|
146
|
+
File.should_receive( :chmod ).with( 0777, :log1 )
|
147
|
+
File.should_receive( :delete ).with( :log1 )
|
148
|
+
File.should_receive( :chmod ).with( 0777, :log2 )
|
149
|
+
File.should_receive( :delete ).with( :log2 )
|
150
|
+
|
151
|
+
@lexicon.clean_logs
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
describe "with a converted WordNet database" do
|
159
|
+
|
160
|
+
before( :all ) do
|
161
|
+
@basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
162
|
+
@datadir = @basedir + 'ruby-wordnet'
|
163
|
+
end
|
164
|
+
|
165
|
+
before( :each ) do
|
166
|
+
pending "you haven't converted the WordNet datafiles yet -- try 'rake convert'" unless
|
167
|
+
@datadir.directory?
|
168
|
+
|
169
|
+
@lexicon = WordNet::Lexicon.new( @datadir.to_s )
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
TEST_WORDS.each do |word, pos|
|
174
|
+
it "returns a Fixnum value for the familiarity of #{word}(#{pos})" do
|
175
|
+
@lexicon.familiarity( word, pos ).should be_an_instance_of( Fixnum )
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
|
180
|
+
it "returns the root word as the morphological conversion of a dictionary word it knows about" do
|
181
|
+
@lexicon.morph( "angriest", WordNet::Adjective ).should == 'angry'
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
it "returns nil as the morphological conversion of a dictionary word it doesn't know about" do
|
186
|
+
@lexicon.morph( "Passomoquoddy", WordNet::Noun ).should be_nil()
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
it "returns the 'reverse morph' of dictionary words it knows about" do
|
191
|
+
@lexicon.reverse_morph( "angry" ).should == 'angriest%a'
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
it "tries looking up a failing via its morphological conversion if the original fails" do
|
196
|
+
synsets = @lexicon.lookup_synsets( 'angriest', WordNet::Adjective )
|
197
|
+
|
198
|
+
synsets.should_not be_nil()
|
199
|
+
synsets.first.should be_an_instance_of( WordNet::Synset )
|
200
|
+
synsets.first.words.should include( 'angry' )
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
it "returns only the requested sense if a sense is specified" do
|
205
|
+
synset = @lexicon.lookup_synsets( 'run', WordNet::Verb, 4 )
|
206
|
+
synset.should be_an_instance_of( WordNet::Synset )
|
207
|
+
synset.words.first.should =~ /operate/i
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
it "can find every compound sense of a word in its dictionary" do
|
212
|
+
words = @lexicon.grep( 'thing' )
|
213
|
+
|
214
|
+
words.should have(10).members
|
215
|
+
words.should include( 'thing%n' )
|
216
|
+
words.should include( 'thing-in-itself%n' )
|
217
|
+
words.should include( 'thingamabob%n' )
|
218
|
+
words.should include( 'thingamajig%n' )
|
219
|
+
words.should include( 'thingmabob%n' )
|
220
|
+
words.should include( 'thingmajig%n' )
|
221
|
+
words.should include( 'things%n' )
|
222
|
+
words.should include( 'thingumabob%n' )
|
223
|
+
words.should include( 'thingumajig%n' )
|
224
|
+
words.should include( 'thingummy%n' )
|
225
|
+
end
|
226
|
+
|
227
|
+
|
228
|
+
TEST_WORDS.each do |word, pos|
|
229
|
+
it "can look up the synset #{word}(#{pos}) by word and part-of-speech" do
|
230
|
+
synsets = @lexicon.lookup_synsets( word, pos )
|
231
|
+
|
232
|
+
synsets.should have_at_least(1).members
|
233
|
+
synsets.each do |ss|
|
234
|
+
ss.should be_an_instance_of( WordNet::Synset )
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
it "can act as a factory for new synsets" do
|
241
|
+
@lexicon.create_synset( "Ruby", WordNet::Noun ).
|
242
|
+
should be_an_instance_of( WordNet::Synset )
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
|