verbs 2.2.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # The program conjugates most common english verbs with the following option:
2
- # * :tense => :past or :present or :future
3
- # * :person => :first or :second or :third
4
- # * :plurality => :singular or :plural
5
- # * :aspect => :habitual or :perfect or :perfective or :progressive or :prospective
6
- # * :mood => :indicative or :imperative or :subjunctive
7
- # Respective defaults are :present, :third, :singular, :habitual, and :indicative
4
+ # * :tense => :past or :present or :future (default: :present)
5
+ # * :person => :first or :second or :third (default: :third)
6
+ # * :plurality => :singular or :plural (default: :singular)
7
+ # * :aspect => :habitual or :perfect or :perfective or :progressive or :prospective (default: :habitual, or :perfective for past tense)
8
+ # * :mood => :indicative or :imperative or :subjunctive (default: :indicative)
9
+ # * :diathesis => :active or :passive (default: :active)
8
10
  #
9
11
  # Author:: Andy Rossmeissl
10
12
  # Copyright:: Copyright (c) 2009 Andy Rossmeissl
@@ -24,7 +26,9 @@ module Verbs
24
26
 
25
27
  # Creates initial variables for class
26
28
  def initialize
27
- @irregulars, @single_terminal_consonants, @copulars = {}, [], {}
29
+ @irregulars = {}
30
+ @single_terminal_consonants = []
31
+ @copulars = {}
28
32
  end
29
33
 
30
34
  # Determines irregular verbs from the expression
@@ -38,9 +42,13 @@ module Verbs
38
42
  # create new Verb object with infinitive and &blk
39
43
  irregular = ::Verbs::Verb.new infinitive, &blk
40
44
  else
41
- raise ArgumentError, "Standard irregular verbs must specify preterite and past participle forms" unless preterite and past_participle
45
+ unless preterite && past_participle
46
+ raise ArgumentError,
47
+ 'Standard irregular verbs must specify preterite and past participle forms'
48
+ end
49
+
42
50
  # create new Verb object with infinitive, preterite and past_participle
43
- irregular = ::Verbs::Verb.new infinitive, :preterite => preterite, :past_participle => past_participle
51
+ irregular = ::Verbs::Verb.new infinitive, preterite: preterite, past_participle: past_participle
44
52
  end
45
53
  @irregulars[infinitive] = irregular
46
54
  end
@@ -77,10 +85,10 @@ module Verbs
77
85
  plurality = options[:plurality] || :singular # singular, plural
78
86
  diathesis = options[:diathesis] || :active # active, passive
79
87
  mood = options[:mood] || :indicative # imperative, subjunctive
80
- aspect = options[:aspect] || :habitual # perfective, habitual, progressive, perfect, prospective
88
+ aspect = options[:aspect] || default_aspect(options) # perfective, habitual, progressive, perfect, prospective
81
89
 
82
- check_for_improper_constructions(tense, person, mood) # find incompatabilities
83
- form = form_for(tense, aspect) # find form array based on tense and aspect
90
+ check_for_improper_constructions(infinitive, tense, person, mood, diathesis) # find incompatabilities
91
+ form = form_for(tense, aspect, diathesis) # find form array based on tense and aspect
84
92
 
85
93
  # map form array to conjugation array, applying infinitive and options to the array
86
94
  conjugation = form.map { |e| resolve e, infinitive, tense, person, plurality, mood }.join(' ').strip
@@ -99,15 +107,15 @@ module Verbs
99
107
  # * options, list of options given to determine conjugation
100
108
  def subject(options)
101
109
  case [options[:person], options[:plurality]]
102
- when [:first, :singular]
110
+ when %i[first singular]
103
111
  'I'
104
- when [:first, :plural]
112
+ when %i[first plural]
105
113
  'we'
106
- when [:second, :singular], [:second, :plural]
114
+ when %i[second singular], %i[second plural]
107
115
  'you'
108
- when [:third, :singular]
116
+ when %i[third singular]
109
117
  'he'
110
- when [:third, :plural]
118
+ when %i[third plural]
111
119
  'they'
112
120
  end
113
121
  end
@@ -143,13 +151,13 @@ module Verbs
143
151
  # * plurality, an option given by the user
144
152
  # * mood, an option given by the user
145
153
  def inflect(infinitive, inflection, person, plurality, mood)
146
- send(*([inflection, infinitive, person, plurality, mood][0, method(inflection).arity + 1]))
154
+ send(*[inflection, infinitive, person, plurality, mood][0, method(inflection).arity + 1])
147
155
  end
148
156
 
