Repository: crsmithdev/arrow
Pull request #799 (2020-06-05 16:07:01)

Improve Macedonian(MK) locale
## Pull Request Checklist

Thank you for taking the time to improve Arrow! Before submitting your pull request, please check all *appropriate* boxes:

<!-- Check boxes by placing an x in the brackets: [x] -->
- [x] 🧪 Added **tests** for changed code.
- [x] 🛠️ All tests **pass** when run locally (run `tox` or `make test` to find out!).
- [x] 🧹 All linting checks **pass** when run locally (run `tox -e lint` or `make lint` to find out!).
- [ ] 📚 Updated **documentation** for changed code.
- [x] ⏩ Code is **up-to-date** with the `master` branch.

## Description of Changes

Hello,

This PR consists of the following changes to the Macedonian locale:
- Adding weeks.
- Fix singular second.
- Adding Slavic handling of seconds.
- Of course, tests to back up the above and improvements to them.


Patch:
diff --git a/arrow/locales.py b/arrow/locales.py
index e26cef5..82c7029 100644
--- a/arrow/locales.py
+++ b/arrow/locales.py
@@ -1616,14 +1616,16 @@ class MacedonianLocale(SlavicBaseLocale):
 
     timeframes = {
         "now": "сега",
-        "second": "секунда",
-        "seconds": "{0} секунди",
+        "second": "една секунда",
+        "seconds": ["{0} секунда", "{0} секунди", "{0} секунди"],
         "minute": "една минута",
         "minutes": ["{0} минута", "{0} минути", "{0} минути"],
         "hour": "еден саат",
         "hours": ["{0} саат", "{0} саати", "{0} саати"],
         "day": "еден ден",
         "days": ["{0} ден", "{0} дена", "{0} дена"],
+        "week": "една недела",
+        "weeks": ["{0} недела", "{0} недели", "{0} недели"],
         "month": "еден месец",
         "months": ["{0} месец", "{0} месеци", "{0} месеци"],
         "year": "една година",
@@ -1649,39 +1651,39 @@ class MacedonianLocale(SlavicBaseLocale):
     ]
     month_abbreviations = [
         "",
-        "Јан.",
-        " Фев.",
-        " Мар.",
-        " Апр.",
-        " Мај",
-        " Јун.",
-        " Јул.",
-        " Авг.",
-        " Септ.",
-        " Окт.",
-        " Ноем.",
-        " Декем.",
+        "Јан",
+        "Фев",
+        "Мар",
+        "Апр",
+        "Мај",
+        "Јун",
+        "Јул",
+        "Авг",
+        "Септ",
+        "Окт",
+        "Ноем",
+        "Декем",
     ]
 
     day_names = [
         "",
         "Понеделник",
-        " Вторник",
-        " Среда",
-        " Четврток",
-        " Петок",
-        " Сабота",
-        " Недела",
+        "Вторник",
+        "Среда",
+        "Четврток",
+        "Петок",
+        "Сабота",
+        "Недела",
     ]
     day_abbreviations = [
         "",
-        "Пон.",
-        " Вт.",
-        " Сре.",
-        " Чет.",
-        " Пет.",
-        " Саб.",
-        " Нед.",
+        "Пон",
+        "Вт",
+        "Сре",
+        "Чет",
+        "Пет",
+        "Саб",
+        "Нед",
     ]
 
 


Test patch:
diff --git a/tests/test_locales.py b/tests/test_locales.py
index 6336889..a51f543 100644
--- a/tests/test_locales.py
+++ b/tests/test_locales.py
@@ -480,19 +480,69 @@ class TestBulgarianLocale:
 
 @pytest.mark.usefixtures("lang_locale")
 class TestMacedonianLocale:
