summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/grit/grit/node/empty.py2
-rw-r--r--tools/grit/grit/node/misc.py28
-rw-r--r--tools/grit/grit/node/misc_unittest.py60
3 files changed, 83 insertions, 7 deletions
diff --git a/tools/grit/grit/node/empty.py b/tools/grit/grit/node/empty.py
index cfff7a4..51d3e58 100644
--- a/tools/grit/grit/node/empty.py
+++ b/tools/grit/grit/node/empty.py
@@ -62,7 +62,7 @@ class TranslationsNode(base.Node):
class OutputsNode(base.Node):
'''The <outputs> element.'''
def _IsValidChild(self, child):
- return isinstance(child, io.OutputNode)
+ return isinstance(child, (io.OutputNode, misc.IfNode))
class IdentifiersNode(GroupingNode):
diff --git a/tools/grit/grit/node/misc.py b/tools/grit/grit/node/misc.py
index 56fec47..b906ec2 100644
--- a/tools/grit/grit/node/misc.py
+++ b/tools/grit/grit/node/misc.py
@@ -36,6 +36,9 @@ class IfNode(base.Node):
elif isinstance(self.parent, empty.StructuresNode):
from grit.node import structure
return isinstance(child, structure.StructureNode)
+ elif isinstance(self.parent, empty.OutputsNode):
+ from grit.node import io
+ return isinstance(child, io.OutputNode)
else:
return False
@@ -204,12 +207,31 @@ class GritNode(base.Node):
'''
return self.attrs['base_dir']
+ def _CollectOutputFiles(self, nodes, output_files):
+ '''Recursively filters the list of nodes that may contain other lists
+ in <if> nodes, and collects all the nodes that are not enclosed by
+ unsatisfied <if> conditionals and not <if> nodes themselves.
+
+ Args:
+ nodes: The list of nodes to filter.
+ output_files: The list of satisfying nodes.
+ '''
+ for node in nodes:
+ if node.name == 'if':
+ if node.IsConditionSatisfied():
+ self._CollectOutputFiles(node.children, output_files)
+ else:
+ output_files.append(node)
+
def GetOutputFiles(self):
- '''Returns the list of <file> nodes that are children of this node's
- <outputs> child.'''
+ '''Returns the list of <output> nodes that are descendants of this node's
+ <outputs> child and are not enclosed by unsatisfied <if> conditionals.
+ '''
for child in self.children:
if child.name == 'outputs':
- return child.children
+ output_files = []
+ self._CollectOutputFiles(child.children, output_files)
+ return output_files
raise exception.MissingElement()
def ItemFormatter(self, t):
diff --git a/tools/grit/grit/node/misc_unittest.py b/tools/grit/grit/node/misc_unittest.py
index b7ee4de..1adc632d 100644
--- a/tools/grit/grit/node/misc_unittest.py
+++ b/tools/grit/grit/node/misc_unittest.py
@@ -59,9 +59,9 @@ class IfNodeUnittest(unittest.TestCase):
bingo_message = messages_node.children[0].children[0]
hello_message = messages_node.children[1].children[0]
french_message = messages_node.children[2].children[0]
- assert bingo_message.name == 'message'
- assert hello_message.name == 'message'
- assert french_message.name == 'message'
+ self.assertTrue(bingo_message.name == 'message')
+ self.assertTrue(hello_message.name == 'message')
+ self.assertTrue(french_message.name == 'message')
grd.SetOutputContext('fr', {'hello' : '1'})
self.failUnless(not bingo_message.SatisfiesOutputCondition())
@@ -78,6 +78,60 @@ class IfNodeUnittest(unittest.TestCase):
self.failUnless(not hello_message.SatisfiesOutputCondition())
self.failUnless(french_message.SatisfiesOutputCondition())
+ def testIffynessWithOutputNodes(self):
+ grd = grd_reader.Parse(StringIO.StringIO('''
+ <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
+ <outputs>
+ <output filename="uncond1.rc" type="rc_data" />
+ <if expr="lang == 'fr' or 'hello' in defs">
+ <output filename="only_fr.adm" type="adm" />
+ <output filename="only_fr.plist" type="plist" />
+ </if>
+ <if expr="lang == 'ru'">
+ <output filename="doc.html" type="document" />
+ </if>
+ <output filename="uncond2.adm" type="adm" />
+ </outputs>
+ </grit>'''), dir='.')
+
+ outputs_node = grd.children[0]
+ uncond1_output = outputs_node.children[0]
+ only_fr_adm_output = outputs_node.children[1].children[0]
+ only_fr_plist_output = outputs_node.children[1].children[1]
+ doc_output = outputs_node.children[2].children[0]
+ uncond2_output = outputs_node.children[0]
+ self.assertTrue(uncond1_output.name == 'output')
+ self.assertTrue(only_fr_adm_output.name == 'output')
+ self.assertTrue(only_fr_plist_output.name == 'output')
+ self.assertTrue(doc_output.name == 'output')
+ self.assertTrue(uncond2_output.name == 'output')
+
+ grd.SetOutputContext('ru', {'hello' : '1'})
+ outputs = [output.GetFilename() for output in grd.GetOutputFiles()]
+ self.assertEquals(
+ outputs,
+ ['uncond1.rc', 'only_fr.adm', 'only_fr.plist', 'doc.html',
+ 'uncond2.adm'])
+
+ grd.SetOutputContext('ru', {'bingo': '2'})
+ outputs = [output.GetFilename() for output in grd.GetOutputFiles()]
+ self.assertEquals(
+ outputs,
+ ['uncond1.rc', 'doc.html', 'uncond2.adm'])
+
+ grd.SetOutputContext('fr', {'hello': '1'})
+ outputs = [output.GetFilename() for output in grd.GetOutputFiles()]
+ self.assertEquals(
+ outputs,
+ ['uncond1.rc', 'only_fr.adm', 'only_fr.plist', 'uncond2.adm'])
+
+ grd.SetOutputContext('en', {'bingo': '1'})
+ outputs = [output.GetFilename() for output in grd.GetOutputFiles()]
+ self.assertEquals(outputs, ['uncond1.rc', 'uncond2.adm'])
+
+ grd.SetOutputContext('fr', {'bingo': '1'})
+ outputs = [output.GetFilename() for output in grd.GetOutputFiles()]
+ self.assertNotEquals(outputs, ['uncond1.rc', 'uncond2.adm'])
class ReleaseNodeUnittest(unittest.TestCase):
def testPseudoControl(self):