Skip to content

Commit 501679e

Browse files
authored
Fix compiled encode_into for None arrays (#2790)
1 parent a0b3c46 commit 501679e

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

kafka/protocol/new/schemas/fields/array.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,19 @@ def emit_encode_into(self, ctx, val_expr, indent, version=None, compact=False, t
7373
an = ctx.next_var('an')
7474
ctx.emit(indent, '%s = len(%s) + 1 if %s is not None else 0' % (an, val_expr, val_expr))
7575
UnsignedVarInt32.emit_encode_into(ctx, an, indent)
76+
ctx.emit(indent, 'if %s is not None:' % val_expr)
7677
else:
7778
ctx.emit(indent, 'if %s is None:' % val_expr)
7879
ctx.emit(indent, " pack_into('>i', buf, pos, -1)")
7980
ctx.emit(indent, ' pos += 4')
8081
ctx.emit(indent, 'else:')
8182
ctx.emit(indent, " pack_into('>i', buf, pos, len(%s))" % val_expr)
8283
ctx.emit(indent, ' pos += 4')
83-
guard = indent + ' ' if not compact else indent
84+
guard = indent + ' '
8485
item_var = ctx.next_var('ai')
8586
ctx.emit(guard, 'for %s in %s:' % (item_var, val_expr))
8687
self.array_of.emit_encode_into(ctx, item_var, guard + ' ',
87-
version=version, compact=compact, tagged=tagged)
88+
version=version, compact=compact, tagged=tagged)
8889

8990
def emit_decode_from(self, ctx, var_name, indent, version=None, compact=False, tagged=False):
9091
n = ctx.next_var('n')

kafka/protocol/new/schemas/fields/struct_array.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,15 @@ def emit_encode_into(self, ctx, val_expr, indent, version=None, compact=False, t
8989
an = ctx.next_var('an')
9090
ctx.emit(indent, '%s = len(%s) + 1 if %s is not None else 0' % (an, val_expr, val_expr))
9191
UnsignedVarInt32.emit_encode_into(ctx, an, indent)
92+
ctx.emit(indent, 'if %s is not None:' % val_expr)
9293
else:
9394
ctx.emit(indent, 'if %s is None:' % val_expr)
9495
ctx.emit(indent, " pack_into('>i', buf, pos, -1)")
9596
ctx.emit(indent, ' pos += 4')
9697
ctx.emit(indent, 'else:')
9798
ctx.emit(indent, " pack_into('>i', buf, pos, len(%s))" % val_expr)
9899
ctx.emit(indent, ' pos += 4')
99-
guard = indent + ' ' if not compact else indent
100+
guard = indent + ' '
100101
item_var = ctx.next_var('si')
101102
if len(fields) == 1:
102103
# Single-field struct: items may be scalars (str, int, etc.)

test/protocol/new/metadata/test_new_metadata.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ def test_metadata_request_roundtrip(version):
2828
assert decoded == request
2929

3030

31+
@pytest.mark.parametrize("version", range(MetadataRequest.min_version, MetadataRequest.max_version + 1))
32+
def test_metadata_request_all_topics(version):
33+
Topic = MetadataRequest.MetadataRequestTopic
34+
request = MetadataRequest(
35+
topics=None if version > 0 else [],
36+
allow_auto_topic_creation=False if version >= 4 else True,
37+
include_cluster_authorized_operations=True if 8 <= version <= 10 else False,
38+
include_topic_authorized_operations=True if version >= 8 else False
39+
)
40+
encoded = request.encode(version=version)
41+
decoded = MetadataRequest.decode(encoded, version=version)
42+
assert decoded == request
43+
44+
3145
@pytest.mark.parametrize("version", range(MetadataResponse.min_version, MetadataResponse.max_version + 1))
3246
def test_metadata_response_roundtrip(version):
3347
Broker = MetadataResponse.MetadataResponseBroker

0 commit comments

Comments
 (0)