149
157
  def present(infinitive, person, plurality, mood)
150
- if verb = conjugations.irregulars[infinitive]
151
- conjugate_irregular(verb, :tense => :present, :person => person, :plurality => plurality, :mood => mood)
152
- elsif person == :third and plurality == :singular and not mood == :subjunctive
158
+ if (verb = conjugations.irregulars[infinitive])
159
+ conjugate_irregular(verb, tense: :present, person: person, plurality: plurality, mood: mood)
160
+ elsif (person == :third) && (plurality == :singular) && (mood != :subjunctive)
153
161
  present_third_person_singular_form_for infinitive
154
162
  else
155
163
  infinitive
@@ -163,8 +171,8 @@ module Verbs
163
171
  # * plurality, an option given by the user
164
172
  # * mood, an option given by the user
165
173
  def past(infinitive, person, plurality, mood)
166
- if verb = conjugations.irregulars[infinitive]
167
- conjugate_irregular(verb, :tense => :past, :person => person, :plurality => plurality, :mood => mood)
174
+ if (verb = conjugations.irregulars[infinitive])
175
+ conjugate_irregular(verb, tense: :past, person: person, plurality: plurality, mood: mood)
168
176
  else
169
177
  regular_preterite_for infinitive
170
178
  end
@@ -174,36 +182,40 @@ module Verbs
174
182
  # Params:
175
183
  # * infinitive, the given verb
176
184
  def present_participle(infinitive)
177
- if infinitive.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(infinitive.to_sym)
178
- present_participle_with_doubled_terminal_consonant_for infinitive
179
- elsif infinitive.to_s.match(/c$/)
180
- infinitive.to_s.concat('king').to_sym
181
- elsif infinitive.to_s.match(/^be$/) or infinitive.to_s.match(/ye$/) or infinitive.to_s.match(/oe$/) or infinitive.to_s.match(/nge$/) or infinitive.to_s.match(/ee$/)
182
- infinitive.to_s.concat('ing').to_sym
183
- elsif infinitive.to_s.match(/ie$/)
184
- infinitive.to_s[0..-2].concat('ying').to_sym
185
- elsif infinitive.to_s.match(/e$/)
186
- infinitive.to_s[0..-2].concat('ing').to_sym
187
- else
188
- infinitive.to_s[0..-1].concat('ing').to_sym
185
+ if infinitive.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{CONSONANTS_WITHOUT_C_PATTERN}$/) &&
186
+ !conjugations.single_terminal_consonants.include?(infinitive.to_sym)
187
+ return present_participle_with_doubled_terminal_consonant_for infinitive
189
188
  end
189
+
190
+ case infinitive.to_s
191
+ when /c$/
192
+ "#{infinitive}k"
193
+ when /(^be|ye|oe|nge|ee)$/
194
+ infinitive.to_s
195
+ when /ie$/
196
+ infinitive.to_s.gsub(/ie$/, 'y')
197
+ when /#{VOWEL_PATTERN}#{CONSONANT_PATTERN}e$/, /ue$/
198
+ infinitive.to_s[0..-2]
199
+ else # rubocop:disable Lint/DuplicateBranch
200
+ infinitive.to_s
201
+ end.dup.concat('ing').to_sym
190
202
  end
191
203
 
192
204
  # Forming verb to apply past tense endings
193
205
  # Params:
194
206
  # * infinitive, the given verb
195
207
  def past_participle(infinitive)
196
- if verb = conjugations.irregulars[infinitive]
197
- conjugate_irregular(verb, :tense => :past, :derivative => :participle)
208
+ if (verb = conjugations.irregulars[infinitive])
209
+ conjugate_irregular(verb, tense: :past, derivative: :participle)
198
210
  else
199
211
  regular_preterite_for infinitive
200
212
  end
201
213
  end
202
214
 
203
- #
215
+ #
204
216
  # Params:
205
- # * verb,
206
- # * options,
217
+ # * verb,
218
+ # * options,
207
219
  def conjugate_irregular(verb, options)
208
220
  return verb[options] if verb[options]
209
221
 
@@ -212,9 +224,9 @@ module Verbs
212
224
  plurality = options[:plurality]
213
225
  derivative = options[:derivative]
214
226
 
215
- if [tense, person, plurality] == [:present, :third, :singular]
227
+ if [tense, person, plurality] == %i[present third singular]
216
228
  present_third_person_singular_form_for verb
217
- elsif [tense, derivative] == [:past, :participle]
229
+ elsif [tense, derivative] == %i[past participle]
218
230
  verb.past_participle
