saviialib 0.9.1__tar.gz → 0.10.1__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 (54) hide show
  1. {saviialib-0.9.1 → saviialib-0.10.1}/PKG-INFO +1 -1
  2. {saviialib-0.9.1 → saviialib-0.10.1}/pyproject.toml +1 -1
  3. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/api/epii_api_types.py +3 -0
  4. saviialib-0.10.1/src/saviialib/libs/directory_client/__init__.py +4 -0
  5. saviialib-0.10.1/src/saviialib/libs/directory_client/client/os_client.py +23 -0
  6. saviialib-0.10.1/src/saviialib/libs/directory_client/directory_client.py +28 -0
  7. saviialib-0.10.1/src/saviialib/libs/directory_client/directory_client_contract.py +19 -0
  8. saviialib-0.10.1/src/saviialib/libs/directory_client/types/directory_client_types.py +6 -0
  9. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/files_client/__init__.py +2 -2
  10. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/files_client/clients/aiofiles_client.py +12 -3
  11. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/files_client/types/files_client_types.py +2 -1
  12. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/api.py +3 -1
  13. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/upload_backup_to_sharepoint.py +2 -1
  14. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/constants/upload_backup_to_sharepoint_constants.py +1 -0
  15. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/types/upload_backup_to_sharepoint_types.py +2 -0
  16. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/upload_backup_to_sharepoint.py +51 -36
  17. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/utils/upload_backup_to_sharepoint_utils.py +9 -14
  18. {saviialib-0.9.1 → saviialib-0.10.1}/LICENSE +0 -0
  19. {saviialib-0.9.1 → saviialib-0.10.1}/README.md +0 -0
  20. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/__init__.py +0 -0
  21. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/__init__.py +0 -0
  22. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/api/__init__.py +0 -0
  23. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/error_types/__init__.py +0 -0
  24. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/error_types/api/__init__.py +0 -0
  25. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/error_types/api/epii_api_error_types.py +0 -0
  26. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/error_types/common/__init__.py +0 -0
  27. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/general_types/error_types/common/common_types.py +0 -0
  28. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/files_client/files_client.py +0 -0
  29. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/files_client/files_client_contract.py +0 -0
  30. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/__init__.py +0 -0
  31. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/clients/__init__.py +0 -0
  32. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/clients/aioftp_client.py +0 -0
  33. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/ftp_client.py +0 -0
  34. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/ftp_client_contract.py +0 -0
  35. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/types/__init__.py +0 -0
  36. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/ftp_client/types/ftp_client_types.py +0 -0
  37. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/sharepoint_client/__init__.py +0 -0
  38. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/sharepoint_client/clients/sharepoint_rest_api.py +0 -0
  39. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/sharepoint_client/sharepoint_client.py +0 -0
  40. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/sharepoint_client/sharepoint_client_contract.py +0 -0
  41. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/sharepoint_client/types/sharepoint_client_types.py +0 -0
  42. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/libs/zero_dependency/utils/datetime_utils.py +0 -0
  43. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/__init__.py +0 -0
  44. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/__init__.py +0 -0
  45. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/types/__init__.py +0 -0
  46. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/types/update_thies_data_types.py +0 -0
  47. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/types/upload_backup_to_sharepoint_types.py +0 -0
  48. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/controllers/update_thies_data.py +0 -0
  49. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/constants/update_thies_data_constants.py +0 -0
  50. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/types/__init__.py +0 -0
  51. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/types/update_thies_data_types.py +0 -0
  52. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/use_cases/update_thies_data.py +0 -0
  53. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/utils/__init__.py +0 -0
  54. {saviialib-0.9.1 → saviialib-0.10.1}/src/saviialib/services/epii/utils/update_thies_data_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: saviialib
3
- Version: 0.9.1
3
+ Version: 0.10.1
4
4
  Summary: A client library for IoT projects in the RCER initiative
5
5
  License: MIT
6
6
  Author: pedropablozavalat
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "saviialib"
3
- version = "0.9.1"
3
+ version = "0.10.1"
4
4
  description = "A client library for IoT projects in the RCER initiative"
5
5
  authors = ["pedropablozavalat"]
6
6
  license = "MIT"
@@ -1,4 +1,5 @@
1
1
  from dataclasses import dataclass
