verbs 2.1.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +29 -0
- data/.gitignore +2 -0
- data/README.rdoc +7 -2
- data/Rakefile +0 -3
- data/lib/verbs/conjugations.rb +9 -3
- data/lib/verbs/conjugator.rb +148 -29
- data/lib/verbs/verblike.rb +3 -3
- data/lib/verbs/version.rb +1 -1
- data/test/test_verbs.rb +74 -1
- data/verbs.gemspec +2 -1
- metadata +19 -6
- data/VERSION +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e723eb9d358a2b674c497f70192e6172ba18d20fa472e588e38adcbf9f318a54
|
4
|
+
data.tar.gz: 8f88abec47d56529a4ec23c1b45b58d940fc1b7c6b6ceaf3f86d46b75c3591a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 708d985dffabeee18e46906f1e976dc988a92c85e12db77a04f0319b0f73f8e25c03d884fee19393b4909160c8a631abc12dfcdbef80c739217e67cfb1becf5c
|
7
|
+
data.tar.gz: 64cab548cb88b306788ac88f05ee26628cbd60c72d7b7a9987b54ab988b03ca24782fb84870917ee06c6790abefea4a1029e6fdb8f0710a9f27dd2a9f9b464d9
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v2
|
22
|
+
- name: Set up Ruby
|
23
|
+
uses: ruby/setup-ruby@v1
|
24
|
+
with:
|
25
|
+
ruby-version: 2.6
|
26
|
+
- name: Install dependencies
|
27
|
+
run: bundle install
|
28
|
+
- name: Run tests
|
29
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -31,7 +31,7 @@ Either <tt>:singular</tt> or <tt>:plural</tt>. Defaults to <tt>:singular</tt>.
|
|
31
31
|
|
32
32
|
=== <tt>:aspect</tt>
|
33
33
|
|
34
|
-
One of <tt>:habitual</tt>, <tt>:perfect</tt>, <tt>:perfective</tt>, <tt>:progressive</tt>, or <tt>:prospective</tt>. Defaults to <tt>:habitual</tt
|
34
|
+
One of <tt>:habitual</tt>, <tt>:perfect</tt>, <tt>:perfective</tt>, <tt>:progressive</tt>, or <tt>:prospective</tt>. Defaults to <tt>:habitual</tt> (<tt>:perfective</tt> for past tense).
|
35
35
|
|
36
36
|
See below for a guide to verb aspect.
|
37
37
|
|
@@ -43,11 +43,15 @@ One of <tt>:indicative</tt>, <tt>:imperative</tt>, or <tt>:subjunctive</tt>. Def
|
|
43
43
|
|
44
44
|
Set this to a string to prepend the conjugated verb with it. When set to <tt>true</tt>, a standard personal pronoun will be used.
|
45
45
|
|
46
|
+
=== <tt>:diathesis</tt>
|
47
|
+
|
48
|
+
One of <tt>:active</tt> or <tt>:passive</tt>. Defaults to <tt>:active</tt>.
|
49
|
+
|
46
50
|
== Tense/aspect quick reference
|
47
51
|
|
48
52
|
EXAMPLE TENSE ASPECT
|
49
53
|
|
50
|
-
I
|
54
|
+
I used to accept past habitual
|
51
55
|
I had accepted past perfect
|
52
56
|
I accepted past perfective
|
53
57
|
I was accepting past progressive
|
@@ -71,6 +75,7 @@ Set this to a string to prepend the conjugated verb with it. When set to <tt>tru
|
|
71
75
|
* {Pat Byrd and Tom McKlin}[http://www2.gsu.edu/~wwwesl/egw/pluralsv.htm]
|
72
76
|
* {Rick Harrison}[http://www.rickharrison.com/language/aspect.html]
|
73
77
|
* {Anatoli Makarevich}[https://github.com/makaroni4] for {#6}[https://github.com/rossmeissl/verbs/pull/6]
|
78
|
+
* {Nikita Kamaev}[https://github.com/nerixim] for {#35}[https://github.com/rossmeissl/verbs/pull/35]
|
74
79
|
|
75
80
|
== Copyright
|
76
81
|
|
data/Rakefile
CHANGED
data/lib/verbs/conjugations.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
Verbs::Conjugator.conjugations do |conjugate|
|
2
2
|
|
3
|
-
conjugate.irregular :be do |verb| # copular
|
3
|
+
conjugate.irregular :be do |verb| # copular
|
4
4
|
verb.form :am, :tense => :present, :person => :first, :plurality => :singular
|
5
5
|
verb.form :is, :tense => :present, :person => :third, :plurality => :singular
|
6
6
|
verb.form :are, :tense => :present, :person => :second, :plurality => :singular
|
7
|
+
verb.form :are, :tense => :present, :person => :second, :plurality => :plural
|
7
8
|
verb.form :are, :tense => :present, :person => :first, :plurality => :plural
|
8
9
|
verb.form :are, :tense => :present, :person => :third, :plurality => :plural
|
9
10
|
verb.form :was, :tense => :past, :person => :first, :plurality => :singular
|
10
11
|
verb.form :was, :tense => :past, :person => :third, :plurality => :singular
|
11
12
|
verb.form :were, :tense => :past, :person => :second, :plurality => :singular
|
13
|
+
verb.form :were, :tense => :past, :person => :second, :plurality => :plural
|
12
14
|
verb.form :were, :tense => :past, :person => :first, :plurality => :plural
|
13
15
|
verb.form :were, :tense => :past, :person => :third, :plurality => :plural
|
14
16
|
verb.form :were, :tense => :past, :mood => :subjunctive
|
@@ -17,15 +19,17 @@ Verbs::Conjugator.conjugations do |conjugate|
|
|
17
19
|
verb.form :been, :tense => :past, :derivative => :participle
|
18
20
|
end
|
19
21
|
|
20
|
-
conjugate.irregular :have do |verb|
|
22
|
+
conjugate.irregular :have do |verb|
|
21
23
|
verb.form :have, :tense => :present, :person => :first, :plurality => :singular
|
22
24
|
verb.form :has, :tense => :present, :person => :third, :plurality => :singular
|
23
25
|
verb.form :have, :tense => :present, :person => :second, :plurality => :singular
|
26
|
+
verb.form :have, :tense => :present, :person => :second, :plurality => :plural
|
24
27
|
verb.form :have, :tense => :present, :person => :first, :plurality => :plural
|
25
28
|
verb.form :have, :tense => :present, :person => :third, :plurality => :plural
|
26
29
|
verb.form :had, :tense => :past, :person => :first, :plurality => :singular
|
27
30
|
verb.form :had, :tense => :past, :person => :third, :plurality => :singular
|
28
31
|
verb.form :had, :tense => :past, :person => :second, :plurality => :singular
|
32
|
+
verb.form :had, :tense => :past, :person => :second, :plurality => :plural
|
29
33
|
verb.form :had, :tense => :past, :person => :first, :plurality => :plural
|
30
34
|
verb.form :had, :tense => :past, :person => :third, :plurality => :plural
|
31
35
|
verb.form :having, :tense => :present, :derivative => :participle
|
@@ -182,7 +186,7 @@ Verbs::Conjugator.conjugations do |conjugate|
|
|
182
186
|
conjugate.irregular :strive, :strove, :striven
|
183
187
|
conjugate.irregular :swear, :swore, :sworn
|
184
188
|
conjugate.irregular :sweep, :swept, :swept
|
185
|
-
conjugate.irregular :swell, :swelled, :swelled
|
189
|
+
conjugate.irregular :swell, :swelled, :swelled
|
186
190
|
conjugate.irregular :swim, :swam, :swum
|
187
191
|
conjugate.irregular :swing, :swung, :swung
|
188
192
|
conjugate.irregular :take, :took, :taken
|
@@ -264,6 +268,7 @@ Verbs::Conjugator.conjugations do |conjugate|
|
|
264
268
|
conjugate.single_terminal_consonant :decipher
|
265
269
|
conjugate.single_terminal_consonant :deflower
|
266
270
|
conjugate.single_terminal_consonant :delimit
|
271
|
+
conjugate.single_terminal_consonant :deliver
|
267
272
|
conjugate.single_terminal_consonant :deposit
|
268
273
|
conjugate.single_terminal_consonant :develop
|
269
274
|
conjugate.single_terminal_consonant :differ
|
@@ -309,6 +314,7 @@ Verbs::Conjugator.conjugations do |conjugate|
|
|
309
314
|
conjugate.single_terminal_consonant :flounder
|
310
315
|
conjugate.single_terminal_consonant :fluster
|
311
316
|
conjugate.single_terminal_consonant :flutter
|
317
|
+
conjugate.single_terminal_consonant :follow
|
312
318
|
conjugate.single_terminal_consonant :foreshorten
|
313
319
|
conjugate.single_terminal_consonant :founder
|
314
320
|
conjugate.single_terminal_consonant :fritter
|
data/lib/verbs/conjugator.rb
CHANGED
@@ -1,31 +1,60 @@
|
|
1
|
+
# The program conjugates most common english verbs with the following option:
|
2
|
+
# * :tense => :past or :present or :future (default: :present)
|
3
|
+
# * :person => :first or :second or :third (default: :third)
|
4
|
+
# * :plurality => :singular or :plural (default: :singular)
|
5
|
+
# * :aspect => :habitual or :perfect or :perfective or :progressive or :prospective (default: :habitual, or :perfective for past tense)
|
6
|
+
# * :mood => :indicative or :imperative or :subjunctive (default: :indicative)
|
7
|
+
# * :diathesis => :active or :passive (default: :active)
|
8
|
+
#
|
9
|
+
# Author:: Andy Rossmeissl
|
10
|
+
# Copyright:: Copyright (c) 2009 Andy Rossmeissl
|
11
|
+
# License:: Found in LICENSE file
|
12
|
+
|
1
13
|
module Verbs
|
2
14
|
module Conjugator
|
3
15
|
extend self
|
4
16
|
|
17
|
+
# This class determines the conjugations from the given options (or defaults)
|
18
|
+
# conjugations are then applied to the verb
|
5
19
|
class Conjugations
|
6
20
|
include Singleton
|
7
21
|
|
22
|
+
# permit outside functions access to these variables
|
8
23
|
attr_reader :irregulars, :single_terminal_consonants, :copulars
|
9
24
|
|
25
|
+
# Creates initial variables for class
|
10
26
|
def initialize
|
11
27
|
@irregulars, @single_terminal_consonants, @copulars = {}, [], {}
|
12
28
|
end
|
13
29
|
|
30
|
+
# Determines irregular verbs from the expression
|
31
|
+
# Params:
|
32
|
+
# * infinitive, the given verb
|
33
|
+
# * preterite, denote events that took place in the past
|
34
|
+
# * past_participle, form of a verb, ending in 'ed'
|
35
|
+
# * &blk, block of code that may be run
|
14
36
|
def irregular(infinitive, preterite = nil, past_participle = nil, &blk)
|
15
37
|
if block_given?
|
38
|
+
# create new Verb object with infinitive and &blk
|
16
39
|
irregular = ::Verbs::Verb.new infinitive, &blk
|
17
40
|
else
|
18
41
|
raise ArgumentError, "Standard irregular verbs must specify preterite and past participle forms" unless preterite and past_participle
|
42
|
+
# create new Verb object with infinitive, preterite and past_participle
|
19
43
|
irregular = ::Verbs::Verb.new infinitive, :preterite => preterite, :past_participle => past_participle
|
20
44
|
end
|
21
45
|
@irregulars[infinitive] = irregular
|
22
46
|
end
|
23
47
|
|
48
|
+
# Find single terminal consonant with the infinitive
|
49
|
+
# Params:
|
50
|
+
# * infinitive, the given verb
|
24
51
|
def single_terminal_consonant(infinitive)
|
25
52
|
@single_terminal_consonants << infinitive
|
26
53
|
end
|
27
54
|
end
|
28
55
|
|
56
|
+
# Runs a block of code if given in a class instance
|
57
|
+
# else only class instance is created
|
29
58
|
def conjugations
|
30
59
|
if block_given?
|
31
60
|
yield Conjugations.instance
|
@@ -34,28 +63,40 @@ module Verbs
|
|
34
63
|
end
|
35
64
|
end
|
36
65
|
|
66
|
+
# Using options given, determine the conjugation and the subject
|
67
|
+
# Return the subject, if there is one, and the proper conjugation
|
68
|
+
# Params:
|
69
|
+
# * infinitive, the given verb
|
70
|
+
# * options, the list of parameters to alter the conjugation
|
37
71
|
def conjugate(infinitive, options = {})
|
72
|
+
infinitive = infinitive.dup if infinitive.is_a?(String)
|
73
|
+
|
74
|
+
# set all options according to parameter, or the default
|
38
75
|
tense = options[:tense] || :present # present, past, future
|
39
76
|
person = options[:person] || :third # first, second, third
|
40
77
|
plurality = options[:plurality] || :singular # singular, plural
|
41
78
|
diathesis = options[:diathesis] || :active # active, passive
|
42
79
|
mood = options[:mood] || :indicative # imperative, subjunctive
|
43
|
-
aspect = options[:aspect] ||
|
44
|
-
|
45
|
-
check_for_improper_constructions(tense, person, mood)
|
46
|
-
|
47
|
-
form = form_for(tense, aspect)
|
80
|
+
aspect = options[:aspect] || default_aspect(options) # perfective, habitual, progressive, perfect, prospective
|
48
81
|
|
82
|
+
check_for_improper_constructions(infinitive, tense, person, mood, diathesis) # find incompatabilities
|
83
|
+
form = form_for(tense, aspect, diathesis) # find form array based on tense and aspect
|
84
|
+
|
85
|
+
# map form array to conjugation array, applying infinitive and options to the array
|
49
86
|
conjugation = form.map { |e| resolve e, infinitive, tense, person, plurality, mood }.join(' ').strip
|
50
87
|
|
51
|
-
if options[:subject]
|
52
|
-
actor = options.delete(:subject)
|
88
|
+
if options[:subject] # When options includes a subject,
|
89
|
+
actor = options.delete(:subject) # remove from options and make subject humanized
|
53
90
|
actor = subject(options).humanize if actor.is_a?(TrueClass)
|
54
91
|
end
|
55
92
|
|
56
93
|
"#{actor} #{conjugation}".strip
|
57
94
|
end
|
58
95
|
|
96
|
+
# Finds the pronoun associated with the subject for the conjugation
|
97
|
+
# Returns the pronoun
|
98
|
+
# Params:
|
99
|
+
# * options, list of options given to determine conjugation
|
59
100
|
def subject(options)
|
60
101
|
case [options[:person], options[:plurality]]
|
61
102
|
when [:first, :singular]
|
@@ -73,6 +114,14 @@ module Verbs
|
|
73
114
|
|
74
115
|
private
|
75
116
|
|
117
|
+
# Resolves conflictions between options of the conjugation
|
118
|
+
# Params:
|
119
|
+
# * element,
|
120
|
+
# * infinitive, the given verb
|
121
|
+
# * tense, an option given by the user
|
122
|
+
# * person, an option given by the user
|
123
|
+
# * plurality, an option given by the user
|
124
|
+
# * mood, an option given by the user
|
76
125
|
def resolve(element, infinitive, tense, person, plurality, mood)
|
77
126
|
case element
|
78
127
|
when String
|
@@ -86,6 +135,13 @@ module Verbs
|
|
86
135
|
end
|
87
136
|
end
|
88
137
|
|
138
|
+
# Change the form to express the proper grammatical function
|
139
|
+
# Params:
|
140
|
+
# * infinitive,the given verb
|
141
|
+
# * inflection, form to be changed
|
142
|
+
# * person, an option given by the user
|
143
|
+
# * plurality, an option given by the user
|
144
|
+
# * mood, an option given by the user
|
89
145
|
def inflect(infinitive, inflection, person, plurality, mood)
|
90
146
|
send(*([inflection, infinitive, person, plurality, mood][0, method(inflection).arity + 1]))
|
91
147
|
end
|
@@ -100,6 +156,12 @@ module Verbs
|
|
100
156
|
end
|
101
157
|
end
|
102
158
|
|
159
|
+
# Conjugate verb to past with relevent options determining outcome
|
160
|
+
# Params:
|
161
|
+
# * infinitive, the given verb
|
162
|
+
# * person, the subject of the verb
|
163
|
+
# * plurality, an option given by the user
|
164
|
+
# * mood, an option given by the user
|
103
165
|
def past(infinitive, person, plurality, mood)
|
104
166
|
if verb = conjugations.irregulars[infinitive]
|
105
167
|
conjugate_irregular(verb, :tense => :past, :person => person, :plurality => plurality, :mood => mood)
|
@@ -108,12 +170,15 @@ module Verbs
|
|
108
170
|
end
|
109
171
|
end
|
110
172
|
|
173
|
+
# Forming verb to apply present tense endings
|
174
|
+
# Params:
|
175
|
+
# * infinitive, the given verb
|
111
176
|
def present_participle(infinitive)
|
112
|
-
if infinitive.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(infinitive)
|
177
|
+
if infinitive.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(infinitive.to_sym)
|
113
178
|
present_participle_with_doubled_terminal_consonant_for infinitive
|
114
179
|
elsif infinitive.to_s.match(/c$/)
|
115
180
|
infinitive.to_s.concat('king').to_sym
|
116
|
-
elsif infinitive.to_s.match(/ye$/) or infinitive.to_s.match(/oe$/) or infinitive.to_s.match(/nge$/) or infinitive.to_s.match(/ee$/)
|
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$/)
|
117
182
|
infinitive.to_s.concat('ing').to_sym
|
118
183
|
elsif infinitive.to_s.match(/ie$/)
|
119
184
|
infinitive.to_s[0..-2].concat('ying').to_sym
|
@@ -124,6 +189,9 @@ module Verbs
|
|
124
189
|
end
|
125
190
|
end
|
126
191
|
|
192
|
+
# Forming verb to apply past tense endings
|
193
|
+
# Params:
|
194
|
+
# * infinitive, the given verb
|
127
195
|
def past_participle(infinitive)
|
128
196
|
if verb = conjugations.irregulars[infinitive]
|
129
197
|
conjugate_irregular(verb, :tense => :past, :derivative => :participle)
|
@@ -132,6 +200,10 @@ module Verbs
|
|
132
200
|
end
|
133
201
|
end
|
134
202
|
|
203
|
+
#
|
204
|
+
# Params:
|
205
|
+
# * verb,
|
206
|
+
# * options,
|
135
207
|
def conjugate_irregular(verb, options)
|
136
208
|
return verb[options] if verb[options]
|
137
209
|
|
@@ -151,6 +223,9 @@ module Verbs
|
|
151
223
|
end
|
152
224
|
end
|
153
225
|
|
226
|
+
# Apply thir person rules to the verb for the conjugation
|
227
|
+
# Params:
|
228
|
+
# * verb, apply proper third person rules to this
|
154
229
|
def present_third_person_singular_form_for(verb)
|
155
230
|
infinitive = verb.is_a?(Verb) ? verb.infinitive.to_s : verb.to_s
|
156
231
|
|
@@ -165,10 +240,13 @@ module Verbs
|
|
165
240
|
end
|
166
241
|
end
|
167
242
|
|
243
|
+
# Apply the regular past tense to a given verb for the conjugation
|
244
|
+
# Params:
|
245
|
+
# * verb, apply regular past tense rules to this
|
168
246
|
def regular_preterite_for(verb)
|
169
247
|
infinitive = verb.is_a?(Verb) ? verb.infinitive.to_s : verb.to_s
|
170
|
-
|
171
|
-
if verb.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{DOUBLED_CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(verb)
|
248
|
+
|
249
|
+
if verb.to_s.match(/#{CONSONANT_PATTERN}#{VOWEL_PATTERN}#{DOUBLED_CONSONANT_PATTERN}$/) and !conjugations.single_terminal_consonants.include?(verb.to_sym)
|
172
250
|
regular_preterite_with_doubled_terminal_consonant_for verb
|
173
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$/)
|
174
252
|
infinitive.to_s.concat('d').to_sym
|
@@ -179,39 +257,80 @@ module Verbs
|
|
179
257
|
end
|
180
258
|
end
|
181
259
|
|
260
|
+
# Apply proper rules to consonant endings
|
261
|
+
# Params:
|
262
|
+
# * verb, apply doule consonant to this
|
182
263
|
def regular_preterite_with_doubled_terminal_consonant_for(verb)
|
183
264
|
regular_preterite_for verb.to_s.concat(verb.to_s[-1,1]).to_sym
|
184
265
|
end
|
185
266
|
|
267
|
+
# Apply proper rules to consonant endings
|
268
|
+
# Params:
|
269
|
+
# * verb, apply doule consonant to this
|
186
270
|
def present_participle_with_doubled_terminal_consonant_for(verb)
|
187
271
|
present_participle verb.to_s.concat(verb.to_s[-1,1]).to_sym
|
188
272
|
end
|
189
273
|
|
190
|
-
|
274
|
+
# Add appropriate aspects to the tense of the conjugation
|
275
|
+
# Params:
|
276
|
+
# * tense, an option given by the user
|
277
|
+
# * aspect, an option given by the user
|
278
|
+
# * diathesis, an option given by the user
|
279
|
+
def form_for(tense, aspect, diathesis)
|
191
280
|
form = []
|
192
|
-
if
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
281
|
+
if diathesis == :active
|
282
|
+
if tense == :future
|
283
|
+
form << 'will'
|
284
|
+
form << :infinitive if aspect == :habitual
|
285
|
+
form.concat ['have', :past_participle] if aspect == :perfect
|
286
|
+
form.concat ['be having', :past_participle] if aspect == :perfective
|
287
|
+
form.concat ['be', :present_participle] if aspect == :progressive
|
288
|
+
form.concat ['be about to', :infinitive] if aspect == :prospective
|
289
|
+
else
|
290
|
+
form.concat ['used to', :infinitive] if [tense, aspect] == [:past, :habitual]
|
291
|
+
form.concat [:have, :past_participle] if aspect == :perfect
|
292
|
+
form << :past if [tense, aspect] == [:past, :perfective]
|
293
|
+
form.concat [:be, :present_participle] if aspect == :progressive
|
294
|
+
form.concat [:be, 'about to', :infinitive] if aspect == :prospective
|
295
|
+
form << :present if [tense, aspect] == [:present, :habitual]
|
296
|
+
form.concat [:be, 'having', :past_participle] if [tense, aspect] == [:present, :perfective]
|
297
|
+
end
|
298
|
+
elsif diathesis == :passive
|
299
|
+
if tense == :future
|
300
|
+
form << 'will'
|
301
|
+
form.concat ['be', :past_participle] if aspect == :habitual
|
302
|
+
form.concat ['have been', :past_participle] if aspect == :perfect
|
303
|
+
form.concat ['be being', :past_participle] if aspect == :progressive
|
304
|
+
form.concat ['be about to be', :past_participle] if aspect == :prospective
|
305
|
+
else
|
306
|
+
form.concat ['used to be', :past_participle] if [tense, aspect] == [:past, :habitual]
|
307
|
+
form.concat [:have, 'been', :past_participle] if aspect == :perfect
|
308
|
+
form.concat [:be, :past_participle] if [tense, aspect] == [:past, :perfective]
|
309
|
+
form.concat [:be, 'being', :past_participle] if aspect == :progressive
|
310
|
+
form.concat [:be, 'about to be', :past_participle] if aspect == :prospective
|
311
|
+
form.concat [:be, :past_participle] if [tense, aspect] == [:present, :habitual]
|
312
|
+
end
|
207
313
|
end
|
208
314
|
form
|
209
315
|
end
|
210
|
-
|
211
|
-
|
316
|
+
|
317
|
+
# Confirm an imperative mood contains the present tense and second person
|
318
|
+
# Params:
|
319
|
+
# * tense, an option given by the user
|
320
|
+
# * person, how the conjugation refers to the subject
|
321
|
+
# * mood, an option given by the user
|
322
|
+
# * diathesis, an option given by the user
|
323
|
+
def check_for_improper_constructions(infinitive, tense, person, mood, diathesis)
|
212
324
|
if mood == :imperative and not (person == :second and tense == :present)
|
213
325
|
raise Verbs::ImproperConstruction, 'The imperative mood requires present tense and second person'
|
214
326
|
end
|
327
|
+
if infinitive.to_sym == :be and diathesis == :passive
|
328
|
+
raise Verbs::ImproperConstruction, 'There is no passive diathesis for the copula'
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def default_aspect(options)
|
333
|
+
options[:tense] == :past ? :perfective : :habitual
|
215
334
|
end
|
216
335
|
end
|
217
336
|
end
|
data/lib/verbs/verblike.rb
CHANGED
@@ -4,17 +4,17 @@ module Verbs
|
|
4
4
|
def initialize(base)
|
5
5
|
@base = base
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def conjugate(options)
|
9
9
|
words = @base.to_s.split(' ')
|
10
10
|
words.shift if words.first.downcase == 'to'
|
11
|
-
infinitive = words.shift.to_sym
|
11
|
+
infinitive = words.shift.downcase.to_sym
|
12
12
|
conjugation = ::Verbs::Conjugator.conjugate infinitive, options
|
13
13
|
conjugated = words.unshift(conjugation.to_s).join(' ')
|
14
14
|
@base.is_a?(Symbol) ? conjugated.to_sym : conjugated
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
module Access
|
19
19
|
def verb
|
20
20
|
::Verbs::Verblike::Wrapper.new self
|
data/lib/verbs/version.rb
CHANGED
data/test/test_verbs.rb
CHANGED
@@ -2,16 +2,32 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestVerbs < Test::Unit::TestCase
|
4
4
|
def test_copular_conjugation
|
5
|
+
# present habitual
|
5
6
|
assert_equal 'am', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :first, :plurality => :singular, :aspect => :habitual)
|
6
7
|
assert_equal 'are', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :second, :plurality => :singular, :aspect => :habitual)
|
7
8
|
assert_equal 'is', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :third, :plurality => :singular, :aspect => :habitual)
|
8
9
|
assert_equal 'are', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :first, :plurality => :plural, :aspect => :habitual)
|
9
10
|
assert_equal 'are', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :third, :plurality => :plural, :aspect => :habitual)
|
11
|
+
|
12
|
+
# past
|
13
|
+
assert_equal 'was', Verbs::Conjugator.conjugate(:be, :tense => :past)
|
14
|
+
|
15
|
+
# past habitual
|
16
|
+
assert_equal 'used to be', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :first, :plurality => :singular, :aspect => :habitual)
|
17
|
+
assert_equal 'used to be', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :second, :plurality => :singular, :aspect => :habitual)
|
18
|
+
assert_equal 'used to be', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :third, :plurality => :singular, :aspect => :habitual)
|
19
|
+
assert_equal 'used to be', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :first, :plurality => :plural, :aspect => :habitual)
|
20
|
+
assert_equal 'used to be', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :third, :plurality => :plural, :aspect => :habitual)
|
21
|
+
|
10
22
|
assert_equal 'was', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
11
23
|
assert_equal 'were', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :second, :plurality => :singular, :aspect => :perfective)
|
12
24
|
assert_equal 'was', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :third, :plurality => :singular, :aspect => :perfective)
|
13
25
|
assert_equal 'were', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :first, :plurality => :plural, :aspect => :perfective)
|
14
26
|
assert_equal 'were', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :third, :plurality => :plural, :aspect => :perfective)
|
27
|
+
|
28
|
+
assert_equal 'was being', Verbs::Conjugator.conjugate(:be, :tense => :past, :person => :third, :aspect => :progressive)
|
29
|
+
assert_equal 'is being', Verbs::Conjugator.conjugate(:be, :tense => :present, :person => :third, :aspect => :progressive)
|
30
|
+
assert_equal 'will be being', Verbs::Conjugator.conjugate(:be, :tense => :future, :person => :third, :aspect => :progressive)
|
15
31
|
end
|
16
32
|
def test_irregular_conjugation
|
17
33
|
assert_equal 'break', Verbs::Conjugator.conjugate(:break, :tense => :present, :person => :first, :plurality => :singular, :aspect => :habitual)
|
@@ -27,6 +43,7 @@ class TestVerbs < Test::Unit::TestCase
|
|
27
43
|
assert_equal 'has', Verbs::Conjugator.conjugate(:have, :tense => :present, :person => :third, :plurality => :singular, :aspect => :habitual)
|
28
44
|
end
|
29
45
|
def test_know
|
46
|
+
assert_equal 'knew', Verbs::Conjugator.conjugate(:know, :tense => :past)
|
30
47
|
assert_equal 'had known', Verbs::Conjugator.conjugate(:know, :tense => :past, :person => :third, :plurality => :singular, :aspect => :perfect)
|
31
48
|
assert_equal 'knew', Verbs::Conjugator.conjugate(:know, :tense => :past, :person => :third, :plurality => :singular, :aspect => :perfective)
|
32
49
|
assert_equal 'was knowing', Verbs::Conjugator.conjugate(:know, :tense => :past, :person => :third, :plurality => :singular, :aspect => :progressive)
|
@@ -53,8 +70,10 @@ class TestVerbs < Test::Unit::TestCase
|
|
53
70
|
end
|
54
71
|
def test_regular_conjugation_with_irregular_terminal_consonant
|
55
72
|
assert_equal 'abandoned', Verbs::Conjugator.conjugate(:abandon, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
73
|
+
assert_equal 'followed', Verbs::Conjugator.conjugate(:follow, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
56
74
|
assert_equal 'triggered', Verbs::Conjugator.conjugate(:trigger, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
57
75
|
assert_equal 'colored', Verbs::Conjugator.conjugate(:color, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
76
|
+
assert_equal 'delivered', Verbs::Conjugator.conjugate(:deliver, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
58
77
|
end
|
59
78
|
def test_regular_conjugation_with_ean_suffix
|
60
79
|
assert_equal 'cleaned', Verbs::Conjugator.conjugate(:clean, :tense => :past, :person => :first, :plurality => :singular, :aspect => :perfective)
|
@@ -94,10 +113,11 @@ class TestVerbs < Test::Unit::TestCase
|
|
94
113
|
def test_core_access
|
95
114
|
assert_equal :accepts, :accept.verb.conjugate(:tense => :present, :person => :third, :plurality => :singular, :aspect => :habitual)
|
96
115
|
assert_equal 'accepts', 'accept'.verb.conjugate(:tense => :present, :person => :third, :plurality => :singular, :aspect => :habitual)
|
116
|
+
assert_equal 'Girl is Near', 'Be Near'.verb.conjugate(:subject => 'Girl')
|
97
117
|
end
|
98
118
|
def test_aspects
|
99
119
|
Verbs::Conjugator.with_options :person => :first, :plurality => :singular, :subject => true do |standard|
|
100
|
-
assert_equal 'I
|
120
|
+
assert_equal 'I used to accept', standard.conjugate(:accept, :tense => :past, :aspect => :habitual)
|
101
121
|
assert_equal 'I had accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfect)
|
102
122
|
assert_equal 'I accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfective)
|
103
123
|
assert_equal 'I was accepting', standard.conjugate(:accept, :tense => :past, :aspect => :progressive)
|
@@ -144,4 +164,57 @@ class TestVerbs < Test::Unit::TestCase
|
|
144
164
|
assert_equal 'changes', standard.conjugate('change')
|
145
165
|
end
|
146
166
|
end
|
167
|
+
|
168
|
+
def test_immutability
|
169
|
+
verb = 'like'
|
170
|
+
Verbs::Conjugator.conjugate(verb, :tense => :past, :aspect => :perfective)
|
171
|
+
assert_equal 'like', verb
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_second_person_plural_forms
|
175
|
+
Verbs::Conjugator.with_options :person => :second, :plurality => :plural, :subject => true do |standard|
|
176
|
+
assert_equal 'You had accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfect)
|
177
|
+
assert_equal 'You accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfective)
|
178
|
+
assert_equal 'You were accepting', standard.conjugate(:accept, :tense => :past, :aspect => :progressive)
|
179
|
+
assert_equal 'You were about to accept', standard.conjugate(:accept, :tense => :past, :aspect => :prospective)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_passive
|
184
|
+
Verbs::Conjugator.with_options :diathesis => :passive, :person => :first, :plurality => :singular, :subject => true do |standard|
|
185
|
+
assert_equal 'I used to be accepted', standard.conjugate(:accept, :tense => :past, :aspect => :habitual)
|
186
|
+
assert_equal 'I had been accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfect)
|
187
|
+
assert_equal 'I was accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfective)
|
188
|
+
assert_equal 'I was being accepted', standard.conjugate(:accept, :tense => :past, :aspect => :progressive)
|
189
|
+
assert_equal 'I was about to be accepted', standard.conjugate(:accept, :tense => :past, :aspect => :prospective)
|
190
|
+
assert_equal 'I am accepted', standard.conjugate(:accept, :tense => :present, :aspect => :habitual)
|
191
|
+
assert_equal 'I have been accepted', standard.conjugate(:accept, :tense => :present, :aspect => :perfect)
|
192
|
+
assert_equal 'I am being accepted', standard.conjugate(:accept, :tense => :present, :aspect => :progressive)
|
193
|
+
assert_equal 'I am about to be accepted', standard.conjugate(:accept, :tense => :present, :aspect => :prospective)
|
194
|
+
assert_equal 'I will be accepted', standard.conjugate(:accept, :tense => :future, :aspect => :habitual)
|
195
|
+
assert_equal 'I will have been accepted', standard.conjugate(:accept, :tense => :future, :aspect => :perfect)
|
196
|
+
assert_equal 'I will be being accepted', standard.conjugate(:accept, :tense => :future, :aspect => :progressive)
|
197
|
+
assert_equal 'I will be about to be accepted', standard.conjugate(:accept, :tense => :future, :aspect => :prospective)
|
198
|
+
end
|
199
|
+
|
200
|
+
Verbs::Conjugator.with_options :diathesis => :passive, :person => :third, :plurality => :plural, :subject => true do |standard|
|
201
|
+
assert_equal 'They used to be accepted', standard.conjugate(:accept, :tense => :past, :aspect => :habitual)
|
202
|
+
assert_equal 'They had been accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfect)
|
203
|
+
assert_equal 'They were accepted', standard.conjugate(:accept, :tense => :past, :aspect => :perfective)
|
204
|
+
assert_equal 'They were being accepted', standard.conjugate(:accept, :tense => :past, :aspect => :progressive)
|
205
|
+
assert_equal 'They were about to be accepted', standard.conjugate(:accept, :tense => :past, :aspect => :prospective)
|
206
|
+
assert_equal 'They are accepted', standard.conjugate(:accept, :tense => :present, :aspect => :habitual)
|
207
|
+
assert_equal 'They have been accepted', standard.conjugate(:accept, :tense => :present, :aspect => :perfect)
|
208
|
+
assert_equal 'They are being accepted', standard.conjugate(:accept, :tense => :present, :aspect => :progressive)
|
209
|
+
assert_equal 'They are about to be accepted', standard.conjugate(:accept, :tense => :present, :aspect => :prospective)
|
210
|
+
assert_equal 'They will be accepted', standard.conjugate(:accept, :tense => :future, :aspect => :habitual)
|
211
|
+
assert_equal 'They will have been accepted', standard.conjugate(:accept, :tense => :future, :aspect => :perfect)
|
212
|
+
assert_equal 'They will be being accepted', standard.conjugate(:accept, :tense => :future, :aspect => :progressive)
|
213
|
+
assert_equal 'They will be about to be accepted', standard.conjugate(:accept, :tense => :future, :aspect => :prospective)
|
214
|
+
end
|
215
|
+
|
216
|
+
assert_raise Verbs::ImproperConstruction do
|
217
|
+
Verbs::Conjugator.conjugate(:be, :diathesis => :passive)
|
218
|
+
end
|
219
|
+
end
|
147
220
|
end
|
data/verbs.gemspec
CHANGED
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_development_dependency '
|
20
|
+
s.add_development_dependency 'test-unit'
|
21
|
+
s.add_development_dependency 'rake'
|
21
22
|
s.add_dependency 'activesupport', '>= 2.3.4'
|
22
23
|
s.add_dependency 'i18n'
|
23
24
|
end
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: verbs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Rossmeissl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: test-unit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -61,12 +75,12 @@ extensions: []
|
|
61
75
|
extra_rdoc_files: []
|
62
76
|
files:
|
63
77
|
- ".document"
|
78
|
+
- ".github/workflows/ruby.yml"
|
64
79
|
- ".gitignore"
|
65
80
|
- Gemfile
|
66
81
|
- LICENSE
|
67
82
|
- README.rdoc
|
68
83
|
- Rakefile
|
69
|
-
- VERSION
|
70
84
|
- lib/verbs.rb
|
71
85
|
- lib/verbs/conjugations.rb
|
72
86
|
- lib/verbs/conjugator.rb
|
@@ -95,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
requirements: []
|
98
|
-
|
99
|
-
rubygems_version: 2.2.0
|
112
|
+
rubygems_version: 3.1.2
|
100
113
|
signing_key:
|
101
114
|
specification_version: 4
|
102
115
|
summary: English verb conjugation in Ruby
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.0.10
|