wordnet 0.0.5 → 1.0.0.pre.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
- data/History.rdoc +5 -0
- data/LICENSE +9 -9
- data/Manifest.txt +39 -0
- data/README.rdoc +60 -0
- data/Rakefile +47 -267
- data/TODO +9 -0
- data/WordNet30-license.txt +31 -0
- data/examples/add-laced-boots.rb +35 -0
- data/examples/clothes-with-collars.rb +42 -0
- data/examples/clothesWithTongues.rb +0 -0
- data/examples/domainTree.rb +0 -0
- data/examples/memberTree.rb +0 -0
- data/lib/wordnet/constants.rb +259 -296
- data/lib/wordnet/lexicallink.rb +34 -0
- data/lib/wordnet/lexicon.rb +158 -386
- data/lib/wordnet/mixins.rb +62 -0
- data/lib/wordnet/model.rb +78 -0
- data/lib/wordnet/morph.rb +25 -0
- data/lib/wordnet/semanticlink.rb +52 -0
- data/lib/wordnet/sense.rb +55 -0
- data/lib/wordnet/sumoterm.rb +21 -0
- data/lib/wordnet/synset.rb +404 -859
- data/lib/wordnet/utils.rb +126 -0
- data/lib/wordnet/word.rb +119 -0
- data/lib/wordnet.rb +113 -76
- data/spec/lib/helpers.rb +102 -133
- data/spec/linguawordnet.tests.rb +38 -0
- data/spec/wordnet/lexicon_spec.rb +96 -186
- data/spec/wordnet/model_spec.rb +59 -0
- data/spec/wordnet/semanticlink_spec.rb +42 -0
- data/spec/wordnet/synset_spec.rb +27 -256
- data/spec/wordnet/word_spec.rb +58 -0
- data/spec/wordnet_spec.rb +52 -0
- data.tar.gz.sig +0 -0
- metadata +227 -188
- metadata.gz.sig +0 -0
- data/ChangeLog +0 -720
- data/README +0 -93
- data/Rakefile.local +0 -46
- data/convertdb.rb +0 -417
- data/examples/addLacedBoots.rb +0 -27
- data/examples/clothesWithCollars.rb +0 -36
- data/rake/dependencies.rb +0 -76
- data/rake/helpers.rb +0 -384
- data/rake/manual.rb +0 -755
- data/rake/packaging.rb +0 -112
- data/rake/publishing.rb +0 -303
- data/rake/rdoc.rb +0 -35
- data/rake/style.rb +0 -62
- data/rake/svn.rb +0 -469
- data/rake/testing.rb +0 -192
- data/rake/verifytask.rb +0 -64
- data/utils.rb +0 -838
@@ -0,0 +1,126 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
require 'wordnet' unless defined?( WordNet )
|
7
|
+
|
8
|
+
|
9
|
+
module WordNet
|
10
|
+
|
11
|
+
# A alternate formatter for Logger instances.
|
12
|
+
# @private
|
13
|
+
class LogFormatter < Logger::Formatter
|
14
|
+
|
15
|
+
# The format to output unless debugging is turned on
|
16
|
+
DEFAULT_FORMAT = "[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"
|
17
|
+
|
18
|
+
# The format to output if debugging is turned on
|
19
|
+
DEFAULT_DEBUG_FORMAT = "[%1$s.%2$06d %3$d/%4$s] %5$5s {%6$s} -- %7$s\n"
|
20
|
+
|
21
|
+
|
22
|
+
### Initialize the formatter with a reference to the logger so it can check for log level.
|
23
|
+
def initialize( logger, format=DEFAULT_FORMAT, debug=DEFAULT_DEBUG_FORMAT ) # :notnew:
|
24
|
+
@logger = logger
|
25
|
+
@format = format
|
26
|
+
@debug_format = debug
|
27
|
+
|
28
|
+
super()
|
29
|
+
end
|
30
|
+
|
31
|
+
######
|
32
|
+
public
|
33
|
+
######
|
34
|
+
|
35
|
+
# The Logger object associated with the formatter
|
36
|
+
attr_accessor :logger
|
37
|
+
|
38
|
+
# The logging format string
|
39
|
+
attr_accessor :format
|
40
|
+
|
41
|
+
# The logging format string that's used when outputting in debug mode
|
42
|
+
attr_accessor :debug_format
|
43
|
+
|
44
|
+
|
45
|
+
### Log using either the DEBUG_FORMAT if the associated logger is at ::DEBUG level or
|
46
|
+
### using FORMAT if it's anything less verbose.
|
47
|
+
def call( severity, time, progname, msg )
|
48
|
+
args = [
|
49
|
+
time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
|
50
|
+
time.usec, # %2$d
|
51
|
+
Process.pid, # %3$d
|
52
|
+
Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
|
53
|
+
severity, # %5$s
|
54
|
+
progname, # %6$s
|
55
|
+
msg # %7$s
|
56
|
+
]
|
57
|
+
|
58
|
+
if @logger.level == Logger::DEBUG
|
59
|
+
return self.debug_format % args
|
60
|
+
else
|
61
|
+
return self.format % args
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end # class LogFormatter
|
65
|
+
|
66
|
+
|
67
|
+
# An alternate formatter for Logger instances that outputs +div+ HTML
|
68
|
+
# fragments.
|
69
|
+
# @private
|
70
|
+
class HtmlLogFormatter < Logger::Formatter
|
71
|
+
include ERB::Util # for html_escape()
|
72
|
+
|
73
|
+
# The default HTML fragment that'll be used as the template for each log message.
|
74
|
+
HTML_LOG_FORMAT = %q{
|
75
|
+
<div class="log-message %5$s">
|
76
|
+
<span class="log-time">%1$s.%2$06d</span>
|
77
|
+
[
|
78
|
+
<span class="log-pid">%3$d</span>
|
79
|
+
/
|
80
|
+
<span class="log-tid">%4$s</span>
|
81
|
+
]
|
82
|
+
<span class="log-level">%5$s</span>
|
83
|
+
:
|
84
|
+
<span class="log-name">%6$s</span>
|
85
|
+
<span class="log-message-text">%7$s</span>
|
86
|
+
</div>
|
87
|
+
}
|
88
|
+
|
89
|
+
### Override the logging formats with ones that generate HTML fragments
|
90
|
+
def initialize( logger, format=HTML_LOG_FORMAT ) # :notnew:
|
91
|
+
@logger = logger
|
92
|
+
@format = format
|
93
|
+
super()
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
######
|
98
|
+
public
|
99
|
+
######
|
100
|
+
|
101
|
+
# The HTML fragment that will be used as a format() string for the log
|
102
|
+
attr_accessor :format
|
103
|
+
|
104
|
+
|
105
|
+
### Return a log message composed out of the arguments formatted using the
|
106
|
+
### formatter's format string
|
107
|
+
def call( severity, time, progname, msg )
|
108
|
+
args = [
|
109
|
+
time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
|
110
|
+
time.usec, # %2$d
|
111
|
+
Process.pid, # %3$d
|
112
|
+
Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
|
113
|
+
severity.downcase, # %5$s
|
114
|
+
progname, # %6$s
|
115
|
+
html_escape( msg ).gsub(/\n/, '<br />') # %7$s
|
116
|
+
]
|
117
|
+
|
118
|
+
return self.format % args
|
119
|
+
end
|
120
|
+
|
121
|
+
end # class HtmlLogFormatter
|
122
|
+
|
123
|
+
end # module WordNet
|
124
|
+
|
125
|
+
# vim: set nosta noet ts=4 sw=4:
|
126
|
+
|
data/lib/wordnet/word.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'wordnet' unless defined?( WordNet )
|
4
|
+
require 'wordnet/mixins'
|
5
|
+
require 'wordnet/model'
|
6
|
+
|
7
|
+
# WordNet word model class
|
8
|
+
class WordNet::Word < WordNet::Model( :words )
|
9
|
+
include WordNet::Constants
|
10
|
+
|
11
|
+
# Table "public.words"
|
12
|
+
# Column | Type | Modifiers
|
13
|
+
# --------+-----------------------+--------------------
|
14
|
+
# wordid | integer | not null default 0
|
15
|
+
# lemma | character varying(80) | not null
|
16
|
+
# Indexes:
|
17
|
+
# "pk_words" PRIMARY KEY, btree (wordid)
|
18
|
+
# "unq_words_lemma" UNIQUE, btree (lemma)
|
19
|
+
# Referenced by:
|
20
|
+
# TABLE "adjpositions" CONSTRAINT "fk_adjpositions_wordid"
|
21
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
22
|
+
# TABLE "bncconvtasks" CONSTRAINT "fk_bncconvtasks_wordid"
|
23
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
24
|
+
# TABLE "bncimaginfs" CONSTRAINT "fk_bncimaginfs_wordid"
|
25
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
26
|
+
# TABLE "bncs" CONSTRAINT "fk_bncs_wordid"
|
27
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
28
|
+
# TABLE "bncspwrs" CONSTRAINT "fk_bncspwrs_wordid"
|
29
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
30
|
+
# TABLE "casedwords" CONSTRAINT "fk_casedwords_wordid"
|
31
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
32
|
+
# TABLE "lexlinks" CONSTRAINT "fk_lexlinks_word1id"
|
33
|
+
# FOREIGN KEY (word1id) REFERENCES words(wordid)
|
34
|
+
# TABLE "lexlinks" CONSTRAINT "fk_lexlinks_word2id"
|
35
|
+
# FOREIGN KEY (word2id) REFERENCES words(wordid)
|
36
|
+
# TABLE "morphmaps" CONSTRAINT "fk_morphmaps_wordid"
|
37
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
38
|
+
# TABLE "sensemaps2021" CONSTRAINT "fk_sensemaps2021_wordid"
|
39
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
40
|
+
# TABLE "sensemaps2130" CONSTRAINT "fk_sensemaps2130_wordid"
|
41
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
42
|
+
# TABLE "senses20" CONSTRAINT "fk_senses20_wordid"
|
43
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
44
|
+
# TABLE "senses21" CONSTRAINT "fk_senses21_wordid"
|
45
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
46
|
+
# TABLE "senses" CONSTRAINT "fk_senses_wordid"
|
47
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
48
|
+
# TABLE "vframemaps" CONSTRAINT "fk_vframemaps_wordid"
|
49
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
50
|
+
# TABLE "vframesentencemaps" CONSTRAINT "fk_vframesentencemaps_wordid"
|
51
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
52
|
+
# TABLE "vnclassmembers" CONSTRAINT "fk_vnclassmembers_wordid"
|
53
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
54
|
+
# TABLE "vnframemaps" CONSTRAINT "fk_vnframemaps_wordid"
|
55
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
56
|
+
# TABLE "vnrolemaps" CONSTRAINT "fk_vnrolemaps_wordid"
|
57
|
+
# FOREIGN KEY (wordid) REFERENCES words(wordid)
|
58
|
+
|
59
|
+
|
60
|
+
set_primary_key :wordid
|
61
|
+
|
62
|
+
##
|
63
|
+
# The WordNet::Sense objects that relate the word with its Synsets
|
64
|
+
one_to_many :senses,
|
65
|
+
:key => :wordid,
|
66
|
+
:primary_key => :wordid
|
67
|
+
|
68
|
+
##
|
69
|
+
# The WordNet::Synsets related to the word via its senses
|
70
|
+
many_to_many :synsets,
|
71
|
+
:join_table => :senses,
|
72
|
+
:left_key => :wordid,
|
73
|
+
:right_key => :synsetid
|
74
|
+
|
75
|
+
##
|
76
|
+
# The WordNet::Morphs related to the word
|
77
|
+
many_to_many :morphs,
|
78
|
+
:join_table => :morphmaps,
|
79
|
+
:left_key => :wordid,
|
80
|
+
:right_key => :morphid
|
81
|
+
|
82
|
+
|
83
|
+
### Return the stringified word; alias for #lemma.
|
84
|
+
def to_s
|
85
|
+
return self.lemma
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
### Return a dataset for all of the Word's Synsets that are nouns.
|
90
|
+
def nouns
|
91
|
+
return synsets_dataset.nouns
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
### Return a dataset for all of the Word's Synsets that are verbs.
|
96
|
+
def verbs
|
97
|
+
return synsets_dataset.verbs
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
### Return a dataset for all of the Word's Synsets that are adjectives.
|
102
|
+
def adjectives
|
103
|
+
return synsets_dataset.adjectives
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
### Return a dataset for all of the Word's Synsets that are adverbs.
|
108
|
+
def adverbs
|
109
|
+
return synsets_dataset.adverbs
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
### Return a dataset for all of the Word's Synsets that are adjective satellites.
|
114
|
+
def adjective_satellites
|
115
|
+
return synsets_dataset.adjective_satellites
|
116
|
+
end
|
117
|
+
|
118
|
+
end # class WordNet::Word
|
119
|
+
|
data/lib/wordnet.rb
CHANGED
@@ -1,87 +1,124 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# == Synopsis
|
5
|
-
#
|
6
|
-
# require "WordNet"
|
7
|
-
#
|
8
|
-
# # Create a new lexicon object
|
9
|
-
# lex = WordNet::Lexicon::new
|
10
|
-
#
|
11
|
-
# # Look up the synsets for "language" and "computer program"
|
12
|
-
# languageSynset = lex.lookup_synsets( "language", WordNet::Noun, 3 )
|
13
|
-
# programSynset = lex.lookup_synsets( "program", WordNet::Noun, 3 )
|
14
|
-
#
|
15
|
-
# # Create a new synset for programming languages, set its gloss, link it to its
|
16
|
-
# # hypernym and holonym, and save everything to the database.
|
17
|
-
# progLangSynset = lex.create_synset( "programming language", WordNet::Noun )
|
18
|
-
# progLangSynset.gloss = "a system of human-readable symbols and words "\
|
19
|
-
# "for encoding instructions for a computer"
|
20
|
-
# progLangSynset.hypernyms += languageSynset
|
21
|
-
# languageSynset.hyponyms += progLangSynset
|
22
|
-
# progLangSynset.holonyms += programSynset
|
23
|
-
# programSynset.stuff_meronyms += progLangSynset
|
24
|
-
# [ progLangSynset, programSynset, languageSynset ].each do |synset|
|
25
|
-
# synset.store
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
# # Create a new synset for Ruby, link it, and save it
|
29
|
-
# rubySynset = lex.create_synset( "Ruby", Wordnet::Noun )
|
30
|
-
# rubySynset.gloss = "an interpreted scripting language for quick and easy object-oriented programming"
|
31
|
-
# rubySynset.hypernyms += languageSyn ; languageSynset.hyponyms += rubySyn
|
32
|
-
# rubySynset.write ; languageSynset.write
|
33
|
-
#
|
34
|
-
# == Description
|
35
|
-
#
|
36
|
-
# This is a Ruby interface to the WordNet lexical database. It's mostly a port
|
37
|
-
# of Dan Brian's Lingua::Wordnet Perl module, modified a bit to be more
|
38
|
-
# Ruby-ish.
|
39
|
-
#
|
40
|
-
# == Author
|
41
|
-
#
|
42
|
-
# The Lingua::Wordnet module by Dan Brian, on which this code is based, falls under
|
43
|
-
# the following license:
|
44
|
-
#
|
45
|
-
# Copyright 1999,2000,2001 by Dan Brian.
|
46
|
-
#
|
47
|
-
# This program is free software; you can redistribute it and/or modify
|
48
|
-
# it under the same terms as Perl itself.
|
49
|
-
#
|
50
|
-
# Written by Michael Granger <ged@FaerieMUD.org>
|
51
|
-
#
|
52
|
-
# Copyright (c) 2002,2003,2005 The FaerieMUD Consortium. All rights reserved.
|
53
|
-
#
|
54
|
-
# This module is free software. You may use, modify, and/or redistribute this
|
55
|
-
# software under the terms of the Perl Artistic License. (See
|
56
|
-
# http://language.perl.com/misc/Artistic.html)
|
57
|
-
#
|
58
|
-
# == Version
|
59
|
-
#
|
60
|
-
# $Id: wordnet.rb 90 2008-07-09 23:02:53Z deveiant $
|
61
|
-
#
|
62
|
-
|
63
|
-
# Try to provide underbarred alternatives for camelCased methods. Requires the
|
64
|
-
# 'CrossCase' module.
|
65
|
-
begin
|
66
|
-
require 'crosscase'
|
67
|
-
rescue LoadError
|
68
|
-
end
|
69
|
-
|
70
|
-
### The main namespace for WordNet classes
|
71
|
-
module WordNet
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#encoding: utf-8
|
72
3
|
|
73
|
-
|
74
|
-
|
4
|
+
require 'logger'
|
5
|
+
require 'sequel'
|
75
6
|
|
76
|
-
|
77
|
-
|
7
|
+
# This is a Ruby interface to the WordNet® lexical database. It uses the WordNet-SQL
|
8
|
+
# project's databases instead of reading from the canonical flatfiles for speed and
|
9
|
+
# easy modification.
|
10
|
+
module WordNet
|
78
11
|
|
79
12
|
# Release version
|
80
|
-
VERSION = '0.0
|
13
|
+
VERSION = '1.0.0'
|
14
|
+
|
15
|
+
# VCS revision
|
16
|
+
REVISION = %q$Revision: $
|
17
|
+
|
18
|
+
# Abort if not >=1.9.2
|
19
|
+
vvec = lambda {|version| version.split('.').collect {|v| v.to_i }.pack('N*') }
|
20
|
+
abort "This version of WordNet requires Ruby 1.9.2 or greater." unless
|
21
|
+
vvec[RUBY_VERSION] >= vvec['1.9.2']
|
22
|
+
|
23
|
+
|
24
|
+
### Lexicon exception - something has gone wrong in the internals of the
|
25
|
+
### lexicon.
|
26
|
+
class LexiconError < StandardError ; end
|
27
|
+
|
28
|
+
### Lookup error - the object being looked up either doesn't exist or is
|
29
|
+
### malformed
|
30
|
+
class LookupError < StandardError ; end
|
31
|
+
|
81
32
|
|
82
33
|
require 'wordnet/constants'
|
34
|
+
include WordNet::Constants
|
35
|
+
require 'wordnet/utils'
|
36
|
+
|
37
|
+
#
|
38
|
+
# Logging
|
39
|
+
#
|
40
|
+
|
41
|
+
@default_logger = Logger.new( $stderr )
|
42
|
+
@default_logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
|
43
|
+
|
44
|
+
@default_log_formatter = WordNet::LogFormatter.new( @default_logger )
|
45
|
+
@default_logger.formatter = @default_log_formatter
|
46
|
+
|
47
|
+
@logger = @default_logger
|
48
|
+
|
49
|
+
class << self
|
50
|
+
# @return [Logger::Formatter] the log formatter that will be used when the logging
|
51
|
+
# subsystem is reset
|
52
|
+
attr_accessor :default_log_formatter
|
53
|
+
|
54
|
+
# @return [Logger] the logger that will be used when the logging subsystem is reset
|
55
|
+
attr_accessor :default_logger
|
56
|
+
|
57
|
+
# @return [Logger] the logger that's currently in effect
|
58
|
+
attr_accessor :logger
|
59
|
+
alias_method :log, :logger
|
60
|
+
alias_method :log=, :logger=
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
### Reset the global logger object to the default
|
65
|
+
### @return [void]
|
66
|
+
def self::reset_logger
|
67
|
+
self.logger = self.default_logger
|
68
|
+
self.logger.level = Logger::WARN
|
69
|
+
self.logger.formatter = self.default_log_formatter
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
### Returns +true+ if the global logger has not been set to something other than
|
74
|
+
### the default one.
|
75
|
+
def self::using_default_logger?
|
76
|
+
return self.logger == self.default_logger
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
### Get the WordNet version.
|
81
|
+
### @return [String] the library's version
|
82
|
+
def self::version_string( include_buildnum=false )
|
83
|
+
vstring = "%s %s" % [ self.name, VERSION ]
|
84
|
+
vstring << " (build %s)" % [ REVISION[/: ([[:xdigit:]]+)/, 1] || '0' ] if include_buildnum
|
85
|
+
return vstring
|
86
|
+
end
|
87
|
+
|
88
|
+
|
83
89
|
require 'wordnet/lexicon'
|
90
|
+
|
91
|
+
require 'wordnet/model'
|
92
|
+
require 'wordnet/sense'
|
84
93
|
require 'wordnet/synset'
|
94
|
+
require 'wordnet/semanticlink'
|
95
|
+
require 'wordnet/lexicallink'
|
96
|
+
require 'wordnet/word'
|
97
|
+
require 'wordnet/morph'
|
98
|
+
require 'wordnet/sumoterm'
|
99
|
+
|
100
|
+
#
|
101
|
+
# Backward-compatibility stuff
|
102
|
+
#
|
103
|
+
|
104
|
+
# :section: Backward-compatibility
|
105
|
+
|
106
|
+
# Backward-compatibility constant
|
107
|
+
Noun = :n
|
108
|
+
|
109
|
+
# Backward-compatibility constant
|
110
|
+
Verb = :v
|
111
|
+
|
112
|
+
# Backward-compatibility constant
|
113
|
+
Adjective = :a
|
114
|
+
|
115
|
+
# Backward-compatibility constant
|
116
|
+
Adverb = :r
|
117
|
+
|
118
|
+
# Backward-compatibility constant
|
119
|
+
Other = :s
|
120
|
+
|
121
|
+
|
85
122
|
|
86
123
|
end # module WordNet
|
87
124
|
|
data/spec/lib/helpers.rb
CHANGED
@@ -1,155 +1,124 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
+
# coding: utf-8
|
2
3
|
|
3
|
-
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
BEGIN {
|
5
|
+
require 'pathname'
|
6
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent
|
7
|
+
|
8
|
+
libdir = basedir + "lib"
|
9
|
+
|
10
|
+
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
11
|
+
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
12
|
+
}
|
13
|
+
|
14
|
+
require 'rspec'
|
15
|
+
require 'wordnet'
|
12
16
|
|
17
|
+
|
18
|
+
### RSpec helper functions.
|
13
19
|
module WordNet::SpecHelpers
|
14
20
|
|
21
|
+
# A logger that logs to an array.
|
22
|
+
class ArrayLogger
|
23
|
+
### Create a new ArrayLogger that will append content to +array+.
|
24
|
+
def initialize( array )
|
25
|
+
@array = array
|
26
|
+
end
|
27
|
+
|
28
|
+
### Write the specified +message+ to the array.
|
29
|
+
def write( message )
|
30
|
+
@array << message
|
31
|
+
end
|
32
|
+
|
33
|
+
### No-op -- this is here just so Logger doesn't complain
|
34
|
+
def close; end
|
35
|
+
|
36
|
+
end # class ArrayLogger
|
37
|
+
|
38
|
+
|
39
|
+
unless defined?( LEVEL )
|
40
|
+
LEVEL = {
|
41
|
+
:debug => Logger::DEBUG,
|
42
|
+
:info => Logger::INFO,
|
43
|
+
:warn => Logger::WARN,
|
44
|
+
:error => Logger::ERROR,
|
45
|
+
:fatal => Logger::FATAL,
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
|
15
50
|
###############
|
16
51
|
module_function
|
17
52
|
###############
|
18
53
|
|
19
|
-
###
|
20
|
-
|
21
|
-
|
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
|
54
|
+
### Make an easily-comparable version vector out of +ver+ and return it.
|
55
|
+
def vvec( ver )
|
56
|
+
return ver.split('.').collect {|char| char.to_i }.pack('N*')
|
31
57
|
end
|
32
|
-
|
33
|
-
end
|
34
58
|
|
35
|
-
# Override the badly-formatted output of the RSpec HTML formatter
|
36
|
-
require 'spec/runner/formatter/html_formatter'
|
37
59
|
|
38
|
-
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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>"
|
60
|
+
### Reset the logging subsystem to its default state.
|
61
|
+
def reset_logging
|
62
|
+
WordNet.reset_logger
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
### Alter the output of the default log formatter to be pretty in SpecMate output
|
67
|
+
def setup_logging( level=Logger::FATAL )
|
68
|
+
|
69
|
+
# Turn symbol-style level config into Logger's expected Fixnum level
|
70
|
+
if LEVEL.key?( level )
|
71
|
+
level = LEVEL[ level ]
|
64
72
|
end
|
65
73
|
|
66
|
-
|
67
|
-
|
74
|
+
logger = Logger.new( $stderr )
|
75
|
+
WordNet.logger = logger
|
76
|
+
WordNet.logger.level = level
|
77
|
+
|
78
|
+
# Only do this when executing from a spec in TextMate
|
79
|
+
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
80
|
+
Thread.current['logger-output'] = []
|
81
|
+
logdevice = ArrayLogger.new( Thread.current['logger-output'] )
|
82
|
+
WordNet.logger = Logger.new( logdevice )
|
83
|
+
# WordNet.logger.level = level
|
84
|
+
WordNet.logger.formatter = WordNet::HtmlLogFormatter.new( logger )
|
68
85
|
end
|
69
|
-
|
70
|
-
@output.puts " </div>",
|
71
|
-
" </dd>"
|
72
|
-
@output.flush
|
73
86
|
end
|
74
87
|
|
75
88
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
89
|
+
### Make a WordNet::Directory that will use the given +conn+ object as its
|
90
|
+
### LDAP connection. Also pre-loads the schema object and fixtures some other
|
91
|
+
### external data.
|
92
|
+
def get_fixtured_directory( conn )
|
93
|
+
LDAP::SSLConn.stub( :new ).and_return( @conn )
|
94
|
+
conn.stub( :root_dse ).and_return( nil )
|
95
|
+
directory = WordNet.directory( TEST_LDAPURI )
|
96
|
+
directory.stub( :schema ).and_return( SCHEMA )
|
97
|
+
|
98
|
+
return directory
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
### Mock with Rspec
|
105
|
+
RSpec.configure do |c|
|
106
|
+
c.mock_with :rspec
|
107
|
+
c.include( WordNet::SpecHelpers )
|
108
|
+
|
109
|
+
c.treat_symbols_as_metadata_keys_with_true_values = true
|
110
|
+
|
111
|
+
if Gem::Specification.find_all_by_name( 'pg' ).empty?
|
112
|
+
c.filter_run_excluding( :requires_pg )
|
113
|
+
end
|
114
|
+
|
115
|
+
begin
|
116
|
+
uri = WordNet::Lexicon.default_db_uri
|
117
|
+
WordNet.log.info "Database tests will use: #{uri}"
|
118
|
+
rescue WordNet::LexiconError
|
119
|
+
c.filter_run_excluding( :requires_database )
|
152
120
|
end
|
153
121
|
end
|
154
122
|
|
123
|
+
# vim: set nosta noet ts=4 sw=4:
|
155
124
|
|