ipulse-shared-core-ftredge 2.6.1__py3-none-any.whl → 2.7.1__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.

Potentially problematic release.


This version of ipulse-shared-core-ftredge might be problematic. Click here for more details.

Files changed (24) hide show
  1. ipulse_shared_core_ftredge/__init__.py +10 -9
  2. ipulse_shared_core_ftredge/enums/__init__.py +12 -7
  3. ipulse_shared_core_ftredge/enums/enums_common_utils.py +9 -0
  4. ipulse_shared_core_ftredge/enums/enums_data_eng.py +280 -76
  5. ipulse_shared_core_ftredge/enums/{enums_logs.py → enums_logging.py} +30 -1
  6. ipulse_shared_core_ftredge/enums/enums_module_fincore.py +16 -2
  7. ipulse_shared_core_ftredge/enums/enums_modules.py +6 -0
  8. ipulse_shared_core_ftredge/enums/{enums_cloud.py → enums_solution_providers.py} +11 -4
  9. ipulse_shared_core_ftredge/utils/__init__.py +11 -7
  10. ipulse_shared_core_ftredge/utils/logs/context_log.py +2 -3
  11. ipulse_shared_core_ftredge/utils/logs/get_logger.py +47 -20
  12. ipulse_shared_core_ftredge/utils/utils_cloud.py +26 -17
  13. ipulse_shared_core_ftredge/utils/utils_cloud_gcp.py +311 -180
  14. ipulse_shared_core_ftredge/utils/utils_cloud_gcp_with_collectors.py +150 -153
  15. ipulse_shared_core_ftredge/utils/utils_cloud_with_collectors.py +16 -15
  16. ipulse_shared_core_ftredge/utils/utils_collector_pipelinemon.py +2 -2
  17. ipulse_shared_core_ftredge/utils/utils_common.py +145 -110
  18. ipulse_shared_core_ftredge/utils/utils_templates_and_schemas.py +2 -2
  19. {ipulse_shared_core_ftredge-2.6.1.dist-info → ipulse_shared_core_ftredge-2.7.1.dist-info}/METADATA +1 -1
  20. ipulse_shared_core_ftredge-2.7.1.dist-info/RECORD +33 -0
  21. ipulse_shared_core_ftredge-2.6.1.dist-info/RECORD +0 -33
  22. {ipulse_shared_core_ftredge-2.6.1.dist-info → ipulse_shared_core_ftredge-2.7.1.dist-info}/LICENCE +0 -0
  23. {ipulse_shared_core_ftredge-2.6.1.dist-info → ipulse_shared_core_ftredge-2.7.1.dist-info}/WHEEL +0 -0
  24. {ipulse_shared_core_ftredge-2.6.1.dist-info → ipulse_shared_core_ftredge-2.7.1.dist-info}/top_level.txt +0 -0
@@ -5,141 +5,176 @@
5
5
  # pylint: disable=missing-class-docstring
6
6
  # pylint: disable=broad-exception-caught
7
7
 
8
- import os
8
+ import os
9
9
  import json
10
+ from typing import List
11
+ from ipulse_shared_core_ftredge.enums import DuplicationHandling, DuplicationHandlingStatus, MatchConditionType
12
+ # from ipulse_shared_core_ftredge.utils import Pipelinemon, ContextLog
10
13
 
11
- def log_error(message, logger=None , print_out=False, exc_info=False):
14
+
15
+ def log_error(msg,logger=None , print_out=False, exc_info=False):
16
+ if print_out:
17
+ print(msg)
12
18
  if logger:
13
- logger.error(message, exc_info=exc_info)
14
- elif print_out:
15
- print(message)
19
+ logger.error(msg, exc_info=exc_info)
16
20
 
17
- def log_warning(message, logger=None, print_out=False):
21
+ def log_warning(msg, logger=None, print_out=False):
22
+ if print_out:
23
+ print(msg)
18
24
  if logger:
19
- logger.warning(message)
20
- elif print_out:
21
- print(message)
25
+ logger.warning(msg)
26
+
22
27
 
23
- def log_info(message, logger=None, print_out=False):
28
+ def log_info(msg, logger=None, print_out=False):
29
+ if print_out:
30
+ print(msg)
24
31
  if logger:
25
- logger.info(message)
26
- elif print_out:
27
- print(message)
32
+ logger.info(msg)
28
33
 
