boto3-assist 0.9.5__py3-none-any.whl → 0.11.0__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.
@@ -14,4 +14,4 @@ class CloudWatchConnectionTracker(ConnectionTracker):
14
14
  """
15
15
 
16
16
  def __init__(self) -> None:
17
- super().__init__("CloudWatch")
17
+ super().__init__()
@@ -5,7 +5,7 @@ MIT License. See Project Root for the license information.
5
5
  """
6
6
 
7
7
  import time
8
- from typing import List, Dict, Any, Optional
8
+ from typing import List, Dict, Any, Optional, Literal
9
9
 
10
10
 
11
11
  from aws_lambda_powertools import Logger
@@ -130,7 +130,7 @@ class CognitoUtility(CognitoConnection):
130
130
  is_permanent=True,
131
131
  )
132
132
 
133
- return response
133
+ return dict(response)
134
134
 
135
135
  except self.client.exceptions.UsernameExistsException as e:
136
136
  logger.error(f"Error: {e.response['Error']['Message']}")
@@ -185,7 +185,7 @@ class CognitoUtility(CognitoConnection):
185
185
  UserPoolId=user_pool_id, Username=user_name
186
186
  )
187
187
 
188
- return response
188
+ return dict(response)
189
189
 
190
190
  def admin_enable_user(
191
191
  self, user_name: str, user_pool_id: str, reset_password: bool = True
@@ -271,7 +271,7 @@ class CognitoUtility(CognitoConnection):
271
271
  logger.debug(
272
272
  f"User {email} created successfully. Confirmation code sent to {email}."
273
273
  )
274
- return response
274
+ return dict(response)
275
275
 
276
276
  except self.client.exceptions.UsernameExistsException as e:
277
277
  logger.error(f"Error: {e.response['Error']['Message']}")
@@ -324,11 +324,11 @@ class CognitoUtility(CognitoConnection):
324
324
  user_pool_id,
325
325
  client_name,
326
326
  id_token_time_out=60,
327
- id_token_units="minutes",
327
+ id_token_units: Literal["days", "hours", "minutes", "seconds"] = "minutes",
328
328
  access_token_time_out=60,
329
- access_token_units="minutes",
329
+ access_token_units: Literal["days", "hours", "minutes", "seconds"] = "minutes",
330
330
  refresh_token_time_out=60,
331
- refresh_token_units="minutes",
331
+ refresh_token_units: Literal["days", "hours", "minutes", "seconds"] = "minutes",
332
332
  ) -> dict:
333
333
  # valid units: 'seconds'|'minutes'|'hours'|'days'
334
334
 
@@ -340,9 +340,9 @@ class CognitoUtility(CognitoConnection):
340
340
  AccessTokenValidity=access_token_time_out,
341
341
  IdTokenValidity=id_token_time_out,
342
342
  TokenValidityUnits={
343
- "AccessToken": f"{access_token_units}",
344
- "IdToken": f"{id_token_units}",
345
- "RefreshToken": f"{refresh_token_units}",
343
+ "AccessToken": access_token_units,
344
+ "IdToken": id_token_units,
345
+ "RefreshToken": refresh_token_units,
346
346
  },
347
347
  # ReadAttributes=[
348
348
  # 'string',
@@ -381,18 +381,18 @@ class CognitoUtility(CognitoConnection):
381
381
  # AuthSessionValidity=123
382
382
  )
383
383
 
384
- return response
384
+ return dict(response)
385
385
 
386
386
  def search_cognito(self, email: str, user_pool_id: str) -> dict:
387
387
  """Search cognito for an existing user"""
388
388
 
389
- email = self.__format_email(email=email)
389
+ email = self.__format_email(email=email) or ""
390
390
  filter_string = f'email = "{email}"'
391
391
 
392
392
  # Call the admin_list_users method with the filter
393
393
  response = self.client.list_users(UserPoolId=user_pool_id, Filter=filter_string)
394
394
 
395
- return response
395
+ return dict(response)
396
396
 
397
397
  def __set_user_attributes(self, *, user: CognitoUser) -> List[dict]:
