linkparser 1.0.4 → 1.1.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.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
|