danielgtaylor / danielgtaylor/python-betterproto

Cast "oneOf" value to a single value when converting to dict/JSON

Abierto
#388 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.