aws-lambda-powertools 3.14.1a6__py3-none-any.whl → 3.15.1a0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "3.14.1a6"
3
+ VERSION = "3.15.1a0"
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
+ from google.protobuf.internal.decoder import _DecodeVarint # type: ignore[attr-defined]
5
6
  from google.protobuf.json_format import MessageToDict
6
7
 
7
8
  from aws_lambda_powertools.utilities.kafka.deserializer.base import DeserializerBase
@@ -43,6 +44,12 @@ class ProtobufDeserializer(DeserializerBase):
43
44
  When the data cannot be deserialized according to the message class,
44
45
  typically due to data format incompatibility or incorrect message class.
45
46
 
47
+ Notes
48
+ -----
49
+ This deserializer handles both standard Protocol Buffer format and the Confluent
50
+ Schema Registry format which includes message index information. It will first try
51
+ standard deserialization and fall back to message index handling if needed.
52
+
46
53
  Example
47
54
  --------
48
55
  >>> # Assuming proper protobuf setup
@@ -54,11 +61,56 @@ class ProtobufDeserializer(DeserializerBase):
54
61
  ... except KafkaConsumerDeserializationError as e:
55
62
  ... print(f"Failed to deserialize: {e}")
56
63
  """
64
+ value = self._decode_input(data)
57
65
  try:
58
- value = self._decode_input(data)
59
66
  message = self.message_class()
60
67
  message.ParseFromString(value)
61
68
  return MessageToDict(message, preserving_proto_field_name=True)
69
+ except Exception:
70
+ return self._deserialize_with_message_index(value, self.message_class())
71
+
72
+ def _deserialize_with_message_index(self, data: bytes, parser: Any) -> dict:
73
+ """
74
+ Deserialize protobuf message with Confluent message index handling.
75
+
76
+ Parameters
77
+ ----------
78
+ data : bytes
79
+ data
80
+ parser : google.protobuf.message.Message
81
+ Protobuf message instance to parse the data into
82
+
83
+ Returns
84
+ -------
85
+ dict
86
+ Dictionary representation of the parsed protobuf message with original field names
87
+
88
+ Raises
89
+ ------
90
+ KafkaConsumerDeserializationError
91
+ If deserialization fails
92
+
93
+ Notes
94
+ -----
95
+ This method handles the special case of Confluent Schema Registry's message index
96
+ format, where the message is prefixed with either a single 0 (for the first schema)
97
+ or a list of schema indexes. The actual protobuf message follows these indexes.
98
+ """
99
+
100
+ buffer = memoryview(data)
101
+ pos = 0
102
+
103
+ try:
104
+ first_value, new_pos = _DecodeVarint(buffer, pos)
105
+ pos = new_pos
106
+
107
+ if first_value != 0:
108
+ for _ in range(first_value):
109
+ _, new_pos = _DecodeVarint(buffer, pos)
110
+ pos = new_pos
111
+
112
+ parser.ParseFromString(data[pos:])
113
+ return MessageToDict(parser, preserving_proto_field_name=True)
62
114
  except Exception as e:
63
115
  raise KafkaConsumerDeserializationError(
64
116
  f"Error trying to deserialize protobuf data - {type(e).__name__}: {str(e)}",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aws_lambda_powertools
3
- Version: 3.14.1a6
3
+ Version: 3.15.1a0
4
4
  Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
5
5
  License: MIT
6
6
  Keywords: aws_lambda_powertools,aws,tracing,logging,lambda,powertools,feature_flags,idempotency,middleware
@@ -98,7 +98,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
98
98
  aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
99
99
  aws_lambda_powertools/shared/types.py,sha256=EZ_tbX3F98LA4Zcra1hTEjzRacpZAtggK957Zcv1oKg,135
100
100
  aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
101
- aws_lambda_powertools/shared/version.py,sha256=WstjGQ_WhUZwMj6bNHiLhYCT8KZuwJBgSkKg4BZSA6k,85
101
+ aws_lambda_powertools/shared/version.py,sha256=5WSLgC8-Hu8uyQsZiv6idiTW34zWFphwDoKXLLuHReo,85
102
102
  aws_lambda_powertools/tracing/__init__.py,sha256=f4bMThOPBPWTPVcYqcAIErAJPerMsf3H_Z4gCXCsK9I,141
103
103
  aws_lambda_powertools/tracing/base.py,sha256=WSO986XGBOe9K0F2SnG6ustJokIrtO0m0mcL8N7mfno,4544
104
104
  aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
@@ -198,7 +198,7 @@ aws_lambda_powertools/utilities/kafka/deserializer/base.py,sha256=-bOPbZADsKK-Hu
198
198
  aws_lambda_powertools/utilities/kafka/deserializer/default.py,sha256=GhAUfZO3rcasy_ZiKEv3IOFX_VNDTA61zb2eo0HAIcQ,1416
199
199
  aws_lambda_powertools/utilities/kafka/deserializer/deserializer.py,sha256=Wh4-srDUFGBUZ0kXiiU-R8DznumOKdLPk9Va88LT7zE,3733
200
200
  aws_lambda_powertools/utilities/kafka/deserializer/json.py,sha256=2_helv8DyUoK60z3wflLd1BwkuRINaVjucyYie10qUM,1742
201
- aws_lambda_powertools/utilities/kafka/deserializer/protobuf.py,sha256=FG0OQ1PqPpfNlIMfGpEzn0mrvNY8LEf2DfVuAj1TJms,2326
201
+ aws_lambda_powertools/utilities/kafka/deserializer/protobuf.py,sha256=WEaJysV__sZy32HNpqZZ6KrZyxyvsEnxf24On36zeXY,4183
202
202
  aws_lambda_powertools/utilities/kafka/exceptions.py,sha256=kwNfAcYmiTgk19QEdN6oHtMc2dDIZh64uWr_d5X3FFc,495
203
203
  aws_lambda_powertools/utilities/kafka/kafka_consumer.py,sha256=x1RcOWJcG74JvzrahO4cSSrAuSZFUlMtg14QjAjtJjY,2069
204
204
  aws_lambda_powertools/utilities/kafka/schema_config.py,sha256=GaSiwKWiUEQqrdBZWMaGl_DQcqpyplohoCMgMrCOyGI,3268
@@ -290,7 +290,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
290
290
  aws_lambda_powertools/utilities/validation/exceptions.py,sha256=PKy_19zQMBJGCMMFl-sMkcm-cc0v3zZBn_bhGE4wKNo,2084
291
291
  aws_lambda_powertools/utilities/validation/validator.py,sha256=khCqFhACSdn0nKyYRRPiC5Exht956hTfSfhlV3IRmpg,10099
292
292
  aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
293
- aws_lambda_powertools-3.14.1a6.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
294
- aws_lambda_powertools-3.14.1a6.dist-info/METADATA,sha256=3QbFuPDyU0-_o2axbtsBnTvjtKXP1bXjlWXH862BuOo,11530
295
- aws_lambda_powertools-3.14.1a6.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
296
- aws_lambda_powertools-3.14.1a6.dist-info/RECORD,,
293
+ aws_lambda_powertools-3.15.1a0.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
294
+ aws_lambda_powertools-3.15.1a0.dist-info/METADATA,sha256=xV1embSYU_5i1o2KjkK9YGriIlimyakq6SRnx3hs0EI,11530
295
+ aws_lambda_powertools-3.15.1a0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
296
+ aws_lambda_powertools-3.15.1a0.dist-info/RECORD,,