29
34
 
30
- def save_json_locally_extended(data:dict | list | str, file_name:str, local_path:str, file_exists_if_starts_with_prefix:str=None, overwrite_if_exists:bool=False, increment_if_exists:bool=False,
31
- max_deletable_files:int=1, logger=None, print_out=False):
32
-
33
- """Saves data to a local JSON file.
35
+ def prepare_full_file_path(file_name: str, output_directory: str = None) -> str:
36
+ """
37
+ Prepares the full file path, ensuring the output directory and subdirectories exist.
34
38
 
35
39
  Args:
36
- data (dict | list | str): The data to save.
37
- file_name (str): The desired file name.
38
- local_path (str): The directory where the file should be saved.
39
- file_exists_if_starts_with_prefix (str, optional): If provided, used to check for
40
- existing files with the given prefix. Defaults to None.
41
- overwrite_if_exists (bool, optional): If True, overwrites existing files. Defaults to False.
42
- increment_if_exists (bool, optional): If True, increments the file name if it exists.
43
- Defaults to False.
44
- max_deletable_files (int, optional): Maximum number of files to delete when overwriting.
45
- Defaults to 1.
40
+ file_name (str): The name of the file, which may include subdirectories or a full path.
41
+ output_directory (str, optional): The directory where the file should be saved. Defaults to the current working directory.
46
42
 
47
43
  Returns:
