boto3-assist 0.9.2__tar.gz → 0.9.4__tar.gz

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.
Files changed (126) hide show
  1. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/PKG-INFO +1 -1
  2. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/pyproject.toml +1 -1
  3. boto3_assist-0.9.4/src/boto3_assist/aws_lambda/mock_context.py +4 -0
  4. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/errors/custom_exceptions.py +12 -0
  5. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/s3/s3_object.py +42 -10
  6. boto3_assist-0.9.4/src/boto3_assist/version.py +1 -0
  7. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/models/serializable_model_test.py +1 -1
  8. boto3_assist-0.9.2/src/boto3_assist/version.py +0 -1
  9. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.env.docker +0 -0
  10. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.env.docker.001 +0 -0
  11. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.env.docker.nosql.workbench +0 -0
  12. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.env.unittest +0 -0
  13. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.gitignore +0 -0
  14. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.vscode/launch.json +0 -0
  15. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.vscode/settings.json +0 -0
  16. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/.vscode/tasks.json +0 -0
  17. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/LICENSE-EXPLAINED.txt +0 -0
  18. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/LICENSE.txt +0 -0
  19. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/README.md +0 -0
  20. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/aws_regions_with_status.csv +0 -0
  21. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/aws_regions_with_status.json +0 -0
  22. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/devops/build.py +0 -0
  23. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/devops/readme.md +0 -0
  24. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/__init__.py +0 -0
  25. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/cloudwatch/log_report.py +0 -0
  26. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/models/order_item_model.py +0 -0
  27. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/models/order_model.py +0 -0
  28. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/models/product_model.py +0 -0
  29. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/models/user_model.py +0 -0
  30. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/models/user_post_model.py +0 -0
  31. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/order_example/main.py +0 -0
  32. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/order_example/products.json +0 -0
  33. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/order_item_service.py +0 -0
  34. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/order_service.py +0 -0
  35. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/product_service.py +0 -0
  36. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/table_service.py +0 -0
  37. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/user_post_service.py +0 -0
  38. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/user_service.py +0 -0
  39. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/user_service_client_example.py +0 -0
  40. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/services/user_service_resource_example.py +0 -0
  41. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/dynamodb/user_post_example/main.py +0 -0
  42. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/examples/ec2/regions_report.py +0 -0
  43. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/module-headers.txt +0 -0
  44. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/mypy.ini +0 -0
  45. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/requirements-dev.txt +0 -0
  46. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/requirements.txt +0 -0
  47. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/run-checks.sh +0 -0
  48. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/run_unit_tests.sh +0 -0
  49. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/__init__.py +0 -0
  50. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/aws_lambda/event_info.py +0 -0
  51. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/boto3session.py +0 -0
  52. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cloudwatch/cloudwatch_connection.py +0 -0
  53. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cloudwatch/cloudwatch_connection_tracker.py +0 -0
  54. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cloudwatch/cloudwatch_log_connection.py +0 -0
  55. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cloudwatch/cloudwatch_logs.py +0 -0
  56. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cloudwatch/cloudwatch_query.py +0 -0
  57. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cognito/cognito_authorizer.py +0 -0
  58. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cognito/cognito_connection.py +0 -0
  59. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cognito/cognito_utility.py +0 -0
  60. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cognito/jwks_cache.py +0 -0
  61. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/cognito/user.py +0 -0
  62. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/connection.py +0 -0
  63. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/connection_tracker.py +0 -0
  64. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb.py +0 -0
  65. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_connection.py +0 -0
  66. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_helpers.py +0 -0
  67. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_importer.py +0 -0
  68. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_index.py +0 -0
  69. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_iservice.py +0 -0
  70. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_key.py +0 -0
  71. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_model_base.py +0 -0
  72. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_model_base_interfaces.py +0 -0
  73. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_reindexer.py +0 -0
  74. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_reserved_words.py +0 -0
  75. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/dynamodb_reserved_words.txt +0 -0
  76. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/readme.md +0 -0
  77. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/dynamodb/troubleshooting.md +0 -0
  78. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/ec2/ec2_connection.py +0 -0
  79. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/environment_services/__init__.py +0 -0
  80. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/environment_services/environment_loader.py +0 -0
  81. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/environment_services/environment_variables.py +0 -0
  82. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/http_status_codes.py +0 -0
  83. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/models/serializable_model.py +0 -0
  84. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/s3/s3.py +0 -0
  85. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/s3/s3_bucket.py +0 -0
  86. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/s3/s3_connection.py +0 -0
  87. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/s3/s3_event_data.py +0 -0
  88. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/securityhub/securityhub.py +0 -0
  89. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/securityhub/securityhub_connection.py +0 -0
  90. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/datetime_utility.py +0 -0
  91. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/dictionaroy_utility.py +0 -0
  92. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/file_operations.py +0 -0
  93. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/http_utility.py +0 -0
  94. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/logging_utility.py +0 -0
  95. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/numbers_utility.py +0 -0
  96. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/serialization_utility.py +0 -0
  97. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/src/boto3_assist/utilities/string_utility.py +0 -0
  98. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/__init__.py +0 -0
  99. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/__top/__init__.py +0 -0
  100. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/__init__.py +0 -0
  101. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/cms/base.py +0 -0
  102. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/cms/content_block.py +0 -0
  103. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/cms/page.py +0 -0
  104. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/cms/template.py +0 -0
  105. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/simple_model.py +0 -0
  106. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/user_model.py +0 -0
  107. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dbmodels/user_required_fields_model.py +0 -0
  108. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dynamodb_model_base_test.py +0 -0
  109. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dynamodb_model_projections_test.py +0 -0
  110. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dynamodb_model_serializtion_test.py +0 -0
  111. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dynamodb_moto_sorting_test.py +0 -0
  112. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/dynamodb/dynamodb_reindex_test.py +0 -0
  113. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/examples_test/__init__.py +0 -0
  114. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/examples_test/user_service_test.py +0 -0
  115. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/lambda/__init__.py +0 -0
  116. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/lambda/event_info_test.py +0 -0
  117. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/models/__init__.py +0 -0
  118. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/models/serializable_model_wide_test.py +0 -0
  119. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/s3/__init__.py +0 -0
  120. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/s3/files/test.txt +0 -0
  121. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/s3/s3_event_data_test.py +0 -0
  122. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/s3/s3_file_delete_test.py +0 -0
  123. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/s3/s3_file_upload_test.py +0 -0
  124. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/utilities/__init__.py +0 -0
  125. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/utilities/serialization_utility_test.py +0 -0
  126. {boto3_assist-0.9.2 → boto3_assist-0.9.4}/tests/utilities/string_utility_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boto3_assist
