boto3-assist 0.2.2__tar.gz → 0.2.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 (101) hide show
  1. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/PKG-INFO +1 -1
  2. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/pyproject.toml +1 -1
  3. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/s3/s3.py +38 -2
  4. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/file_operations.py +10 -0
  5. boto3_assist-0.2.4/src/boto3_assist/version.py +1 -0
  6. boto3_assist-0.2.4/tests/s3/__init__.py +0 -0
  7. boto3_assist-0.2.4/tests/s3/files/test.txt +1 -0
  8. boto3_assist-0.2.4/tests/s3/s3_file_upload_test.py +48 -0
  9. boto3_assist-0.2.2/src/boto3_assist/version.py +0 -1
  10. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.env.docker +0 -0
  11. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.env.docker.001 +0 -0
  12. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.env.docker.nosql.workbench +0 -0
  13. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.env.unittest +0 -0
  14. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.gitignore +0 -0
  15. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.vscode/launch.json +0 -0
  16. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.vscode/settings.json +0 -0
  17. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/.vscode/tasks.json +0 -0
  18. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/LICENSE-EXPLAINED.txt +0 -0
  19. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/LICENSE.txt +0 -0
  20. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/README.md +0 -0
  21. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/aws_regions_with_status.csv +0 -0
  22. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/aws_regions_with_status.json +0 -0
  23. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/devops/build.py +0 -0
  24. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/devops/readme.md +0 -0
  25. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/__init__.py +0 -0
  26. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/cloudwatch/log_report.py +0 -0
  27. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/models/order_item_model.py +0 -0
  28. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/models/order_model.py +0 -0
  29. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/models/product_model.py +0 -0
  30. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/models/user_model.py +0 -0
  31. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/models/user_post_model.py +0 -0
  32. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/order_example/main.py +0 -0
  33. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/order_example/products.json +0 -0
  34. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/order_item_service.py +0 -0
  35. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/order_service.py +0 -0
  36. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/product_service.py +0 -0
  37. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/table_service.py +0 -0
  38. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/user_post_service.py +0 -0
  39. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/user_service.py +0 -0
  40. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/user_service_client_example.py +0 -0
  41. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/services/user_service_resource_example.py +0 -0
  42. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/dynamodb/user_post_example/main.py +0 -0
  43. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/examples/ec2/regions_report.py +0 -0
  44. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/module-headers.txt +0 -0
  45. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/mypy.ini +0 -0
  46. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/requirements-dev.txt +0 -0
  47. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/requirements.txt +0 -0
  48. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/run-checks.sh +0 -0
  49. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/__init__.py +0 -0
  50. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/boto3session.py +0 -0
  51. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/cloudwatch/cloudwatch_connection.py +0 -0
  52. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/cloudwatch/cloudwatch_connection_tracker.py +0 -0
  53. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/cloudwatch/cloudwatch_log_connection.py +0 -0
  54. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/cloudwatch/cloudwatch_logs.py +0 -0
  55. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/cloudwatch/cloudwatch_query.py +0 -0
  56. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/connection.py +0 -0
  57. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/connection_tracker.py +0 -0
  58. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb.py +0 -0
  59. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_connection.py +0 -0
  60. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_connection_tracker.py +0 -0
  61. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_helpers.py +0 -0
  62. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_importer.py +0 -0
  63. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_index.py +0 -0
  64. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_iservice.py +0 -0
  65. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_key.py +0 -0
  66. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_model_base.py +0 -0
  67. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_model_base_interfaces.py +0 -0
  68. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_reindexer.py +0 -0
  69. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_reserved_words.py +0 -0
  70. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/dynamodb_reserved_words.txt +0 -0
  71. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/readme.md +0 -0
  72. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/dynamodb/troubleshooting.md +0 -0
  73. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/ec2/ec2_connection.py +0 -0
  74. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/environment_services/__init__.py +0 -0
  75. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/environment_services/environment_loader.py +0 -0
  76. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/environment_services/environment_variables.py +0 -0
  77. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/errors/custom_exceptions.py +0 -0
  78. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/s3/s3_connection.py +0 -0
  79. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/datetime_utility.py +0 -0
  80. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/http_utility.py +0 -0
  81. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/logging_utility.py +0 -0
  82. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/serialization_utility.py +0 -0
  83. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/src/boto3_assist/utilities/string_utility.py +0 -0
  84. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/__init__.py +0 -0
  85. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/__top/__init__.py +0 -0
  86. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/__init__.py +0 -0
  87. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/dynamodb_model_base_test.py +0 -0
  88. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/dynamodb_model_projections_test.py +0 -0
  89. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/dynamodb_model_serializtion_test.py +0 -0
  90. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/dynamodb_moto_sorting_test.py +0 -0
  91. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/dynamodb_reindex_test.py +0 -0
  92. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/cms/base.py +0 -0
  93. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/cms/content_block.py +0 -0
  94. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/cms/page.py +0 -0
  95. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/cms/template.py +0 -0
  96. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/simple_model.py +0 -0
  97. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/dynamodb/models/user_model.py +0 -0
  98. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/examples_test/__init__.py +0 -0
  99. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/examples_test/user_service_test.py +0 -0
  100. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/utilities/__init__.py +0 -0
  101. {boto3_assist-0.2.2 → boto3_assist-0.2.4}/tests/utilities/serialization_utility_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: boto3_assist
