diff options
author | gfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-20 19:41:31 +0000 |
---|---|---|
committer | gfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-20 19:41:31 +0000 |
commit | f9d2de3e213d35a73eaece1bf73d3fdaa8ced209 (patch) | |
tree | 80bf1a548e52a37b17964f4c6e4a981ef917abde /tools | |
parent | ee69e53ffb6824063af3e2654b8ca92f1e96d0df (diff) | |
download | chromium_src-f9d2de3e213d35a73eaece1bf73d3fdaa8ced209.zip chromium_src-f9d2de3e213d35a73eaece1bf73d3fdaa8ced209.tar.gz chromium_src-f9d2de3e213d35a73eaece1bf73d3fdaa8ced209.tar.bz2 |
Add support for if nodes in outputs nodes of grd files
Make it possible to enclose <output> nodes in <if> conditional, therefore it becomes possible to generate different files from .grd files depending on the platform.
BUG=none
TEST=IfNodeUnittest.testIffynessWithOutputNodes (in grit)
Review URL: http://codereview.chromium.org/3155033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56905 0039d316-1c4b-4281-b951-d872f2087c98
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): |