def ParseArgs(self, request): """Parse the request into a KeyValue proto.""" key = request.REQ.get("%s_key" % self.prefix) value = request.REQ.get("%s_value" % self.prefix) value_type = request.REQ.get("%s_type" % self.prefix) if key is None: return result = rdf_protodict.KeyValue() result.k.SetValue(key) # Automatically try to detect the value if value_type is None: value = self.GuessValueType(value) elif value_type == "Integer": value = int(value) elif value_type == "Float": value = float(value) elif value_type == "Boolean": if value in ["True", "true", "yes", "1"]: value = True elif value in ["False", "false", "no", "0"]: value = False else: raise ValueError("Value %s is not a boolean" % value) elif value_type == "String": value = value.decode("utf8") result.v.SetValue(value) return result
def testRdfFormatterHandlesKeyValuePair(self): """rdfvalue.KeyValue items need special handling to expand k and v.""" key = rdf_protodict.DataBlob().SetValue("skynet") value = rdf_protodict.DataBlob().SetValue([1997]) rdf = rdf_protodict.KeyValue(k=key, v=value) template = "{k}: {v}" hinter = hints.Hinter(template=template) expected = "skynet: 1997" result = hinter.Render(rdf) self.assertEqual(expected, result)