48
- dict: Metadata about the save operation, including:
49
- - local_path (str): The full path to the saved file (or None if not saved).
50
- - local_file_already_exists (bool): True if a file with the same name or prefix existed.
51
- - local_file_overwritten (bool): True if an existing file was overwritten.
52
- - local_deleted_file_names (str): A comma-separated string of deleted file names (or None).
53
- - local_file_saved_with_increment (bool): True if the file was saved with an incremented name.
54
- - local_save_error (bool): True if there was an error saving the file.
44
+ str: The full path to the file.
55
45
  """
56
-
57
- local_save_error=None
58
- # Input validation
59
- if overwrite_if_exists and increment_if_exists:
60
- msg = "Both 'overwrite_if_exists' and 'increment_if_exists' cannot be True simultaneously."
61
- log_error(msg, logger=logger, print_out=print_out)
62
- return {"local_save_error" : msg}
63
- if max_deletable_files > 10:
64
- msg = "max_deletable_files should be less than 10 for safety. For more, use another method."
65
- log_error(msg, logger=logger, print_out=print_out)
66
- return {"local_save_error" : msg}
67
-
68
-
69
- # Prepare data
70
- if isinstance(data, (list, dict)):
71
- data_str = json.dumps(data, indent=2)
46
+ if os.path.isabs(file_name):
47
+ # If file_name is an absolute path, use it directly
48
+ full_file_path = file_name
72
49
  else:
73
- data_str = data
50
+ # Prepare the output directory
51
+ output_directory = output_directory or os.getcwd()
52
+ full_file_path = os.path.join(output_directory, file_name)
74
53
 
54
+ # Create the directory if it doesn't exist
55
+ os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
75
56
 
76
- # Extract directory from file_name if present
77
- directory = os.path.dirname(file_name)
78
- full_local_path = os.path.join(local_path, directory)
57
+ return full_file_path
79
58
 
80
- # Create the full directory path if it doesn't exist
81
- os.makedirs(full_local_path, exist_ok=True)
82
59
 
83
- # Now use the full file path including the subdirectories
84
- base_file_name, ext = os.path.splitext(os.path.basename(file_name))
85
- increment = 0
86
- full_file_path = os.path.join(full_local_path, f"{base_file_name}{ext}")
60
+ def save_json_locally_extended(data:dict | list | str, file_name:str,
61
+ duplication_handling:DuplicationHandling ,
62
+ duplication_match_condition_type:MatchConditionType,
63
+ output_directory:str=None,
64
+ duplication_match_condition:str | List[str] = "",
65
+ max_matched_deletable_files:int=1, logger=None, print_out=False, raise_e=False):
87
66
 
88
- # Metadata
89
- local_path = None
90
- local_file_already_exists = False
91
- local_file_overwritten = False
92
- local_file_saved_with_increment = False
93
- local_deleted_file_names = None
94
- local_save_error = None
67
+ """Saves data to a local JSON file.
68
+ """
95
69
 
70
+ max_deletable_files_allowed = 3
71
+
72
+ saved_to_file_path = None
73
+ matched_duplicates_count = 0 # Default to 0
74
+ duplication_handling_status = None
75
+ matched_duplicates_deleted = None
76
+ error_during_operation = None
77
+
78
+ response={
79
+ "saved_to_file_path": saved_to_file_path,
80
+ "matched_duplicates_count": matched_duplicates_count,
81
+ "matched_duplicates_deleted": matched_duplicates_deleted,
82
+ "duplication_handling_status": duplication_handling_status,
83
+ "duplication_match_condition_type": duplication_match_condition_type,
84
+ "duplication_match_condition": duplication_match_condition,
85
+ "error_during_operation": error_during_operation
86
+ }
87
+
88
+ supported_match_condition_types = [MatchConditionType.EXACT, MatchConditionType.PREFIX]
89
+ supported_duplication_handling = [DuplicationHandling.RAISE_ERROR, DuplicationHandling.OVERWRITE, DuplicationHandling.INCREMENT, DuplicationHandling.SKIP]
90
+
96
91
  try:
97
- # --- Overwrite Logic ---
98
- if overwrite_if_exists:
99
- if file_exists_if_starts_with_prefix:
100
- files_to_delete = [
101
- f for f in os.listdir(full_local_path)
102
- if f.startswith(file_exists_if_starts_with_prefix)
103
- ]
104
- if len(files_to_delete) > max_deletable_files:
105
- raise ValueError(
106
- f"Error: Attempt to delete {len(files_to_delete)} matched files, but limit is {max_deletable_files}."
107
- )
108
- if files_to_delete:
109
- local_file_already_exists = True
110
- for file in files_to_delete:
111
- os.remove(os.path.join(full_local_path, file))
112
- local_file_overwritten = True
113
- local_deleted_file_names = ",,,".join(files_to_delete)
114
- elif os.path.exists(full_file_path):
115
- local_file_already_exists = True
116
- os.remove(full_file_path)
117
- local_file_overwritten = True
118
-
119
- # --- Increment Logic ---
120
- elif increment_if_exists:
121
- while os.path.exists(full_file_path):
122
- local_file_already_exists = True
123
- increment += 1
124
- file_name = f"{base_file_name}_v{increment}{ext}"
125
- full_file_path = os.path.join(full_local_path, file_name)
126
- local_file_saved_with_increment = True
92
+
93
+ # Use the helper function to get the full file path
94
+ full_file_path = prepare_full_file_path(file_name=file_name, output_directory=output_directory)
95
+ # Extract the directory path, base file name, and extension
96
+ directory_path = os.path.dirname(full_file_path)
97
+
98
+ if max_matched_deletable_files > max_deletable_files_allowed:
99
+ msg = f"Error: max_deletable_files should be less than or equal to {max_deletable_files_allowed} for safety. For more, use specific Delete method."
100
+ raise ValueError(msg)
101
+
102
+ if duplication_handling not in supported_duplication_handling:
103
+ msg = f"Error: Duplication handling not supported. Supported types: {supported_duplication_handling}"
104
+ raise ValueError(msg)
105
+
106
+ if duplication_match_condition_type not in supported_match_condition_types:
107
+ msg = f"Error: Match condition type not supported. Supported types: {supported_match_condition_types}"
108
+ raise ValueError(msg)
109
+
110
+ elif duplication_match_condition_type!=MatchConditionType.EXACT and not duplication_match_condition:
111
+ msg = f"Error: Match condition is required for match condition type: {duplication_match_condition_type}"
112
+ raise ValueError(msg)
113
+
114
+ # Prepare data
115
+ if isinstance(data, (list, dict)):
116
+ data_str = json.dumps(data, indent=2)
117
+ else:
118
+ data_str = data
119
+
120
+
121
+ # --- Check if File Exists ---
122
+ if duplication_match_condition_type==MatchConditionType.PREFIX:
123
+ files_matched_on_condition = [
124
+ os.path.join(directory_path, f) for f in os.listdir(directory_path)
125
+ if f.startswith(duplication_match_condition)
126
+ ]
127
+ if files_matched_on_condition:
128
+ matched_duplicates_count = len(files_matched_on_condition)
129
+ elif duplication_match_condition_type==MatchConditionType.EXACT:
130
+ if os.path.exists(full_file_path):
131
+ files_matched_on_condition = [full_file_path] # Always assign a list
132
+ matched_duplicates_count = 1
133
+
134
+
135
+ if matched_duplicates_count:
136
+ if duplication_handling==DuplicationHandling.RAISE_ERROR:
137
+ msg = f"Error: File already exists at file path: {full_file_path}"
138
+ raise FileExistsError(msg)
139
+
140
+ if duplication_handling == DuplicationHandling.SKIP:
141
+ log_warning(f"Skipping saving to file path: {full_file_path} - file already exists.", logger=logger, print_out=print_out)
142
+ response["duplication_handling_status"] = DuplicationHandlingStatus.SKIPPED.value
143
+ return response # Return here
144
+ # --- Overwrite Logic --> Delete ---
145
+ if duplication_handling==DuplicationHandling.OVERWRITE:
146
+ if matched_duplicates_count > max_matched_deletable_files:
147
+ msg = f"Error: Attempt to delete {len(files_matched_on_condition)} matched files, but limit is {max_matched_deletable_files}. Operation Cancelled."
148
+ raise ValueError(msg)
149
+
150
+ for path in files_matched_on_condition:
151
+ os.remove(path)
152
+
153
+ deleted_files=",,,".join( files_matched_on_condition)
154
+ log_info(f"Deleted {len(files_matched_on_condition)} files that matched condition: {deleted_files}", logger=logger, print_out=print_out)
155
+ response["matched_duplicates_deleted"] = deleted_files
156
+ response["duplication_handling_status"] = DuplicationHandlingStatus.OVERWRITTEN.value
157
+ # --- Increment Logic ---
158
+ elif duplication_handling==DuplicationHandling.INCREMENT:
159
+ increment = 0
160
+ base_file_name, ext = os.path.splitext(os.path.basename(full_file_path))
161
+ while os.path.exists(full_file_path):
162
+ increment += 1
163
+ file_name = f"{base_file_name}_v{increment}{ext}"
164
+ full_file_path = os.path.join(directory_path, file_name)
165
+ response["duplication_handling_status"] = DuplicationHandlingStatus.INCREMENTED.value
127
166
 
128
167
  # --- Save the File ---
129
168
  with open(full_file_path, "w", encoding="utf-8") as f:
130
169
  f.write(data_str)
131
- local_path = full_file_path
170
+ response["saved_to_file_path"] = full_file_path
171
+
132
172
 
133
173
  except Exception as e:
134
- local_save_error=f"Error saving file to local path: {full_file_path} : {type(e).__name__}-{str(e)}"
135
- log_error(local_save_error, logger=logger, print_out=print_out)
136
- return {"local_save_error" : msg}
137
-
138
- return {
139
- "local_path": local_path,
140
- "local_file_already_exists": local_file_already_exists,
141
- "local_file_overwritten": local_file_overwritten,
142
- "local_deleted_file_names": local_deleted_file_names,
143
- "local_file_saved_with_increment": local_file_saved_with_increment,
144
- "local_save_error": local_save_error,
145
- }
174
+ error_during_operation=f"Error occurred while writing JSON to file path: {full_file_path} : {type(e).__name__}-{str(e)}"
175
+ log_error(error_during_operation, logger=logger, print_out=print_out)
176
+ response["error_during_operation"] = error_during_operation
177
+ if raise_e:
178
+ raise e
179
+
180
+ return response # Return response once at the end
@@ -5,8 +5,8 @@
5
5
  # pylint: disable=broad-exception-caught
6
6
 
7
7
  import datetime
8
- from ipulse_shared_core_ftredge.enums.enums_logs import LogLevel
9
- from ipulse_shared_core_ftredge.utils.logs.context_log import ContextLog
8
+ from ipulse_shared_core_ftredge.enums import LogLevel
9
+ from ipulse_shared_core_ftredge.utils.logs import ContextLog
10
10
 
11
11
 
12
12
  def check_format_against_schema_template(data_to_check, schema, dt_ts_to_str=True, check_max_length=True):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ipulse_shared_core_ftredge
3
- Version: 2.6.1
3
+ Version: 2.7.1
4
4
  Summary: Shared Core models and Logger util for the Pulse platform project. Using AI for financial advisory and investment management.
5
5
  Home-page: https://github.com/TheFutureEdge/ipulse_shared_core
6
6
  Author: Russlan Ramdowar
@@ -0,0 +1,33 @@
1
+ ipulse_shared_core_ftredge/__init__.py,sha256=0tmR-zLphsZP6z3uQkF9uMVtry5gYPjiYYzddI_IznM,1222
2
+ ipulse_shared_core_ftredge/enums/__init__.py,sha256=NDv8Vy6_XXRjo0lpTA8SS00KAhb0OtQKJKAvrJhRoK8,1307
3
+ ipulse_shared_core_ftredge/enums/enums_common_utils.py,sha256=O-GE1177xD5tdo7qlKkq38ZoQmnc89uc90KWSDa0FhE,3626
4
+ ipulse_shared_core_ftredge/enums/enums_data_eng.py,sha256=LA4BNTReDXtmLBNQy1z0r4ECOI1LDk2i9MK4XX08ZuU,9960
5
+ ipulse_shared_core_ftredge/enums/enums_logging.py,sha256=N84hR427aJurD1P4XFS1BXuVY-M_rICFsZ03iXR88Zc,4775
6
+ ipulse_shared_core_ftredge/enums/enums_module_fincore.py,sha256=o0sCVjRxr1G_6ZVmvu64VOVIFCkzvJhBOTz8IilkA2s,1621
7
+ ipulse_shared_core_ftredge/enums/enums_modules.py,sha256=8dt6EVYpiyRJ8jaJxz9Wj7_H4ixeX1DK1j4Q0SBayL0,648
8
+ ipulse_shared_core_ftredge/enums/enums_solution_providers.py,sha256=pSmM0JtzR2n0FBJ5Unec0gWMD5zGo6fHwdcCnmGL1oE,497
9
+ ipulse_shared_core_ftredge/enums/pulse_enums.py,sha256=0RjIJbK0pt1Mzo4k_lhhxZL8myEUergQwOY9JOLZIJ4,4716
10
+ ipulse_shared_core_ftredge/models/__init__.py,sha256=MeGH2ZBxkrwldUiWyUaI_TMyfq78tuSwRkN_mEfKD8U,161
11
+ ipulse_shared_core_ftredge/models/organisation.py,sha256=22esRGYuJmKN3papkgozleEmDNJrVwUgIzKp7annvWs,3280
12
+ ipulse_shared_core_ftredge/models/resource_catalog_item.py,sha256=mEGX8AftzrhEHqFVXjr62CuRnXC1vK4z3bHl_XBJodU,4964
13
+ ipulse_shared_core_ftredge/models/user_auth.py,sha256=35HNN7ZW4ZELCqaJrAtoSsVLFAZ1KL2S_VmuzbcEMm4,119
14
+ ipulse_shared_core_ftredge/models/user_profile.py,sha256=D3BB9D6XEv7IVZgsURgf0hWmUZW5rms3uiBXS0ZGLeE,1927
15
+ ipulse_shared_core_ftredge/models/user_profile_update.py,sha256=oKK0XsQDKkgDvjFPhX2XlqEqlKLBQ4AkvPHXEuZbFMY,1712
16
+ ipulse_shared_core_ftredge/models/user_status.py,sha256=8TyRd8tBK9_xb0MPKbI5pn9-lX7ovKbeiuWYYPtIOiw,3202
17
+ ipulse_shared_core_ftredge/utils/__init__.py,sha256=yY4NX-W37xkTWeHOrR-Vni4FNCewaFJ7b9Beejyunyw,887
18
+ ipulse_shared_core_ftredge/utils/utils_cloud.py,sha256=LEsp0L1KfsNqp9nkqxi3TXSuZxXQQenIvagnlJWYytc,2993
19
+ ipulse_shared_core_ftredge/utils/utils_cloud_gcp.py,sha256=5A0qgzFQ2eMe_2uMX4Untxt0G49PX-g-o4XxKENpDQM,22156
20
+ ipulse_shared_core_ftredge/utils/utils_cloud_gcp_with_collectors.py,sha256=Y6_qbZdiVU4kFW3Zk2CjudCUlF1Xrp4m_sLqN7rWCAE,11500
21
+ ipulse_shared_core_ftredge/utils/utils_cloud_with_collectors.py,sha256=vDHt2FrSgj-qmt7Pip-lVbaov8tE3bfQVYKlZ3YcuUE,1612
22
+ ipulse_shared_core_ftredge/utils/utils_collector_pipelinemon.py,sha256=M4Qi1gDxtkPclya64K9JRKWcMhbpcer6LPxDzgpUd04,14995
23
+ ipulse_shared_core_ftredge/utils/utils_common.py,sha256=HTklVthhlMyewR5-qxo6HjMQRokXd-paruoKgENBEKc,8121
24
+ ipulse_shared_core_ftredge/utils/utils_templates_and_schemas.py,sha256=pn2m8IVVjCPKKb9E_SqpUekcwaxyqI3AYn7HjhcVVhM,7489
25
+ ipulse_shared_core_ftredge/utils/logs/__init__.py,sha256=fY6UNr197HYwUDi7uj5fsXw1Ma5gyAFzALxnoDSHFG0,71
26
+ ipulse_shared_core_ftredge/utils/logs/audit_log_firestore.py,sha256=5AwO6NHuOncq65n400eqM8QPrS2EGGaP3Z_6l2rxdBE,261
27
+ ipulse_shared_core_ftredge/utils/logs/context_log.py,sha256=AfDM_R4Xt0nueAMzkwLSPsembseXwSpvnGNv8tbqB1w,8615
28
+ ipulse_shared_core_ftredge/utils/logs/get_logger.py,sha256=u4FTEeNU320s-LJ7-gdhWafWIdWPZsSZl2ymQoc7D3Q,4534
29
+ ipulse_shared_core_ftredge-2.7.1.dist-info/LICENCE,sha256=YBtYAXNqCCOo9Mr2hfkbSPAM9CeAr2j1VZBSwQTrNwE,1060
30
+ ipulse_shared_core_ftredge-2.7.1.dist-info/METADATA,sha256=_pDlpIXITli6boHmvHKLXg4LvrSVBmphutZcAVKHkU4,556
31
+ ipulse_shared_core_ftredge-2.7.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
32
+ ipulse_shared_core_ftredge-2.7.1.dist-info/top_level.txt,sha256=8sgYrptpexkA_6_HyGvho26cVFH9kmtGvaK8tHbsGHk,27
33
+ ipulse_shared_core_ftredge-2.7.1.dist-info/RECORD,,
@@ -1,33 +0,0 @@
1
- ipulse_shared_core_ftredge/__init__.py,sha256=7yQzgsmIy7SlAwxTxUBIor_OuFfvoCMBBuonDXjMCC4,1188
2
- ipulse_shared_core_ftredge/enums/__init__.py,sha256=KWDgmon4URp9PpRw4HCwiviggWXzTo-icTuaOWKjrcI,1034
3
- ipulse_shared_core_ftredge/enums/enums_cloud.py,sha256=svlVyTwOr4C9XuMBSu3_B7nBEyJUT1rnEJaLvt53NjU,375
4
- ipulse_shared_core_ftredge/enums/enums_common_utils.py,sha256=AtLcAq5_NmVzCmX4WEYw6T0-O3UQQjdyu7XZUizC8Y8,3476
5
- ipulse_shared_core_ftredge/enums/enums_data_eng.py,sha256=U6SBw3CjoNt29bMOH-aw0yxmWldcwwouT1Hp9x1gSGI,4080
6
- ipulse_shared_core_ftredge/enums/enums_logs.py,sha256=WR6i9T7EmBAEN_Q4nXe435IHPxoAoPnbVm4joqLTwBs,3881
7
- ipulse_shared_core_ftredge/enums/enums_module_fincore.py,sha256=W1TkSLu3ryLf_aif2VcKsFznWz0igeMUR_buoGEG6w8,1406
8
- ipulse_shared_core_ftredge/enums/enums_modules.py,sha256=I-EfnpB7WMPXEQMK18vCO711uq84pt8b3ycSVB7oLcU,548
9
- ipulse_shared_core_ftredge/enums/pulse_enums.py,sha256=0RjIJbK0pt1Mzo4k_lhhxZL8myEUergQwOY9JOLZIJ4,4716
10
- ipulse_shared_core_ftredge/models/__init__.py,sha256=MeGH2ZBxkrwldUiWyUaI_TMyfq78tuSwRkN_mEfKD8U,161
11
- ipulse_shared_core_ftredge/models/organisation.py,sha256=22esRGYuJmKN3papkgozleEmDNJrVwUgIzKp7annvWs,3280
12
- ipulse_shared_core_ftredge/models/resource_catalog_item.py,sha256=mEGX8AftzrhEHqFVXjr62CuRnXC1vK4z3bHl_XBJodU,4964
13
- ipulse_shared_core_ftredge/models/user_auth.py,sha256=35HNN7ZW4ZELCqaJrAtoSsVLFAZ1KL2S_VmuzbcEMm4,119
14
- ipulse_shared_core_ftredge/models/user_profile.py,sha256=D3BB9D6XEv7IVZgsURgf0hWmUZW5rms3uiBXS0ZGLeE,1927
15
- ipulse_shared_core_ftredge/models/user_profile_update.py,sha256=oKK0XsQDKkgDvjFPhX2XlqEqlKLBQ4AkvPHXEuZbFMY,1712
16
- ipulse_shared_core_ftredge/models/user_status.py,sha256=8TyRd8tBK9_xb0MPKbI5pn9-lX7ovKbeiuWYYPtIOiw,3202
17
- ipulse_shared_core_ftredge/utils/__init__.py,sha256=hGi4WtdFSUxI_LQBsRUADS2-FmNifM9BSMTH9KhEmpg,851
18
- ipulse_shared_core_ftredge/utils/utils_cloud.py,sha256=eWMwr1ZBbUy3TdUSnO2-MGiUeq5RIoG1p_jZJ3f6LOw,2386
19
- ipulse_shared_core_ftredge/utils/utils_cloud_gcp.py,sha256=8HvizgqXaRjLCvIfsxtfC6SnO7KY7ONScB0_1FqumbE,14162
20
- ipulse_shared_core_ftredge/utils/utils_cloud_gcp_with_collectors.py,sha256=hiesZhK-UMHMAy9QZZXAHKItLY30EqS-RDeUdEz-uaY,11251
21
- ipulse_shared_core_ftredge/utils/utils_cloud_with_collectors.py,sha256=5siDvpgHJxfdykS1bjPS5sqtn5SYYPLV4ZYSoniSd0E,1678
22
- ipulse_shared_core_ftredge/utils/utils_collector_pipelinemon.py,sha256=QTZA0UIXAbYEuwUuYrP4QfELAFEg36ef1iJbAad1nxM,15017
23
- ipulse_shared_core_ftredge/utils/utils_common.py,sha256=n9TgX1RNVWlXA5AJjtkvVQqL_B2tr0NOZgPLKivyUZ4,6044
24
- ipulse_shared_core_ftredge/utils/utils_templates_and_schemas.py,sha256=6mtuaGui5y8ECA87eCiaptUi6o-7m_vqaqni7mIxIQU,7512
25
- ipulse_shared_core_ftredge/utils/logs/__init__.py,sha256=fY6UNr197HYwUDi7uj5fsXw1Ma5gyAFzALxnoDSHFG0,71
26
- ipulse_shared_core_ftredge/utils/logs/audit_log_firestore.py,sha256=5AwO6NHuOncq65n400eqM8QPrS2EGGaP3Z_6l2rxdBE,261
27
- ipulse_shared_core_ftredge/utils/logs/context_log.py,sha256=nsUfVmC_DP5QjQuSlBRalqpaaktxedwmx834h4_ZhYA,8673
28
- ipulse_shared_core_ftredge/utils/logs/get_logger.py,sha256=RPSdqT1O8MbfwAqdIdH8P9fOn39AmDLW8N7sCU2EAbM,3255
29
- ipulse_shared_core_ftredge-2.6.1.dist-info/LICENCE,sha256=YBtYAXNqCCOo9Mr2hfkbSPAM9CeAr2j1VZBSwQTrNwE,1060
30
- ipulse_shared_core_ftredge-2.6.1.dist-info/METADATA,sha256=C6xUGmUY19PDLy0o8nz8pfQ5DCGTQ-1fxrqjYvt3aNU,556
31
- ipulse_shared_core_ftredge-2.6.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
32
- ipulse_shared_core_ftredge-2.6.1.dist-info/top_level.txt,sha256=8sgYrptpexkA_6_HyGvho26cVFH9kmtGvaK8tHbsGHk,27
33
- ipulse_shared_core_ftredge-2.6.1.dist-info/RECORD,,