Skip to content

Commit b600eb2

Browse files
committed
MessageContext: combined messages and terms dicts
Thanks @zbraniecki
1 parent b97f537 commit b600eb2

File tree

3 files changed

+31
-22
lines changed

3 files changed

+31
-22
lines changed

fluent/context.py

+8-10
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ def __init__(self, locales, functions=None, use_isolating=True):
3030
_functions.update(functions)
3131
self._functions = _functions
3232
self._use_isolating = use_isolating
33-
self._messages = {}
34-
self._terms = {}
33+
self._messages_and_terms = {}
3534
self._babel_locale = self._get_babel_locale()
3635
self._plural_form = babel.plural.to_python(self._babel_locale.plural_form)
3736

@@ -40,12 +39,9 @@ def add_messages(self, source):
4039
resource = parser.parse(source)
4140
# TODO - warn/error about duplicates
4241
for item in resource.body:
43-
if isinstance(item, Message):
44-
if item.id.name not in self._messages:
45-
self._messages[item.id.name] = item
46-
elif isinstance(item, Term):
47-
if item.id.name not in self._terms:
48-
self._terms[item.id.name] = item
42+
if isinstance(item, (Message, Term)):
43+
if item.id.name not in self._messages_and_terms:
44+
self._messages_and_terms[item.id.name] = item
4945

5046
def has_message(self, message_id):
5147
try:
@@ -63,15 +59,17 @@ def format(self, message_id, args=None):
6359
return resolved, errors
6460

6561
def _get_message(self, message_id):
62+
if message_id.startswith('-'):
63+
raise LookupError(message_id)
6664
if '.' in message_id:
6765
name, attr_name = message_id.split('.', 1)
68-
msg = self._messages[name]
66+
msg = self._messages_and_terms[name]
6967
for attribute in msg.attributes:
7068
if attribute.id.name == attr_name:
7169
return attribute.value
7270
raise LookupError(message_id)
7371
else:
74-
return self._messages[message_id]
72+
return self._messages_and_terms[message_id]
7573

7674
def _get_babel_locale(self):
7775
for l in self.locales:

fluent/resolver.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -166,17 +166,14 @@ def handle_term_reference(term_reference, env):
166166

167167
def lookup_reference(name, env):
168168
message = None
169-
if name.startswith("-"):
170-
try:
171-
message = env.context._terms[name]
172-
except LookupError:
169+
try:
170+
message = env.context._messages_and_terms[name]
171+
except LookupError:
172+
if name.startswith("-"):
173173
env.errors.append(
174174
FluentReferenceError("Unknown term: {0}"
175175
.format(name)))
176-
else:
177-
try:
178-
message = env.context._messages[name]
179-
except LookupError:
176+
else:
180177
env.errors.append(
181178
FluentReferenceError("Unknown message: {0}"
182179
.format(name)))

tests/test_context.py

+18-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ def test_add_messages(self):
1818
bar = Bar
1919
-baz = Baz
2020
"""))
21-
self.assertIn('foo', self.ctx._messages)
22-
self.assertIn('bar', self.ctx._messages)
23-
self.assertNotIn('-baz', self.ctx._messages)
24-
self.assertIn('-baz', self.ctx._terms)
21+
self.assertIn('foo', self.ctx._messages_and_terms)
22+
self.assertIn('bar', self.ctx._messages_and_terms)
23+
self.assertIn('-baz', self.ctx._messages_and_terms)
2524

2625
def test_has_message(self):
2726
self.ctx.add_messages(dedent_ftl("""
@@ -31,6 +30,13 @@ def test_has_message(self):
3130
self.assertTrue(self.ctx.has_message('foo'))
3231
self.assertFalse(self.ctx.has_message('bar'))
3332

33+
def test_has_message_for_term(self):
34+
self.ctx.add_messages(dedent_ftl("""
35+
-foo = Foo
36+
"""))
37+
38+
self.assertFalse(self.ctx.has_message('-foo'))
39+
3440
def test_has_message_with_attribute(self):
3541
self.ctx.add_messages(dedent_ftl("""
3642
foo = Foo
@@ -84,3 +90,11 @@ def test_format_missing(self):
8490
self.assertRaises(LookupError,
8591
self.ctx.format,
8692
'a-missing-message')
93+
94+
def test_format_term(self):
95+
self.ctx.add_messages(dedent_ftl("""
96+
-foo = Foo
97+
"""))
98+
self.assertRaises(LookupError,
99+
self.ctx.format,
100+
'-foo')

0 commit comments

Comments
 (0)