Skip to content

Commit

Permalink
Factor read_{reference,localization}_ftl out of add_transforms
Browse files Browse the repository at this point in the history
  • Loading branch information
stasm committed Feb 2, 2018
1 parent 1ed0062 commit 5613345
Showing 1 changed file with 48 additions and 33 deletions.
81 changes: 48 additions & 33 deletions fluent/migrate/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,47 @@ def read_legacy_resource(self, path):
# Transform the parsed result which is an iterator into a dict.
return {entity.key: entity.val for entity in parser}

def read_reference_ftl(self, path):
"""Read and parse a reference FTL file.
A missing resource file is a fatal error and will raise an
UnreadableReferenceError.
"""
fullpath = os.path.join(self.reference_dir, path)
try:
return self.read_ftl_resource(fullpath)
except IOError as err:
error_message = 'Missing reference file: {}'.format(fullpath)
logging.getLogger('migrate').error(error_message)
raise UnreadableReferenceError(error_message)
except UnicodeDecodeError as err:
error_message = 'Error reading file {}: {}'.format(fullpath, err)
logging.getLogger('migrate').error(error_message)
raise UnreadableReferenceError(error_message)

def read_localization_ftl(self, path):
"""Read and parse an existing localization FTL file.
Create a new FTL.Resource if the file doesn't exist or can't be
decoded.
"""
fullpath = os.path.join(self.localization_dir, path)
try:
return self.read_ftl_resource(fullpath)
except IOError:
logger = logging.getLogger('migrate')
logger.info(
'Localization file {} does not exist and '
'it will be created'.format(path))
return FTL.Resource()
except UnicodeDecodeError:
logger = logging.getLogger('migrate')
logger.warn(
'Localization file {} has broken encoding. '
'It will be re-created and some translations '
'may be lost'.format(path))
return FTL.Resource()

def maybe_add_localization(self, path):
"""Add a localization resource to migrate translations from.
Expand Down Expand Up @@ -160,29 +201,16 @@ def get_sources(acc, cur):
acc.add((cur.path, cur.key))
return acc

refpath = os.path.join(self.reference_dir, reference)
try:
ast = self.read_ftl_resource(refpath)
except IOError as err:
error_message = 'Missing reference file: {}'.format(refpath)
logging.getLogger('migrate').error(error_message)
raise UnreadableReferenceError(error_message)
except UnicodeDecodeError as err:
error_message = 'Error reading file {}: {}'.format(refpath, err)
logging.getLogger('migrate').error(error_message)
raise UnreadableReferenceError(error_message)
else:
# The reference file will be used by the merge function as
# a template for serializing the merge results.
self.reference_resources[target] = ast
reference_ast = self.read_reference_ftl(reference)
self.reference_resources[target] = reference_ast

for node in transforms:
# Scan `node` for `Source` nodes and collect the information they
# store into a set of dependencies.
dependencies = fold(get_sources, node, set())
# Set these sources as dependencies for the current transform.
self.dependencies[(target, node.id.name)] = dependencies

# Keep track of localization resource paths which were defined as
# sources in the transforms.
expected_paths = set()
Expand All @@ -194,7 +222,7 @@ def get_sources(acc, cur):
for path in set(path for path, _ in dependencies):
expected_paths.add(path)
self.maybe_add_localization(path)

# However, if all legacy resources are missing, bail out early. There
# are no translations to migrate. We'd also get errors in hg annotate.
if len(expected_paths) > 0 and len(self.localization_resources) == 0:
Expand All @@ -208,21 +236,8 @@ def get_sources(acc, cur):
path_transforms += transforms

if target not in self.localization_resources:
fullpath = os.path.join(self.localization_dir, target)
try:
ast = self.read_ftl_resource(fullpath)
except IOError:
logger = logging.getLogger('migrate')
logger.info(
'Localization file {} does not exist and '
'it will be created'.format(target))
except UnicodeDecodeError:
logger = logging.getLogger('migrate')
logger.warn(
'Localization file {} will be re-created and some '
'translations might be lost'.format(target))
else:
self.localization_resources[target] = ast
target_ast = self.read_localization_ftl(target)
self.localization_resources[target] = target_ast

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

for path, reference in self.reference_resources.iteritems():
current = self.localization_resources.get(path, FTL.Resource())
current = self.localization_resources[path]
transforms = self.transforms.get(path, [])

def in_changeset(ident):
Expand Down

0 comments on commit 5613345

Please sign in to comment.