Skip to content

Commit 5613345

Browse files
committed
Factor read_{reference,localization}_ftl out of add_transforms
1 parent 1ed0062 commit 5613345

File tree

1 file changed

+48
-33
lines changed

1 file changed

+48
-33
lines changed

fluent/migrate/context.py

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,47 @@ def read_legacy_resource(self, path):
115115
# Transform the parsed result which is an iterator into a dict.
116116
return {entity.key: entity.val for entity in parser}
117117

118+
def read_reference_ftl(self, path):
119+
"""Read and parse a reference FTL file.
120+
121+
A missing resource file is a fatal error and will raise an
122+
UnreadableReferenceError.
123+
"""
124+
fullpath = os.path.join(self.reference_dir, path)
125+
try:
126+
return self.read_ftl_resource(fullpath)
127+
except IOError as err:
128+
error_message = 'Missing reference file: {}'.format(fullpath)
129+
logging.getLogger('migrate').error(error_message)
130+
raise UnreadableReferenceError(error_message)
131+
except UnicodeDecodeError as err:
132+
error_message = 'Error reading file {}: {}'.format(fullpath, err)
133+
logging.getLogger('migrate').error(error_message)
134+
raise UnreadableReferenceError(error_message)
135+
136+
def read_localization_ftl(self, path):
137+
"""Read and parse an existing localization FTL file.
138+
139+
Create a new FTL.Resource if the file doesn't exist or can't be
140+
decoded.
141+
"""
142+
fullpath = os.path.join(self.localization_dir, path)
143+
try:
144+
return self.read_ftl_resource(fullpath)
145+
except IOError:
146+
logger = logging.getLogger('migrate')
147+
logger.info(
148+
'Localization file {} does not exist and '
149+
'it will be created'.format(path))
150+
return FTL.Resource()
151+
except UnicodeDecodeError:
152+
logger = logging.getLogger('migrate')
153+
logger.warn(
154+
'Localization file {} has broken encoding. '
155+
'It will be re-created and some translations '
156+
'may be lost'.format(path))
157+
return FTL.Resource()
158+
118159
def maybe_add_localization(self, path):
119160
"""Add a localization resource to migrate translations from.
120161
@@ -160,29 +201,16 @@ def get_sources(acc, cur):
160201
acc.add((cur.path, cur.key))
161202
return acc
162203

163-
refpath = os.path.join(self.reference_dir, reference)
164-
try:
165-
ast = self.read_ftl_resource(refpath)
166-
except IOError as err:
167-
error_message = 'Missing reference file: {}'.format(refpath)
168-
logging.getLogger('migrate').error(error_message)
169-
raise UnreadableReferenceError(error_message)
170-
except UnicodeDecodeError as err:
171-
error_message = 'Error reading file {}: {}'.format(refpath, err)
172-
logging.getLogger('migrate').error(error_message)
173-
raise UnreadableReferenceError(error_message)
174-
else:
175-
# The reference file will be used by the merge function as
176-
# a template for serializing the merge results.
177-
self.reference_resources[target] = ast
204+
reference_ast = self.read_reference_ftl(reference)
205+
self.reference_resources[target] = reference_ast
178206

179207
for node in transforms:
180208
# Scan `node` for `Source` nodes and collect the information they
181209
# store into a set of dependencies.
182210
dependencies = fold(get_sources, node, set())
183211
# Set these sources as dependencies for the current transform.
184212
self.dependencies[(target, node.id.name)] = dependencies
185-
213+
186214
# Keep track of localization resource paths which were defined as
187215
# sources in the transforms.
188216
expected_paths = set()
@@ -194,7 +222,7 @@ def get_sources(acc, cur):
194222
for path in set(path for path, _ in dependencies):
195223
expected_paths.add(path)
196224
self.maybe_add_localization(path)
197-
225+
198226
# However, if all legacy resources are missing, bail out early. There
199227
# are no translations to migrate. We'd also get errors in hg annotate.
200228
if len(expected_paths) > 0 and len(self.localization_resources) == 0:
@@ -208,21 +236,8 @@ def get_sources(acc, cur):
208236
path_transforms += transforms
209237

210238
if target not in self.localization_resources:
211-
fullpath = os.path.join(self.localization_dir, target)
212-
try:
213-
ast = self.read_ftl_resource(fullpath)
214-
except IOError:
215-
logger = logging.getLogger('migrate')
216-
logger.info(
217-
'Localization file {} does not exist and '
218-
'it will be created'.format(target))
219-
except UnicodeDecodeError:
220-
logger = logging.getLogger('migrate')
221-
logger.warn(
222-
'Localization file {} will be re-created and some '
223-
'translations might be lost'.format(target))
224-
else:
225-
self.localization_resources[target] = ast
239+
target_ast = self.read_localization_ftl(target)
240+
self.localization_resources[target] = target_ast
226241

227242
def get_source(self, path, key):
228243
"""Get an entity value from a localized legacy source.
@@ -277,7 +292,7 @@ def merge_changeset(self, changeset=None):
277292
}
278293

279294
for path, reference in self.reference_resources.iteritems():
280-
current = self.localization_resources.get(path, FTL.Resource())
295+
current = self.localization_resources[path]
281296
transforms = self.transforms.get(path, [])
282297

283298
def in_changeset(ident):

0 commit comments

Comments
 (0)