danielgtaylor / danielgtaylor/python-betterproto
Cast "oneOf" value to a single value when converting to dict/JSON
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 1.8k
- Forks
- 234
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
I am currently consuming metrics exposed by an OpenTelemetry agent, but when I try to convert the Protobuf metrics to JSON, the "oneOf" occurences are being translated to a dict instead of a single value. Is there any way to change this behavior to only display a single string value?
An example of what is happening:
The proto definitions (the original .proto files can be found here):
syntax = "proto3";
message AnyValue {
oneof value {
string string_value = 1;
bool bool_value = 2;
int64 int_value = 3;
double double_value = 4;
ArrayValue array_value = 5;
KeyValueList kvlist_value = 6;
bytes bytes_value = 7;
}
}
message ArrayValue {
repeated AnyValue values = 1;
}
message KeyValueList {
repeated KeyValue values = 1;
}
message KeyValue {
string key = 1;
AnyValue value = 2;
}
The dataclasses generated:
@dataclass
class KeyValue(betterproto.Message):
key: str = betterproto.string_field(1)
value: "AnyValue" = betterproto.message_field(2)
@dataclass
class AnyValue(betterproto.Message):
string_value: str = betterproto.string_field(1, group="value")
bool_value: bool = betterproto.bool_field(2, group="value")
int_value: int = betterproto.int64_field(3, group="value")
double_value: float = betterproto.double_field(4, group="value")
array_value: "ArrayValue" = betterproto.message_field(5, group="value")
kvlist_value: "KeyValueList" = betterproto.message_field(6, group="value")
bytes_value: bytes = betterproto.bytes_field(7, group="value")
The current conversion:
{"key": "process.pid", "value": {"intValue": "275"}}
What I would like to have:
{"key": "process.pid", "value": "275"}
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
No se especifica ningún archivo del repositorio ni ninguna prueba. Empieza reproduciendo la conversión dict/JSON para las clases AnyValue y KeyValue generadas y, después, sigue cómo se serializan los grupos oneof. El trabajo estará terminado cuando los valores escalares oneof produzcan el valor único solicitado, preservando al mismo tiempo el tratamiento adecuado de las variantes message, array, map y bytes.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- tooling
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100