atomicshop 2.10.3__py3-none-any.whl → 2.10.5__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 atomicshop might be problematic. Click here for more details.

atomicshop/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """Atomic Basic functions and classes to make developer life easier"""
2
2
 
3
3
  __author__ = "Den Kras"
4
- __version__ = '2.10.3'
4
+ __version__ = '2.10.5'
@@ -1,4 +1,5 @@
1
1
  import multiprocessing
2
+ import multiprocessing.managers
2
3
  import queue
3
4
  import concurrent.futures
4
5
  from concurrent.futures import ProcessPoolExecutor, as_completed
@@ -42,10 +43,11 @@ class MultiProcessorRecursive:
42
43
  max_workers: int = None,
43
44
  cpu_percent_max: int = 80,
44
45
  memory_percent_max: int = 80,
45
- wait_time: float = 5
46
+ wait_time: float = 5,
47
+ system_monitor_manager_dict: multiprocessing.managers.DictProxy = None
46
48
  ):
47
49
  """
48
- MultiProcessor class. Used to execute functions in parallel. The result of each execution is feeded back
50
+ MultiProcessor class. Used to execute functions in parallel. The result of each execution is fed back
49
51
  to the provided function. Making it sort of recursive execution.
50
52
  :param process_function: function, function to execute on the input list.
51
53
  :param input_list: list, list of inputs to process.
@@ -56,6 +58,12 @@ class MultiProcessorRecursive:
56
58
  :param memory_percent_max: integer, maximum memory percentage. Above that usage, we will wait, before starting
57
59
  new execution.
58
60
  :param wait_time: float, time to wait if the CPU or memory usage is above the maximum percentage.
61
+ :param system_monitor_manager_dict: multiprocessing.managers.DictProxy, shared manager dict for
62
+ system monitoring. The object is the output of atomicshop.system_resource_monitor.
63
+ If you are already running this monitor, you can pass the manager_dict to both the system monitor and this
64
+ class to share the system resources data.
65
+ If this is used, the system resources will be checked before starting each new execution from this
66
+ shared dict instead of performing new checks.
59
67
 
60
68
  Usage:
61
69
  def unpack_file(file_path):
@@ -87,6 +95,7 @@ class MultiProcessorRecursive:
87
95
  self.cpu_percent_max: int = cpu_percent_max
88
96
  self.memory_percent_max: int = memory_percent_max
89
97
  self.wait_time: float = wait_time
98
+ self.system_monitor_manager_dict: multiprocessing.managers.DictProxy = system_monitor_manager_dict
90
99
 
91
100
  def run_process(self):
92
101
  with multiprocessing.Pool(processes=self.max_workers) as pool:
@@ -100,7 +109,8 @@ class MultiProcessorRecursive:
100
109
  system_resources.wait_for_resource_availability(
101
110
  cpu_percent_max=self.cpu_percent_max,
102
111
  memory_percent_max=self.memory_percent_max,
103
- wait_time=self.wait_time)
112
+ wait_time=self.wait_time,
113
+ system_monitor_manager_dict=self.system_monitor_manager_dict)
104
114
 
105
115
  # Process the item
106
116
  async_result = pool.apply_async(self.process_function, (item,))
@@ -23,14 +23,19 @@ def find_highest_number(numbers: list[float, int, str]):
23
23
  return max(numbers)
24
24
 
25
25
 
26
- def convert_bytes_to_readable(byte_size: Union[int, float]):
26
+ def convert_bytes_to_readable(
27
+ byte_size: Union[int, float],
28
+ return_formatted_string=False
29
+ ) -> Union[tuple[Union[int, float], str], str]:
27
30
  """
28
31
  Convert bytes to a more readable format (KB, MB, GB, etc.) with two numbers after the decimal point.
29
32
 
30
33
  :param byte_size: Size in bytes
31
34
  :type byte_size: int or float
