Skip to content

Commit 4592a4f

Browse files
authored
Merge pull request #31 from bretttolbert/typing-mood-tense
- Added typing for mood and tense using `StrEnum` (backwards-compatible with string values) - Fixed typo in new `Language` enum - Corrected Romanian conditional tense spelling from `conditional` to `condițional`
2 parents 53309c8 + e9c16c5 commit 4592a4f

23 files changed

+800
-380
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "verbecc"
7-
version = "1.11.1"
7+
version = "1.11.2"
88
dependencies = [
99
"cython>=3.1.4",
1010
"importlib_resources==6.4.5 ; python_version < '3.13'",

tests/test_inflectors/test_inflector_es.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ def test_abolir():
590590
"""
591591
Reproduce error:
592592
593-
> co.template.moods[persons_mood_name].tenses[aux_tense_name].person_endings]
593+
> co.template.mood_templates[persons_mood_name].tense_templates[aux_tense_name].person_endings]
594594
E KeyError: 'presente'
595595
596596
../../PyVEnvs/Py311/lib/python3.11/site-packages/verbecc/inflector.py:259: KeyError

tests/test_inflectors/test_inflector_fr.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from verbecc.src.conjugator.conjugator import Conjugator, AlternatesBehavior
88
from verbecc.src.parsers.tense_template import TenseTemplate
99
from verbecc.src.defs.types.exceptions import ConjugatorError
10-
from verbecc.src.defs.types.data_types import MoodsConjugation
10+
from verbecc.src.defs.types.conjugation import MoodsConjugation
1111

1212

1313
@pytest.fixture(scope="module")
@@ -235,7 +235,7 @@ def test_can_conjugate_all_verbs(cg):
235235
assert len(all_conjugations) == len(verbs)
236236

237237

238-
def test_inflector_fr_raser(cg):
238+
def test_inflector_fr_conjugate_compound_raser(cg):
239239
infinitive = "raser"
240240
co = cg._get_conj_obs(infinitive)
241241
ret = cg._conjugate_compound(
@@ -259,7 +259,13 @@ def test_inflector_fr_raser(cg):
259259
]
260260

261261

262-
def test_inflector_fr_se_raser(cg):
262+
def test_inflector_fr_conjugate_compound_se_raser(cg):
263+
"""
264+
test targeting:
265+
- reflexive verb conjugation
266+
- compound verb conjugation with a verb conjugated with être (inflected participle)
267+
- Note: In French, all reflexive verbs are conjugated with être
268+
"""
263269
infinitive = "se raser"
264270
co = cg._get_conj_obs(infinitive)
265271
ret = cg._conjugate_compound(
@@ -281,3 +287,31 @@ def test_inflector_fr_se_raser(cg):
281287
["que vous vous soyez rasés"],
282288
["qu'ils se soient rasés"],
283289
]
290+
291+
292+
def test_inflector_fr_conjugate_compound_parler_indicative_passé_composé(cg):
293+
"""
294+
test targeting:
295+
- compound verb conjugation with a verb not conjugated with être (non-inflected participle)
296+
"""
297+
infinitive = "parler"
298+
co = cg._get_conj_obs(infinitive)
299+
ret = cg._conjugate_compound(
300+
co,
301+
"indicatif",
302+
"passé-composé",
303+
"indicatif",
304+
"présent",
305+
False,
306+
AlternatesBehavior.All,
307+
Gender.Masculine,
308+
True,
309+
)
310+
assert ret == [
311+
["j'ai parlé"],
312+
["tu as parlé"],
313+
["il a parlé"],
314+
["nous avons parlé"],
315+
["vous avez parlé"],
316+
["ils ont parlé"],
317+
]

tests/test_inflectors/test_inflector_it.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import pytest
22
from typing import cast
33

4-
from verbecc.src.defs.types.gender import Gender
5-
from verbecc.src.defs.types.person import Person
64
from verbecc.src.conjugator.conjugator import Conjugator, MoodsConjugation
75
from verbecc.src.defs.types.alternates_behavior import AlternatesBehavior
6+
from verbecc.src.defs.types.gender import Gender
7+
from verbecc.src.defs.types.person import Person
88

99

1010
@pytest.fixture(scope="module")
@@ -240,7 +240,7 @@ def test_inflector_it_alzarsi_indicativo_passato_prossimo(
240240
assert moods_conj["indicativo"]["passato-prossimo"] == expected_result
241241

242242

243-
def test_inflector_it_essere_indicativo_passato_prossimo(cg):
243+
def test_inflector_it_conjugate_compound_essere_indicativo_passato_prossimo(cg):
244244
infinitive = "essere"
245245
co = cg._get_conj_obs(infinitive)
246246
ret = cg._conjugate_compound(

tests/test_inflectors/test_inflector_ro.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def test_all_verbs_have_templates(cg):
267267
),
268268
(
269269
"avea",
270-
"conditional",
270+
"condițional",
271271
"prezent",
272272
AlternatesBehavior.FirstOnly,
273273
[
@@ -281,7 +281,7 @@ def test_all_verbs_have_templates(cg):
281281
),
282282
(
283283
"avea",
284-
"conditional",
284+
"condițional",
285285
"perfect",
286286
AlternatesBehavior.FirstOnly,
287287
[
@@ -334,9 +334,9 @@ def test_inflector_ro_conjugate_mood_tense_viitor_1_popular(cg):
334334
)
335335

336336

337-
def test_inflector_ro_conjugate_mood_tense_conditional_perfect(cg):
337+
def test_inflector_ro_conjugate_mood_tense_condițional_perfect(cg):
338338
assert cg.conjugate_mood_tense(
339-
"avea", "conditional", "perfect", AlternatesBehavior.FirstOnly
339+
"avea", "condițional", "perfect", AlternatesBehavior.FirstOnly
340340
) == [
341341
"eu aş fi avut",
342342
"tu ai fi avut",

verbecc/__init__.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
from verbecc.src.conjugator.conjugator import Conjugator
22
from verbecc.src.defs.types.alternates_behavior import AlternatesBehavior
3-
from verbecc.src.defs.types.data_types import (
3+
from verbecc.src.defs.types.conjugation import (
44
MoodsConjugation,
55
MoodConjugation,
66
TenseConjugation,
77
PersonConjugation,
8-
VerbInfo,
8+
ConjugationInfo,
99
Conjugation,
1010
)
1111
from verbecc.src.defs.types.gender import Gender
1212
from verbecc.src.defs.types.person import Person, is_plural, is_singular
1313
from verbecc.src.defs.types.partiple_inflection import ParticipleInflection
14-
from verbecc.src.defs.types.language import Lanugage
14+
from verbecc.src.defs.types.language import Language
15+
from verbecc.src.defs.types.mood import Mood
16+
from verbecc.src.defs.types.tense import Tense
1517
import verbecc.src.defs.constants.localization as localization
1618
import verbecc.src.defs.constants.grammar_defines as grammar_defines
17-
from verbecc.src.parsers.mood import Mood
19+
from verbecc.src.parsers.mood_template import MoodTemplate
1820
from verbecc.src.parsers.verb import Verb
1921
from verbecc.src.defs.types.exceptions import (
2022
ConjugatorError,

verbecc/src/conjugator/conjugator.py

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import logging
22

33
from verbecc.src.defs.types.gender import Gender
4+
from verbecc.src.defs.types.mood import Mood
5+
from verbecc.src.defs.types.tense import Tense
6+
from verbecc.src.defs.types.conjugation import ConjugationInfo
47
from verbecc.src.defs.constants.config import DEVEL_MODE
58

69
logging_level = logging.CRITICAL + 1 # effectively disables logging
@@ -29,7 +32,7 @@
2932
InvalidMoodError,
3033
InvalidTenseError,
3134
)
32-
from verbecc.src.defs.types.data_types import (
35+
from verbecc.src.defs.types.conjugation import (
3336
PersonConjugation,
3437
TenseConjugation,
3538
MoodConjugation,
@@ -54,7 +57,7 @@ def __init__(self, lang: str):
5457

5558
def conjugate(
5659
self,
57-
infinitive,
60+
infinitive: str,
5861
include_alternates: bool = False,
5962
gender: Gender = Gender.Masculine,
6063
conjugate_pronouns: bool = True,
@@ -74,26 +77,26 @@ def conjugate(
7477
alternates_behavior = AlternatesBehavior.All
7578
co = self._get_conj_obs(infinitive)
7679
moods: MoodsConjugation = {}
77-
for mood in co.template.moods:
78-
moods[mood] = self._conjugate_mood(
79-
co, mood, alternates_behavior, gender, conjugate_pronouns
80+
for mood_name, _ in co.template.mood_templates.items():
81+
moods[mood_name] = self._conjugate_mood(
82+
co, mood_name, alternates_behavior, gender, conjugate_pronouns
8083
)
8184
return {
82-
"verb": {
83-
"infinitive": co.verb.infinitive,
84-
"predicted": co.verb.predicted,
85-
"pred_score": co.verb.pred_score,
86-
"template": co.verb.template,
87-
"translation_en": co.verb.translation_en,
88-
"stem": co.verb_stem,
89-
},
85+
"verb": ConjugationInfo(
86+
co.verb.infinitive,
87+
co.verb.predicted,
88+
co.verb.pred_score,
89+
co.verb.template,
90+
co.verb.translation_en,
91+
co.verb_stem,
92+
).data,
9093
"moods": moods,
9194
}
9295

9396
def conjugate_mood(
9497
self,
9598
infinitive: str,
96-
mood_name: str,
99+
mood_name: Mood,
97100
alternates_behavior: AlternatesBehavior = AlternatesBehavior.FirstOnly,
98101
gender: Gender = Gender.Masculine,
99102
conjugate_pronouns: bool = True,
@@ -139,8 +142,8 @@ def get_verbs_that_start_with(self, query: str, max_results: int) -> List[str]:
139142
def conjugate_mood_tense(
140143
self,
141144
infinitive: str,
142-
mood_name: str,
143-
tense_name: str,
145+
mood_name: Mood,
146+
tense_name: Tense,
144147
alternates_behavior: AlternatesBehavior = AlternatesBehavior.FirstOnly,
145148
gender: Gender = Gender.Masculine,
146149
conjugate_pronouns: bool = True,
@@ -153,12 +156,12 @@ def conjugate_mood_tense(
153156
def _conjugate_mood(
154157
self,
155158
co: ConjugationObjects,
156-
mood_name: str,
159+
mood_name: Mood,
157160
alternates_behavior: AlternatesBehavior,
158161
gender: Gender = Gender.Masculine,
159162
conjugate_pronouns: bool = True,
160163
) -> MoodConjugation:
161-
if mood_name not in co.template.moods:
164+
if mood_name not in co.template.mood_templates.keys():
162165
raise InvalidMoodError
163166
ret = {}
164167
ret.update(
@@ -176,8 +179,8 @@ def _conjugate_mood(
176179
def _conjugate_mood_tense(
177180
self,
178181
co: ConjugationObjects,
179-
mood_name: str,
180-
tense_name: str,
182+
mood_name: Mood,
183+
tense_name: Tense,
181184
alternates_behavior: AlternatesBehavior,
182185
gender: Gender = Gender.Masculine,
183186
conjugate_pronouns: bool = True,
@@ -201,10 +204,10 @@ def _conjugate_mood_tense(
201204
conjugate_pronouns=conjugate_pronouns,
202205
)
203206
else:
204-
mood = co.template.moods[mood_name]
205-
if tense_name not in mood.tenses:
207+
mood_template = co.template.mood_templates[mood_name]
208+
if tense_name not in mood_template.tense_templates:
206209
raise InvalidTenseError
207-
tense_template = mood.tenses[tense_name]
210+
tense_template = mood_template.tense_templates[tense_name]
208211
return self._conjugate_simple_mood_tense(
209212
co.verb_stem,
210213
mood_name,
@@ -221,14 +224,14 @@ def _conjugate_mood_tense(
221224
def _get_simple_conjugations_for_mood(
222225
self,
223226
co: ConjugationObjects,
224-
mood_name: str,
227+
mood_name: Mood,
225228
alternates_behavior: AlternatesBehavior,
226229
gender: Gender = Gender.Masculine,
227230
conjugate_pronouns: bool = True,
228231
) -> MoodConjugation:
229232
ret = {}
230-
mood = co.template.moods[mood_name]
231-
for tense_name in mood.tenses:
233+
mood_template = co.template.mood_templates[mood_name]
234+
for tense_name in mood_template.tense_templates:
232235
ret[tense_name] = self._conjugate_mood_tense(
233236
co,
234237
mood_name,
@@ -242,7 +245,7 @@ def _get_simple_conjugations_for_mood(
242245
def _get_compound_conjugations_for_mood(
243246
self,
244247
co: ConjugationObjects,
245-
mood_name: str,
248+
mood_name: Mood,
246249
alternates_behavior: AlternatesBehavior,
247250
gender: Gender,
248251
conjugate_pronouns=True,
@@ -264,10 +267,10 @@ def _get_compound_conjugations_for_mood(
264267
def _conjugate_compound(
265268
self,
266269
co: ConjugationObjects,
267-
mood_name: str,
268-
tense_name: str,
269-
aux_mood_name: str,
270-
aux_tense_name: str,
270+
mood_name: Mood,
271+
tense_name: Tense,
272+
aux_mood_name: Mood,
273+
aux_tense_name: Tense,
271274
aux_uses_alternate: bool,
272275
alternates_behavior: AlternatesBehavior,
273276
gender: Gender = Gender.Masculine,
@@ -283,18 +286,20 @@ def _conjugate_compound(
283286
):
284287
return ret
285288
persons_mood_name = mood_name
286-
if mood_name not in co.template.moods:
289+
if mood_name not in co.template.mood_templates.keys():
287290
persons_mood_name = self._inflector._get_indicative_mood_name()
288291
persons = [
289292
pe.person
290-
for pe in co.template.moods[persons_mood_name]
291-
.tenses[aux_tense_name]
293+
for pe in co.template.mood_templates[persons_mood_name]
294+
.tense_templates[aux_tense_name]
292295
.person_endings
293296
]
294297
aux_verb = self._inflector._get_auxilary_verb(co, mood_name, tense_name)
295298
aux_co = self._get_conj_obs(aux_verb)
296299
aux_tense_template = copy.deepcopy(
297-
aux_co.template.moods[aux_mood_name].tenses[aux_tense_name]
300+
aux_co.template.mood_templates[aux_mood_name].tense_templates[
301+
aux_tense_name
302+
]
298303
)
299304
aux_person_endings = []
300305
for pe in aux_tense_template.person_endings:
@@ -347,8 +352,8 @@ def _conjugate_compound(
347352
def _conjugate_compound_primary_verb(
348353
self,
349354
co: ConjugationObjects,
350-
mood_name: str,
351-
tense_name: str,
355+
mood_name: Mood,
356+
tense_name: Tense,
352357
persons: List[Person],
353358
aux_verb: str,
354359
aux_conj: List[str],
@@ -385,7 +390,7 @@ def _conjugate_compound_primary_verb(
385390
p_conj = self._conjugate_simple_mood_tense(
386391
co.verb_stem,
387392
p_mood,
388-
co.template.moods[p_mood].tenses[p_tense],
393+
co.template.mood_templates[p_mood].tense_templates[p_tense],
389394
False,
390395
AlternatesBehavior.FirstOnly,
391396
gender=gender,
@@ -502,7 +507,7 @@ def _conjugate_compound_primary_verb(
502507
def _conjugate_simple_mood_tense(
503508
self,
504509
verb_stem: str,
505-
mood_name: str,
510+
mood_name: Mood,
506511
tense_template: TenseTemplate,
507512
is_reflexive: bool = False,
508513
alternates_behavior: AlternatesBehavior = AlternatesBehavior.FirstOnly,

0 commit comments

Comments
 (0)