aws-lambda-powertools 3.10.1a2__py3-none-any.whl → 3.10.1a3__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.
- aws_lambda_powertools/shared/version.py +1 -1
- aws_lambda_powertools/utilities/data_masking/base.py +49 -1
- {aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/METADATA +1 -1
- {aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/RECORD +6 -6
- {aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/LICENSE +0 -0
- {aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/WHEEL +0 -0
@@ -6,6 +6,7 @@ Base class for Data Masking
|
|
6
6
|
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
|
+
import dataclasses
|
9
10
|
import functools
|
10
11
|
import logging
|
11
12
|
import warnings
|
@@ -27,6 +28,51 @@ if TYPE_CHECKING:
|
|
27
28
|
logger = logging.getLogger(__name__)
|
28
29
|
|
29
30
|
|
31
|
+
def prepare_data(data: Any, _visited: set[int] | None = None) -> Any:
|
32
|
+
"""
|
33
|
+
Recursively convert complex objects into dictionaries or simple types.
|
34
|
+
Handles dataclasses, Pydantic models, and prevents circular references.
|
35
|
+
"""
|
36
|
+
_visited = _visited or set()
|
37
|
+
|
38
|
+
# Handle circular references and primitive types
|
39
|
+
data_id = id(data)
|
40
|
+
if data_id in _visited or isinstance(data, (str, int, float, bool, type(None))):
|
41
|
+
return data
|
42
|
+
|
43
|
+
_visited.add(data_id)
|
44
|
+
|
45
|
+
# Define handlers as (condition, transformer) pairs
|
46
|
+
handlers: list[tuple[Callable[[Any], bool], Callable[[Any], Any]]] = [
|
47
|
+
# Dataclasses
|
48
|
+
(lambda x: hasattr(x, "__dataclass_fields__"), lambda x: prepare_data(dataclasses.asdict(x), _visited)),
|
49
|
+
# Pydantic models
|
50
|
+
(lambda x: callable(getattr(x, "model_dump", None)), lambda x: prepare_data(x.model_dump(), _visited)),
|
51
|
+
# Objects with dict() method
|
52
|
+
(
|
53
|
+
lambda x: callable(getattr(x, "dict", None)) and not isinstance(x, dict),
|
54
|
+
lambda x: prepare_data(x.dict(), _visited),
|
55
|
+
),
|
56
|
+
# Dictionaries
|
57
|
+
(
|
58
|
+
lambda x: isinstance(x, dict),
|
59
|
+
lambda x: {prepare_data(k, _visited): prepare_data(v, _visited) for k, v in x.items()},
|
60
|
+
),
|
61
|
+
# Lists, tuples, sets
|
62
|
+
(lambda x: isinstance(x, (list, tuple, set)), lambda x: type(x)(prepare_data(item, _visited) for item in x)),
|
63
|
+
# Objects with __dict__
|
64
|
+
(lambda x: hasattr(x, "__dict__"), lambda x: prepare_data(vars(x), _visited)),
|
65
|
+
]
|
66
|
+
|
67
|
+
# Find and apply the first matching handler
|
68
|
+
for condition, transformer in handlers:
|
69
|
+
if condition(data):
|
70
|
+
return transformer(data)
|
71
|
+
|
72
|
+
# Default fallback
|
73
|
+
return data
|
74
|
+
|
75
|
+
|
30
76
|
class DataMasking:
|
31
77
|
"""
|
32
78
|
The DataMasking class orchestrates erasing, encrypting, and decrypting
|
@@ -93,6 +139,7 @@ class DataMasking:
|
|
93
139
|
data_masker = DataMasking(provider=encryption_provider)
|
94
140
|
encrypted = data_masker.encrypt({"secret": "value"})
|
95
141
|
"""
|
142
|
+
data = prepare_data(data)
|
96
143
|
return self._apply_action(
|
97
144
|
data=data,
|
98
145
|
fields=None,
|
@@ -135,7 +182,7 @@ class DataMasking:
|
|
135
182
|
data_masker = DataMasking(provider=encryption_provider)
|
136
183
|
encrypted = data_masker.decrypt(encrypted_data)
|
137
184
|
"""
|
138
|
-
|
185
|
+
data = prepare_data(data)
|
139
186
|
return self._apply_action(
|
140
187
|
data=data,
|
141
188
|
fields=None,
|
@@ -184,6 +231,7 @@ class DataMasking:
|
|
184
231
|
Any
|
185
232
|
The data with sensitive information erased or masked.
|
186
233
|
"""
|
234
|
+
data = prepare_data(data)
|
187
235
|
if masking_rules:
|
188
236
|
return self._apply_masking_rules(data=data, masking_rules=masking_rules)
|
189
237
|
else:
|
{aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: aws_lambda_powertools
|
3
|
-
Version: 3.10.
|
3
|
+
Version: 3.10.1a3
|
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
|
{aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/RECORD
RENAMED
@@ -88,7 +88,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
|
|
88
88
|
aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
|
89
89
|
aws_lambda_powertools/shared/types.py,sha256=APkI38HbiTpSF19NSNii8Ydx73vmVUVotgEQ9jHruEI,124
|
90
90
|
aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
|
91
|
-
aws_lambda_powertools/shared/version.py,sha256=
|
91
|
+
aws_lambda_powertools/shared/version.py,sha256=zNYel6XXBBXPbUK74MD4i9i5F9zSEpHNLHTMv8OPBiY,85
|
92
92
|
aws_lambda_powertools/tracing/__init__.py,sha256=f4bMThOPBPWTPVcYqcAIErAJPerMsf3H_Z4gCXCsK9I,141
|
93
93
|
aws_lambda_powertools/tracing/base.py,sha256=DbLD8OSK05KLdSV36oNA5wDSGv8KbcOD19qMUqoXh58,4513
|
94
94
|
aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
|
@@ -141,7 +141,7 @@ aws_lambda_powertools/utilities/data_classes/sqs_event.py,sha256=seWIKCpPbzKpPdX
|
|
141
141
|
aws_lambda_powertools/utilities/data_classes/transfer_family_event.py,sha256=gfPvQeur8bBXl5gq46sc_z3Oz3JTnRlM7iXUK5cbjic,6856
|
142
142
|
aws_lambda_powertools/utilities/data_classes/vpc_lattice.py,sha256=SEZUvRTMsI-iQi7hcpqaKqYtJLYqIxX5ijqmeTSrf9E,6363
|
143
143
|
aws_lambda_powertools/utilities/data_masking/__init__.py,sha256=Ez0MABo8ARkgWKSu8Dog4uFSkkZuHkW7DoWcexJGeyU,108
|
144
|
-
aws_lambda_powertools/utilities/data_masking/base.py,sha256=
|
144
|
+
aws_lambda_powertools/utilities/data_masking/base.py,sha256=Ny0fZNcLu0Qs6h40CCrMCy1J6C0Q0Zen8j0rtUT_Pyk,18571
|
145
145
|
aws_lambda_powertools/utilities/data_masking/constants.py,sha256=hKeeWDE4g53zxCq6fOD0D1vUTjuqVXNrr9oXCv-7mGg,752
|
146
146
|
aws_lambda_powertools/utilities/data_masking/exceptions.py,sha256=MGg6t5K9smOPcydmxMI3a_9D20u_zC3JCdd_eQpBisg,621
|
147
147
|
aws_lambda_powertools/utilities/data_masking/provider/__init__.py,sha256=83eP8qT3OpY99T--QUIV9K37MmAIi8cbAMmkHyIGVHI,119
|
@@ -258,7 +258,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
|
|
258
258
|
aws_lambda_powertools/utilities/validation/exceptions.py,sha256=PKy_19zQMBJGCMMFl-sMkcm-cc0v3zZBn_bhGE4wKNo,2084
|
259
259
|
aws_lambda_powertools/utilities/validation/validator.py,sha256=x_1qpuKJBuWpgNU-zCD3Di-vXrZfyUu7oA5RmjZjr84,10034
|
260
260
|
aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
|
261
|
-
aws_lambda_powertools-3.10.
|
262
|
-
aws_lambda_powertools-3.10.
|
263
|
-
aws_lambda_powertools-3.10.
|
264
|
-
aws_lambda_powertools-3.10.
|
261
|
+
aws_lambda_powertools-3.10.1a3.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
|
262
|
+
aws_lambda_powertools-3.10.1a3.dist-info/METADATA,sha256=HBp9uMgkHD0POryTWaEXz3DT2guEypJ6e5jwQv_5C20,11187
|
263
|
+
aws_lambda_powertools-3.10.1a3.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
264
|
+
aws_lambda_powertools-3.10.1a3.dist-info/RECORD,,
|
{aws_lambda_powertools-3.10.1a2.dist-info → aws_lambda_powertools-3.10.1a3.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|