3
- Version: 0.2.2
3
+ Version: 0.2.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
  Classifier: License :: Other/Proprietary License
@@ -7,7 +7,7 @@ packages = ["src/boto3_assist"]
7
7
 
8
8
  [project]
9
9
  name = "boto3_assist"
10
- version = "0.2.2"
10
+ version = "0.2.4"
11
11
  authors = [
12
12
  { name="Eric Wilson", email="boto3-assist@geekcafe.com" }
13
13
  ]
@@ -7,6 +7,7 @@ MIT License. See Project Root for the license information.
7
7
  import os
8
8
  import tempfile
9
9
  import time
10
+ import io
10
11
  from typing import Any, Dict, List, Optional
11
12
 
12
13
  from aws_lambda_powertools import Logger
@@ -50,6 +51,19 @@ class S3(S3Connection):
50
51
  aws_secret_access_key=aws_secret_access_key,
51
52
  )
52
53
 
54
+ def create_bucket(self, bucket_name: str) -> None:
55
+ """
56
+ Create an S3 bucket
57
+ :param bucket_name: Bucket to create
58
+ :return: True if bucket is created, else False
59
+ """
60
+ try:
61
+ self.client.create_bucket(Bucket=bucket_name)
62
+ logger.info(f"Bucket {bucket_name} created")
63
+ except ClientError as e:
64
+ logger.exception(e)
65
+ raise e
66
+
53
67
  def generate_presigned_url(
54
68
  self,
55
69
  bucket_name: str,
@@ -139,7 +153,7 @@ class S3(S3Connection):
139
153
 
140
154
  return response
141
155
 
142
- def upload_file_obj(self, bucket: str, key: str, file_obj: bytes) -> str:
156
+ def upload_file_obj(self, bucket: str, key: str, file_obj: bytes | str) -> str:
143
157
  """
144
158
  Uploads a file object to s3. Returns the full s3 path s3://<bucket>/<key>
145
159
  """
@@ -156,7 +170,13 @@ class S3(S3Connection):
156
170
  }
157
171
  )
158
172
  try:
159
- self.client.upload_fileobj(Fileobj=file_obj, Bucket=bucket, Key=key)
173
+ # convert if necessary
174
+ file_obj: bytes = (
175
+ file_obj.encode("utf-8") if isinstance(file_obj, str) else file_obj
176
+ )
177
+ self.client.upload_fileobj(
178
+ Fileobj=io.BytesIO(file_obj), Bucket=bucket, Key=key
179
+ )
160
180
 
