saviialib 0.11.1__tar.gz → 1.0.0__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.

Potentially problematic release.


This version of saviialib might be problematic. Click here for more details.

Files changed (53) hide show
  1. {saviialib-0.11.1 → saviialib-1.0.0}/PKG-INFO +6 -6
  2. {saviialib-0.11.1 → saviialib-1.0.0}/pyproject.toml +6 -6
  3. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/api/epii_api_types.py +1 -0
  4. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/clients/aioftp_client.py +5 -2
  5. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/api.py +1 -0
  6. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/update_thies_data.py +1 -0
  7. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/types/update_thies_data_types.py +2 -0
  8. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/update_thies_data.py +38 -9
  9. {saviialib-0.11.1 → saviialib-1.0.0}/LICENSE +0 -0
  10. {saviialib-0.11.1 → saviialib-1.0.0}/README.md +0 -0
  11. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/__init__.py +0 -0
  12. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/__init__.py +0 -0
  13. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/api/__init__.py +0 -0
  14. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/error_types/__init__.py +0 -0
  15. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/error_types/api/__init__.py +0 -0
  16. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/error_types/api/epii_api_error_types.py +0 -0
  17. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/error_types/common/__init__.py +0 -0
  18. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/general_types/error_types/common/common_types.py +0 -0
  19. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/directory_client/__init__.py +0 -0
  20. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/directory_client/client/os_client.py +0 -0
  21. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/directory_client/directory_client.py +0 -0
  22. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/directory_client/directory_client_contract.py +0 -0
  23. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/directory_client/types/directory_client_types.py +0 -0
  24. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/files_client/__init__.py +0 -0
  25. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/files_client/clients/aiofiles_client.py +0 -0
  26. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/files_client/files_client.py +0 -0
  27. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/files_client/files_client_contract.py +0 -0
  28. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/files_client/types/files_client_types.py +0 -0
  29. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/__init__.py +0 -0
  30. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/clients/__init__.py +0 -0
  31. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/ftp_client.py +0 -0
  32. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/ftp_client_contract.py +0 -0
  33. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/types/__init__.py +0 -0
  34. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/ftp_client/types/ftp_client_types.py +0 -0
  35. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/sharepoint_client/__init__.py +0 -0
  36. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/sharepoint_client/clients/sharepoint_rest_api.py +0 -0
  37. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/sharepoint_client/sharepoint_client.py +0 -0
  38. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/sharepoint_client/sharepoint_client_contract.py +0 -0
  39. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/sharepoint_client/types/sharepoint_client_types.py +0 -0
  40. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/libs/zero_dependency/utils/datetime_utils.py +0 -0
  41. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/__init__.py +0 -0
  42. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/__init__.py +0 -0
  43. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/types/__init__.py +0 -0
  44. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/types/update_thies_data_types.py +0 -0
  45. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/types/upload_backup_to_sharepoint_types.py +0 -0
  46. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/controllers/upload_backup_to_sharepoint.py +0 -0
  47. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py +0 -0
  48. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/types/__init__.py +0 -0
  49. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py +0 -0
  50. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py +0 -0
  51. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/utils/__init__.py +0 -0
  52. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/utils/update_thies_data_utils.py +0 -0
  53. {saviialib-0.11.1 → saviialib-1.0.0}/src/saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: saviialib
3
- Version: 0.11.1
3
+ Version: 1.0.0
4
4
  Summary: A client library for IoT projects in the RCER initiative
5
5
  License: MIT
6
6
  Author: pedropablozavalat
@@ -11,12 +11,12 @@ Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
- Requires-Dist: aiofiles (==24.1.0)
15
- Requires-Dist: aioftp (==0.25.1)
16
- Requires-Dist: aiohttp (==3.11.16)
14
+ Requires-Dist: aiofiles
15
+ Requires-Dist: aioftp
16
+ Requires-Dist: aiohttp
17
17
  Requires-Dist: build
