| Index: infra_libs/ts_mon/common/pb_to_popo.py
|
| diff --git a/infra_libs/ts_mon/common/pb_to_popo.py b/infra_libs/ts_mon/common/pb_to_popo.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8266f9af7df92526315a7d849bb16e0af7d63441
|
| --- /dev/null
|
| +++ b/infra_libs/ts_mon/common/pb_to_popo.py
|
| @@ -0,0 +1,43 @@
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import logging
|
| +
|
| +from google.protobuf.descriptor import FieldDescriptor as fd
|
| +
|
| +def convert(pb):
|
| + """Convert protobuf to plain-old-python-object"""
|
| + obj = {}
|
| + for field, value in pb.ListFields():
|
| + if field.label == fd.LABEL_REPEATED:
|
| + obj[field.name] = list(_get_json_func(field.type)(v) for v in value)
|
| + else:
|
| + obj[field.name] = _get_json_func(field.type)(value)
|
| + return obj
|
| +
|
| +def _get_json_func(field_type):
|
| + if field_type in _FD_TO_JSON:
|
| + return _FD_TO_JSON[field_type]
|
| + else: # pragma: no cover
|
| + logging.warning("pb_to_popo doesn't support converting %s", field_type)
|
| + return unicode
|
| +
|
| +_FD_TO_JSON = {
|
| + fd.TYPE_BOOL: bool,
|
| + fd.TYPE_DOUBLE: float,
|
| + fd.TYPE_ENUM: int,
|
| + fd.TYPE_FIXED32: float,
|
| + fd.TYPE_FIXED64: float,
|
| + fd.TYPE_FLOAT: float,
|
| + fd.TYPE_INT32: int,
|
| + fd.TYPE_INT64: long,
|
| + fd.TYPE_SFIXED32: float,
|
| + fd.TYPE_SFIXED64: float,
|
| + fd.TYPE_SINT32: int,
|
| + fd.TYPE_SINT64: long,
|
| + fd.TYPE_STRING: unicode,
|
| + fd.TYPE_UINT32: int,
|
| + fd.TYPE_UINT64: long,
|
| + fd.TYPE_MESSAGE: convert
|
| +}
|
|
|