diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/grit/grit/node/empty.py | 2 | ||||
-rw-r--r-- | tools/grit/grit/node/misc.py | 28 | ||||
-rw-r--r-- | tools/grit/grit/node/misc_unittest.py | 60 |
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): |