verbvector 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,12 +1,17 @@
1
1
  require 'bundler'
2
+ require 'rdoc/task'
3
+
2
4
  Bundler::GemHelper.install_tasks
3
5
 
4
- #Added to get testing working
5
- require 'rake/testtask'
6
- Rake::TestTask.new(:test)
6
+ task :default => :test
7
7
 
8
- require "rake/rdoctask"
9
- Rake::RDocTask.new do |rd|
10
- rd.rdoc_files.include("lib/**/*.rb")
11
- rd.rdoc_dir = "rdoc"
8
+ RDoc::Task.new do | rd |
9
+ rd.rdoc_dir = "rdoc"
10
+ rd.rdoc_files.include("lib/**/*.rb")
11
+ end
12
+
13
+ require 'rake/testtask'
14
+ Rake::TestTask.new do |t|
15
+ t.ruby_opts = [ '-rminitest/pride' ]
16
+ t.verbose = true
12
17
  end
data/lib/verbvector.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
2
- require "verbvector"
3
- require 'pp'
2
+ require 'verbvector'
4
3
 
5
4
  # Generalized module for handling lingustics processing
6
5
  module Linguistics
@@ -14,13 +13,9 @@ module Linguistics
14
13
  # given type of verb (French, Latin, Spanish). I'm not trying to be
15
14
  # obscure, but I'm trying to be very generalizable.
16
15
  class VerbvectorGenerator
17
- attr_reader :language, :aspect_list, :vector_list, :cluster_methods,
16
+ attr_reader :language, :aspect_list, :vector_list, :cluster_methods,
18
17
  :respondable_methods
19
-
20
- # Class methods go here
21
- class << self
22
- end
23
-
18
+
24
19
  # Initialization
25
20
  #
26
21
  # Takes the descriptive block of the tense structure in a DSL format
@@ -30,7 +25,7 @@ module Linguistics
30
25
  @respondable_methods = []
31
26
  @cluster_methods = {}
32
27
  @language = ""
33
-
28
+
34
29
  # Let's remember the difference between instance_ and class_eval.
35
30
  #
36
31
  # "class_eval sets things up as if you were in the body of a class
@@ -39,26 +34,26 @@ module Linguistics
39
34
  # "instance_eval on a class acts as if you were working inside the
40
35
  # singleton class of self. Therefore, any methods you define will
41
36
  # become class methods." - prog ruby 1.9 v3, prag programmers p.388
42
- #
37
+ #
43
38
  # As such, instance_eval here is about to apply this eval to the
44
39
  # eigenclass. That means any instance of this class will have this
45
40
  # method.
46
- instance_eval &b
47
-
41
+ instance_eval(&b)
42
+
48
43
  @aspect_list.sort!
49
44
  end
50
-
45
+
51
46
  # Vectors are specified at their most atomic
52
47
  # Sometimes it is handy to return all the values that match
53
48
  # "up to" a given aspect and then uniq'ify them
54
49
 
