Skip to content

Commit 577f38f

Browse files
committed
refactor lookup into bundle, change dirty, and make named arguments work
1 parent 061c3ca commit 577f38f

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

fluent.runtime/fluent/runtime/__init__.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,19 @@ def has_message(self, message_id):
5656
return False
5757
return message_id in self._messages_and_terms
5858

59+
def lookup(self, full_id):
60+
if full_id not in self._compiled:
61+
message = self._messages_and_terms[full_id]
62+
self._compiled[full_id] = self._compiler(message.value)
63+
return self._compiled[full_id]
64+
5965
def format(self, message_id, args=None):
6066
if message_id.startswith(TERM_SIGIL):
6167
raise LookupError(message_id)
6268
if args is None:
6369
args = {}
64-
if message_id not in self._compiled:
65-
message = self._messages_and_terms[message_id]
66-
self._compiled[message_id] = self._compiler(message.value)
67-
resolve = self._compiled[message_id]
6870
errors = []
71+
resolve = self.lookup(message_id)
6972
env = ResolverEnvironment(context=self,
7073
current=CurrentEnvironment(args=args),
7174
errors=errors)

fluent.runtime/fluent/runtime/resolver.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from fluent.syntax import ast as FTL
1111
from .errors import FluentCyclicReferenceError, FluentFormatError, FluentReferenceError
12-
from .types import FluentDateType, FluentNone, FluentNumber, fluent_date, fluent_number
12+
from .types import FluentType, FluentDateType, FluentNone, FluentNumber, fluent_date, fluent_number
1313
from .utils import numeric_to_native, reference_to_id, unknown_reference_error_obj
1414

1515
try:
@@ -54,7 +54,6 @@ class CurrentEnvironment(object):
5454
class ResolverEnvironment(object):
5555
context = attr.ib()
5656
errors = attr.ib()
57-
dirty = attr.ib(factory=set)
5857
part_count = attr.ib(default=0)
5958
current = attr.ib(factory=CurrentEnvironment)
6059

@@ -141,11 +140,16 @@ def __call__(self, env):
141140
return FluentNone()
142141
self.dirty = True
143142
retval = ''.join(
144-
element(env) for element in self.elements
143+
self.resolve(element(env), env) for element in self.elements
145144
)
146145
self.dirty = False
147146
return retval
148147

148+
def resolve(self, fluentish, env):
149+
if isinstance(fluentish, FluentType):
150+
return fluentish.format(env.context._babel_locale)
151+
return fluentish
152+
149153

150154
class TextElement(FTL.TextElement, Literal):
151155
def __call__(self, env):
@@ -189,17 +193,16 @@ def lookup_reference(ref, env):
189193
AST node, or FluentNone if not found, including fallback logic
190194
"""
191195
ref_id = reference_to_id(ref)
192-
193196
try:
194-
return env.context._compiler(env.context._messages_and_terms[ref_id])
197+
return env.context.lookup(ref_id)
195198
except LookupError:
196199
env.errors.append(unknown_reference_error_obj(ref_id))
197200

198201
if isinstance(ref, AttributeExpression):
199202
# Fallback
200203
parent_id = reference_to_id(ref.ref)
201204
try:
202-
return env.context._compiler(env.context._messages_and_terms[parent_id])
205+
return env.context.lookup(parent_id)
203206
except LookupError:
204207
# Don't add error here, because we already added error for the
205208
# actual thing we were looking for.
@@ -330,10 +333,10 @@ def __call__(self, env):
330333

331334
# TODO What to do if message is not a VariantList?
332335
# Need test at least.
333-
assert isinstance(message.value, VariantList)
336+
assert isinstance(message, VariantList)
334337

335338
variant_name = self.key.name
336-
return message.value.select_from_variant_list(env, variant_name)
339+
return message.select_from_variant_list(env, variant_name)
337340

338341

339342
class CallExpression(FTL.CallExpression, BaseResolver):
@@ -365,6 +368,11 @@ def __call__(self, env):
365368
return FluentNoneResolver(function_name + "()")
366369

367370

371+
class NamedArgument(FTL.NamedArgument, BaseResolver):
372+
def __call__(self, env):
373+
return self.value(env)
374+
375+
368376
@handle.register(FluentNumber)
369377
def handle_fluent_number(number, env):
370378
return number.format(env.context._babel_locale)

0 commit comments

Comments
 (0)