-    def test_plurals_mk(self):
+    def test_singles_mk(self):
+        assert self.locale._format_timeframe("second", 1) == "една секунда"
+        assert self.locale._format_timeframe("minute", 1) == "една минута"
+        assert self.locale._format_timeframe("hour", 1) == "еден саат"
+        assert self.locale._format_timeframe("day", 1) == "еден ден"
+        assert self.locale._format_timeframe("week", 1) == "една недела"
+        assert self.locale._format_timeframe("month", 1) == "еден месец"
+        assert self.locale._format_timeframe("year", 1) == "една година"
+
+    def test_meridians_mk(self):
+        assert self.locale.meridian(7, "A") == "претпладне"
+        assert self.locale.meridian(18, "A") == "попладне"
+        assert self.locale.meridian(10, "a") == "дп"
+        assert self.locale.meridian(22, "a") == "пп"
+
+    def test_describe_mk(self):
+        assert self.locale.describe("second", only_distance=True) == "една секунда"
+        assert self.locale.describe("second", only_distance=False) == "за една секунда"
+        assert self.locale.describe("minute", only_distance=True) == "една минута"
+        assert self.locale.describe("minute", only_distance=False) == "за една минута"
+        assert self.locale.describe("hour", only_distance=True) == "еден саат"
+        assert self.locale.describe("hour", only_distance=False) == "за еден саат"
+        assert self.locale.describe("day", only_distance=True) == "еден ден"
+        assert self.locale.describe("day", only_distance=False) == "за еден ден"
+        assert self.locale.describe("week", only_distance=True) == "една недела"
+        assert self.locale.describe("week", only_distance=False) == "за една недела"
+        assert self.locale.describe("month", only_distance=True) == "еден месец"
+        assert self.locale.describe("month", only_distance=False) == "за еден месец"
+        assert self.locale.describe("year", only_distance=True) == "една година"
+        assert self.locale.describe("year", only_distance=False) == "за една година"
+
+    def test_relative_mk(self):
         # time
         assert self.locale._format_relative("сега", "now", 0) == "сега"
+        assert self.locale._format_relative("1 секунда", "seconds", 1) == "за 1 секунда"
+        assert self.locale._format_relative("1 минута", "minutes", 1) == "за 1 минута"
+        assert self.locale._format_relative("1 саат", "hours", 1) == "за 1 саат"
+        assert self.locale._format_relative("1 ден", "days", 1) == "за 1 ден"
+        assert self.locale._format_relative("1 недела", "weeks", 1) == "за 1 недела"
+        assert self.locale._format_relative("1 месец", "months", 1) == "за 1 месец"
+        assert self.locale._format_relative("1 година", "years", 1) == "за 1 година"
+        assert (
+            self.locale._format_relative("1 секунда", "seconds", -1) == "пред 1 секунда"
+        )
+        assert (
+            self.locale._format_relative("1 минута", "minutes", -1) == "пред 1 минута"
+        )
+        assert self.locale._format_relative("1 саат", "hours", -1) == "пред 1 саат"
+        assert self.locale._format_relative("1 ден", "days", -1) == "пред 1 ден"
+        assert self.locale._format_relative("1 недела", "weeks", -1) == "пред 1 недела"
+        assert self.locale._format_relative("1 месец", "months", -1) == "пред 1 месец"
+        assert self.locale._format_relative("1 година", "years", -1) == "пред 1 година"
 
-        # Hours
-        assert self.locale._format_timeframe("hours", 0) == "0 саати"
-        assert self.locale._format_timeframe("hours", 1) == "1 саат"
-        assert self.locale._format_timeframe("hours", 2) == "2 саати"
-        assert self.locale._format_timeframe("hours", 4) == "4 саати"
-        assert self.locale._format_timeframe("hours", 5) == "5 саати"
-        assert self.locale._format_timeframe("hours", 21) == "21 саат"
-        assert self.locale._format_timeframe("hours", 22) == "22 саати"
-        assert self.locale._format_timeframe("hours", 25) == "25 саати"
+    def test_plurals_mk(self):
+        # Seconds
+        assert self.locale._format_timeframe("seconds", 0) == "0 секунди"
+        assert self.locale._format_timeframe("seconds", 1) == "1 секунда"
+        assert self.locale._format_timeframe("seconds", 2) == "2 секунди"
+        assert self.locale._format_timeframe("seconds", 4) == "4 секунди"
+        assert self.locale._format_timeframe("seconds", 5) == "5 секунди"
+        assert self.locale._format_timeframe("seconds", 21) == "21 секунда"
+        assert self.locale._format_timeframe("seconds", 22) == "22 секунди"
+        assert self.locale._format_timeframe("seconds", 25) == "25 секунди"
 
         # Minutes
         assert self.locale._format_timeframe("minutes", 0) == "0 минути"
@@ -504,6 +554,71 @@ class TestMacedonianLocale:
         assert self.locale._format_timeframe("minutes", 22) == "22 минути"
         assert self.locale._format_timeframe("minutes", 25) == "25 минути"
 
+        # Hours
+        assert self.locale._format_timeframe("hours", 0) == "0 саати"
+        assert self.locale._format_timeframe("hours", 1) == "1 саат"
+        assert self.locale._format_timeframe("hours", 2) == "2 саати"
+        assert self.locale._format_timeframe("hours", 4) == "4 саати"
+        assert self.locale._format_timeframe("hours", 5) == "5 саати"
+        assert self.locale._format_timeframe("hours", 21) == "21 саат"
+        assert self.locale._format_timeframe("hours", 22) == "22 саати"
+        assert self.locale._format_timeframe("hours", 25) == "25 саати"
+
+        # Days
+        assert self.locale._format_timeframe("days", 0) == "0 дена"
+        assert self.locale._format_timeframe("days", 1) == "1 ден"
+        assert self.locale._format_timeframe("days", 2) == "2 дена"
+        assert self.locale._format_timeframe("days", 3) == "3 дена"
+        assert self.locale._format_timeframe("days", 21) == "21 ден"
+
+        # Weeks
+        assert self.locale._format_timeframe("weeks", 0) == "0 недели"
+        assert self.locale._format_timeframe("weeks", 1) == "1 недела"
+        assert self.locale._format_timeframe("weeks", 2) == "2 недели"
+        assert self.locale._format_timeframe("weeks", 4) == "4 недели"
+        assert self.locale._format_timeframe("weeks", 5) == "5 недели"
+        assert self.locale._format_timeframe("weeks", 21) == "21 недела"
+        assert self.locale._format_timeframe("weeks", 22) == "22 недели"
+        assert self.locale._format_timeframe("weeks", 25) == "25 недели"
+
+        # Months
+        assert self.locale._format_timeframe("months", 0) == "0 месеци"
+        assert self.locale._format_timeframe("months", 1) == "1 месец"
+        assert self.locale._format_timeframe("months", 2) == "2 месеци"
+        assert self.locale._format_timeframe("months", 4) == "4 месеци"
+        assert self.locale._format_timeframe("months", 5) == "5 месеци"
+        assert self.locale._format_timeframe("months", 21) == "21 месец"
+        assert self.locale._format_timeframe("months", 22) == "22 месеци"
+        assert self.locale._format_timeframe("months", 25) == "25 месеци"
+
+        # Years
+        assert self.locale._format_timeframe("years", 1) == "1 година"
+        assert self.locale._format_timeframe("years", 2) == "2 години"
+        assert self.locale._format_timeframe("years", 5) == "5 години"
+
+    def test_multi_describe_mk(self):
+        describe = self.locale.describe_multi
+
+        fulltest = [("years", 5), ("weeks", 1), ("hours", 1), ("minutes", 6)]
+        assert describe(fulltest) == "за 5 години 1 недела 1 саат 6 минути"
+        seconds4000_0days = [("days", 0), ("hours", 1), ("minutes", 6)]
+        assert describe(seconds4000_0days) == "за 0 дена 1 саат 6 минути"
+        seconds4000 = [("hours", 1), ("minutes", 6)]
+        assert describe(seconds4000) == "за 1 саат 6 минути"
+        assert describe(seconds4000, only_distance=True) == "1 саат 6 минути"
+        seconds3700 = [("hours", 1), ("minutes", 1)]
+        assert describe(seconds3700) == "за 1 саат 1 минута"
+        seconds300_0hours = [("hours", 0), ("minutes", 5)]
+        assert describe(seconds300_0hours) == "за 0 саати 5 минути"
+        seconds300 = [("minutes", 5)]
+        assert describe(seconds300) == "за 5 минути"
+        seconds60 = [("minutes", 1)]
+        assert describe(seconds60) == "за 1 минута"
+        assert describe(seconds60, only_distance=True) == "1 минута"
+        seconds60 = [("seconds", 1)]
+        assert describe(seconds60) == "за 1 секунда"
+        assert describe(seconds60, only_distance=True) == "1 секунда"
+
 
 @pytest.mark.usefixtures("time_2013_01_01")
 @pytest.mark.usefixtures("lang_locale")