diff --git a/src/humanize/i18n.py b/src/humanize/i18n.py index 55f809f..c2dd493 100644 --- a/src/humanize/i18n.py +++ b/src/humanize/i18n.py @@ -3,7 +3,8 @@ from __future__ import annotations import gettext as gettext_module -import os.path +import importlib.resources +import pathlib from threading import local __all__ = ["activate", "deactivate", "decimal_separator", "thousands_separator"] @@ -32,14 +33,13 @@ } -def _get_default_locale_path() -> str | None: - try: - if __file__ is None: - return None - return os.path.join(os.path.dirname(__file__), "locale") - except NameError: +def _get_default_locale_path() -> pathlib.Path | None: + if __package__ == "": return None + with importlib.resources.as_file(importlib.resources.files(__package__)) as pkg: + return pkg / "locale" + def get_translation() -> gettext_module.NullTranslations: try: diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 004b3f5..0e6e86c 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -156,20 +156,20 @@ def test_ordinal_genders( humanize.i18n.deactivate() -def test_default_locale_path_defined__file__() -> None: +def test_default_locale_path_defined__package__() -> None: i18n = importlib.import_module("humanize.i18n") assert i18n._get_default_locale_path() is not None -def test_default_locale_path_null__file__() -> None: +def test_default_locale_path_null__package__(monkeypatch) -> None: i18n = importlib.import_module("humanize.i18n") - i18n.__file__ = None + monkeypatch.setattr(i18n, "__package__", "") assert i18n._get_default_locale_path() is None -def test_default_locale_path_undefined__file__() -> None: +def test_default_locale_path_undefined__file__(monkeypatch) -> None: i18n = importlib.import_module("humanize.i18n") - del i18n.__file__ + monkeypatch.delattr(i18n, "__package__") assert i18n._get_default_locale_path() is None @@ -179,17 +179,17 @@ class TestActivate: " 'locale' folder. You need to pass the path explicitly." ) - def test_default_locale_path_null__file__(self) -> None: + def test_default_locale_path_null__package__(self, monkeypatch) -> None: i18n = importlib.import_module("humanize.i18n") - i18n.__file__ = None + monkeypatch.setattr(i18n, "__package__", "") with pytest.raises(Exception) as excinfo: i18n.activate("ru_RU") assert str(excinfo.value) == self.expected_msg - def test_default_locale_path_undefined__file__(self) -> None: + def test_default_locale_path_undefined__file__(self, monkeypatch) -> None: i18n = importlib.import_module("humanize.i18n") - del i18n.__file__ + monkeypatch.delattr(i18n, "__package__") with pytest.raises(Exception) as excinfo: i18n.activate("ru_RU")