219
231
  elsif tense == :present
220
232
  verb.infinitive
@@ -229,14 +241,15 @@ module Verbs
229
241
  def present_third_person_singular_form_for(verb)
230
242
  infinitive = verb.is_a?(Verb) ? verb.infinitive.to_s : verb.to_s
231
243
 
232
- if infinitive =~ /[a-z&&#{CONSONANT_PATTERN}]y$/i
233
- infinitive[0..-2] + 'ies'
234
- elsif infinitive =~ /(ss|sh|t?ch|zz|x|#{CONSONANT_PATTERN}o)$/i
235
- infinitive + 'es'
236
- elsif infinitive =~ /[^s]s$/i
237
- infinitive + 'ses'
244
+ case infinitive
245
+ when /[a-z&&#{CONSONANT_PATTERN}]y$/i
246
+ "#{infinitive[0..-2]}ies"
247
+ when /(ss|sh|t?ch|zz|x|#{CONSONANT_PATTERN}o)$/i
248
+ "#{infinitive}es"
249
+ when /[^s]s$/i
250
+ "#{infinitive}ses"
238
251
  else
239
- infinitive + 's'
252
+ "#{infinitive}s"
240
253
  end
241
254
  end
242
255
 
@@ -246,52 +259,81 @@ module Verbs
246
259
  def regular_preterite_for(verb)
247
260
  infinitive = verb.is_a?(Verb) ? verb.infinitive.to_s : verb.to_s
248
261
 
249
- if verb.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{DOUBLED_CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(verb.to_sym)
250
- regular_preterite_with_doubled_terminal_consonant_for verb
251
- elsif verb.to_s.match(/#{CONSONANT_PATTERN}e$/) or verb.to_s.match(/ye$/) or verb.to_s.match(/oe$/) or verb.to_s.match(/nge$/) or verb.to_s.match(/ie$/) or verb.to_s.match(/ee$/)
252
- infinitive.to_s.concat('d').to_sym
253
- elsif verb.to_s.match(/#{CONSONANT_PATTERN}y$/)
254
- infinitive.to_s.chomp('y').concat('ied').to_sym
262
+ if verb.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{DOUBLED_CONSONANT_WITHOUT_C_PATTERN}$/) &&
263
+ !conjugations.single_terminal_consonants.include?(verb.to_sym)
264
+ return regular_preterite_with_doubled_terminal_consonant_for verb
265
+ end
266
+
267
+ case verb.to_s
268
+ when /(#{CONSONANT_PATTERN}e|ye|oe|nge|ie|ee|ue)$/
269
+ infinitive.concat('d').to_sym
270
+ when /#{CONSONANT_PATTERN}y$/
271
+ infinitive.gsub(/y$/, 'ied').to_sym
272
+ when /c$/
273
+ infinitive.gsub(/c$/, 'cked').to_sym
255
274
  else
256
- infinitive.to_s.concat('ed').to_sym
275
+ infinitive.concat('ed').to_sym
257
276
  end
258
277
  end
259
278
 
260
279
  # Apply proper rules to consonant endings
261
280
  # Params:
262
- # * verb, apply doule consonant to this
281
+ # * verb, apply double consonant to this
263
282
  def regular_preterite_with_doubled_terminal_consonant_for(verb)
264
- regular_preterite_for verb.to_s.concat(verb.to_s[-1,1]).to_sym
283
+ regular_preterite_for verb.to_s.concat(verb.to_s[-1, 1]).to_sym
265
284
  end
266
285
 
267
286
  # Apply proper rules to consonant endings
268
287
  # Params:
269
- # * verb, apply doule consonant to this
288
+ # * verb, apply double consonant to this
270
289
  def present_participle_with_doubled_terminal_consonant_for(verb)
271
- present_participle verb.to_s.concat(verb.to_s[-1,1]).to_sym
290
+ if /c$/ =~ verb.to_s
291
+ present_participle verb.to_sym
292
+ else
293
+ present_participle verb.to_s.concat(verb.to_s[-1, 1]).to_sym
294
+ end
272
295
  end
273
296
 
274
297
  # Add appropriate aspects to the tense of the conjugation
275
298
  # Params:
276
299
  # * tense, an option given by the user
277
300
  # * aspect, an option given by the user
278
- def form_for(tense, aspect)
301
+ # * diathesis, an option given by the user
302
+ def form_for(tense, aspect, diathesis)
279
303
  form = []
280
- if tense == :future
281
- form << 'will'
282
- form << :infinitive if aspect == :habitual
283
- form.concat ['have', :past_participle] if aspect == :perfect
284
- form.concat ['be having', :past_participle] if aspect == :perfective
285
- form.concat ['be', :present_participle] if aspect == :progressive
286
- form.concat ['be about to', :infinitive] if aspect == :prospective
287
- else
288
- form.concat ['used to', :infinitive] if [tense, aspect] == [:past, :habitual]
289
- form.concat [:have, :past_participle] if aspect == :perfect
290
- form << :past if [tense, aspect] == [:past, :perfective]
291
- form.concat [:be, :present_participle] if aspect == :progressive
292
- form.concat [:be, 'about to', :infinitive] if aspect == :prospective
293
- form << :present if [tense, aspect] == [:present, :habitual]
294
- form.concat [:be, 'having', :past_participle] if [tense, aspect] == [:present, :perfective]
304
+ case diathesis
305
+ when :active
306
+ if tense == :future
307
+ form << 'will'
308
+ form << :infinitive if aspect == :habitual
309
+ form.concat ['have', :past_participle] if aspect == :perfect
310
+ form.concat ['be having', :past_participle] if aspect == :perfective
311
+ form.concat ['be', :present_participle] if aspect == :progressive
312
+ form.concat ['be about to', :infinitive] if aspect == :prospective
313
+ else
314
+ form.concat ['used to', :infinitive] if [tense, aspect] == %i[past habitual]
315
+ form.concat %i[have past_participle] if aspect == :perfect
316
+ form << :past if [tense, aspect] == %i[past perfective]
317
+ form.concat %i[be present_participle] if aspect == :progressive
318
+ form.concat [:be, 'about to', :infinitive] if aspect == :prospective
319
+ form << :present if [tense, aspect] == %i[present habitual]
320
+ form.concat [:be, 'having', :past_participle] if [tense, aspect] == %i[present perfective]
321
+ end
322
+ when :passive
323
+ if tense == :future
324
+ form << 'will'
325
+ form.concat ['be', :past_participle] if aspect == :habitual
326
+ form.concat ['have been', :past_participle] if aspect == :perfect
327
+ form.concat ['be being', :past_participle] if aspect == :progressive
328
+ form.concat ['be about to be', :past_participle] if aspect == :prospective
329
+ else
330
+ form.concat ['used to be', :past_participle] if [tense, aspect] == %i[past habitual]
331
+ form.concat [:have, 'been', :past_participle] if aspect == :perfect
332
+ form.concat %i[be past_participle] if [tense, aspect] == %i[past perfective]
333
+ form.concat [:be, 'being', :past_participle] if aspect == :progressive
334
+ form.concat [:be, 'about to be', :past_participle] if aspect == :prospective
335
+ form.concat %i[be past_participle] if [tense, aspect] == %i[present habitual]
336
+ end
295
337
  end
296
338
  form
297
339
  end
@@ -301,10 +343,18 @@ module Verbs
301
343
  # * tense, an option given by the user
302
344
  # * person, how the conjugation refers to the subject
303
345
  # * mood, an option given by the user
304
- def check_for_improper_constructions(tense, person, mood)
305
- if mood == :imperative and not (person == :second and tense == :present)
346
+ # * diathesis, an option given by the user
347
+ def check_for_improper_constructions(infinitive, tense, person, mood, diathesis)
348
+ if (mood == :imperative) && !((person == :second) && (tense == :present))
306
349
  raise Verbs::ImproperConstruction, 'The imperative mood requires present tense and second person'
307
350
  end
351
+ if (infinitive.to_sym == :be) && (diathesis == :passive)
352
+ raise Verbs::ImproperConstruction, 'There is no passive diathesis for the copula'
353
+ end
354
+ end
355
+
356
+ def default_aspect(options)
357
+ options[:tense] == :past ? :perfective : :habitual
308
358
  end
309
359
  end
310
360
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Verbs
2
- class ImproperConstruction < ArgumentError;
4
+ class ImproperConstruction < ArgumentError
3
5
  end
4
6
  end
data/lib/verbs/verb.rb CHANGED
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Verbs
2
4
  class Verb
3
5
  attr_reader :infinitive, :preterite, :past_participle
4
-
5
- def initialize(infinitive, options = {}, &blk)
6
+
7
+ def initialize(infinitive, options = {})
6
8
  @infinitive = infinitive
7
9
  @forms = {}
8
10
  if block_given?
@@ -12,29 +14,36 @@ module Verbs
12
14
  @past_participle = options[:past_participle]
13
15
  end
14
16
  end
15
-
17
+
16
18
  def form(word, options = {})
17
- raise ArgumentError, 'Irregular verb specifications must identify tense and must identify either derivative, mood, or person and plurality' unless options[:tense] and (options[:derivative] or options[:mood] or (options[:person] and options[:plurality]))
18
-
19
+ unless options[:tense] && (options[:derivative] || options[:mood] || (options[:person] && options[:plurality]))
20
+ raise ArgumentError,
21
+ 'Irregular verb specifications must identify tense and must identify either derivative, mood, or person and plurality'
22
+ end
23
+
19
24
  tense = options[:tense]
20
25
 
21
26
  @forms[:present] ||= {}
22
27
  @forms[:past] ||= {}
23
- if derivative = options[:derivative]
28
+ if (derivative = options[:derivative])
24
29
  @forms[tense][derivative] = word
25
- elsif mood = options[:mood]
30
+ elsif (mood = options[:mood])
26
31
  @forms[tense][mood] = word
27
- elsif person = options[:person]
32
+ elsif (person = options[:person])
28
33
  @forms[tense][person] ||= {}
29
34
  @forms[tense][person][options[:plurality]] = word
30
35
  end
31
36
  end
32
-
37
+
33
38
  def [](options = {})
34
- tense, person, plurality, derivative, mood = options[:tense], options[:person], options[:plurality], options[:derivative], options[:mood]
35
- if tense and person and plurality and mood
39
+ tense = options[:tense]
40
+ person = options[:person]
41
+ plurality = options[:plurality]
42
+ derivative = options[:derivative]
43
+ mood = options[:mood]
44
+ if tense && person && plurality && mood
36
45
  @forms[tense].try(:[], mood) || @forms[tense].try(:[], person).try(:[], plurality)
37
- elsif tense and derivative
46
+ elsif tense && derivative
38
47
  @forms[tense].try(:[], derivative)
39
48
  end
40
49
  end
@@ -1,20 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Verbs
2
4
  module Verblike
3
5
  class Wrapper
4
6
  def initialize(base)
5
7
  @base = base
6
8
  end
7
-
9
+
8
10
  def conjugate(options)
9
- words = @base.to_s.split(' ')
11
+ words = @base.to_s.split
10
12
  words.shift if words.first.downcase == 'to'
11
- infinitive = words.shift.to_sym
13
+ infinitive = words.shift.downcase.to_sym
12
14
  conjugation = ::Verbs::Conjugator.conjugate infinitive, options
13
15
  conjugated = words.unshift(conjugation.to_s).join(' ')
14
16
  @base.is_a?(Symbol) ? conjugated.to_sym : conjugated
15
17
  end
16
18
  end
17
-
19
+
18
20
  module Access
19
21
  def verb
20
22
  ::Verbs::Verblike::Wrapper.new self
data/lib/verbs/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Verbs
2
- VERSION = "2.2.1"
4
+ VERSION = '3.1.0'
3
5
  end
data/lib/verbs.rb CHANGED
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'singleton'
4
+ require 'time'
2
5
  require 'active_support'
3
6
  require 'active_support/core_ext'
4
7
  require 'verbs/verb'
@@ -8,10 +11,14 @@ require 'verbs/verblike'
8
11
  require 'verbs/improper_construction'
9
12
 
10
13
  module Verbs
11
- CONSONANTS = %w(b c d f g h j k l m n p q r s t v w x z)
14
+ CONSONANTS = %w[b c d f g h j k l m n p q r s t v w x z].freeze
12
15
  CONSONANT_PATTERN = "[#{CONSONANTS.join}]"
13
- DOUBLED_CONSONANTS = %w(b c d f g h j k l m n p q r s t z)
16
+ CONSONANTS_WITHOUT_C = (CONSONANTS - ['c']).freeze
17
+ CONSONANTS_WITHOUT_C_PATTERN = "[#{CONSONANTS_WITHOUT_C.join}]"
18
+ DOUBLED_CONSONANTS = (CONSONANTS - %w[v w x]).freeze
14
19
  DOUBLED_CONSONANT_PATTERN = "[#{DOUBLED_CONSONANTS.join}]"
15
- VOWELS = %w(a e i o u y)
20
+ DOUBLED_CONSONANTS_WITHOUT_C = (DOUBLED_CONSONANTS - ['c']).freeze
21
+ DOUBLED_CONSONANT_WITHOUT_C_PATTERN = "[#{DOUBLED_CONSONANTS_WITHOUT_C.join}]"
22
+ VOWELS = %w[a e i o u y].freeze
16
23
  VOWEL_PATTERN = "[#{VOWELS.join}]"
17
24
  end