3
- Version: 0.9.2
3
+ Version: 0.9.4
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 +7,7 @@ packages = ["src/boto3_assist"]
7
7
 
8
8
  [project]
9
9
  name = "boto3_assist"
10
- version = "0.9.2"
10
+ version = "0.9.4"
11
11
 
12
12
  authors = [
13
13
  { name="Eric Wilson", email="boto3-assist@geekcafe.com" }
@@ -0,0 +1,4 @@
1
+ from aws_lambda_powertools.utilities.typing import LambdaContext
2
+
3
+
4
+ class MockLambdaContext(LambdaContext)
@@ -32,3 +32,15 @@ class InvalidRoutePath(Exception):
32
32
  "message": message,
33
33
  }
34
34
  super().__init__(self.message)
35
+
36
+
37
+ class FileNotFound(Exception):
38
+ """File Not Found Error"""
39
+
40
+ def __init__(self, message="File Not Found"):
41
+ """Invalid Route"""
42
+ self.message = {
43
+ "status_code": 404,
44
+ "message": message,
45
+ }
46
+ super().__init__(self.message)
@@ -18,7 +18,7 @@ from boto3_assist.s3.s3_connection import S3Connection
18
18
  from boto3_assist.utilities.datetime_utility import DatetimeUtility
19
19
  from boto3_assist.utilities.file_operations import FileOperations