32
- :return: A string representing the size in a readable format
33
- :rtype: str
35
+ :param return_formatted_string: If True, return the formatted string,
36
+ otherwise return the size and suffix separately in a tuple.
37
+ :type return_formatted_string: bool
38
+ :return: tuple of integer or float and suffix string - representing the size in a readable format
34
39
  """
35
40
  # Define the suffixes for each unit of measurement
36
41
  suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
@@ -44,5 +49,8 @@ def convert_bytes_to_readable(byte_size: Union[int, float]):
44
49
  i += 1
45
50
 
46
51
  # Format the result to include two digits after the decimal point
47
- readable_format = "{:.2f} {}".format(byte_size, suffixes[i])
48
- return readable_format
52
+ if return_formatted_string:
53
+ readable_format: str = "{:.2f} {}".format(byte_size, suffixes[i])
54
+ return readable_format
55
+ else:
56
+ return byte_size, suffixes[i]
@@ -1,6 +1,5 @@
1
1
  from typing import Union
2
2
  import threading
3
- import multiprocessing
4
3
  import multiprocessing.managers
5
4
 
6
5
  from .print_api import print_api
@@ -22,7 +21,7 @@ class SystemResourceMonitor:
22
21
  get_disk_used_percent: bool = True,
23
22
  calculate_maximum_changed_disk_io: bool = False,
24
23
  queue_list: list = None,
25
- manager_dict = None # multiprocessing.Manager().dict()
24
+ manager_dict=None # multiprocessing.Manager().dict()
26
25
  ):
27
26
  """
28
27
  Initialize the system resource monitor.
@@ -97,7 +96,7 @@ class SystemResourceMonitor:
97
96
  self.get_disk_used_percent: bool = get_disk_used_percent
98
97
  self.calculate_maximum_changed_disk_io: bool = calculate_maximum_changed_disk_io
99
98
  self.queue_list: list = queue_list
100
- self.manager_dict: multiprocessing.Manager().dict = manager_dict
99
+ self.manager_dict = manager_dict # multiprocessing.Manager().dict()
101
100
 