55
- def match_vector_upto_aspect(s)
56
- @vector_list.compact.sort.grep(/#{s}/).map{ |x|
50
+ def match_vector_upto_aspect(s)
51
+ @vector_list.compact.sort.grep(/#{s}/).map{ |x|
57
52
  x.sub(/(^.*#{s}).*/,%q(\1))
58
- }.uniq
53
+ }.uniq
59
54
  end
60
-
61
- # Creates the anonymous module based on the contents of @vector_list.
55
+
56
+ # Creates the anonymous module based on the contents of @vector_list.
62
57
  # The method names in this module are just stubs _except_ those that
63
58
  # are loaded into the @cluster_methods hash. By generating all the
64
59
  # method names we allow +responds_to?+ to work as expected.
@@ -72,13 +67,13 @@ module Linguistics
72
67
  Module.new do
73
68
  # This defines instance methods on the Module
74
69
  # m.instance_methods #=> [:say_foo, :say_bar, :say_bat]
75
-
70
+
76
71
  # Note, you can't use @someArray in the iteration because
77
72
  # self has changed to this anonymous module. Since a block
78
- # is a binding, it has the local context (including 'v')
79
- # bundled up with it -- despte self having changed!
73
+ # is a binding, it has the local context (including 'v')
74
+ # bundled up with it -- despte self having changed!
80
75
  # Therefore, the following works.
81
-
76
+
82
77
  # Define a method for each name in vector_list.
83
78
  raise("Language was not defined." ) if l.nil?
84
79
 
@@ -86,8 +81,8 @@ module Linguistics
86
81
  r << "#{m}"
87
82
  define_method "#{l.downcase}_#{m}".to_sym do
88
83
  end
89
- end
90
-
84
+ end
85
+
91
86
  # Write something to spit out the vectors as well.
92
87
  define_method :vector_list do
93
88
  return v
@@ -98,24 +93,24 @@ module Linguistics
98
93
  end
99
94
 
100
95
  # Spit out the clustered methods
101
- c.each_pair do |k,v|
96
+ c.each_pair do |k,val|
102
97
  define_method k do
103
- v.call
104
- end
98
+ val.call
99
+ end
105
100
  end
106
101
 
107
- end
102
+ end
108
103
  end
109
-
104
+
110
105
  # Language takes a symbol for +l+ the language whose verb we seek to
111
106
  # model. It then takes a block for the sub-specification of the verbs
112
107
  # of that language.
113
- def language(*l,&b)
108
+ def language(*l,&b)
114
109
  return @language if (l[0].nil? and not @language.nil?)
115
110
  @language = l[0]
116
- instance_eval &b
111
+ instance_eval(&b)
117
112
  end
118
-
113
+
119
114
  # Method generates tense vectors based on aspects that are assumed to
120
115
  # apply to all possible vectors. These would be seen as the most
121
116
  # general aspects possible For example, while only *some* vectors are
@@ -124,32 +119,32 @@ module Linguistics
124
119
  def all_vectors(position,&b)
125
120
  # Make sure there is a block given
126
121
  return unless (block_given? or yield.first)
127
-
122
+
128
123
  # Sentinel condition for stopping recursive call
129
124
  return @vector_list unless yield.first
130
125
 
131
126
  # Provided that there was a block, collect the DSL hash into
132
127
  # specifications
133
128
  specifications = yield
134
-
129
+
135
130
  # Extract the first k/v
136
131
  specification = specifications.first
137
132
 
138
133
  # Based on the key for each row, take that content and postpend
139
134
  # it.to_s to the ending of each value held in the hash element value
140
135
  expanded_specification = combinatorialize(specification)
141
-
136
+
142
137
  # Remove the expanded value from the specifications hash
143
- specifications.delete(specification[0])
144
-
138
+ specifications.delete(specification[0])
139
+
145
140
  # Keep a record of aspects we have seen
146
141
  @aspect_list.push specification[0]
147
142
  @aspect_list.uniq!
148
-
143
+
149
144
  # If it's the first go round put the first set of values in. In
150
145
  # general these should be the leftmost and theremfore most general
151
- if @vector_list.empty?
152
- @vector_list = expanded_specification
146
+ if @vector_list.empty?
147
+ @vector_list = expanded_specification
153
148
  else
154
149
  # If there's already a definition in the tens list, for each of
155
150
  # the _existing_ values add the array of strings seen in
@@ -163,49 +158,49 @@ module Linguistics
163
158
  end
164
159
  @vector_list = temp
165
160
  end
166
-
161
+
167
162
  # Recursive call, sentnel contition is at the top of the method
168
163
  all_vectors(position) do
169
164
  specifications
170
165
  end
171
-
172
- instance_eval &b
166
+
167
+ instance_eval(&b)
173
168
  end
174
-
169
+
175
170
  # Method appends vector definitions _if_ the +condition+ (a RegEx) is satisfied
176
171
  def vectors_that(condition,&b)
177
172
  matching_stems = @vector_list.grep condition
178
173
  temp = []
179
-
174
+
180
175
  specifications = yield
181
-
176
+
182
177
  # Extract the first k/v
183
178
  specification = specifications.first
184
179
 
185
180
  # Based on the key for each row, take that content and postpend
186
181
  # it.to_s to the ending of each value held in the hash element value
187
182
  expanded_specification = combinatorialize(specification)
188
-
183
+
189
184
  # Remove the expanded value from the specifications hash
190
- specifications.delete(specification[0])
185
+ specifications.delete(specification[0])
191
186
 
192
187
  # Keep a record of aspects we have seen
193
188
  @aspect_list.push specification[0]
194
189
  @aspect_list.uniq!
195
-
190
+
196
191
  # So we grepped the desired stems and stored them in matching_stems
197
192
  # First we delete those stems (becasue we're going to further specify) them
198
- matching_stems.each do |x|
193
+ matching_stems.each do |x|
199
194
  @vector_list.delete x
200
195
  expanded_specification.each do |u|
201
196
  temp.push x+"_#{u}"
202
197
  end
203
198
  end
204
-
199
+
205
200
  # Combine the original list with the freshly expanded list
206
201
  @vector_list = (@vector_list + temp).sort
207
202
  end
208
-
203
+
209
204
  # Languages are not entirely rational, while something _ought_ exist
210
205
  # by the rules of rational combination, some times they simply _don't_
211
206
  # exist. That's what this method is for.
@@ -215,11 +210,11 @@ module Linguistics
215
210
  # _block_ :: used to add
216
211
  def exception(action, id, &b)
217
212
  if action == :remove
218
- @vector_list.delete_if {|x| x =~ /#{id.to_s}/ }
213
+ @vector_list.delete_if {|x| x =~ /#{id.to_s}/ }
219
214
  elsif action == :add
220
215
  end
221
216
  end
222
-
217
+
223
218
  # Method to take a hash key where the key is an _aspect_ and the value
224
219
  # is an array of specifications valid for that _aspect_.
225
220
  def combinatorialize(h)
@@ -229,7 +224,7 @@ module Linguistics
229
224
  end
230
225
  results
231
226
  end
232
-
227
+
233
228
  # Method to allow "clusters" of simiar vectors to be identified (see:
234
229
  # +match_upto+) based on the 0th string match. These clusters can be
235
230
  # called by the method namd provided as the 2nd argument (0-index)
@@ -246,21 +241,21 @@ module Linguistics
246
241
  # needs
247
242
  #
248
243
  # *Example:* <tt>cluster_on /active_voice.*third/, "as method", :active_thirds</tt>
249
- #
250
- #
251
- # This means you want to collect several method names that match the Regexp and make them identifiable by a call to the
252
- # method +active_thirds+
244
+ #
245
+ #
246
+ # This means you want to collect several method names that match the Regexp and make them identifiable by a call to the
247
+ # method +active_thirds+
253
248
  #
254
249
  # Alternatively, you might want to use a String or Symbol (making use of match_upto).
255
250
  #
256
251
  # *Example:* <tt>cluster_on :tense, "as method", :tense_list</tt>
257
- #
252
+ #
258
253
  # +match+ :: The String or Regex match_upto will use for matching
259
254
  # +junk+ :: Syntactic sugar, a string that makes the DSL look sensible
260
- # +method_name+ :: The method in the anonymous module that returns the matched method names. See +create_module+
255
+ # +method_name+ :: The method in the anonymous module that returns the matched method names. See +create_module+
261
256
  def cluster_on(match, junk, method_name)
262
257
 
263
- clustered_matches =
258
+ clustered_matches =
264
259
  if match.class == Regexp
265
260
  @vector_list.grep match
266
261
  elsif match.class.to_s =~ /^(String|Symbol)/
@@ -273,7 +268,7 @@ module Linguistics
273
268
 
274
269
  unless clustered_matches.nil?
275
270
  # No, this should not be done:
276
- # ...and add them to the @vector_list.
271
+ # ...and add them to the @vector_list.
277
272
  # @vector_list += clustered_matches
278
273
  # Clustered methods need to be defined, for real, somewhere. We
279
274
  # should not claim to respond to them here, but rather let the
@@ -286,9 +281,7 @@ module Linguistics
286
281
  clustered_matches
287
282
  end
288
283
  end
289
-
290
284
  end
291
-
292
285
  end
293
286
  end
294
287
  end
@@ -2,7 +2,7 @@ module Linguistics
2
2
  module Verbs
3
3
  module Verbvector
4
4
  # Version of the gem
5
- VERSION = "0.0.1"
5
+ VERSION = "0.0.2"
6
6
  end
7
7
  end
8
8
  end
@@ -5,7 +5,7 @@ require "verbvector"
5
5
 
6
6
  class TestVerbVector < Test::Unit::TestCase
7
7
  def setup
8
- @vv =
8
+ @vv =
9
9
  Linguistics::Verbs::Verbvector::VerbvectorGenerator.new do
10
10
  language :Latin do
11
11
  all_vectors :start_with do
@@ -14,19 +14,19 @@ class TestVerbVector < Test::Unit::TestCase
14
14
  :mood => %w(indicative subjunctive imperative)
15
15
  }
16
16
  end
17
- vectors_that /.*_indicative_mood/ do
17
+ vectors_that( /.*_indicative_mood/ ) do
18
18
  {
19
19
  :tense => %w(present imperfect future
20
20
  perfect pastperfect futureperfect)
21
21
  }
22
22
  end
23
- vectors_that /.*_subjunctive_mood/ do
23
+ vectors_that( /.*_subjunctive_mood/ ) do
24
24
  {
25
- :tense => %w(present imperfect
25
+ :tense => %w(present imperfect
26
26
  perfect pastperfect)
27
27
  }
28
28
  end
29
- vectors_that /.*_imperative_mood/ do
29
+ vectors_that( /.*_imperative_mood/ ) do
30
30
  {
31
31
  :tense => %w(present)
32
32
  }
@@ -46,7 +46,7 @@ class TestVerbVector < Test::Unit::TestCase
46
46
  def test_basics
47
47
  v = Linguistics::Verbs::Verbvector::VerbvectorGenerator.new do
48
48
  end
49
-
49
+
50
50
  assert_not_nil(v)
51
51
  assert_equal(:Latin, @vv.language)
52
52
  end
@@ -56,9 +56,9 @@ class TestVerbVector < Test::Unit::TestCase
56
56
  assert_equal 5, @vv.match_vector_upto_aspect("mood").length
57
57
  assert_equal 21, @vv.match_vector_upto_aspect("tense").length
58
58
  end
59
-
59
+
60
60
  def test_tense_resolution
61
- tense_list = Array.new(File.open(File.join(File.dirname(__FILE__), *%w[fixtures tense_list])).read.split /\s/)
61
+ tense_list = Array.new(File.open(File.join(File.dirname(__FILE__), *%w[fixtures tense_list])).read.split( /\s/ ))
62
62
  tense_list.sort!
63
63
 
64
64
  tc = Class.new
@@ -68,7 +68,7 @@ class TestVerbVector < Test::Unit::TestCase
68
68
  end
69
69
 
70
70
  def test_clustering_with_regex
71
- t =
71
+ t =
72
72
  Linguistics::Verbs::Verbvector::VerbvectorGenerator.new do
73
73
  language :Latin do
74
74
  all_vectors :start_with do
@@ -77,19 +77,19 @@ class TestVerbVector < Test::Unit::TestCase
77
77
  :mood => %w(indicative subjunctive imperative)
78
78
  }
79
79
  end
80
- vectors_that /.*_indicative_mood/ do
80
+ vectors_that( /.*_indicative_mood/ ) do
81
81
  {
82
82
  :tense => %w(present imperfect future
83
83
  perfect pastperfect futureperfect)
84
84
  }
85
85
  end
86
- vectors_that /.*_subjunctive_mood/ do
86
+ vectors_that( /.*_subjunctive_mood/ ) do
87
87
  {
88
- :tense => %w(present imperfect
88
+ :tense => %w(present imperfect
89
89
  perfect pastperfect)
90
90
  }
91
91
  end
92
- vectors_that /.*_imperative_mood/ do
92
+ vectors_that( /.*_imperative_mood/ ) do
93
93
  {
94
94
  :tense => %w(present)
95
95
  }
@@ -101,7 +101,7 @@ class TestVerbVector < Test::Unit::TestCase
101
101
  }
102
102
  end
103
103
  exception :remove, :passive_voice_imperative_mood_present_tense
104
- cluster_on /active_voice.*third/, "as method", :active_thirds
104
+ cluster_on( /active_voice.*third/, "as method", :active_thirds )
105
105
  end
106
106
  end
107
107
  tc = Class.new
@@ -109,13 +109,13 @@ class TestVerbVector < Test::Unit::TestCase
109
109
  assert_respond_to(tc, :active_thirds)
110
110
  assert_equal(22, tc.active_thirds.length)
111
111
  end
112
-
112
+
113
113
  def test_extension
114
114
  tc = Class.new
115
115
  tc.extend @vv.method_extension_module
116
116
  assert_respond_to(tc, :latin_active_voice_indicative_mood_imperfect_tense_singular_number_third_person)
117
117
  end
118
-
118
+
119
119
  def test_clustering
120
120
  assert_respond_to(@vv, :vectors_that)
121
121
  assert_respond_to(@vv, :cluster_on)
@@ -128,7 +128,7 @@ class TestVerbVector < Test::Unit::TestCase
128
128
 
129
129
  cms=@vv.cluster_methods[:tense_list].call
130
130
  cms.each do |m|
131
- assert_true not(tc.respond_to? m.to_sym)
131
+ assert not(tc.respond_to? m.to_sym)
132
132
  end
133
133
 
134
134
  end
@@ -0,0 +1,82 @@
1
+ require "test/unit"
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
+ require "verbvector"
5
+
6
+ class TestProcBasedDefinition < Test::Unit::TestCase
7
+ def setup
8
+ @dsl_proc = Proc.new do
9
+ language :Latin do
10
+ all_vectors :start_with do
11
+ {
12
+ :voice => %w(active passive),
13
+ :mood => %w(indicative subjunctive imperative)
14
+ }
15
+ end
16
+ vectors_that( /.*_indicative_mood/ ) do
17
+ {
18
+ :tense => %w(present imperfect future
19
+ perfect pastperfect futureperfect)
20
+ }
21
+ end
22
+ vectors_that( /.*_subjunctive_mood/ ) do
23
+ {
24
+ :tense => %w(present imperfect
25
+ perfect pastperfect)
26
+ }
27
+ end
28
+ vectors_that( /.*_imperative_mood/ ) do
29
+ {
30
+ :tense => %w(present)
31
+ }
32
+ end
33
+ all_vectors :end_with do
34
+ {
35
+ :number => %w(singular plural),
36
+ :person => %w(first second third)
37
+ }
38
+ end
39
+ exception :remove, :passive_voice_imperative_mood_present_tense
40
+ cluster_on :tense, "as method", :tense_list
41
+ end
42
+ end
43
+ @vv = Linguistics::Verbs::Verbvector::VerbvectorGenerator.new(&@dsl_proc)
44
+ end
45
+
46
+ def test_basics
47
+ v = Linguistics::Verbs::Verbvector::VerbvectorGenerator.new do
48
+ end
49
+
50
+ assert_not_nil(v)
51
+ assert_equal(:Latin, @vv.language)
52
+ end
53
+
54
+ def test_vector_matcher
55
+ assert_equal 2, @vv.match_vector_upto_aspect("voice").length
56
+ assert_equal 5, @vv.match_vector_upto_aspect("mood").length
57
+ assert_equal 21, @vv.match_vector_upto_aspect("tense").length
58
+ end
59
+
60
+ def test_extension
61
+ tc = Class.new
62
+ tc.extend @vv.method_extension_module
63
+ assert_respond_to(tc, :latin_active_voice_indicative_mood_imperfect_tense_singular_number_third_person)
64
+ end
65
+
66
+ def test_clustering
67
+ assert_respond_to(@vv, :vectors_that)
68
+ assert_respond_to(@vv, :cluster_on)
69
+
70
+ tc = Class.new
71
+ tc.extend @vv.method_extension_module
72
+
73
+ # Make sure that each cluster method is /not/ defined. We want these to
74
+ # be defined "for real," not as a proxy.
75
+
76
+ cms=@vv.cluster_methods[:tense_list].call
77
+ cms.each do |m|
78
+ assert not(tc.respond_to? m.to_sym)
79
+ end
80
+ end
81
+
82
+ end
metadata CHANGED
@@ -1,28 +1,24 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: verbvector
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
4
5
  prerelease:
5
- version: 0.0.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Steven G. Harms
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-02 00:00:00 Z
12
+ date: 2012-10-20 00:00:00.000000000 Z
14
13
  dependencies: []
15
-
16
- description: Use a DSL to describe the verb tense framework of a language and have it generate methods corresponding to each unique vector.
17
- email:
14
+ description: Use a DSL to describe the verb tense framework of a language and have
15
+ it generate methods corresponding to each unique vector.
16
+ email:
18
17
  - github@sgharms.oib.com
19
18
  executables: []
20
-
21
19
  extensions: []
22
-
23
20
  extra_rdoc_files: []
24
-
25
- files:
21
+ files:
26
22
  - .gitignore
27
23
  - Gemfile
28
24
  - README.textile
@@ -31,34 +27,30 @@ files:
31
27
  - lib/verbvector/version.rb
32
28
  - test/fixtures/tense_list
33
29
  - test/test_generator.rb
30
+ - test/test_passed_block.rb
34
31
  - verbvector.gemspec
35
32
  homepage: http://rubygems.org/gems/verbvector
36
33
  licenses: []
37
-
38
34
  post_install_message:
39
35
  rdoc_options: []
40
-
41
- require_paths:
36
+ require_paths:
42
37
  - lib
43
- required_ruby_version: !ruby/object:Gem::Requirement
38
+ required_ruby_version: !ruby/object:Gem::Requirement
44
39
  none: false
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: "0"
49
- required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
45
  none: false
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: "0"
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
55
50
  requirements: []
56
-
57
51
  rubyforge_project: verbvector
58
- rubygems_version: 1.8.5
52
+ rubygems_version: 1.8.23
59
53
  signing_key:
60
54
  specification_version: 3
61
55
  summary: Generates the verb tense "vectors" based on a DSL description syntax.
62
- test_files:
63
- - test/fixtures/tense_list
64
- - test/test_generator.rb
56
+ test_files: []