398
398
  """
@@ -7,7 +7,7 @@ MIT License. See Project Root for the license information.
7
7
  import os
8
8
  from typing import List, Optional, overload, Dict, Any
9
9
 
10
- from aws_lambda_powertools import Tracer, Logger
10
+ from aws_lambda_powertools import Logger
11
11
  from boto3.dynamodb.conditions import (
12
12
  Key,
13
13
  # And,
@@ -22,7 +22,7 @@ from boto3_assist.utilities.string_utility import StringUtility
22
22
 
23
23
 
24
24
  logger = Logger()
25
- tracer = Tracer()
25
+
26
26
 
27
27
 
28
28
  class DynamoDB(DynamoDBConnection):
@@ -55,7 +55,7 @@ class DynamoDB(DynamoDBConnection):
55
55
  )
56
56
  logger.setLevel(os.getenv("LOG_LEVEL", "INFO"))
57
57
 
58
- @tracer.capture_method
58
+
59
59
  def save(
60
60
  self,
61
61
  item: dict | DynamoDBModelBase,
@@ -169,7 +169,7 @@ class DynamoDB(DynamoDBConnection):
169
169
  call_type: str = "resource",
170
170
  ) -> Dict[str, Any]: ...
171
171
 
172
- @tracer.capture_method
172
+
173
173
  def get(
174
174
  self,
175
175
  key: Optional[dict] = None,
@@ -344,7 +344,7 @@ class DynamoDB(DynamoDBConnection):
344
344
  ) -> dict:
345
345
  pass
346
346
 
347
- @tracer.capture_method
347
+
348
348
  def delete(
349
349
  self,
350
350
  *,
@@ -7,11 +7,11 @@ MIT License. See Project Root for the license information.
7
7
  from typing import List, Any, Dict
8
8
 
9
9
  from boto3.dynamodb.conditions import ConditionBase, Key, And, Equals
10
- from aws_lambda_powertools import Tracer, Logger
10
+ from aws_lambda_powertools import Logger
11
11
  from boto3_assist.dynamodb.dynamodb_index import DynamoDBIndex
12
12
 
13
13
  logger = Logger()
14
- tracer = Tracer()
14
+
15
15
 
16
16
 
17
17
  class DynamoDBHelpers:
@@ -118,7 +118,7 @@ class DynamoDBHelpers:
118
118
  logger.error({"exception": str(e)})
119
119
  return "unknown"
120
120
 
121
- @tracer.capture_method(capture_response=False)
121
+
122
122
  def wrap_response(self, items, dynamodb_response: dict, diagnostics) -> dict:
123
123
  """A wrapper for response data"""
124
124
  last_key = dynamodb_response.get("LastEvaluatedKey", None)
@@ -135,8 +135,7 @@ class DynamoDBHelpers:
135
135
  }
136
136
 
137
137
  return response
138
-
139
- @tracer.capture_method(capture_response=False)
138
+
140
139
  def wrap_collection_response(self, collection: List[dict]) -> dict[str, List]:
141
140
  """
142
141
  Wraps Up Some usefull information when dealing with
@@ -249,6 +249,7 @@ class DynamoDBModelBase(SerializableModel):
249
249
  """
250
250
 
251
251
  value = DatetimeUtility.to_datetime_utc(value)
252
+ return value
252
253
 
253
254
 
254
255
  class DynamoDBSerializer:
@@ -15,37 +15,37 @@ class EventData:
15
15
  self.__event = event
16
16
 
17
17
  @property
18
- def version(self) -> str:
18
+ def version(self) -> str | None:
19
19
  """Event Version"""
20
20
  return self.__event.get("version")
21
21
 
22
22
  @property
23
- def id(self) -> str:
23
+ def id(self) -> str | None:
24
24
  """Event Id"""
25
25
  return self.__event.get("id")
26
26
 
27
27
  @property
28
- def detail_type(self) -> str:
28
+ def detail_type(self) -> str | None:
29
29
  """Event Detail Type"""
30
30
  return self.__event.get("detail-type")
31
31
 
32
32
  @property
33
- def source(self) -> str:
33
+ def source(self) -> str | None:
34
34
  """Event Source"""
35
35
  return self.__event.get("source")
36
36
 
37
37
  @property
38
- def account(self) -> str:
38
+ def account(self) -> str | None:
39
39
  """Event Account"""
40
40
  return self.__event.get("account")
41
41
 
42
42
  @property
43
- def time(self) -> str:
43
+ def time(self) -> str | None:
44
44
  """Event Time"""
45
45
  return self.__event.get("time")
46
46
 
47
47
  @property
48
- def region(self) -> str:
48
+ def region(self) -> str | None:
49
49
  """Event Region"""
50
50
  return self.__event.get("region")
51
51
 
@@ -217,7 +217,7 @@ class S3Object:
217
217
  )
218
218
  try:
219
219
  # convert if necessary
220
- file_obj: bytes = (
220
+ file_obj = (
221
221
  file_obj.encode("utf-8") if isinstance(file_obj, str) else file_obj
222
222
  )
223
223
  self.connection.client.upload_fileobj(
@@ -658,7 +658,7 @@ class S3Object:
658
658
  Key=destination_key,
659
659
  )
660
660
 
661
- return response
661
+ return dict(response)
662
662
 
663
663
  def move(
664
664
  self,
@@ -5,7 +5,7 @@ MIT License. See Project Root for the license information.
5
5
  """