102
101
  self.maximum_disk_io: dict = {
103
102
  'read_bytes_per_sec': 0,
@@ -3,6 +3,7 @@ import time
3
3
  import tempfile
4
4
  import shutil
5
5
  import threading
6
+ import multiprocessing.managers
6
7
 
7
8
  from .print_api import print_api
8
9
  from .wrappers.psutilw import cpus, memories, disks
@@ -93,18 +94,33 @@ def check_system_resources(
93
94
  return result
94
95
 
95
96
 
96
- def wait_for_resource_availability(cpu_percent_max: int = 80, memory_percent_max: int = 80, wait_time: float = 5):
97
+ def wait_for_resource_availability(
98
+ cpu_percent_max: int = 80,
99
+ memory_percent_max: int = 80,
100
+ wait_time: float = 5,
101
+ system_monitor_manager_dict: multiprocessing.managers.DictProxy = None
102
+ ):
97
103
  """
98
104
  Wait for system resources to be available.
99
105
  :param cpu_percent_max: int, maximum CPU percentage. Above that usage, we will wait.
100
106
  :param memory_percent_max: int, maximum memory percentage. Above that usage, we will wait.
101
107
  :param wait_time: float, time to wait between checks.
108
+ :param system_monitor_manager_dict: multiprocessing.managers.DictProxy, shared manager dict for
109
+ system monitoring. The object is the output of atomicshop.system_resource_monitor.
110
+ If you are already running this monitor, you can pass the manager_dict to both the system monitor and this
111
+ class to share the system resources data.
112
+ If this is used, the system resources will be checked before starting each new execution from this
113
+ shared dict instead of performing new checks.
102
114
  :return: None
103
115
  """
104
116
  while True:
105
- result = check_system_resources(
106
- get_cpu=True, get_memory=True,
107
- get_disk_io_bytes=False, get_disk_files_count=False, get_disk_busy_time=False, get_disk_used_percent=False)
117
+ if system_monitor_manager_dict:
118
+ result = system_monitor_manager_dict
119
+ else:
120
+ result = check_system_resources(
121
+ get_cpu=True, get_memory=True,
122
+ get_disk_io_bytes=False, get_disk_files_count=False, get_disk_busy_time=False, get_disk_used_percent=False)
123
+
108
124
  if result['cpu_usage'] < cpu_percent_max and result['memory_usage'] < memory_percent_max:
109
125
  break
110
126
  print_api(
@@ -1,6 +1,7 @@
1
1
  DEFAULT_ELASTIC_PORT: str = '9200'
2
2
  DEFAULT_ELASTIC_HOST: str = 'localhost'
3
3
  DEFAULT_ELASTIC_URL: str = f"http://{DEFAULT_ELASTIC_HOST}:{DEFAULT_ELASTIC_PORT}"
4
+ DEFAULT_ELASTIC_URL_JVM_OPTIONS: str = f"{DEFAULT_ELASTIC_URL}/_nodes?filter_path=**.jvm&pretty"
4
5
 
5
6
  DEFAULT_KIBANA_PORT: str = '5601'
6
7
  DEFAULT_KIBANA_HOST: str = 'localhost'
@@ -12,7 +13,7 @@ ELASTIC_CONFIG_FILE: str = f"{ELASTIC_SEARCH_CONFIG_DIRECTORY}/elasticsearch.yml
12
13
  XPACK_SECURITY_SETTING_NAME: str = "xpack.security.enabled"
13
14
 
14
15
  ELASTIC_JVM_OPTIONS_DIRECTORY: str = f"{ELASTIC_SEARCH_CONFIG_DIRECTORY}/jvm.options.d"
15
- ELASTIC_JVM_OPTIONS_CUSTOM_FILE: str = f"{ELASTIC_JVM_OPTIONS_DIRECTORY}/custom.options"
16
+ ELASTIC_JVM_OPTIONS_4GB_CUSTOM_FILE: str = f"{ELASTIC_JVM_OPTIONS_DIRECTORY}/4gb_memory_heap.options"
16
17
  ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE: list[str] = ['-Xms4g', '-Xmx4g']
17
18
 
18
19
  UBUNTU_DEPENDENCY_PACKAGES: list[str] = ['apt-transport-https', 'openjdk-11-jdk', 'wget']
@@ -170,29 +170,35 @@ def modify_xpack_security_setting(
170
170
  print_api(f"The setting is already set to [{setting}].")
171
171
 
172
172
 
173
- def create_jvm_options_custom_file(file_path: str = None, options: list = None):
173
+ def create_jvm_options_custom_file(file_path: str, options: list):
174
174
  """
175
175
  The function creates a custom JVM options file for Elasticsearch.
176
- The default file path is 'config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE'.
177
- The default options are 'config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE'.
178
- The 4GB memory usage options are needed for the Elasticsearch to work properly and not to crash.
176
+ You can use the default directory path as 'config_basic.ELASTIC_JVM_OPTIONS_DIRECTORY'.
179
177
  :param file_path: str, the path to the custom JVM options file.
180
178
  :param options: list, the list of JVM options.
181
179
  :return:
182
180
  """
183
181
 
184
- if not file_path:
185
- file_path = config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE
186
-
187
- if not options:
188
- options = config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE
189
-
190
182
  # Write the options to the file.
191
183
  with open(file_path, 'w') as file:
192
184
  for option in options:
193
185
  file.write(f"{option}\n")
194
186
 
195
187
 
188
+ def create_jvm_options_custom_4gb_memory_heap_file(file_path: str = None):
189
+ """
190
+ The function creates a custom JVM options file with 4GB memory heap usage.
191
+ The 4GB memory usage options are needed for the Elasticsearch to work properly and not to crash.
192
+ :param file_path: str, the path to the custom JVM options file.
193
+ :return:
194
+ """
195
+
196
+ if not file_path:
197
+ file_path = config_basic.ELASTIC_JVM_OPTIONS_4GB_CUSTOM_FILE
198
+
199
+ create_jvm_options_custom_file(file_path, config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE)
200
+
201
+
196
202
  def is_server_available(
197
203
  max_attempts: int = 5,
198
204
  wait_between_attempts_seconds: float = 10,
@@ -234,3 +240,25 @@ def is_server_available(
234
240
 
235
241
  print_api("Elasticsearch did not start within the expected time.", color='red', **print_kwargs)
236
242
  return False
243
+
244
+
245
+ def is_4gb_memory_heap_options_applied_on_server() -> bool:
246
+ """
247
+ The function checks if the 4GB memory heap options are applied on the Elasticsearch server.
248
+ :return: bool.
249
+ """
250
+
251
+ # Send a GET request
252
+ response = requests.get(config_basic.DEFAULT_ELASTIC_URL_JVM_OPTIONS)
253
+ response.raise_for_status() # Raise an exception for HTTP errors
254
+
255
+ # Load JSON data from the response
256
+ jvm_data = response.json()
257
+
258
+ # Check if memory heap options are applied in 'input_arguments' key.
259
+ for node in jvm_data['nodes'].values():
260
+ # Get the JVM input arguments values.
261
+ input_arguments = node['jvm']['input_arguments']
262
+
263
+ # Check that the 4GB memory heap options are applied.
264
+ return all(options in input_arguments for options in config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE)
@@ -216,10 +216,7 @@ def install_elastic_kibana_ubuntu(install_elastic: bool = True, install_kibana:
216
216
  infrastructure.start_elastic_and_check_service_availability()
217
217
 
218
218
  print_api("Creating custom JVM options file with 4GB memory usage.")
219
- infrastructure.create_jvm_options_custom_file(
220
- file_path=config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE,
221
- options=config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE
222
- )
219
+ infrastructure.create_jvm_options_custom_4gb_memory_heap_file()
223
220
 
224
221
  if install_kibana:
225
222
  # Install Kibana.
@@ -68,7 +68,7 @@ def install_before_restart(
68
68
  archive_path=fact_source_archive_path, extract_directory=installation_directory,
69
69
  remove_first_directory=True, **(print_kwargs or {}))
70
70
 
71
- # Set the executable permission on the pre-install file.
71
+ # Set the executable permission on the pre-installation file.
72
72
  permissions.set_executable_permission(fact_core_pre_install_file_path)
73
73
 
74
74
  # Run the shell script
@@ -1,5 +1,7 @@
1
1
  import psutil
2
2
 
3
+ from ...basics import numbers
4
+
3
5
 
4
6
  def get_memory_usage():
5
7
  """
@@ -7,3 +9,17 @@ def get_memory_usage():
7
9
  :return: float
8
10
  """
9
11
  return psutil.virtual_memory().percent
12
+
13
+
14
+ def get_total_ram(convert_size_to_readable=False) -> tuple[int, str]:
15
+ """
16
+ Get total physical memory in bytes.
17
+ :return:
18
+ """
19
+
20
+ memory_size: int = psutil.virtual_memory().total
21
+
22
+ if convert_size_to_readable:
23
+ return numbers.convert_bytes_to_readable(memory_size)
24
+
25
+ return memory_size, 'B'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: atomicshop
3
- Version: 2.10.3
3
+ Version: 2.10.5
4
4
  Summary: Atomic functions and classes to make developer life easier
5
5
  Author: Denis Kras
6
6
  License: MIT License
@@ -1,4 +1,4 @@
1
- atomicshop/__init__.py,sha256=CAdy7uaKf071UFjU2KsMKAsd6EzULOhS7j2IOVneT_A,123
1
+ atomicshop/__init__.py,sha256=fQnAhsrGKmKYe0fp_81c4goU6Nzou40Ap0w1uxsS2jc,123
2
2
  atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
3
3
  atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
4
4
  atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
@@ -37,8 +37,8 @@ atomicshop/sound.py,sha256=KSzWRF8dkpEVXmFidIv-Eftc3kET-hQzQOxZRE7rMto,24297
37
37
  atomicshop/speech_recognize.py,sha256=55-dIjgkpF93mvJnJuxSFuft5H5eRvGNlUj9BeIOZxk,5903
38
38
  atomicshop/ssh_remote.py,sha256=Sas3nrQv8ardxR51t59xZZsYm8nvUcA7tMSqEDViRLk,17155
39
39
  atomicshop/sys_functions.py,sha256=MTBxRve5bh58SPvhX3gMiGqHlSBuI_rdNN1NnnBBWqI,906
40
- atomicshop/system_resource_monitor.py,sha256=4AqeJbfYcVrNENjEJDrFQ5jIdu--yCir8CZuPBerp9o,13697
41
- atomicshop/system_resources.py,sha256=fl8yfG1CrcsXsFzVPiTEZ82MEjcyCPj4TevKczHEKTE,8310
40
+ atomicshop/system_resource_monitor.py,sha256=ilA3wEUJfBjQhRsHDXGH7Q05mYr5KarPjRWP8S6pCTw,13681
41
+ atomicshop/system_resources.py,sha256=mcgkULCkrfMM1cu7F1fyDQQja2pJpC_pcPpwxjr_ULg,9097
42
42
  atomicshop/tempfiles.py,sha256=uq1ve2WlWehZ3NOTXJnpBBMt6HyCdBufqedF0HyzA6k,2517
43
43
  atomicshop/timer.py,sha256=KxBBgVM8po6pUJDW8TgY1UXj0iiDmRmL5XDCq0VHAfU,1670
44
44
  atomicshop/urls.py,sha256=CQl1j1kjEVDlAuYJqYD9XxPF1SUSgrmG8PjlcXNEKsQ,597
@@ -87,8 +87,8 @@ atomicshop/basics/if_else.py,sha256=MakivJChofZCpr0mOVjwCthzpiaBxXVB-zv7GwMOqVo,
87
87
  atomicshop/basics/isinstancing.py,sha256=fQ35xfqbguQz2BUn-3a4KVGskhTcIn8JjRtxV2rFcRQ,876
88
88
  atomicshop/basics/list_of_dicts.py,sha256=EeUh5FwUSmjQ7_Df7yTBgwHsou5jx3tP2a0dzgs8-fk,5773
89
89
  atomicshop/basics/lists.py,sha256=pLpYPSu0BjJIAe_Ar55XhLsH2YBhftn7b-tTAdkK1sw,3928
90
- atomicshop/basics/multiprocesses.py,sha256=AczaI4TmYduNjE6_VEQhxvDQn4VLDdXYRxhPDpjH4T0,17974
91
- atomicshop/basics/numbers.py,sha256=j0f4glCtyIypEdCKv145F1gkzEEoZ2GdsGO-OM4BN7o,1439
90
+ atomicshop/basics/multiprocesses.py,sha256=nSskxJSlEdalPM_Uf8cc9kAYYlVwYM1GonBLAhCL2mM,18831
91
+ atomicshop/basics/numbers.py,sha256=ESX0z_7o_ok3sOmCKAUBoZinATklgMy2v-4RndqXlVM,1837
92
92
  atomicshop/basics/randoms.py,sha256=DmYLtnIhDK29tAQrGP1Nt-A-v8WC7WIEB8Edi-nk3N4,282
93
93
  atomicshop/basics/strings.py,sha256=aQ92AJPvb3U0O6n2FMqRUqEsPCiklwGX--jPmB9M0_s,15418
94
94
  atomicshop/basics/threads.py,sha256=xvgdDJdmgN0wmmARoZ-H7Kvl1GOcEbvgaeGL4M3Hcx8,2819
@@ -157,10 +157,10 @@ atomicshop/wrappers/dockerw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
157
157
  atomicshop/wrappers/dockerw/dockerw.py,sha256=w8zSJr5C7cbvbuG09ORCpAe0BOcibqqL_Z2EKEBHYK4,6266
158
158
  atomicshop/wrappers/dockerw/install_docker.py,sha256=eF0raR1EO9Xk1MVH7CvtkFI2Fgu9zL12MIYV_1vPTQk,4799
159
159
  atomicshop/wrappers/elasticsearchw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
- atomicshop/wrappers/elasticsearchw/config_basic.py,sha256=q9Ybr8TTeNPy6FxtiYCln8WNuwOQjdPazTRoGl7Lk8w,1066
160
+ atomicshop/wrappers/elasticsearchw/config_basic.py,sha256=fDujtrjEjbWiYh_WQ3OcYp_8mXhXPYeKLy4wSPL5qM0,1177
161
161
  atomicshop/wrappers/elasticsearchw/elasticsearchw.py,sha256=7TqFdEFznO8NlligJhEKk1vm641ALpCYdaRl1uoXdzM,9768
162
- atomicshop/wrappers/elasticsearchw/infrastructure.py,sha256=Sy15gLVe_LAk9WpAoFxu5YApecFlYeJzzJ8lk5NYQEw,9217
163
- atomicshop/wrappers/elasticsearchw/install_elastic.py,sha256=5CNgIoPIDnTCk5kU7Zcyb48TP4JScvUzeZmhcWt63sI,8754
162
+ atomicshop/wrappers/elasticsearchw/infrastructure.py,sha256=aQZpPNN6mcBR5K5iOX-pLV3GJJhmkj5IqbTwkzKKSYE,10261
163
+ atomicshop/wrappers/elasticsearchw/install_elastic.py,sha256=IhbapWeq5am-MtmnvKBNBPzvaL338rvfG0rbSpl8azE,8620
164
164
  atomicshop/wrappers/elasticsearchw/queries/__init__.py,sha256=KBjT-bAt75CJsx1Apko9mpuFU4pfZV8DcGWQvpX65RU,78
165
165
  atomicshop/wrappers/elasticsearchw/queries/aggregation.py,sha256=N9a5yMMnb10sMa_x1qJBFQpgyJ49UWo8_vxuqmUtZ1A,1742
166
166
  atomicshop/wrappers/elasticsearchw/queries/info.py,sha256=P_VhhBo8MvRI4Shi-bh4RsYtlYNRKRBzScXPC64Up_Q,2900
@@ -178,7 +178,7 @@ atomicshop/wrappers/factw/fact_extractor/docker_image.py,sha256=jJAoJNQ4aoATjn3x
178
178
  atomicshop/wrappers/factw/fact_extractor/get_extractor.py,sha256=2mfOAftHIlCcGt1s7MWdq7DsDCuI6wX3MtvcEZ4SK-0,756
179
179
  atomicshop/wrappers/factw/install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
180
  atomicshop/wrappers/factw/install/install_after_restart.py,sha256=roM1W2hkDynpEKda55xd7AsZxodsFj8i4wmFGt_HHzA,1558
181
- atomicshop/wrappers/factw/install/pre_install_and_install_before_restart.py,sha256=fAH53sJgWoXOOhjeAmME2SHYm-5YQAgEi1neaok82Lk,4246
181
+ atomicshop/wrappers/factw/install/pre_install_and_install_before_restart.py,sha256=7Yk1xZXFXoPZVsSvgZzOLMoZza9OFIB5HplLQxY-7Bs,4251
182
182
  atomicshop/wrappers/factw/postgresql/__init__.py,sha256=xMBn2d3Exo23IPP2F_9-SXmOlhFbwWDgS9KwozSTjA0,162
183
183
  atomicshop/wrappers/factw/postgresql/analysis.py,sha256=2Rxzy2jyq3zEKIo53z8VkjuslKE_i5mq2ZpmJAvyd6U,716
184
184
  atomicshop/wrappers/factw/postgresql/file_object.py,sha256=VRiCXnsd6yDbnsE-TEKYPC-gkAgFVkE6rygRrJLQShI,713
@@ -213,7 +213,7 @@ atomicshop/wrappers/playwrightw/scenarios.py,sha256=Wz7aVYfG7K4fuSe_TUAc1jhFXVq5
213
213
  atomicshop/wrappers/playwrightw/waits.py,sha256=308fdOu6YDqQ7K7xywj7R27sSmFanPBQqpZyBC-NFmo,7015
214
214
  atomicshop/wrappers/psutilw/cpus.py,sha256=w6LPBMINqS-T_X8vzdYkLS2Wzuve28Ydp_GafTCngrc,236
215
215
  atomicshop/wrappers/psutilw/disks.py,sha256=3ZSVoommKH1TWo37j_83frB-NqXF4Nf5q5mBCX8G4jE,9221
216
- atomicshop/wrappers/psutilw/memories.py,sha256=wpdKEkQ9Wty_r7ZJKkfli7wIHMXdQOMlmDlzmc_0FWo,161
216
+ atomicshop/wrappers/psutilw/memories.py,sha256=_S0aL8iaoIHebd1vOFrY_T9aROM5Jx2D5CvDh_4j0Vc,528
217
217
  atomicshop/wrappers/psutilw/psutilw.py,sha256=G22ZQfGnqX15-feD8KUXfEZO4pFkIEnB8zgPzJ2jc7M,20868
218
218
  atomicshop/wrappers/psycopgw/psycopgw.py,sha256=XJvVf0oAUjCHkrYfKeFuGCpfn0Oxj3u4SbKMKA1508E,7118
219
219
  atomicshop/wrappers/pywin32w/wmi_win32process.py,sha256=qMzXtJ5hBZ5ydAyqpDbSx0nO2RJQL95HdmV5SzNKMhk,6826
@@ -233,8 +233,8 @@ atomicshop/wrappers/socketw/socket_server_tester.py,sha256=AhpurHJmP2kgzHaUbq5ey
233
233
  atomicshop/wrappers/socketw/socket_wrapper.py,sha256=aXBwlEIJhFT0-c4i8iNlFx2It9VpCEpsv--5Oqcpxao,11624
234
234
  atomicshop/wrappers/socketw/ssl_base.py,sha256=k4V3gwkbq10MvOH4btU4onLX2GNOsSfUAdcHmL1rpVE,2274
235
235
  atomicshop/wrappers/socketw/statistics_csv.py,sha256=t3dtDEfN47CfYVi0CW6Kc2QHTEeZVyYhc57IYYh5nmA,826
236
- atomicshop-2.10.3.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
237
- atomicshop-2.10.3.dist-info/METADATA,sha256=Y3tx3_gaPuodTn3bxopQR6X7_AYeMMMcv6Fjtv4dLJA,10423
238
- atomicshop-2.10.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
239
- atomicshop-2.10.3.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
240
- atomicshop-2.10.3.dist-info/RECORD,,
236
+ atomicshop-2.10.5.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
237
+ atomicshop-2.10.5.dist-info/METADATA,sha256=EYaFqDb87S7rakgkJ6Yj8B5Pqt7OtVodfUEOeZvXDew,10423
238
+ atomicshop-2.10.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
239
+ atomicshop-2.10.5.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
240
+ atomicshop-2.10.5.dist-info/RECORD,,