18
- Requires-Dist: dotenv (==0.9.9)
19
- Requires-Dist: pytest-cov (==6.1.1)
18
+ Requires-Dist: dotenv (>=0.9.9,<0.10.0)
19
+ Requires-Dist: pytest-cov (>=6.1.1,<7.0.0)
20
20
  Description-Content-Type: text/markdown
21
21
 
22
22
  # SAVIIA Library
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "saviialib"
3
- version = "0.11.1"
3
+ version = "1.0.0"
4
4
  description = "A client library for IoT projects in the RCER initiative"
5
5
  authors = ["pedropablozavalat"]
6
6
  license = "MIT"
@@ -8,11 +8,11 @@ readme = "README.md"
8
8
 
9
9
  [tool.poetry.dependencies]
10
10
  python = "^3.10"
11
- aioftp = "0.25.1"
12
- aiohttp = "3.11.16"
13
- aiofiles = "24.1.0"
14
- dotenv = "0.9.9"
15
- pytest-cov="6.1.1"
11
+ aioftp = "*"
12
+ aiohttp = "*"
13
+ aiofiles = "*"
14
+ dotenv = "^0.9.9"
15
+ pytest-cov="^6.1.1"
16
16
  build="*"
17
17
  [tool.poetry.group.dev.dependencies]
18
18
  pytest = "8.3.5"
@@ -59,6 +59,7 @@ class EpiiUpdateThiesConfig:
59
59
  sharepoint_tenant_id: str
60
60
  sharepoint_tenant_name: str
61
61
  sharepoint_site_name: str
62
+ logger: Logger
62
63
 
63
64
 
64
65
  @dataclass
@@ -45,5 +45,8 @@ class AioFTPClient(FTPClientContract):
45
45
 
46
46
  async def read_file(self, args: FtpReadFileArgs) -> bytes:
47
47
  await self._async_start()
48
- async with self.client.download_stream(args.file_path) as stream: # type: ignore
49
- return await stream.read()
48
+ try:
49
+ async with self.client.download_stream(args.file_path) as stream: # type: ignore
50
+ return await stream.read()
51
+ except StatusCodeError as error:
52
+ raise FileNotFoundError(f"File not found: {args.file_path}") from error
@@ -55,6 +55,7 @@ class EpiiAPI:
55
55
  sharepoint_site_name=self.sharepoint_site_name,
56
56
  sharepoint_tenant_id=self.sharepoint_tenant_id,
57
57
  sharepoint_tenant_name=self.sharepoint_tenant_name,
58
+ logger=self.logger,
58
59
  )
59
60
  controller = UpdateThiesDataController(
60
61
  UpdateThiesDataControllerInput(
@@ -45,6 +45,7 @@ class UpdateThiesDataController:
45
45
  ),
46
46
  sharepoint_folders_path=input.sharepoint_folders_path,
47
47
  ftp_server_folders_path=input.ftp_server_folders_path,
48
+ logger=input.config.logger,
48
49
  )
49
50
  )
50
51
 
@@ -1,6 +1,7 @@
1
1
  from dataclasses import dataclass, field
2
2
  from typing import Dict, List
3
3
  from saviialib.general_types.api.epii_api_types import FtpClientConfig, SharepointConfig
4
+ from logging import Logger
4
5
 
5
6
 
6
7
  @dataclass
@@ -9,6 +10,7 @@ class UpdateThiesDataUseCaseInput:
9
10
  sharepoint_config: SharepointConfig
10
11
  sharepoint_folders_path: List
11
12
  ftp_server_folders_path: List
13
+ logger: Logger
12
14
 
13
15
 
14
16
  @dataclass
@@ -38,6 +38,7 @@ class UpdateThiesDataUseCase:
38
38
  self.sharepoint_client = self._initialize_sharepoint_client(
39
39
  input.sharepoint_config
40
40
  )
41
+ self.logger = input.logger
41
42
  self.thies_ftp_client = self._initialize_thies_ftp_client(input.ftp_config)
42
43
  self.sharepoint_folders_path = input.sharepoint_folders_path
43
44
  self.ftp_server_folders_path = input.ftp_server_folders_path
@@ -122,16 +123,25 @@ class UpdateThiesDataUseCase:
122
123
  try:
123
124
  content_files = {}
124
125
  for file in self.uploading:
125
- _, filename = file.split("_", 1)
126
- folder_path = (
127
- self.ftp_server_folders_path[0]
128
- if "AV" in self.ftp_server_folders_path[0] # Folder with AVG prefix
129
- else self.ftp_server_folders_path[1] # Folder with EXT prefix
126
+ prefix, filename = file.split("_", 1)
127
+ # The first path is for AVG files. The second file is for EXT files
128
+ folder_path = next(
129
+ (
130
+ path
131
+ for path in self.ftp_server_folders_path
132
+ if prefix == ("AVG" if "AV" in path else "EXT")
133
+ ),
134
+ self.ftp_server_folders_path[0], # Default to the first path
130
135
  )
131
136
  file_path = f"{folder_path}/{filename}"
132
137
  content = await self.thies_ftp_client.read_file(
133
138
  FtpReadFileArgs(file_path)
134
139
  )
140
+ self.logger.debug(
141
+ "[thies_synchronization_lib] Fetching file '%s' from '%s'.",
142
+ file,
143
+ folder_path,
144
+ )
135
145
  content_files[file] = (
136
146
  content # Save file content with its original name.
137
147
  )
@@ -162,7 +172,7 @@ class UpdateThiesDataUseCase:
162
172
  folder_path = avg_folder if origin == "AVG" else ext_folder
163
173
 
164
174
  relative_url = f"{self.sharepoint_base_url}/{folder_path}"
165
- print(relative_url)
175
+
166
176
  args = SpUploadFileArgs(
167
177
  folder_relative_url=relative_url,
168
178
  file_content=file_content,
@@ -170,8 +180,18 @@ class UpdateThiesDataUseCase:
170
180
  )
171
181
  await self.sharepoint_client.upload_file(args)
172
182
  upload_results["new_files"].append(file)
183
+ self.logger.debug(
184
+ "[thies_synchronization_lib] File '%s' from '%s' uploaded successfully to '%s' ✅",
185
+ file_name,
186
+ folder_path,
187
+ relative_url,
188
+ )
173
189
 
174
190
  except ConnectionError as error:
191
+ self.logger.error(
192
+ "[thies_synchronization_lib] Unexpected error from with file '%s'",
193
+ file_name,
194
+ )
175
195
  upload_results["failed_files"].append(
176
196
  f"{file} (Error: {str(error)})"
177
197
  )
@@ -186,16 +206,23 @@ class UpdateThiesDataUseCase:
186
206
 
187
207
  async def execute(self):
188
208
  """Synchronize data from the THIES Center to the cloud."""
209
+ self.logger.debug("[thies_synchronization_lib] Starting ...")
189
210
  try:
190
211
  thies_files = await self.fetch_thies_file_names()
191
212
  except RuntimeError as error:
192
213
  raise FtpClientError(error)
193
-
214
+ self.logger.debug(
215
+ "[thies_synchronization_lib] Total files fetched from THIES: %s",
216
+ str(len(thies_files)),
217
+ )
194
218
  try:
195
219
  cloud_files = await self.fetch_cloud_file_names()
196
220
  except RuntimeError as error:
197
221
  raise SharepointClient(error) # type: ignore
198
-
222
+ self.logger.debug(
223
+ "[thies_synchronization_lib] Total files fetched from Sharepoint: %s",
224
+ str(len(cloud_files)),
225
+ )
199
226
  self.uploading = thies_files - cloud_files
200
227
  if not self.uploading:
201
228
  raise EmptyDataError(reason="No files to upload.")
@@ -206,5 +233,7 @@ class UpdateThiesDataUseCase:
206
233
  upload_statistics = await self.upload_thies_files_to_sharepoint(
207
234
  thies_fetched_files
208
235
  )
209
-
236
+ self.logger.debug(
237
+ "[thies_synchronization_lib] All the files were uploaded successfully 🎉"
238
+ )
210
239
  return parse_execute_response(thies_fetched_files, upload_statistics) # type: ignore
File without changes
File without changes