return result
-def FillOpcode(opcls, body, static):
+def FillOpcode(opcls, body, static, rename=None):
"""Fills an opcode with body parameters.
Parameter types are checked.
@param body: Body parameters as received from client
@type static: dict
@param static: Static parameters which can't be modified by client
+ @type rename: dict
+ @param rename: Renamed parameters, key as old name, value as new name
@return: Opcode object
"""
CheckType(body, dict, "Body contents")
+ # Make copy to be modified
+ params = body.copy()
+
+ if rename:
+ for old, new in rename.items():
+ if new in params and old in params:
+ raise http.HttpBadRequest("Parameter '%s' was renamed to '%s', but"
+ " both are specified" %
+ (old, new))
+ if old in params:
+ assert new not in params
+ params[new] = params.pop(old)
+
if static:
- overwritten = set(body.keys()) & set(static.keys())
+ overwritten = set(params.keys()) & set(static.keys())
if overwritten:
raise http.HttpBadRequest("Can't overwrite static parameters %r" %
overwritten)
- # Combine parameters
- params = body.copy()
-
- if static:
params.update(static)
# Convert keys to strings (simplejson decodes them as unicode)
self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
self.OpTest, range(10), None)
+ def testRenameBothSpecified(self):
+ self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
+ self.OpTest, { "old": 123, "new": 999, }, None,
+ rename={ "old": "new", })
+
+ def testRename(self):
+ value = "Hello World"
+ op = baserlib.FillOpcode(self.OpTest, { "data": value, }, None,
+ rename={ "data": "test", })
+ self.assertEqual(op.test, value)
+
+ def testRenameStatic(self):
+ self.assertRaises(http.HttpBadRequest, baserlib.FillOpcode,
+ self.OpTest, { "data": 0, }, { "test": None, },
+ rename={ "data": "test", })
+
if __name__ == "__main__":
testutils.GanetiTestProgram()