2
+ from logging import Logger
2
3
 
3
4
 
4
5
  @dataclass
@@ -27,6 +28,7 @@ class EpiiAPIConfig:
27
28
  sharepoint_tenant_id: str
28
29
  sharepoint_tenant_name: str
29
30
  sharepoint_site_name: str
31
+ logger: Logger
30
32
 
31
33
 
32
34
  @dataclass
@@ -80,3 +82,4 @@ class EpiiSharepointBackupConfig:
80
82
  sharepoint_site_name: str
81
83
  local_backup_source_path: str
82
84
  destination_folders: str
85
+ logger: Logger
@@ -0,0 +1,4 @@
1
+ from .directory_client import DirectoryClient
2
+ from .types.directory_client_types import DirectoryClientArgs
3
+
4
+ __all__ = ["DirectoryClient", "DirectoryClientArgs"]
@@ -0,0 +1,23 @@
1
+ from saviialib.libs.directory_client.directory_client_contract import (
2
+ DirectoryClientContract,
3
+ )
4
+ import os
5
+ import asyncio
6
+
7
+
8
+ class OsClient(DirectoryClientContract):
9
+ @staticmethod
10
+ def join_paths(*paths: str) -> str:
11
+ return os.path.join(*paths)
12
+
13
+ @staticmethod
14
+ async def path_exists(path: str) -> bool:
15
+ return await asyncio.to_thread(os.path.exists, path)
16
+
17
+ @staticmethod
18
+ async def listdir(path: str) -> list:
19
+ return await asyncio.to_thread(os.listdir, path)
20
+
21
+ @staticmethod
22
+ async def isdir(path: str) -> list:
23
+ return await asyncio.to_thread(os.path.isdir, path)
@@ -0,0 +1,28 @@
1
+ from .client.os_client import OsClient
2
+ from .directory_client_contract import DirectoryClientContract
3
+ from .types.directory_client_types import DirectoryClientArgs
4
+
5
+
6
+ class DirectoryClient(DirectoryClientContract):
7
+ CLIENTS = {"os_client"}
8
+
9
+ def __init__(self, args: DirectoryClientArgs) -> None:
10
+ if args.client_name not in DirectoryClient.CLIENTS:
11
+ msg = f"Unsupported client {args.client_name}"
12
+ raise KeyError(msg)
13
+
14
+ if args.client_name == "os_client":
15
+ self.client_obj = OsClient()
16
+ self.client_name = args.client_name
17
+
18
+ def join_paths(self, *paths: str) -> str:
19
+ return self.client_obj.join_paths(*paths)
20
+
21
+ async def path_exists(self, path: str) -> bool:
22
+ return await self.client_obj.path_exists(path)
23
+
24
+ async def listdir(self, path: str) -> list:
25
+ return await self.client_obj.listdir(path)
26
+
27
+ async def isdir(self, path: str) -> bool:
28
+ return await self.client_obj.isdir(path)
@@ -0,0 +1,19 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class DirectoryClientContract(ABC):
5
+ @abstractmethod
6
+ def join_paths(self, *paths: str) -> str:
7
+ pass
8
+
9
+ @abstractmethod
10
+ async def path_exists(self, path: str) -> bool:
11
+ pass
12
+
13
+ @abstractmethod
14
+ async def listdir(self, path: str) -> list:
15
+ pass
16
+
17
+ @abstractmethod
18
+ async def isdir(self, path) -> bool:
19
+ pass
@@ -0,0 +1,6 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class DirectoryClientArgs:
6
+ client_name: str = "os_client"
@@ -1,4 +1,4 @@
1
1
  from .files_client import FilesClient
2
- from .types.files_client_types import FilesClientInitArgs, ReadArgs
2
+ from .types.files_client_types import FilesClientInitArgs, ReadArgs, WriteArgs
3
3
 
4
- __all__ = ["FilesClient", "FilesClientInitArgs", "ReadArgs"]
4
+ __all__ = ["FilesClient", "FilesClientInitArgs", "ReadArgs", "WriteArgs"]
@@ -1,5 +1,8 @@
1
1
  import aiofiles
