Skip to content

Commit 3edff20

Browse files
fix: convert listValues to lists
Signed-off-by: Jesús Fernández <[email protected]>
1 parent fde5b7e commit 3edff20

File tree

4 files changed

+40
-6
lines changed

4 files changed

+40
-6
lines changed

crossplane/function/proto/v1/run_function_pb2_grpc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from crossplane.function.proto.v1 import run_function_pb2 as crossplane_dot_function_dot_proto_dot_v1_dot_run__function__pb2
77

8-
GRPC_GENERATED_VERSION = '1.66.0'
8+
GRPC_GENERATED_VERSION = '1.66.2'
99
GRPC_VERSION = grpc.__version__
1010
_version_not_supported = False
1111

crossplane/function/proto/v1beta1/run_function_pb2_grpc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from crossplane.function.proto.v1beta1 import run_function_pb2 as crossplane_dot_function_dot_proto_dot_v1beta1_dot_run__function__pb2
77

8-
GRPC_GENERATED_VERSION = '1.66.0'
8+
GRPC_GENERATED_VERSION = '1.66.2'
99
GRPC_VERSION = grpc.__version__
1010
_version_not_supported = False
1111

crossplane/function/resource.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import dataclasses
1818
import datetime
19+
from typing import Any
1920

2021
import pydantic
2122
from google.protobuf import struct_pb2 as structpb
@@ -62,17 +63,28 @@ def dict_to_struct(d: dict) -> structpb.Struct:
6263
return s
6364

6465

66+
def __to_python_native(v: structpb.Value) -> Any:
67+
"""Convert a protobuf Value to a Python native type."""
68+
if isinstance(v, structpb.ListValue):
69+
return __listvalue_to_list(v)
70+
elif isinstance(v, structpb.Struct):
71+
return struct_to_dict(v)
72+
return v
73+
74+
75+
def __listvalue_to_list(lv: structpb.ListValue) -> list:
76+
"""Convert a protobuf ListValue to a list."""
77+
return [__to_python_native(v) for v in lv]
78+
79+
6580
def struct_to_dict(s: structpb.Struct) -> dict:
6681
"""Create a dict from the supplied Struct well-known type.
6782
6883
Crossplane sends observed and desired resources to a function encoded as a
6984
protobuf struct. This function makes it possible to convert resources to a
7085
dictionary.
7186
"""
72-
return {
73-
k: (struct_to_dict(v) if isinstance(v, structpb.Struct) else v)
74-
for k, v in s.items()
75-
}
87+
return {k: __to_python_native(v) for k, v in s.items()}
7688

7789

7890
@dataclasses.dataclass

tests/test_resource.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,28 @@ class TestCase:
275275
),
276276
want={"foo": {"bar": "baz"}},
277277
),
278+
TestCase(
279+
reason="Convert a nested struct containing ListValues to a dictionary.",
280+
s=structpb.Struct(
281+
fields={
282+
"foo": structpb.Value(
283+
struct_value=structpb.Struct(
284+
fields={
285+
"bar": structpb.Value(
286+
list_value=structpb.ListValue(
287+
values=[
288+
structpb.Value(string_value="baz"),
289+
structpb.Value(string_value="qux"),
290+
]
291+
)
292+
)
293+
}
294+
)
295+
)
296+
}
297+
),
298+
want={"foo": {"bar": ["baz", "qux"]}},
299+
),
278300
]
279301

280302
for case in cases:

0 commit comments

Comments
 (0)