6
6
 
7
7
  import os
8
- from typing import Optional
8
+ from typing import Optional, Literal
9
9
 
10
10
  from aws_lambda_powertools import Logger
11
11
 
@@ -20,7 +20,7 @@ class SecurityHub(SecurityHubConnection):
20
20
  def update_findings_status(
21
21
  self,
22
22
  region_name: str,
23
- workflow_status: str,
23
+ workflow_status: Literal["NEW", "NOTIFIED", "RESOLVED", "SUPPRESSED"],
24
24
  note_text: Optional[str] = None,
25
25
  updated_by: Optional[str] = None,
26
26
  ):
@@ -8,11 +8,11 @@ import uuid
8
8
  from datetime import UTC, datetime, timedelta, timezone
9
9
  from typing import Any
10
10
  import pytz # type: ignore
11
- from aws_lambda_powertools import Tracer, Logger
11
+ from aws_lambda_powertools import Logger
12
12
  from dateutil.relativedelta import relativedelta
13
13
 
14
14
 
15
- tracer = Tracer()
15
+
16
16
  logger = Logger()
17
17
 
18
18
  _last_timestamp = None
@@ -47,7 +47,7 @@ class DatetimeUtility:
47
47
  return datetime.now(timezone.utc)
48
48
 
49
49
  @staticmethod
50
- @tracer.capture_method(capture_response=False)
50
+
51
51
  def string_to_date(string_date: str | datetime) -> datetime | None:
52
52
  """
53
53
  Description: takes a string value and returns it as a datetime.
@@ -148,9 +148,11 @@ class JsonConversions:
148
148
  elif isinstance(data, list):
149
149
  # For lists, if deep conversion is enabled, process each element.
150
150
  return [
151
- JsonConversions._convert_keys(item, convert_func, deep)
152
- if deep
153
- else item
151
+ (
152
+ JsonConversions._convert_keys(item, convert_func, deep)
153
+ if deep
154
+ else item
155
+ )
154
156
  for item in data
155
157
  ]
156
158
  else:
@@ -377,7 +379,10 @@ class Serialization:
377
379
  setattr(target, "__actively_serializing_data__", True)
378
380
 
379
381
  for key, value in source.items():
380
- if Serialization.has_attribute(target, key):
382
+ if isinstance(target, dict):
383
+ # our target is a dictionary, so we need to handle this differently
384
+ target[key] = value
385
+ elif Serialization.has_attribute(target, key):
381
386
  attr = getattr(target, key)
382
387
  expected_type = type(attr)
383
388
 
@@ -313,6 +313,7 @@ class StringUtility:
313
313
  return True
314
314
  if value in ("false", "0", "f", "n", "no"):
315
315
  return False
316
+ raise ValueError(f"Invalid boolean value: {value}")
316
317
  elif isinstance(value, int):
317
318
  return bool(value)
318
319
  elif value is None:
boto3_assist/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.9.5'
1
+ __version__ = '0.11.0'
@@ -1,13 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boto3_assist
3
- Version: 0.9.5
3
+ Version: 0.11.0
4
4
  Summary: Additional boto3 wrappers to make your life a little easier
5
5
  Author-email: Eric Wilson <boto3-assist@geekcafe.com>
6
6
  License-File: LICENSE-EXPLAINED.txt
7
7
  License-File: LICENSE.txt
8
- Classifier: License :: Other/Proprietary License
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: License :: OSI Approved :: MIT License
9
10
  Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python
10
12
  Classifier: Programming Language :: Python :: 3
13
+ Classifier: Topic :: Software Development
11
14
  Requires-Python: >=3.10
12
15
  Requires-Dist: aws-lambda-powertools
13
16
  Requires-Dist: aws-xray-sdk
@@ -23,6 +26,10 @@ Description-Content-Type: text/markdown
23
26
 
24
27
  # boto3 assist
25
28
 
29
+ [![PyPI version](https://img.shields.io/pypi/v/boto3-assist.svg)](https://pypi.org/project/boto3-assist/)
30
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
31
+ [![Downloads](https://static.pepy.tech/badge/boto3-assist)](https://pepy.tech/project/boto3-assist)
32
+
26
33
  This is in beta and subject to changes before it's initial 1.0.0 release
27
34
 
28
35
  This libary was created to make life a little easier when using boto3.
@@ -51,3 +58,19 @@ pip install boto3-assist
51
58
 
52
59
  ```
53
60
 
61
+ ## Running Unit Tests
62
+ Several of our tests use a mocking library to simulate connections to S3, DynamoDB, etc. In order to use those tests, you will need to have a `.env.unittest` file at the root of this project (which our tests will attempt to locate and load).
63
+
64
+ For your convenince the `.evn.unittest` file has been added to this project. The values should not point to live AWS profiles, instead it should use the values added.
65
+
66
+ Since we also point to a profile, you should create the profile in the `~/.aws/config` file. The entry should look like the following:
67
+
68
+ ```toml
69
+ [profile moto-mock-tests]
70
+ region = us-east-1
71
+ output = json
72
+ aws_access_key_id = test
73
+ aws_secret_access_key = test
74
+
75
+ ```
76
+
@@ -3,27 +3,27 @@ boto3_assist/boto3session.py,sha256=JnZIRbut5R_C_r50bY2xiF6CjR93jQSOeVmhdK97mDg,
3
3
  boto3_assist/connection.py,sha256=-z_OZtZmSVjSSECpoqx1FnqW7B9A_LovfN_cJ_nhHgg,4361
4
4
  boto3_assist/connection_tracker.py,sha256=UgfR9RlvXf3A4ssMr3gDMpw89ka8mSRvJn4M34SzhbU,4378
5
5
  boto3_assist/http_status_codes.py,sha256=G0zRSWenwavYKETvDF9tNVUXQz3Ae2gXdBETYbjvJe8,3284
6
- boto3_assist/version.py,sha256=KdjdLD2Ih8isiZGr12GUg7fDzQKGgS2c2XOqkmiFJOM,22
6
+ boto3_assist/version.py,sha256=UHGsGhGjMtfvoaFMaJdv4diSXG2uXo8Y2yCo7kiUOdk,23
7
7
  boto3_assist/aws_lambda/event_info.py,sha256=OkZ4WzuGaHEu_T8sB188KBgShAJhZpWASALKRGBOhMg,14648
8
8
  boto3_assist/aws_lambda/mock_context.py,sha256=LPjHP-3YSoY6iPl1kPqJDwSVf1zLNTcukUunDtYcbK0,116
9
9
  boto3_assist/cloudwatch/cloudwatch_connection.py,sha256=mnGWaLSQpHh5EeY7Ek_2o9JKHJxOELIYtQVMX1IaHn4,2480
10
- boto3_assist/cloudwatch/cloudwatch_connection_tracker.py,sha256=mzRtO1uHrcfJNh1XrGEiXdTqxwEP8d1RqJkraMNkgK0,410
10
+ boto3_assist/cloudwatch/cloudwatch_connection_tracker.py,sha256=Y59WfjrB71qYlgmRngenElFEYHA35zK6DQkXY2anD5w,398
11
11
  boto3_assist/cloudwatch/cloudwatch_log_connection.py,sha256=qQMZHjUJ6gA8wU9utjQhOURXNSPH2RjxSoAy83bvoCs,1737
12
12
  boto3_assist/cloudwatch/cloudwatch_logs.py,sha256=VtI0OnFjX1l4RYVvA8tvveGkPwAogtrplnflZ4dQSNM,1204
13
13
  boto3_assist/cloudwatch/cloudwatch_query.py,sha256=uNhSb1Gfp99v8BaHmCnCKs63j4MMU4WveqBavCJyhGY,6409
14
14
  boto3_assist/cognito/cognito_authorizer.py,sha256=ONcxzjTACgVYl6qI9kJAQ5SoRMtVHYGDeuKi5QqJvOY,5837
15
15
  boto3_assist/cognito/cognito_connection.py,sha256=deuXR3cNHz0mCYff2k0LfAvK--9OkqehWp0Bl--lDuw,1607
16
- boto3_assist/cognito/cognito_utility.py,sha256=Vd9Fy_URJsG5IC87a19h0J7RE_bcrrTz1_80LzAZfvY,18237
16
+ boto3_assist/cognito/cognito_utility.py,sha256=IVZAg58nHG1U7uxe7FsTYpqwwZiwwdIBGiVTZuLCFqg,18417
17
17
  boto3_assist/cognito/jwks_cache.py,sha256=1Y9r-YfQ8qrgZN5xYPvjUEEV0vthbdcPdAIaPbZP7kU,373
18
18
  boto3_assist/cognito/user.py,sha256=qc44qLx3gwq6q2zMxcPQze1EjeZwy5Kuav93vbe-4WU,820
19
- boto3_assist/dynamodb/dynamodb.py,sha256=q3U4uYqnKX1_u5TXv8Iq94JrBad16q0rL_vKxQyR_3k,15772
19
+ boto3_assist/dynamodb/dynamodb.py,sha256=ARbxuAQitqDBdEb_vHiRaC7x9nDMr71SgRA7tD6NVKk,15681
20
20
  boto3_assist/dynamodb/dynamodb_connection.py,sha256=x6Ylb_uVAY5TS0AIBUNOSyywKIqros3xX8diLTjZUsc,3275
21
- boto3_assist/dynamodb/dynamodb_helpers.py,sha256=ajpTJ5bJOm9PDgE2Zx9p2zkTRFV4xswqJRS81SOTn1s,12198
21
+ boto3_assist/dynamodb/dynamodb_helpers.py,sha256=RoRRqKjdwfC-2-gvlkLvCoNWhIoMrHm-68dkyhXI_Xk,12080
22
22
  boto3_assist/dynamodb/dynamodb_importer.py,sha256=nCKsyRQeMqDSf0Q5mQ_X_oVIg4PRnu0hcUzZnBli610,3471
23
23
  boto3_assist/dynamodb/dynamodb_index.py,sha256=D0Lq121qk1cXeMetPeqnzvv6CXd0XfEygfdUXaljLG8,8551
24
24
  boto3_assist/dynamodb/dynamodb_iservice.py,sha256=O9Aj0PFEvcuk2vhARifWTFnUwcQW5EXzwZS478Hm-N0,796
25
25
  boto3_assist/dynamodb/dynamodb_key.py,sha256=YD7o1EUlwVBQ55p9YCTKqAUU_np4nqtLIHnmp-BeolM,1803
26
- boto3_assist/dynamodb/dynamodb_model_base.py,sha256=Jmy0GAblYqdLlVOT7H-1li50bacemeduocgNs75Yvt8,11910
26
+ boto3_assist/dynamodb/dynamodb_model_base.py,sha256=OoSZ841YLHWTV_yx8MvVc6oHZEnvdqTYPhH9LTZ4M_M,11931
27
27
  boto3_assist/dynamodb/dynamodb_model_base_interfaces.py,sha256=yT4zDRI8vP15WVOHnCvY3FsEy_QSIta5-bnUby70Xow,747
28
28
  boto3_assist/dynamodb/dynamodb_reindexer.py,sha256=bCj6KIU0fQOgjkkiq9yF51PFZZr4Y9Lu3-hPlmsPG0Y,6164
29
29
  boto3_assist/dynamodb/dynamodb_reserved_words.py,sha256=p0irNBSqGe4rd2FwWQqbRJWrNr4svdbWiyIXmz9lj4c,1937
@@ -39,22 +39,22 @@ boto3_assist/models/serializable_model.py,sha256=ZMrRJRvJWLY8PBSKK_nPCgYKv1qUxDP
39
39
  boto3_assist/s3/s3.py,sha256=ESTPXtyDi8mrwHaYNWjQLNGTuTUV4CxKDqw-O_KGzKs,2052
40
40
  boto3_assist/s3/s3_bucket.py,sha256=GfyBbuI5BWz_ybwU_nDqUZiC0wt24PNt49GKZmb05OY,2018
41
41
  boto3_assist/s3/s3_connection.py,sha256=0JgEDNoDFPQTo5hQe-lS8mWnFBJ2S8MDSl0LPG__lZo,2008
42
- boto3_assist/s3/s3_event_data.py,sha256=vwty34zDgTeSLNCLAWVxvhSQKT7hIpM7fZrWm5w6znM,4063
43
- boto3_assist/s3/s3_object.py,sha256=MsDjp-TlAHjONNZznGT_VT_ls_z9OSSovxBUxFimLus,22519
44
- boto3_assist/securityhub/securityhub.py,sha256=nGmHd_R3awDeB_QRzPfNAtQauLdVA1hlRlkaZA4oZjg,5409
42
+ boto3_assist/s3/s3_event_data.py,sha256=Q7QUI1pwkc7g6yZ3IZWMXBIAfsMlPRC7wac2RvrQoA4,4112
43
+ boto3_assist/s3/s3_object.py,sha256=77jZeIUFpQX3cFYGGwRFBvL-peCe54iILnthm-GFjMc,22518
44
+ boto3_assist/securityhub/securityhub.py,sha256=ne-J_v4DaCVZm5YgJa_-LKVomLJQo5Gpw6wleAKSsws,5467
45
45
  boto3_assist/securityhub/securityhub_connection.py,sha256=hWfcj9gjS2lNXUObyw4cShtveoqJPIp8kKFuz-fz1J4,1449
46
46
  boto3_assist/ssm/connection.py,sha256=gYpKn5HsUR3hcRUqJzF5QcTITCk0DReq9KhoE_8-Htg,1370
47
47
  boto3_assist/ssm/parameter_store/parameter_store.py,sha256=2ISi-SmR29mESHFH-onJkxPX1aThIgBRojA3ZoNcP9s,3949
48
- boto3_assist/utilities/datetime_utility.py,sha256=o4k_0tTQmgBty5tnJRCG5j_SH_XQIrX-iLc6w0rbWVI,11221
48
+ boto3_assist/utilities/datetime_utility.py,sha256=kxUV-pYraTx18gaRb2LxXB7sRTBxffgksdOszcM3fg8,11150
49
49
  boto3_assist/utilities/dictionary_utility.py,sha256=IrN5Q3gJ_KWQ_3KCjyXEJyV8oLk2n3tQOO52dVbY6sk,1002
50
50
  boto3_assist/utilities/file_operations.py,sha256=IYhJkh8wUPMvGnyDRRa9yOCDdHN9wR3N6m_xpJS51TM,3949
51
51
  boto3_assist/utilities/http_utility.py,sha256=_K39Fq0V4QcgklAWctUktuMjqXDTwgMld77IOUfR2zc,1282
52
52
  boto3_assist/utilities/logging_utility.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  boto3_assist/utilities/numbers_utility.py,sha256=wzv9d0uXT_2_ZHHio7LBzibwxPqhGpvbq9HinrVn_4A,10160
54
- boto3_assist/utilities/serialization_utility.py,sha256=dP93TrMQzCbJXXMI7O1HNQOfKZuHyBLwdtuDQyvnlA8,21519
55
- boto3_assist/utilities/string_utility.py,sha256=5BpDaqGZI8cSM-3YFQLU1fKcWcqG9r1_GPgDstCWFIs,10318
56
- boto3_assist-0.9.5.dist-info/METADATA,sha256=oSBjbWCQpAQMGiII6jHNGcE4OCOS-MvXXpqWIGp9CbY,1728
57
- boto3_assist-0.9.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
58
- boto3_assist-0.9.5.dist-info/licenses/LICENSE-EXPLAINED.txt,sha256=WFREvTpfTjPjDHpOLADxJpCKpIla3Ht87RUUGii4ODU,606
59
- boto3_assist-0.9.5.dist-info/licenses/LICENSE.txt,sha256=PXDhFWS5L5aOTkVhNvoitHKbAkgxqMI2uUPQyrnXGiI,1105
60
- boto3_assist-0.9.5.dist-info/RECORD,,
54
+ boto3_assist/utilities/serialization_utility.py,sha256=nieqW9b71Dr0X2HPsNmCei6zoIbsPRl9fDAigBQkaUg,21730
55
+ boto3_assist/utilities/string_utility.py,sha256=0ChxbuT37xdG4y3cKzbNTHk4T3fl8lNMdOT7L5aJBQk,10382
56
+ boto3_assist-0.11.0.dist-info/METADATA,sha256=bXUuUsYCrxXCm125R0K6pI13n3oh8rfRdJPj9mNrCdA,2875
57
+ boto3_assist-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
58
+ boto3_assist-0.11.0.dist-info/licenses/LICENSE-EXPLAINED.txt,sha256=WFREvTpfTjPjDHpOLADxJpCKpIla3Ht87RUUGii4ODU,606
59
+ boto3_assist-0.11.0.dist-info/licenses/LICENSE.txt,sha256=PXDhFWS5L5aOTkVhNvoitHKbAkgxqMI2uUPQyrnXGiI,1105
60
+ boto3_assist-0.11.0.dist-info/RECORD,,