2
-
2
+ from saviialib.libs.directory_client.directory_client import (
3
+ DirectoryClient,
4
+ DirectoryClientArgs,
5
+ )
3
6
  from saviialib.libs.files_client.files_client_contract import FilesClientContract
4
7
  from saviialib.libs.files_client.types.files_client_types import (
5
8
  FilesClientInitArgs,
@@ -10,7 +13,7 @@ from saviialib.libs.files_client.types.files_client_types import (
10
13
 
11
14
  class AioFilesClient(FilesClientContract):
12
15
  def __init__(self, args: FilesClientInitArgs):
13
- pass
16
+ self.dir_client = DirectoryClient(DirectoryClientArgs(client_name="os_client"))
14
17
 
15
18
  async def read(self, args: ReadArgs) -> str | bytes:
16
19
  encoding = None if args.mode == "rb" else args.encoding
@@ -18,4 +21,10 @@ class AioFilesClient(FilesClientContract):
18
21
  return await file.read()
19
22
 
20
23
  async def write(self, args: WriteArgs) -> None:
21
- return None
24
+ file_path = (
25
+ self.dir_client.join_paths(args.destination_path, args.file_name)
26
+ if args.destination_path
27
+ else args.file_name
28
+ )
29
+ async with aiofiles.open(file_path, args.mode) as file:
30
+ await file.write(args.file_content)
@@ -26,6 +26,7 @@ class ReadArgs:
26
26
 
27
27
  @dataclass
28
28
  class WriteArgs:
29
- destination_path: str
30
29
  file_name: str
31
30
  file_content: str | bytes
31
+ mode: Literal["w", "wb", "a"]
32
+ destination_path: str = ""
@@ -28,6 +28,7 @@ class EpiiAPI:
28
28
  self.sharepoint_tenant_id = config.sharepoint_tenant_id
29
29
  self.sharepoint_tenant_name = config.sharepoint_tenant_name
30
30
  self.sharepoint_site_name = config.sharepoint_site_name
31
+ self.logger = config.logger
31
32
 
32
33
  async def update_thies_data(self) -> Dict[str, Any]:
33
34
  """
@@ -70,7 +71,8 @@ class EpiiAPI:
70
71
  sharepoint_tenant_id=self.sharepoint_tenant_id,
71
72
  sharepoint_tenant_name=self.sharepoint_tenant_name,
72
73
  local_backup_source_path=local_backup_source_path,
73
- destination_folders=destination_folders
74
+ destination_folders=destination_folders,
75
+ logger=self.logger,
74
76
  )
75
77
 
76
78
  controller = UploadBackupToSharepointController(
@@ -34,7 +34,8 @@ class UploadBackupToSharepointController:
34
34
  sharepoint_tenant_id=input.config.sharepoint_tenant_id,
35
35
  ),
36
36
  local_backup_source_path=input.config.local_backup_source_path,
37
- destination_folders=input.config.destination_folders
37
+ destination_folders=input.config.destination_folders,
38
+ logger=input.config.logger,
38
39
  )
39
40
  )
40
41
 
@@ -2,4 +2,5 @@ import logging
2
2
 
3
3
  SHAREPOINT_BASE_URL = "/sites/uc365_CentrosyEstacionesRegionalesUC/Shared%20Documents/General/Test_Raspberry"
4
4
 
5
+ logging.basicConfig(level=logging.DEBUG)
5
6
  LOGGER = logging.getLogger(__package__)
@@ -1,5 +1,6 @@
1
1
  from dataclasses import dataclass
2
2
  from saviialib.general_types.api.epii_api_types import SharepointConfig
3
+ from logging import Logger
3
4
 
4
5
 
5
6
  @dataclass
@@ -7,3 +8,4 @@ class UploadBackupToSharepointUseCaseInput:
7
8
  sharepoint_config: SharepointConfig
8
9
  local_backup_source_path: str
9
10
  destination_folders: dict
11
+ logger: Logger
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
- import os
3
2
  from time import time
3
+ from logging import Logger
4
4
  import saviialib.services.epii.use_cases.constants.upload_backup_to_sharepoint_constants as c
5
5
  from saviialib.general_types.error_types.api.epii_api_error_types import (
6
6
  BackupEmptyError,
@@ -10,7 +10,13 @@ from saviialib.general_types.error_types.api.epii_api_error_types import (
10
10
  from saviialib.general_types.error_types.common import (
11
11
  SharepointClientError,
12
12
  )
13
- from saviialib.libs.files_client import FilesClient, FilesClientInitArgs, ReadArgs
13
+ from saviialib.libs.directory_client import DirectoryClient, DirectoryClientArgs
14
+ from saviialib.libs.files_client import (
15
+ FilesClient,
16
+ FilesClientInitArgs,
17
+ ReadArgs,
18
+ WriteArgs,
19
+ )
14
20
  from saviialib.libs.sharepoint_client import (
15
21
  SharepointClient,
16
22
  SharepointClientInitArgs,
@@ -19,7 +25,6 @@ from saviialib.libs.sharepoint_client import (
19
25
  from saviialib.services.epii.utils.upload_backup_to_sharepoint_utils import (
20
26
  calculate_percentage_uploaded,
21
27
  count_files_in_directory,
22
- directory_exists,
23
28
  extract_error_message,
24
29
  parse_execute_response,
25
30
  show_upload_result,
@@ -28,7 +33,6 @@ from saviialib.services.epii.utils.upload_backup_to_sharepoint_utils import (
28
33
  from .types.upload_backup_to_sharepoint_types import (
29
34
  UploadBackupToSharepointUseCaseInput,
30
35
  )
31
- from .constants.upload_backup_to_sharepoint_constants import LOGGER
32
36
 
33
37
 
34
38
  class UploadBackupToSharepointUsecase:
@@ -37,38 +41,47 @@ class UploadBackupToSharepointUsecase:
37
41
  self.local_backup_source_path = input.local_backup_source_path
38
42
  self.destination_folders = input.destination_folders
39
43
  self.files_client = self._initialize_files_client()
44
+ self.dir_client = self._initialize_directory_client()
40
45
  self.log_history = []
41
46
  self.grouped_files_by_folder = None
42
47
  self.total_files = None
48
+ self.logger: Logger = input.logger
49
+
50
+ def _initialize_directory_client(self):
51
+ return DirectoryClient(DirectoryClientArgs(client_name="os_client"))
43
52
 
44
53
  def _initialize_files_client(self):
45
54
  return FilesClient(FilesClientInitArgs(client_name="aiofiles_client"))
46
55
 
47
56
  async def _extract_filesnames_by_folder(self) -> dict[str, list[str]]:
48
57
  """Groups files by their parent folder."""
49
- backup_folder_exists = await asyncio.to_thread(
50
- os.path.exists, self.local_backup_source_path
58
+ backup_folder_exists = await self.dir_client.path_exists(
59
+ self.local_backup_source_path
51
60
  )
61
+
52
62
  if not backup_folder_exists:
53
63
  return {}
54
- folder_names = await asyncio.to_thread(
55
- os.listdir, self.local_backup_source_path
56
- )
64
+ folder_names = await self.dir_client.listdir(self.local_backup_source_path)
57
65
  return {
58
66
  folder_name: [
59
67
  file_name
60
- for file_name in await asyncio.to_thread(
61
- os.listdir, os.path.join(self.local_backup_source_path, folder_name)
68
+ for file_name in await self.dir_client.listdir(
69
+ self.dir_client.join_paths(
70
+ self.local_backup_source_path, folder_name
71
+ )
62
72
  )
63
73
  ]
64
74
  for folder_name in folder_names
65
75
  }
66
76
 
67
- def _save_log_history(self) -> None:
68
- text_file = "\n".join(self.log_history)
69
- log_history_filepath = "BACKUP_LOG_HISTORY.log"
70
- with open(log_history_filepath, "w") as file:
71
- file.write(text_file)
77
+ async def _save_log_history(self) -> None:
78
+ await self.files_client.write(
79
+ WriteArgs(
80
+ file_name="BACKUP_LOG_HISTORY.log",
81
+ file_content="\n".join(self.log_history),
82
+ mode="w",
83
+ )
84
+ )
72
85
 
73
86
  async def export_file_to_sharepoint(
74
87
  self, folder_name: str, file_name: str, file_content: bytes
@@ -105,20 +118,22 @@ class UploadBackupToSharepointUsecase:
105
118
 
106
119
  return uploaded, error_message
107
120
 
108
- async def upload_and_log_progress_task(self, folder_name, file_name) -> dict:
121
+ async def _upload_and_log_progress_task(self, folder_name, file_name) -> dict:
109
122
  """Task for uploads a file and logs progress."""
110
123
  uploading_message = (
111
124
  f"[BACKUP] Uploading file '{file_name}' from '{folder_name}' "
112
125
  )
113
126
  self.log_history.append(uploading_message)
114
- LOGGER.debug(uploading_message)
115
- file_path = os.path.join(self.local_backup_source_path, folder_name, file_name)
127
+ self.logger.debug(uploading_message)
128
+ file_path = self.dir_client.join_paths(
129
+ self.local_backup_source_path, folder_name, file_name
130
+ )
116
131
  file_content = await self.files_client.read(ReadArgs(file_path, mode="rb"))
117
132
  uploaded, error_message = await self.export_file_to_sharepoint(
118
133
  folder_name, file_name, file_content
119
134
  )
120
135
  result_message = show_upload_result(uploaded, file_name)
121
- LOGGER.debug(result_message)
136
+ self.logger.debug(result_message)
122
137
  self.log_history.append(result_message)
123
138
  return {
124
139
  "parent_folder": folder_name,
@@ -134,24 +149,26 @@ class UploadBackupToSharepointUsecase:
134
149
  f"[BACKUP] Retrying upload for {len(failed_files)} failed files... 🚨"
135
150
  )
136
151
  self.log_history.append(retry_message)
137
- LOGGER.debug(retry_message)
152
+ self.logger.debug(retry_message)
138
153
  for file in failed_files:
139
154
  tasks.append(
140
- self.upload_and_log_progress_task(
155
+ self._upload_and_log_progress_task(
141
156
  file["parent_folder"], file["file_name"]
142
157
  )
143
158
  )
144
159
  results = await asyncio.gather(*tasks, return_exceptions=True)
145
160
  success = calculate_percentage_uploaded(results, self.total_files)
146
161
  if success < 100.0:
147
- raise BackupUploadError(reason=extract_error_message(results, success))
162
+ raise BackupUploadError(
163
+ reason=extract_error_message(self.logger, results, success)
164
+ )
148
165
  else:
149
166
  successful_upload_retry = (
150
167
  "[BACKUP] All files uploaded successfully after retry."
151
168
  )
152
169
  self.log_history.append(successful_upload_retry)
153
- LOGGER.debug(successful_upload_retry)
154
- self._save_log_history()
170
+ self.logger.debug(successful_upload_retry)
171
+ await self._save_log_history()
155
172
  return parse_execute_response(results)
156
173
 
157
174
  async def execute(self):
@@ -164,7 +181,7 @@ class UploadBackupToSharepointUsecase:
164
181
  start_time = time()
165
182
 
166
183
  # Check if the local path exists in the main directory
167
- if not await directory_exists(self.local_backup_source_path):
184
+ if not await self.dir_client.path_exists(self.local_backup_source_path):
168
185
  raise BackupSourcePathError(
169
186
  reason=f"'{self.local_backup_source_path}' doesn't exist."
170
187
  )
@@ -172,14 +189,12 @@ class UploadBackupToSharepointUsecase:
172
189
  # Check if the current folder only have files.
173
190
  items = [
174
191
  item
175
- for item in await asyncio.to_thread(
176
- os.listdir, self.local_backup_source_path
177
- )
192
+ for item in await self.dir_client.listdir(self.local_backup_source_path)
178
193
  ]
179
194
  for item in items:
180
195
  folder_included = item in self.destination_folders.keys()
181
- is_file = not await asyncio.to_thread(
182
- os.path.isdir, os.path.join(self.local_backup_source_path, item)
196
+ is_file = not await self.dir_client.isdir(
197
+ self.dir_client.join_paths(self.local_backup_source_path, item)
183
198
  )
184
199
 
185
200
  if not folder_included and not is_file:
@@ -197,7 +212,7 @@ class UploadBackupToSharepointUsecase:
197
212
  f"[BACKUP] {self.local_backup_source_path} has no files ⚠️"
198
213
  )
199
214
  self.log_history.append(no_files_message)
200
- LOGGER.debug(no_files_message)
215
+ self.logger.debug(no_files_message)
201
216
  raise BackupEmptyError
202
217
  # Create task for each file stored in the the local backup folder.
203
218
  for folder_name in self.grouped_files_by_folder:
@@ -208,16 +223,16 @@ class UploadBackupToSharepointUsecase:
208
223
  == 0
209
224
  ):
210
225
  empty_folder_message = f"[BACKUP] The folder '{folder_name}' is empty ⚠️"
211
- LOGGER.debug(empty_folder_message)
226
+ self.logger.debug(empty_folder_message)
212
227
  self.log_history.append(empty_folder_message)
213
228
  continue
214
229
  extracting_files_message = (
215
230
  "[BACKUP]" + f" Extracting files from '{folder_name} ".center(15, "*")
216
231
  )
217
232
  self.log_history.append(extracting_files_message)
218
- LOGGER.debug(extracting_files_message)
233
+ self.logger.debug(extracting_files_message)
219
234
  for file_name in self.grouped_files_by_folder[folder_name]:
220
- tasks.append(self.upload_and_log_progress_task(folder_name, file_name))
235
+ tasks.append(self._upload_and_log_progress_task(folder_name, file_name))
221
236
 
222
237
  # Execution of multiple asynchronous tasks for files migration.
223
238
  results = await asyncio.gather(*tasks, return_exceptions=True)
@@ -237,5 +252,5 @@ class UploadBackupToSharepointUsecase:
237
252
  )
238
253
  self.log_history.append(finished_backup_message)
239
254
 
240
- self._save_log_history()
255
+ await self._save_log_history()
241
256
  return parse_execute_response(results)
@@ -1,13 +1,12 @@
1
1
  import re
2
+ from logging import Logger
2
3
  from typing import List, Dict, Optional
3
- import asyncio
4
- import os
5
4
  from saviialib.general_types.error_types.api.epii_api_error_types import (
6
5
  BackupSourcePathError,
7
6
  )
8
- from saviialib.services.epii.use_cases.constants.upload_backup_to_sharepoint_constants import (
9
- LOGGER,
10
- )
7
+ from saviialib.libs.directory_client import DirectoryClient, DirectoryClientArgs
8
+
9
+ dir_client = DirectoryClient(DirectoryClientArgs(client_name="os_client"))
11
10
 
12
11
 
13
12
  def extract_error_information(error: str) -> Optional[Dict[str, str]]:
@@ -30,8 +29,8 @@ def explain_status_code(status_code: int) -> str:
30
29
  return explanations.get(status_code, "Unknown error occurred.")
31
30
 
32
31
 
33
- def extract_error_message(results: List[Dict], success: float) -> str:
34
- LOGGER.info(
32
+ def extract_error_message(logger: Logger, results: List[Dict], success: float) -> str:
33
+ logger.info(
35
34
  "[BACKUP] Not all files uploaded ⚠️\n"
36
35
  f"[BACKUP] Files failed to upload: {(1 - success):.2%}"
37
36
  )
@@ -59,9 +58,9 @@ def extract_error_message(results: List[Dict], success: float) -> str:
59
58
 
60
59
  # Summary
61
60
  for code, items in grouped_errors.items():
62
- LOGGER.info(f"[BACKUP] Status code {code} - {explain_status_code(int(code))}")
61
+ logger.info(f"[BACKUP] Status code {code} - {explain_status_code(int(code))}")
63
62
  for item in items:
64
- LOGGER.info(
63
+ logger.info(
65
64
  f"[BACKUP] File {item['file_name']}, url: {item['url']}, message: {item['message']}"
66
65
  )
67
66
 
@@ -94,9 +93,5 @@ def calculate_percentage_uploaded(results: List[Dict], total_files: int) -> floa
94
93
  return (uploaded_count / total_files) * 100 if total_files > 0 else 0
95
94
 
96
95
 
97
- async def directory_exists(path: str) -> bool:
98
- return await asyncio.to_thread(os.path.exists, path)
99
-
100
-
101
96
  async def count_files_in_directory(path: str, folder_name: str) -> int:
102
- return len(await asyncio.to_thread(os.listdir, os.path.join(path, folder_name)))
97
+ return len(await dir_client.listdir(dir_client.join_paths(path, folder_name)))
File without changes
File without changes