From 320e34df203a8f7dee05557f4235f6fc5c109b87 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Thu, 3 Nov 2011 19:12:32 +0100 Subject: [PATCH] query: Use new SequenceToDict utility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- lib/query.py | 34 +++++++++++++++++----------------- test/ganeti.query_unittest.py | 8 ++++++++ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/query.py b/lib/query.py index fa541b82c..1551f1d62 100644 --- a/lib/query.py +++ b/lib/query.py @@ -766,6 +766,22 @@ def _VerifyResultRow(fields, row): (utils.CommaJoin(errors), row)) +def _FieldDictKey((fdef, _, flags, fn)): + """Generates key for field dictionary. + + """ + assert fdef.name and fdef.title, "Name and title are required" + assert FIELD_NAME_RE.match(fdef.name) + assert TITLE_RE.match(fdef.title) + assert (DOC_RE.match(fdef.doc) and len(fdef.doc.splitlines()) == 1 and + fdef.doc.strip() == fdef.doc), \ + "Invalid description for field '%s'" % fdef.name + assert callable(fn) + assert (flags & ~QFF_ALL) == 0, "Unknown flags for field '%s'" % fdef.name + + return fdef.name + + def _PrepareFieldList(fields, aliases): """Prepares field list for use by L{Query}. @@ -787,23 +803,7 @@ def _PrepareFieldList(fields, aliases): for (fdef, _, _, _) in fields) assert not duplicates, "Duplicate title(s) found: %r" % duplicates - result = {} - - for field in fields: - (fdef, _, flags, fn) = field - - assert fdef.name and fdef.title, "Name and title are required" - assert FIELD_NAME_RE.match(fdef.name) - assert TITLE_RE.match(fdef.title) - assert (DOC_RE.match(fdef.doc) and len(fdef.doc.splitlines()) == 1 and - fdef.doc.strip() == fdef.doc), \ - "Invalid description for field '%s'" % fdef.name - assert callable(fn) - assert fdef.name not in result, \ - "Duplicate field name '%s' found" % fdef.name - assert (flags & ~QFF_ALL) == 0, "Unknown flags for field '%s'" % fdef.name - - result[fdef.name] = field + result = utils.SequenceToDict(fields, key=_FieldDictKey) for alias, target in aliases: assert alias not in result, "Alias %s overrides an existing field" % alias diff --git a/test/ganeti.query_unittest.py b/test/ganeti.query_unittest.py index 426513169..3ee4fff67 100755 --- a/test/ganeti.query_unittest.py +++ b/test/ganeti.query_unittest.py @@ -222,6 +222,14 @@ class TestQuery(unittest.TestCase): None, 0, lambda *args: None), ], []) + # Duplicate field name + self.assertRaises(ValueError, query._PrepareFieldList, [ + (query._MakeField("name", "Name", constants.QFT_TEXT, "Name"), + None, 0, lambda *args: None), + (query._MakeField("name", "Other", constants.QFT_OTHER, "Other"), + None, 0, lambda *args: None), + ], []) + def testUnknown(self): fielddef = query._PrepareFieldList([ (query._MakeField("name", "Name", constants.QFT_TEXT, "Name"), -- GitLab