Skip to content

Commit

Permalink
Cache locale_identifiers()
Browse files Browse the repository at this point in the history
Fixes #620
  • Loading branch information
akx committed May 27, 2019
1 parent cfe7484 commit bd2c44b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
17 changes: 14 additions & 3 deletions babel/localedata.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,24 @@ def locale_identifiers():
"""Return a list of all locale identifiers for which locale data is
available.
This data is cached after the first invocation in `locale_identifiers.cache`.
Removing the `locale_identifiers.cache` attribute or setting it to `None`
will cause this function to re-read the list from disk.
.. versionadded:: 0.8.1
:return: a list of locale identifiers (strings)
"""
return [stem for stem, extension in [
os.path.splitext(filename) for filename in os.listdir(_dirname)
] if extension == '.dat' and stem != 'root']
data = getattr(locale_identifiers, 'cache', None)
if data is None:
locale_identifiers.cache = data = [
stem
for stem, extension in
(os.path.splitext(filename) for filename in os.listdir(_dirname))
if extension == '.dat' and stem != 'root'
]
return data


def load(name, merge_inherited=True):
Expand Down
26 changes: 26 additions & 0 deletions tests/test_localedata.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

from babel import localedata


class MergeResolveTestCase(unittest.TestCase):

def test_merge_items(self):
Expand Down Expand Up @@ -78,6 +79,7 @@ def test_locale_identification():
for l in localedata.locale_identifiers():
assert localedata.exists(l)


def test_unique_ids():
# Check all locale IDs are uniques.
all_ids = localedata.locale_identifiers()
Expand All @@ -93,6 +95,7 @@ def test_mixedcased_locale():
methodcaller(random.choice(['lower', 'upper']))(c) for c in l])
assert localedata.exists(locale_id)


def test_locale_argument_acceptance():
# Testing None input.
normalized_locale = localedata.normalize_locale(None)
Expand All @@ -105,3 +108,26 @@ def test_locale_argument_acceptance():
assert normalized_locale is None
locale_exist = localedata.exists(['en_us', None])
assert locale_exist == False


def test_locale_identifiers_cache(monkeypatch):
original_listdir = localedata.os.listdir
listdir_calls = []
def listdir_spy(*args):
rv = original_listdir(*args)
listdir_calls.append((args, rv))
return rv
monkeypatch.setattr(localedata.os, 'listdir', listdir_spy)

# In case we've already run some tests...
if hasattr(localedata.locale_identifiers, 'cache'):
del localedata.locale_identifiers.cache

assert not listdir_calls
assert localedata.locale_identifiers()
assert len(listdir_calls) == 1
assert localedata.locale_identifiers() is localedata.locale_identifiers.cache
assert len(listdir_calls) == 1
localedata.locale_identifiers.cache = None
assert localedata.locale_identifiers()
assert len(listdir_calls) == 2

0 comments on commit bd2c44b

Please sign in to comment.