Skip to content

Commit

Permalink
Dehumanize Support for Czech and Slovak Locales (arrow-py#1079)
Browse files Browse the repository at this point in the history
  • Loading branch information
anishnya committed Dec 27, 2021
1 parent a2ebb7e commit 74bc0a1
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 28 deletions.
4 changes: 4 additions & 0 deletions arrow/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@
"da-dk",
"ml",
"hi",
"cs",
"cs-cz",
"sk",
"sk-sk",
"fa",
"fa-ir",
"mr",
Expand Down
42 changes: 28 additions & 14 deletions arrow/locales.py
Original file line number Diff line number Diff line change
Expand Up @@ -3067,44 +3067,51 @@ class CzechLocale(Locale):

timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
"now": "Teď",
"second": {"past": "vteřina", "future": "vteřina", "zero": "vteřina"},
"second": {"past": "vteřina", "future": "vteřina"},
"seconds": {
"zero": "vteřina",
"past": "{0} sekundami",
"future-singular": "{0} sekundy",
"future-paucal": "{0} sekund",
},
"minute": {"past": "minutou", "future": "minutu", "zero": "{0} minut"},
"minute": {"past": "minutou", "future": "minutu"},
"minutes": {
"zero": "{0} minut",
"past": "{0} minutami",
"future-singular": "{0} minuty",
"future-paucal": "{0} minut",
},
"hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodin"},
"hour": {"past": "hodinou", "future": "hodinu"},
"hours": {
"zero": "{0} hodin",
"past": "{0} hodinami",
"future-singular": "{0} hodiny",
"future-paucal": "{0} hodin",
},
"day": {"past": "dnem", "future": "den", "zero": "{0} dnů"},
"day": {"past": "dnem", "future": "den"},
"days": {
"zero": "{0} dnů",
"past": "{0} dny",
"future-singular": "{0} dny",
"future-paucal": "{0} dnů",
},
"week": {"past": "týdnem", "future": "týden", "zero": "{0} týdnů"},
"week": {"past": "týdnem", "future": "týden"},
"weeks": {
"zero": "{0} týdnů",
"past": "{0} týdny",
"future-singular": "{0} týdny",
"future-paucal": "{0} týdnů",
},
"month": {"past": "měsícem", "future": "měsíc", "zero": "{0} měsíců"},
"month": {"past": "měsícem", "future": "měsíc"},
"months": {
"zero": "{0} měsíců",
"past": "{0} měsíci",
"future-singular": "{0} měsíce",
"future-paucal": "{0} měsíců",
},
"year": {"past": "rokem", "future": "rok", "zero": "{0} let"},
"year": {"past": "rokem", "future": "rok"},
"years": {
"zero": "{0} let",
"past": "{0} lety",
"future-singular": "{0} roky",
"future-paucal": "{0} let",
Expand Down Expand Up @@ -3190,44 +3197,51 @@ class SlovakLocale(Locale):

timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = {
"now": "Teraz",
"second": {"past": "sekundou", "future": "sekundu", "zero": "{0} sekúnd"},
"second": {"past": "sekundou", "future": "sekundu"},
"seconds": {
"zero": "{0} sekúnd",
"past": "{0} sekundami",
"future-singular": "{0} sekundy",
"future-paucal": "{0} sekúnd",
},
"minute": {"past": "minútou", "future": "minútu", "zero": "{0} minút"},
"minute": {"past": "minútou", "future": "minútu"},
"minutes": {
"zero": "{0} minút",
"past": "{0} minútami",
"future-singular": "{0} minúty",
"future-paucal": "{0} minút",
},
"hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodín"},
"hour": {"past": "hodinou", "future": "hodinu"},
"hours": {
"zero": "{0} hodín",
"past": "{0} hodinami",
"future-singular": "{0} hodiny",
"future-paucal": "{0} hodín",
},
"day": {"past": "dňom", "future": "deň", "zero": "{0} dní"},
"day": {"past": "dňom", "future": "deň"},
"days": {
"zero": "{0} dní",
"past": "{0} dňami",
"future-singular": "{0} dni",
"future-paucal": "{0} dní",
},
"week": {"past": "týždňom", "future": "týždeň", "zero": "{0} týždňov"},
"week": {"past": "týždňom", "future": "týždeň"},
"weeks": {
"zero": "{0} týždňov",
"past": "{0} týždňami",
"future-singular": "{0} týždne",
"future-paucal": "{0} týždňov",
},
"month": {"past": "mesiacom", "future": "mesiac", "zero": "{0} mesiacov"},
"month": {"past": "mesiacom", "future": "mesiac"},
"months": {
"zero": "{0} mesiacov",
"past": "{0} mesiacmi",
"future-singular": "{0} mesiace",
"future-paucal": "{0} mesiacov",
},
"year": {"past": "rokom", "future": "rok", "zero": "{0} rokov"},
"year": {"past": "rokom", "future": "rok"},
"years": {
"zero": "{0} rokov",
"past": "{0} rokmi",
"future-singular": "{0} roky",
"future-paucal": "{0} rokov",
Expand Down
36 changes: 36 additions & 0 deletions tests/test_arrow.py
Original file line number Diff line number Diff line change
Expand Up @@ -2410,6 +2410,10 @@ def locale_list_no_weeks() -> List[str]:
"da-dk",
"ml",
"hi",
"cs",
"cs-cz",
"sk",
"sk-sk",
"fa",
"fa-ir",
"mr",
Expand Down Expand Up @@ -2511,6 +2515,10 @@ def locale_list_with_weeks() -> List[str]:
"pt",
"pt-pt",
"pt-br",
"cs",
"cs-cz",
"sk",
"sk-sk",
"tl",
"tl-ph",
"vi",
Expand Down Expand Up @@ -2954,6 +2962,34 @@ def test_slavic_locales(self, slavic_locales: List[str]):
assert arw.dehumanize(past_string, locale=lang) == past
assert arw.dehumanize(future_string, locale=lang) == future

def test_czech_slovak(self):

# Relevant units for Slavic locale plural logic
units = [
0,
1,
2,
5,
]

# Only need to test on seconds as logic holds for all slavic plural units
for lang in ["cs"]:
for unit in units:
arw = arrow.Arrow(2000, 2, 18, 1, 50, 30)

past = arw.shift(minutes=-1 * unit, days=-1)
future = arw.shift(minutes=unit, days=1)

past_string = past.humanize(
arw, locale=lang, granularity=["minute", "day"]
)
future_string = future.humanize(
arw, locale=lang, granularity=["minute", "day"]
)

assert arw.dehumanize(past_string, locale=lang) == past
assert arw.dehumanize(future_string, locale=lang) == future


class TestArrowIsBetween:
def test_start_before_end(self):
Expand Down
28 changes: 14 additions & 14 deletions tests/test_locales.py
Original file line number Diff line number Diff line change
Expand Up @@ -613,62 +613,62 @@ def test_format_timeframe(self):

# Second(s)
assert self.locale._format_timeframe("second", -1) == "vteřina"
assert self.locale._format_timeframe("second", 0) == "vteřina"
assert self.locale._format_timeframe("second", 1) == "vteřina"
assert self.locale._format_timeframe("seconds", 0) == "vteřina"
assert self.locale._format_timeframe("seconds", -2) == "2 sekundami"
assert self.locale._format_timeframe("seconds", -5) == "5 sekundami"
assert self.locale._format_timeframe("seconds", 2) == "2 sekundy"
assert self.locale._format_timeframe("seconds", 5) == "5 sekund"

# Minute(s)
assert self.locale._format_timeframe("minute", -1) == "minutou"
assert self.locale._format_timeframe("minute", 0) == "0 minut"
assert self.locale._format_timeframe("minute", 1) == "minutu"
assert self.locale._format_timeframe("minutes", 0) == "0 minut"
assert self.locale._format_timeframe("minutes", -2) == "2 minutami"
assert self.locale._format_timeframe("minutes", -5) == "5 minutami"
assert self.locale._format_timeframe("minutes", 2) == "2 minuty"
assert self.locale._format_timeframe("minutes", 5) == "5 minut"

# Hour(s)
assert self.locale._format_timeframe("hour", -1) == "hodinou"
assert self.locale._format_timeframe("hour", 0) == "0 hodin"
assert self.locale._format_timeframe("hour", 1) == "hodinu"
assert self.locale._format_timeframe("hours", 0) == "0 hodin"
assert self.locale._format_timeframe("hours", -2) == "2 hodinami"
assert self.locale._format_timeframe("hours", -5) == "5 hodinami"
assert self.locale._format_timeframe("hours", 2) == "2 hodiny"
assert self.locale._format_timeframe("hours", 5) == "5 hodin"

# Day(s)
assert self.locale._format_timeframe("day", -1) == "dnem"
assert self.locale._format_timeframe("day", 0) == "0 dnů"
assert self.locale._format_timeframe("day", 1) == "den"
assert self.locale._format_timeframe("days", 0) == "0 dnů"
assert self.locale._format_timeframe("days", -2) == "2 dny"
assert self.locale._format_timeframe("days", -5) == "5 dny"
assert self.locale._format_timeframe("days", 2) == "2 dny"
assert self.locale._format_timeframe("days", 5) == "5 dnů"

# Weeks(s)
assert self.locale._format_timeframe("week", -1) == "týdnem"
assert self.locale._format_timeframe("week", 0) == "0 týdnů"
assert self.locale._format_timeframe("week", 1) == "týden"
assert self.locale._format_timeframe("weeks", 0) == "0 týdnů"
assert self.locale._format_timeframe("weeks", -2) == "2 týdny"
assert self.locale._format_timeframe("weeks", -5) == "5 týdny"
assert self.locale._format_timeframe("weeks", 2) == "2 týdny"
assert self.locale._format_timeframe("weeks", 5) == "5 týdnů"

# Month(s)
assert self.locale._format_timeframe("month", -1) == "měsícem"
assert self.locale._format_timeframe("month", 0) == "0 měsíců"
assert self.locale._format_timeframe("month", 1) == "měsíc"
assert self.locale._format_timeframe("months", 0) == "0 měsíců"
assert self.locale._format_timeframe("months", -2) == "2 měsíci"
assert self.locale._format_timeframe("months", -5) == "5 měsíci"
assert self.locale._format_timeframe("months", 2) == "2 měsíce"
assert self.locale._format_timeframe("months", 5) == "5 měsíců"

# Year(s)
assert self.locale._format_timeframe("year", -1) == "rokem"
assert self.locale._format_timeframe("year", 0) == "0 let"
assert self.locale._format_timeframe("year", 1) == "rok"
assert self.locale._format_timeframe("years", 0) == "0 let"
assert self.locale._format_timeframe("years", -2) == "2 lety"
assert self.locale._format_timeframe("years", -5) == "5 lety"
assert self.locale._format_timeframe("years", 2) == "2 roky"
Expand Down Expand Up @@ -697,55 +697,55 @@ def test_format_timeframe(self):
assert self.locale._format_timeframe("seconds", -5) == "5 sekundami"
assert self.locale._format_timeframe("seconds", -2) == "2 sekundami"
assert self.locale._format_timeframe("second", -1) == "sekundou"
assert self.locale._format_timeframe("second", 0) == "0 sekúnd"
assert self.locale._format_timeframe("seconds", 0) == "0 sekúnd"
assert self.locale._format_timeframe("second", 1) == "sekundu"
assert self.locale._format_timeframe("seconds", 2) == "2 sekundy"
assert self.locale._format_timeframe("seconds", 5) == "5 sekúnd"

assert self.locale._format_timeframe("minutes", -5) == "5 minútami"
assert self.locale._format_timeframe("minutes", -2) == "2 minútami"
assert self.locale._format_timeframe("minute", -1) == "minútou"
assert self.locale._format_timeframe("minute", 0) == "0 minút"
assert self.locale._format_timeframe("minutes", 0) == "0 minút"
assert self.locale._format_timeframe("minute", 1) == "minútu"
assert self.locale._format_timeframe("minutes", 2) == "2 minúty"
assert self.locale._format_timeframe("minutes", 5) == "5 minút"

assert self.locale._format_timeframe("hours", -5) == "5 hodinami"
assert self.locale._format_timeframe("hours", -2) == "2 hodinami"
assert self.locale._format_timeframe("hour", -1) == "hodinou"
assert self.locale._format_timeframe("hour", 0) == "0 hodín"
assert self.locale._format_timeframe("hours", 0) == "0 hodín"
assert self.locale._format_timeframe("hour", 1) == "hodinu"
assert self.locale._format_timeframe("hours", 2) == "2 hodiny"
assert self.locale._format_timeframe("hours", 5) == "5 hodín"

assert self.locale._format_timeframe("days", -5) == "5 dňami"
assert self.locale._format_timeframe("days", -2) == "2 dňami"
assert self.locale._format_timeframe("day", -1) == "dňom"
assert self.locale._format_timeframe("day", 0) == "0 dní"
assert self.locale._format_timeframe("days", 0) == "0 dní"
assert self.locale._format_timeframe("day", 1) == "deň"
assert self.locale._format_timeframe("days", 2) == "2 dni"
assert self.locale._format_timeframe("days", 5) == "5 dní"

assert self.locale._format_timeframe("weeks", -5) == "5 týždňami"
assert self.locale._format_timeframe("weeks", -2) == "2 týždňami"
assert self.locale._format_timeframe("week", -1) == "týždňom"
assert self.locale._format_timeframe("week", 0) == "0 týždňov"
assert self.locale._format_timeframe("weeks", 0) == "0 týždňov"
assert self.locale._format_timeframe("week", 1) == "týždeň"
assert self.locale._format_timeframe("weeks", 2) == "2 týždne"
assert self.locale._format_timeframe("weeks", 5) == "5 týždňov"

assert self.locale._format_timeframe("months", -5) == "5 mesiacmi"
assert self.locale._format_timeframe("months", -2) == "2 mesiacmi"
assert self.locale._format_timeframe("month", -1) == "mesiacom"
assert self.locale._format_timeframe("month", 0) == "0 mesiacov"
assert self.locale._format_timeframe("months", 0) == "0 mesiacov"
assert self.locale._format_timeframe("month", 1) == "mesiac"
assert self.locale._format_timeframe("months", 2) == "2 mesiace"
assert self.locale._format_timeframe("months", 5) == "5 mesiacov"

assert self.locale._format_timeframe("years", -5) == "5 rokmi"
assert self.locale._format_timeframe("years", -2) == "2 rokmi"
assert self.locale._format_timeframe("year", -1) == "rokom"
assert self.locale._format_timeframe("year", 0) == "0 rokov"
assert self.locale._format_timeframe("years", 0) == "0 rokov"
assert self.locale._format_timeframe("year", 1) == "rok"
assert self.locale._format_timeframe("years", 2) == "2 roky"
assert self.locale._format_timeframe("years", 5) == "5 rokov"
Expand Down

0 comments on commit 74bc0a1

Please sign in to comment.