20
20
  from boto3_assist.utilities.http_utility import HttpUtility
21
-
21
+ from boto3_assist.errors.custom_exceptions import FileNotFound
22
22
 
23
23
  logger = Logger(child=True)
24
24
 
@@ -193,6 +193,12 @@ class S3Object:
193
193
 
194
194
  return response
195
195
 
196
+ def put(self, *, bucket: str, key: str, data: bytes | str) -> str:
197
+ """
198
+ Uploads a file object to s3. Returns the full s3 path s3://<bucket>/<key>
199
+ """
200
+ return self.upload_file_obj(bucket=bucket, key=key, file_obj=data)
201
+
196
202
  def upload_file_obj(self, *, bucket: str, key: str, file_obj: bytes | str) -> str:
197
203
  """
198
204
  Uploads a file object to s3. Returns the full s3 path s3://<bucket>/<key>
@@ -414,6 +420,19 @@ class S3Object:
414
420
  The "Body" is a streaming body object. You can read it like a file.
415
421
  For example:
416
422
 
423
+ with response["Body"] as f:
424
+ data = f.read()
425
+ print(data)
426
+
427
+ """
428
+ return self.get_object(bucket_name=bucket_name, key=key)
429
+
430
+ def get_object(self, bucket_name: str, key: str) -> Dict[str, Any]:
431
+ """
432
+ Gets a file from s3 and returns the response.
433
+ The "Body" is a streaming body object. You can read it like a file.
434
+ For example:
435
+
417
436
  with response["Body"] as f:
418
437
  data = f.read()
419
438
  print(data)
@@ -443,15 +462,28 @@ class S3Object:
443
462
 
444
463
  except Exception as e: # pylint: disable=W0718
445
464
  error = str(e)
446
- logger.error({"metric_filter": "s3_download_error", "error": str(e)})
447
- raise RuntimeError(
448
- {
449
- "metric_filter": "s3_download_error",
450
- "error": str(e),
451
- "bucket": bucket_name,
452
- "key": key,
453
- }
454
- ) from e
465
+ error_info = {
466
+ "metric_filter": "s3_download_error",
467
+ "error": str(e),
468
+ "bucket": bucket_name,
469
+ "key": key,
470
+ }
471
+
472
+ logger.error(error_info)
473
+ # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/get_object.html
474
+ error = str(e)
475
+ if "An error occurred (AccessDenied)" in error:
476
+ if (
477
+ "is not authorized to perform: s3:ListBucket on resource" in error
478
+ and "because no identity-based policy allows the s3:ListBucket action"
479
+ in error
480
+ ):
481
+ # the file is not found but you're getting a access error since you don't
482
+ # have s3:ListBucket. To make life easier, we're just going to return a 404 error
483
+ raise FileNotFound("File Not Found") from e
484
+
485
+ # last ditch
486
+ raise RuntimeError(error_info) from e
455
487
 
456
488
  finally:
457
489
  logger.debug(
@@ -0,0 +1 @@
1
+ __version__ = '0.9.4'
@@ -139,7 +139,7 @@ class TestSerializableModel(unittest.TestCase):
139
139
  result = model.to_dictionary()
140
140
 
141
141
  self.assertIsInstance(result, dict)
142
- self.assertEqual(len(result), 3)
142
+ self.assertEqual(len(result), 4)
143
143
  self.assertEqual(result.get("name"), "Bob")
144
144
  self.assertEqual(result.get("age"), 35)
145
145
  self.assertEqual(result.get("active"), False)
@@ -1 +0,0 @@
1
- __version__ = '0.9.2'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes