linkparser 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/ChangeLog +134 -506
- data/LICENSE +1 -1
- data/README.md +95 -0
- data/Rakefile +145 -95
- data/Rakefile.local +31 -39
- data/ext/dictionary.c +103 -37
- data/ext/extconf.rb +79 -32
- data/ext/linkage.c +245 -210
- data/ext/linkparser.c +3 -2
- data/ext/linkparser.h +21 -17
- data/ext/parseoptions.c +65 -65
- data/ext/sentence.c +75 -64
- data/lib/linkparser.rb +16 -26
- data/lib/linkparser/linkage.rb +68 -50
- data/lib/linkparser/mixins.rb +38 -0
- data/lib/linkparser/sentence.rb +15 -40
- data/rake/dependencies.rb +1 -1
- data/rake/documentation.rb +123 -0
- data/rake/helpers.rb +400 -310
- data/rake/hg.rb +318 -0
- data/rake/manual.rb +84 -79
- data/rake/packaging.rb +33 -37
- data/rake/publishing.rb +166 -146
- data/rake/style.rb +1 -1
- data/rake/svn.rb +577 -549
- data/rake/testing.rb +55 -106
- data/spec/bugfixes_spec.rb +12 -6
- data/spec/linkparser/dictionary_spec.rb +45 -29
- data/spec/linkparser/linkage_spec.rb +90 -94
- data/spec/linkparser/mixins_spec.rb +67 -0
- data/spec/linkparser/parseoptions_spec.rb +19 -22
- data/spec/linkparser/sentence_spec.rb +19 -17
- data/spec/linkparser_spec.rb +11 -5
- metadata +64 -147
- metadata.gz.sig +0 -0
- data/README +0 -61
- data/rake/rdoc.rb +0 -40
- data/rake/win32.rb +0 -186
data/rake/testing.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Rake tasklib for testing tasks
|
3
|
-
|
3
|
+
|
4
4
|
#
|
5
5
|
# Authors:
|
6
6
|
# * Michael Granger <ged@FaerieMUD.org>
|
@@ -16,7 +16,7 @@ end
|
|
16
16
|
SPEC_FILES = [] unless defined?( SPEC_FILES )
|
17
17
|
TEST_FILES = [] unless defined?( TEST_FILES )
|
18
18
|
|
19
|
-
|
19
|
+
COMMON_RSPEC_OPTS = [] unless defined?( COMMON_RSPEC_OPTS )
|
20
20
|
|
21
21
|
COVERAGE_TARGETDIR = BASEDIR + 'coverage' unless defined?( COVERAGE_TARGETDIR )
|
22
22
|
RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' unless
|
@@ -29,7 +29,7 @@ task :test do
|
|
29
29
|
log "Running specs"
|
30
30
|
Rake::Task['spec:quiet'].invoke
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
unless TEST_FILES.empty?
|
34
34
|
log "Running unit tests"
|
35
35
|
Rake::Task[:unittests].invoke
|
@@ -39,114 +39,55 @@ end
|
|
39
39
|
|
40
40
|
### RSpec specifications
|
41
41
|
begin
|
42
|
-
gem 'rspec', '>=
|
42
|
+
gem 'rspec', '>= 2.0.0'
|
43
43
|
|
44
|
-
require '
|
45
|
-
require '
|
44
|
+
require 'rspec'
|
45
|
+
require 'rspec/core/rake_task'
|
46
46
|
|
47
47
|
### Task: spec
|
48
48
|
desc "Run specs"
|
49
49
|
task :spec => 'spec:doc'
|
50
|
+
task :specs => :spec
|
50
51
|
|
51
52
|
namespace :spec do
|
52
53
|
desc "Run rspec every time there's a change to one of the files"
|
53
54
|
task :autotest do
|
54
|
-
require 'autotest
|
55
|
-
|
56
|
-
|
57
|
-
autotester.run
|
55
|
+
require 'autotest'
|
56
|
+
Autotest.add_discovery { "rspec2" }
|
57
|
+
Autotest.run
|
58
58
|
end
|
59
59
|
|
60
60
|
desc "Generate regular color 'doc' spec output"
|
61
|
-
|
62
|
-
task.
|
63
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 's', '-c']
|
61
|
+
RSpec::Core::RakeTask.new( :doc ) do |task|
|
62
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'd', '-c']
|
64
63
|
end
|
65
64
|
|
66
65
|
desc "Generate spec output with profiling"
|
67
|
-
|
68
|
-
task.
|
69
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'o']
|
66
|
+
RSpec::Core::RakeTask.new( :profile ) do |task|
|
67
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'p', '-p']
|
70
68
|
end
|
71
69
|
|
72
70
|
desc "Generate quiet non-colored plain-text output"
|
73
|
-
|
74
|
-
task.
|
75
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'p']
|
71
|
+
RSpec::Core::RakeTask.new( :quiet ) do |task|
|
72
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'p']
|
76
73
|
end
|
77
74
|
|
78
75
|
desc "Generate HTML output"
|
79
|
-
|
80
|
-
task.
|
81
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'h']
|
76
|
+
RSpec::Core::RakeTask.new( :html ) do |task|
|
77
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'h']
|
82
78
|
end
|
83
79
|
|
84
|
-
end
|
85
|
-
rescue LoadError => err
|
86
|
-
task :no_rspec do
|
87
|
-
$stderr.puts "Specification tasks not defined: %s" % [ err.message ]
|
88
|
-
end
|
89
80
|
|
90
|
-
task :spec => :no_rspec
|
91
|
-
namespace :spec do
|
92
|
-
task :autotest => :no_rspec
|
93
|
-
task :doc => :no_rspec
|
94
|
-
task :profile => :no_rspec
|
95
|
-
task :quiet => :no_rspec
|
96
|
-
task :html => :no_rspec
|
97
81
|
end
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
### Test::Unit tests
|
102
|
-
begin
|
103
|
-
require 'rake/testtask'
|
104
|
-
|
105
|
-
Rake::TestTask.new( :unittests ) do |task|
|
106
|
-
task.libs += [LIBDIR]
|
107
|
-
task.test_files = TEST_FILES
|
108
|
-
task.verbose = true
|
109
|
-
end
|
110
|
-
|
111
|
-
rescue LoadError => err
|
112
|
-
task :no_test do
|
113
|
-
$stderr.puts "Test tasks not defined: %s" % [ err.message ]
|
114
|
-
end
|
115
|
-
|
116
|
-
task :unittests => :no_rspec
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
### RCov (via RSpec) tasks
|
121
|
-
begin
|
122
|
-
gem 'rcov'
|
123
|
-
gem 'rspec', '>= 1.1.3'
|
124
|
-
|
125
|
-
require 'spec'
|
126
|
-
require 'rcov'
|
127
82
|
|
128
83
|
### Task: coverage (via RCov)
|
129
84
|
desc "Build test coverage reports"
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
task.rcov_opts = RCOV_OPTS
|
136
|
-
task.rcov = true
|
137
|
-
end
|
85
|
+
RSpec::Core::RakeTask.new( :coverage ) do |task|
|
86
|
+
task.ruby_opts = [ "-I#{LIBDIR}" ]
|
87
|
+
task.rspec_opts = ['-f', 'p', '-b']
|
88
|
+
task.rcov_opts = RCOV_OPTS
|
89
|
+
task.rcov = true
|
138
90
|
end
|
139
|
-
# unless TEST_FILES.empty?
|
140
|
-
# require 'rcov/rcovtask'
|
141
|
-
|
142
|
-
# Rcov::RcovTask.new do |task|
|
143
|
-
# task.libs += [LIBDIR]
|
144
|
-
# task.test_files = TEST_FILES
|
145
|
-
# task.verbose = true
|
146
|
-
# task.rcov_opts = RCOV_OPTS
|
147
|
-
# end
|
148
|
-
# end
|
149
|
-
|
150
91
|
|
151
92
|
### Task: rcov
|
152
93
|
task :rcov => :coverage
|
@@ -154,50 +95,58 @@ begin
|
|
154
95
|
### Other coverage tasks
|
155
96
|
namespace :coverage do
|
156
97
|
desc "Generate a detailed text coverage report"
|
157
|
-
|
158
|
-
task.spec_files = SPEC_FILES
|
98
|
+
RSpec::Core::RakeTask.new( :text ) do |task|
|
159
99
|
task.rcov_opts = RCOV_OPTS + ['--text-report']
|
160
100
|
task.rcov = true
|
161
101
|
end
|
162
102
|
|
163
103
|
desc "Show differences in coverage from last run"
|
164
|
-
|
165
|
-
task.
|
166
|
-
task.spec_opts = ['-f', 'p', '-b']
|
104
|
+
RSpec::Core::RakeTask.new( :diff ) do |task|
|
105
|
+
task.rspec_opts = ['-f', 'p', '-b']
|
167
106
|
task.rcov_opts = RCOV_OPTS - ['--save'] + ['--text-coverage-diff']
|
168
107
|
task.rcov = true
|
169
108
|
end
|
170
109
|
|
171
|
-
### Task: verify coverage
|
172
|
-
desc "Build coverage statistics"
|
173
|
-
VerifyTask.new( :verify => :rcov ) do |task|
|
174
|
-
task.threshold = COVERAGE_MINIMUM
|
175
|
-
end
|
176
|
-
|
177
110
|
desc "Run RCov in 'spec-only' mode to check coverage from specs"
|
178
|
-
|
179
|
-
task.spec_files = SPEC_FILES
|
111
|
+
RSpec::Core::RakeTask.new( :speconly ) do |task|
|
180
112
|
task.rcov_opts = ['--exclude', RCOV_EXCLUDES, '--text-report', '--save']
|
181
113
|
task.rcov = true
|
182
114
|
end
|
183
115
|
end
|
184
116
|
|
185
117
|
CLOBBER.include( COVERAGE_TARGETDIR )
|
186
|
-
|
187
118
|
rescue LoadError => err
|
188
|
-
task :
|
189
|
-
$stderr.puts "
|
190
|
-
[ err.message ]
|
119
|
+
task :no_rspec do
|
120
|
+
$stderr.puts "Specification tasks not defined: %s" % [ err.message ]
|
191
121
|
end
|
192
122
|
|
193
|
-
task :
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
task :
|
198
|
-
task :
|
123
|
+
task :spec => :no_rspec
|
124
|
+
namespace :spec do
|
125
|
+
task :autotest => :no_rspec
|
126
|
+
task :doc => :no_rspec
|
127
|
+
task :profile => :no_rspec
|
128
|
+
task :quiet => :no_rspec
|
129
|
+
task :html => :no_rspec
|
199
130
|
end
|
200
|
-
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
### Test::Unit tests
|
135
|
+
begin
|
136
|
+
require 'rake/testtask'
|
137
|
+
|
138
|
+
Rake::TestTask.new( :unittests ) do |task|
|
139
|
+
task.libs += [LIBDIR]
|
140
|
+
task.test_files = TEST_FILES
|
141
|
+
task.verbose = true
|
142
|
+
end
|
143
|
+
|
144
|
+
rescue LoadError => err
|
145
|
+
task :no_test do
|
146
|
+
$stderr.puts "Test tasks not defined: %s" % [ err.message ]
|
147
|
+
end
|
148
|
+
|
149
|
+
task :unittests => :no_rspec
|
201
150
|
end
|
202
151
|
|
203
152
|
|
data/spec/bugfixes_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby -w
|
2
2
|
#
|
3
3
|
# Specification for various bugfixes to the LinkParser binding
|
4
|
-
# $Id: bugfixes_spec.rb
|
4
|
+
# $Id: bugfixes_spec.rb,v 6c597e731a87 2010/11/22 15:59:36 ged $
|
5
5
|
#
|
6
6
|
# See the LICENSE file in the distribution for information about copyright and licensing.
|
7
7
|
#
|
@@ -9,27 +9,33 @@
|
|
9
9
|
BEGIN {
|
10
10
|
require 'pathname'
|
11
11
|
basedir = Pathname.new( __FILE__ ).dirname.parent
|
12
|
-
|
12
|
+
|
13
13
|
libdir = basedir + 'lib'
|
14
14
|
extdir = basedir + 'ext'
|
15
|
-
|
15
|
+
|
16
|
+
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
16
17
|
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
17
18
|
$LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s )
|
18
19
|
}
|
19
20
|
|
20
|
-
require '
|
21
|
+
require 'rspec'
|
22
|
+
|
21
23
|
require 'linkparser'
|
22
24
|
|
23
25
|
# @dict = LinkParser::Dictionary.new( :verbosity => 0 )
|
24
26
|
# s = LinkParser::Sentence.new('The cat runs.',@dict)
|
25
27
|
# puts s.linkages.first.verb # "cat.n" !?!?!
|
26
28
|
describe %{bugfix for #3: The first linkage for "The cat runs."} do
|
29
|
+
before( :all ) do
|
30
|
+
$DEBUG = true if ENV['DEBUG']
|
31
|
+
end
|
32
|
+
|
27
33
|
before( :each ) do
|
28
|
-
@dict = LinkParser::Dictionary.new( :verbosity => 0 )
|
34
|
+
@dict = LinkParser::Dictionary.new( 'en', :verbosity => 0 )
|
29
35
|
@sentence = @dict.parse( "The cat runs." )
|
30
36
|
@linkage = @sentence.linkages.first
|
31
37
|
end
|
32
|
-
|
38
|
+
|
33
39
|
|
34
40
|
it "thinks cat is the subject" do
|
35
41
|
@linkage.subject.should == "cat"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby -w
|
2
2
|
#
|
3
3
|
# Specification for the LinkParser::Dictionary class
|
4
|
-
# $Id: dictionary_spec.rb
|
4
|
+
# $Id: dictionary_spec.rb,v a5e7d9e3cf5c 2010/11/25 00:50:55 ged $
|
5
5
|
#
|
6
6
|
# See the LICENSE file in the distribution for information about copyright and licensing.
|
7
7
|
#
|
@@ -9,21 +9,36 @@
|
|
9
9
|
BEGIN {
|
10
10
|
require 'pathname'
|
11
11
|
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
12
|
-
|
12
|
+
|
13
13
|
libdir = basedir + 'lib'
|
14
14
|
extdir = basedir + 'ext'
|
15
|
-
|
15
|
+
|
16
|
+
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
16
17
|
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
17
18
|
$LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s )
|
18
19
|
}
|
19
20
|
|
20
|
-
require '
|
21
|
+
require 'rspec'
|
22
|
+
|
21
23
|
require 'linkparser'
|
22
24
|
|
23
25
|
|
24
26
|
describe LinkParser::Dictionary do
|
27
|
+
|
28
|
+
### Work around current system's locale
|
29
|
+
before( :all ) do
|
30
|
+
$LANG = ENV['LANG']
|
31
|
+
ENV['LANG'] = 'en_US.UTF-8'
|
32
|
+
$DEBUG = true if ENV['DEBUG']
|
33
|
+
end
|
34
|
+
|
35
|
+
after( :all ) do
|
36
|
+
ENV['LANG'] = $LANG
|
37
|
+
end
|
38
|
+
|
39
|
+
|
25
40
|
it "can be instantiated using all default values" do
|
26
|
-
|
41
|
+
LinkParser::Dictionary.new.should be_an_instance_of( LinkParser::Dictionary )
|
27
42
|
end
|
28
43
|
|
29
44
|
it "can be instantiated with an options hash" do
|
@@ -56,35 +71,36 @@ describe LinkParser::Dictionary do
|
|
56
71
|
}.should raise_error( LinkParser::Error )
|
57
72
|
end
|
58
73
|
|
59
|
-
|
74
|
+
context "instance" do
|
60
75
|
|
61
|
-
|
76
|
+
TEST_SENTENCE = "The dog plays with the ball."
|
62
77
|
|
63
|
-
|
78
|
+
before( :each ) do
|
79
|
+
@dict = LinkParser::Dictionary.new(
|
80
|
+
:verbosity => 0,
|
81
|
+
:max_null_count => 18,
|
82
|
+
:echo_on => true
|
83
|
+
)
|
84
|
+
end
|
64
85
|
|
65
|
-
before( :each ) do
|
66
|
-
@dict = LinkParser::Dictionary.new(
|
67
|
-
:verbosity => 0,
|
68
|
-
:max_null_count => 18,
|
69
|
-
:echo_on => true
|
70
|
-
)
|
71
|
-
end
|
72
|
-
|
73
86
|
|
74
|
-
|
75
|
-
|
76
|
-
|
87
|
+
it "knows what the total cost of its linkages are" do
|
88
|
+
@dict.max_cost.should be_an_instance_of(Fixnum)
|
89
|
+
end
|
77
90
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
91
|
+
it "can parse a sentence" do
|
92
|
+
@dict.parse( TEST_SENTENCE ).
|
93
|
+
should be_an_instance_of( LinkParser::Sentence )
|
94
|
+
end
|
95
|
+
|
96
|
+
it "passes on its options to the sentences it parses" do
|
97
|
+
sentence = @dict.parse( TEST_SENTENCE )
|
98
|
+
sentence.options.max_null_count.should == 18
|
99
|
+
sentence.options.verbosity.should == 0
|
100
|
+
sentence.options.echo_on?.should == true
|
101
|
+
end
|
88
102
|
end
|
103
|
+
|
89
104
|
end
|
90
105
|
|
106
|
+
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/ruby -w
|
2
2
|
#
|
3
3
|
# Specification for the LinkParser::Linkage class
|
4
|
-
# $Id: linkage_spec.rb
|
4
|
+
# $Id: linkage_spec.rb,v a5e7d9e3cf5c 2010/11/25 00:50:55 ged $
|
5
5
|
#
|
6
6
|
# See the LICENSE file in the distribution for information about copyright and licensing.
|
7
7
|
#
|
@@ -9,29 +9,32 @@
|
|
9
9
|
BEGIN {
|
10
10
|
require 'pathname'
|
11
11
|
basedir = Pathname.new( __FILE__ ).dirname.parent.parent
|
12
|
-
|
12
|
+
|
13
13
|
libdir = basedir + 'lib'
|
14
14
|
extdir = basedir + 'ext'
|
15
|
-
|
15
|
+
|
16
|
+
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
16
17
|
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
17
18
|
$LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s )
|
18
19
|
}
|
19
20
|
|
20
|
-
require '
|
21
|
+
require 'rspec'
|
22
|
+
|
21
23
|
require 'linkparser'
|
22
24
|
|
23
25
|
|
24
26
|
describe LinkParser::Linkage do
|
25
27
|
|
26
28
|
before( :all ) do
|
27
|
-
@dict = LinkParser::Dictionary.new( :verbosity => 0 )
|
29
|
+
@dict = LinkParser::Dictionary.new( 'en', :verbosity => 0 )
|
30
|
+
$DEBUG = true if ENV['DEBUG']
|
28
31
|
end
|
29
32
|
|
30
33
|
before( :each ) do
|
31
34
|
@sentence = @dict.parse( "The flag was wet." )
|
32
35
|
@linkage = @sentence.linkages.first
|
33
36
|
end
|
34
|
-
|
37
|
+
|
35
38
|
|
36
39
|
# +-------------Xp-------------+
|
37
40
|
# +-----Wd-----+ |
|
@@ -44,14 +47,14 @@ describe LinkParser::Linkage do
|
|
44
47
|
@linkage.diagram.should =~ /flag\.n/
|
45
48
|
@linkage.diagram.should =~ /was\.v/
|
46
49
|
@linkage.diagram.should =~ /wet\.a/
|
47
|
-
|
50
|
+
|
48
51
|
@linkage.diagram.should =~ /-Xp-/
|
49
52
|
@linkage.diagram.should =~ /-Wd-/
|
50
53
|
@linkage.diagram.should =~ /-Ds-/
|
51
54
|
@linkage.diagram.should =~ /-Ss-/
|
52
55
|
@linkage.diagram.should =~ /-Pa-/
|
53
56
|
end
|
54
|
-
|
57
|
+
|
55
58
|
|
56
59
|
# LEFT-WALL Xp <---Xp----> Xp .
|
57
60
|
# (m) LEFT-WALL Wd <---Wd----> Wd flag.n
|
@@ -84,13 +87,13 @@ describe LinkParser::Linkage do
|
|
84
87
|
@linkage.words.should include("LEFT-WALL")
|
85
88
|
@linkage.words.should include("the")
|
86
89
|
@linkage.words.should include("flag.n")
|
87
|
-
@linkage.words.should include("was.v")
|
90
|
+
@linkage.words.should include("was.v-d")
|
88
91
|
@linkage.words.should include("wet.a")
|
89
92
|
@linkage.words.should include(".")
|
90
93
|
@linkage.words.should include("RIGHT-WALL")
|
91
94
|
end
|
92
|
-
|
93
|
-
|
95
|
+
|
96
|
+
|
94
97
|
it "knows how many links are in the sentence" do
|
95
98
|
@linkage.num_links.should == 6
|
96
99
|
end
|
@@ -110,13 +113,13 @@ describe LinkParser::Linkage do
|
|
110
113
|
@linkage.link_lword( 3 ).should == @linkage.words.index('flag.n')
|
111
114
|
|
112
115
|
# (m) was.v Pa <---Pa----> Pa wet.a
|
113
|
-
@linkage.link_lword( 4 ).should == @linkage.words.index('was.v')
|
116
|
+
@linkage.link_lword( 4 ).should == @linkage.words.index('was.v-d')
|
114
117
|
|
115
118
|
# . RW <---RW----> RW RIGHT-WALL
|
116
119
|
@linkage.link_lword( 5 ).should == @linkage.words.index('.')
|
117
120
|
|
118
121
|
end
|
119
|
-
|
122
|
+
|
120
123
|
it "can return the right word for any of its links" do
|
121
124
|
# LEFT-WALL Xp <---Xp----> Xp .
|
122
125
|
@linkage.link_rword( 0 ).should == @linkage.words.index('.')
|
@@ -128,7 +131,7 @@ describe LinkParser::Linkage do
|
|
128
131
|
@linkage.link_rword( 2 ).should == @linkage.words.index('flag.n')
|
129
132
|
|
130
133
|
# (m) flag.n Ss <---Ss----> Ss was.v
|
131
|
-
@linkage.link_rword( 3 ).should == @linkage.words.index('was.v')
|
134
|
+
@linkage.link_rword( 3 ).should == @linkage.words.index('was.v-d')
|
132
135
|
|
133
136
|
# (m) was.v Pa <---Pa----> Pa wet.a
|
134
137
|
@linkage.link_rword( 4 ).should == @linkage.words.index('wet.a')
|
@@ -150,8 +153,8 @@ describe LinkParser::Linkage do
|
|
150
153
|
# Out-of-bounds just returns -1
|
151
154
|
@linkage.link_length( 7 ).should == -1
|
152
155
|
end
|
153
|
-
|
154
|
-
|
156
|
+
|
157
|
+
|
155
158
|
it "can return labels for any of its links" do
|
156
159
|
@linkage.link_label( 0 ).should == "Xp"
|
157
160
|
@linkage.link_label( 1 ).should == "Wd"
|
@@ -162,7 +165,7 @@ describe LinkParser::Linkage do
|
|
162
165
|
|
163
166
|
@linkage.link_label( 7 ).should be_nil
|
164
167
|
end
|
165
|
-
|
168
|
+
|
166
169
|
|
167
170
|
it "can return left labels for any of its links" do
|
168
171
|
@linkage.link_llabel( 0 ).should == "Xp"
|
@@ -174,7 +177,7 @@ describe LinkParser::Linkage do
|
|
174
177
|
|
175
178
|
@linkage.link_llabel( 7 ).should be_nil
|
176
179
|
end
|
177
|
-
|
180
|
+
|
178
181
|
|
179
182
|
it "can return labels for any of its links" do
|
180
183
|
@linkage.link_rlabel( 0 ).should == "Xp"
|
@@ -186,8 +189,8 @@ describe LinkParser::Linkage do
|
|
186
189
|
|
187
190
|
@linkage.link_rlabel( 7 ).should be_nil
|
188
191
|
end
|
189
|
-
|
190
|
-
|
192
|
+
|
193
|
+
|
191
194
|
it "can return the number of domains for any link" do
|
192
195
|
@linkage.link_num_domains( 0 ).should == 0
|
193
196
|
1.upto(4) do |i|
|
@@ -197,25 +200,35 @@ describe LinkParser::Linkage do
|
|
197
200
|
|
198
201
|
@linkage.link_num_domains( 112 ).should == -1
|
199
202
|
end
|
200
|
-
|
201
|
-
|
203
|
+
|
204
|
+
|
202
205
|
it "can return the names of the domains of any of its links" do
|
203
206
|
@linkage.link_domain_names( 0 ).should be_an_instance_of( Array )
|
204
207
|
@linkage.link_domain_names( 0 ).should be_empty
|
205
|
-
|
208
|
+
|
206
209
|
1.upto(4) do |i|
|
207
210
|
@linkage.link_domain_names( i ).should be_an_instance_of( Array )
|
208
211
|
@linkage.link_domain_names( i ).should == ["m"]
|
209
212
|
end
|
210
|
-
|
213
|
+
|
211
214
|
@linkage.link_domain_names( 5 ).should be_an_instance_of( Array )
|
212
215
|
@linkage.link_domain_names( 5 ).should be_empty
|
213
|
-
|
216
|
+
|
214
217
|
@linkage.link_domain_names( 12 ).should be_an_instance_of( Array )
|
215
218
|
@linkage.link_domain_names( 12 ).should be_empty
|
216
219
|
end
|
217
220
|
|
218
|
-
|
221
|
+
|
222
|
+
it "can return the disjunct strings for any of its words" do
|
223
|
+
@linkage.disjunct_strings.should have( @linkage.num_words ).members
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
it "can return parsed disjuncts for any of its words" do
|
228
|
+
@linkage.disjuncts.should have( @linkage.num_words ).members
|
229
|
+
end
|
230
|
+
|
231
|
+
|
219
232
|
it "can report on the various cost metrics of the parse" do
|
220
233
|
@linkage.unused_word_cost.should be_an_instance_of( Fixnum )
|
221
234
|
@linkage.disjunct_cost.should be_an_instance_of( Fixnum )
|
@@ -244,7 +257,7 @@ describe LinkParser::Linkage do
|
|
244
257
|
it "contains link structs describing the linkage" do
|
245
258
|
@linkage.should have(6).links
|
246
259
|
@linkage.links.should be_an_instance_of( Array )
|
247
|
-
|
260
|
+
|
248
261
|
@linkage.links.each do |link|
|
249
262
|
link.should be_a_kind_of( Struct )
|
250
263
|
end
|
@@ -254,7 +267,7 @@ describe LinkParser::Linkage do
|
|
254
267
|
@linkage.links.last.rword.should == 'RIGHT-WALL'
|
255
268
|
@linkage.links.last.label.should == 'RW'
|
256
269
|
@linkage.links[3].lword.should == 'flag.n'
|
257
|
-
@linkage.links[3].rword.should == 'was.v'
|
270
|
+
@linkage.links[3].rword.should == 'was.v-d'
|
258
271
|
@linkage.links[3].label.should == 'Ss'
|
259
272
|
end
|
260
273
|
|
@@ -267,7 +280,13 @@ describe LinkParser::Linkage do
|
|
267
280
|
it "knows when the sentence doesn't have a direct object" do
|
268
281
|
@linkage.object.should be_nil()
|
269
282
|
end
|
270
|
-
|
283
|
+
|
284
|
+
|
285
|
+
it "knows which of its words are nouns" do
|
286
|
+
@linkage.nouns.should have(1).member
|
287
|
+
@linkage.nouns.should include( "flag" )
|
288
|
+
end
|
289
|
+
|
271
290
|
|
272
291
|
MODE1_C_TREE_STRING = "(S (NP The flag)\n (VP was\n (ADJP wet))\n .)\n"
|
273
292
|
MODE2_C_TREE_STRING = "[S [NP The flag NP] [VP was [ADJP wet ADJP] VP] . S] \n"
|
@@ -276,27 +295,27 @@ describe LinkParser::Linkage do
|
|
276
295
|
it "returns an indented sexps for the constituent tree string by default (mode 1)" do
|
277
296
|
@linkage.constituent_tree_string.should == MODE1_C_TREE_STRING
|
278
297
|
end
|
279
|
-
|
298
|
+
|
280
299
|
|
281
300
|
it "returns indented sexps for the constituent tree string if fetched with explicit mode '1'" do
|
282
301
|
@linkage.constituent_tree_string( 1 ).should == MODE1_C_TREE_STRING
|
283
302
|
end
|
284
|
-
|
303
|
+
|
285
304
|
it "returns bracketed constituents if constituent tree string is fetched in mode 2" do
|
286
305
|
@linkage.constituent_tree_string( 2 ).should == MODE2_C_TREE_STRING
|
287
306
|
end
|
288
|
-
|
307
|
+
|
289
308
|
it "returns unindented sexps for the constituent tree string if constituent tree string " +
|
290
309
|
"is fetched in mode 3" do
|
291
310
|
@linkage.constituent_tree_string( 3 ).should == MODE3_C_TREE_STRING
|
292
311
|
end
|
293
|
-
|
312
|
+
|
294
313
|
it "raises an exception for any numeric constituent tree string mode greater than 3" do
|
295
314
|
lambda {
|
296
315
|
@linkage.constituent_tree_string( 4 )
|
297
316
|
}.should raise_error( ArgumentError, /illegal mode 4/i )
|
298
317
|
end
|
299
|
-
|
318
|
+
|
300
319
|
it "raises an exception for any numeric constituent tree string mode less than 1" do
|
301
320
|
lambda {
|
302
321
|
@linkage.constituent_tree_string( 0 )
|
@@ -309,10 +328,10 @@ describe LinkParser::Linkage do
|
|
309
328
|
@linkage.constituent_tree_string( 'glarg' )
|
310
329
|
}.should raise_error( TypeError )
|
311
330
|
end
|
312
|
-
|
331
|
+
|
313
332
|
it "returns an Array of CTree structs for its constituent tree" do
|
314
333
|
rval = @linkage.constituent_tree
|
315
|
-
|
334
|
+
|
316
335
|
rval.should be_an_instance_of( Array )
|
317
336
|
rval.should have(1).members
|
318
337
|
rval.first.should be_a_kind_of( Struct )
|
@@ -320,93 +339,70 @@ describe LinkParser::Linkage do
|
|
320
339
|
rval.first.children.should have(3).members
|
321
340
|
rval.first.children.collect {|n| n.label }.should include( 'NP', 'VP', '.' )
|
322
341
|
end
|
323
|
-
|
324
|
-
it "returns 0 as the number of the current sublinkage since it has no conjunctions" do
|
325
|
-
@linkage.current_sublinkage.should == 0
|
326
|
-
end
|
327
|
-
|
328
342
|
|
329
343
|
it "returns an informational string when inspected" do
|
330
|
-
@linkage.inspect.should =~ /Linkage:0x[[:xdigit:]]+:
|
344
|
+
@linkage.inspect.should =~ /Linkage:0x[[:xdigit:]]+: \[\d+ links\]/
|
331
345
|
end
|
332
|
-
|
333
|
-
|
334
|
-
|
346
|
+
|
347
|
+
|
348
|
+
context "from a simple sentence with a direct object" do
|
335
349
|
before( :each ) do
|
336
350
|
@sentence = @dict.parse( "The dog ran home." )
|
337
351
|
@linkage = @sentence.linkages.first
|
338
352
|
end
|
339
353
|
|
340
354
|
|
341
|
-
it "doesn't have any sublinkages" do
|
342
|
-
@linkage.num_sublinkages.should == 1
|
343
|
-
end
|
344
|
-
|
345
|
-
it "doesn't change after computing its union" do
|
346
|
-
lambda {
|
347
|
-
@linkage.compute_union
|
348
|
-
}.should_not change( @linkage, :num_sublinkages )
|
349
|
-
end
|
350
|
-
|
351
|
-
|
352
355
|
it "knows what word is the object in the sentence" do
|
353
|
-
|
356
|
+
# This depends on the linkage:
|
357
|
+
# +---------------Xp---------------+
|
358
|
+
# +-----Wd----+ |
|
359
|
+
# | +-Ds-+--Ss--+---Ou---+ |
|
360
|
+
# | | | | | |
|
361
|
+
# LEFT-WALL the dog.n ran.v-d home.n-u .
|
362
|
+
# ...but it might not be the first one, so check them all.
|
363
|
+
@sentence.linkages.find {|linkage| linkage.object == 'home' }
|
364
|
+
|
354
365
|
end
|
355
|
-
|
366
|
+
|
356
367
|
end
|
357
368
|
|
358
369
|
|
359
|
-
|
360
|
-
@linkage.should_not have_conjunction()
|
361
|
-
end
|
362
|
-
|
370
|
+
context "deprecated sublinkage API" do
|
363
371
|
|
364
|
-
describe "from a sentence with a conjunction" do
|
365
372
|
before( :each ) do
|
366
|
-
@sentence =
|
367
|
-
@dict.parse( "The ball rolled down the hill and bumped the curb." )
|
373
|
+
@sentence = @dict.parse( "The ball rolled down the hill and bumped the curb." )
|
368
374
|
@linkage = @sentence.linkages.first
|
369
375
|
end
|
370
376
|
|
371
|
-
|
372
|
-
|
373
|
-
@linkage.
|
377
|
+
it "warns about deprecation if #num_sublinkages is called" do
|
378
|
+
@linkage.should_receive( :warn ).with( /deprecated/i )
|
379
|
+
@linkage.num_sublinkages
|
374
380
|
end
|
375
|
-
|
376
|
-
it "has two sublinkages" do
|
377
|
-
@linkage.num_sublinkages.should == 2
|
378
|
-
end
|
379
|
-
|
380
381
|
|
381
|
-
it "
|
382
|
-
|
383
|
-
|
384
|
-
}.should change( @linkage, :num_sublinkages ).from(2).to(3)
|
382
|
+
it "warns about deprecation if #compute_union is called" do
|
383
|
+
@linkage.should_receive( :warn ).with( /deprecated/i )
|
384
|
+
@linkage.compute_union
|
385
385
|
end
|
386
386
|
|
387
|
-
|
388
|
-
|
389
|
-
@linkage.verb.should == 'rolled'
|
387
|
+
it "warn about deprecation if #current_sublinkage= is called" do
|
388
|
+
@linkage.should_receive( :warn ).with( /deprecated/i )
|
390
389
|
@linkage.current_sublinkage = 1
|
391
|
-
@linkage.verb.should == 'bumped'
|
392
390
|
end
|
393
|
-
|
394
391
|
|
395
|
-
it "
|
396
|
-
@linkage.
|
397
|
-
@linkage.current_sublinkage
|
398
|
-
@linkage.object.should == 'curb'
|
392
|
+
it "warn about deprecation if #current_sublinkage is called" do
|
393
|
+
@linkage.should_receive( :warn ).with( /deprecated/i )
|
394
|
+
@linkage.current_sublinkage
|
399
395
|
end
|
400
|
-
|
396
|
+
|
401
397
|
end
|
402
398
|
|
403
399
|
|
404
400
|
it "should know that it's not an imperative sentence" do
|
405
401
|
@linkage.imperative?.should be_false()
|
406
402
|
end
|
407
|
-
|
408
403
|
|
409
|
-
|
404
|
+
|
405
|
+
context "from an imperative sentence" do
|
410
406
|
before( :each ) do
|
411
407
|
@sentence = @dict.parse( "Go to the store!" )
|
412
408
|
@linkage = @sentence.linkages.first
|
@@ -416,19 +412,19 @@ describe LinkParser::Linkage do
|
|
416
412
|
it "knows that it's an imperative sentence" do
|
417
413
|
@linkage.imperative?.should be_true()
|
418
414
|
end
|
419
|
-
|
420
|
-
|
415
|
+
|
416
|
+
|
421
417
|
end
|
422
418
|
|
423
419
|
|
424
|
-
|
425
|
-
|
420
|
+
context "bugfixes" do
|
421
|
+
|
426
422
|
it "also strips off the '.p' from the subject and object when they are plural" do
|
427
423
|
sent = @dict.parse( 'People like goats.' )
|
428
424
|
sent.subject.should_not =~ /people\.p/i
|
429
425
|
sent.object.should_not =~ /goats\.p/i
|
430
426
|
end
|
431
|
-
|
427
|
+
|
432
428
|
end
|
433
429
|
|
434
430
|
end
|