161
181
  except ClientError as ce:
162
182
  error = {
@@ -503,3 +523,19 @@ class S3(S3Connection):
503
523
  else:
504
524
  # Not in AWS Lambda, use the system's default temp directory
505
525
  return tempfile.gettempdir()
526
+
527
+ def encode(
528
+ self, text: str, encoding: str = "utf-8", errors: str = "strict"
529
+ ) -> bytes:
530
+ """
531
+ Encodes a string for s3
532
+ """
533
+ return text.encode(encoding=encoding, errors=errors)
534
+
535
+ def decode(
536
+ self, file_obj: bytes, encoding: str = "utf-8", errors: str = "strict"
537
+ ) -> str:
538
+ """
539
+ Decodes bytes to a string
540
+ """
541
+ return file_obj.decode(encoding=encoding, errors=errors)
@@ -58,6 +58,16 @@ class FileOperations:
58
58
  dirname = os.path.dirname(path)
59
59
  return dirname
60
60
 
61
+ @staticmethod
62
+ def read_file(path: str, encoding: str = "utf-8") -> str:
63
+ """
64
+ Read a file
65
+ """
66
+ logger.debug(f"reading file {path}")
67
+ with open(path, "r", encoding=encoding) as file:
68
+ data = file.read()
69
+ return data
70
+
61
71
  @staticmethod
62
72
  def write_to_file(path: str, data: str, append: bool = False) -> str:
63
73
  """
@@ -0,0 +1 @@
1
+ __version__ = '0.2.4'
File without changes
@@ -0,0 +1 @@
1
+ Test upload file
@@ -0,0 +1,48 @@
1
+ import os
2
+ import unittest
3
+ import moto
4
+ from pathlib import Path
5
+ from boto3_assist.s3.s3 import S3
6
+ from boto3_assist.environment_services.environment_loader import EnvironmentLoader
7
+ from boto3_assist.utilities.file_operations import FileOperations
8
+
9
+
10
+ @moto.mock_aws
11
+ class S3FileUploadTest(unittest.TestCase):
12
+ """Test S3 File Upload"""
13
+
14
+ def setUp(self):
15
+ """Setup"""
16
+ ev: EnvironmentLoader = EnvironmentLoader()
17
+ # NOTE: you need to make sure the the env file below exists or you will get an error
18
+ ev.load_environment_file(file_name=".env.unittest")
19
+
20
+ def test_upload_file(self):
21
+ """Test uploading a file"""
22
+ s3 = S3()
23
+ bucket_name: str = "test-bucket"
24
+ s3.create_bucket(bucket_name)
25
+ local_file_path: Path = Path(
26
+ os.path.join(os.path.dirname(__file__), "files", "test.txt")
27
+ )
28
+ if not os.path.exists(local_file_path):
29
+ raise FileNotFoundError(f"File not found: {local_file_path}")
30
+
31
+ s3.upload_file(
32
+ bucket=bucket_name, key="test.txt", local_file_path=local_file_path
33
+ )
34
+
35
+ def test_upload_file_obj(self):
36
+ """Test uploading a file"""
37
+ s3 = S3()
38
+ bucket_name: str = "test-bucket"
39
+ s3.create_bucket(bucket_name)
40
+ local_file_path: Path = Path(
41
+ os.path.join(os.path.dirname(__file__), "files", "test.txt")
42
+ )
43
+ if not os.path.exists(local_file_path):
44
+ raise FileNotFoundError(f"File not found: {local_file_path}")
45
+
46
+ data = FileOperations.read_file(local_file_path)
47
+
48
+ s3.upload_file_obj(bucket=bucket_name, key="test.txt", file_obj=data)
@@ -1 +0,0 @@
1
- __version__ = '0.2.2'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes