bear-utils 0.7.21__py3-none-any.whl → 0.7.22__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.
Files changed (79) hide show
  1. bear_utils/__init__.py +24 -1
  2. bear_utils/ai/__init__.py +5 -5
  3. bear_utils/ai/ai_helpers/__init__.py +24 -18
  4. bear_utils/ai/ai_helpers/_parsers.py +27 -21
  5. bear_utils/ai/ai_helpers/_types.py +2 -7
  6. bear_utils/cache/__init__.py +35 -23
  7. bear_utils/cli/__init__.py +13 -0
  8. bear_utils/cli/commands.py +14 -8
  9. bear_utils/cli/prompt_helpers.py +40 -34
  10. bear_utils/cli/shell/__init__.py +1 -0
  11. bear_utils/cli/shell/_base_command.py +17 -18
  12. bear_utils/cli/shell/_base_shell.py +37 -34
  13. bear_utils/config/__init__.py +4 -2
  14. bear_utils/config/config_manager.py +193 -56
  15. bear_utils/config/dir_manager.py +8 -3
  16. bear_utils/config/settings_manager.py +94 -171
  17. bear_utils/constants/__init__.py +2 -1
  18. bear_utils/constants/_exceptions.py +6 -1
  19. bear_utils/constants/date_related.py +2 -0
  20. bear_utils/constants/logger_protocol.py +28 -0
  21. bear_utils/constants/time_related.py +2 -0
  22. bear_utils/database/__init__.py +2 -0
  23. bear_utils/database/_db_manager.py +10 -11
  24. bear_utils/events/__init__.py +3 -1
  25. bear_utils/events/events_class.py +11 -11
  26. bear_utils/events/events_module.py +17 -8
  27. bear_utils/extras/__init__.py +8 -6
  28. bear_utils/extras/_async_helpers.py +2 -3
  29. bear_utils/extras/_tools.py +54 -52
  30. bear_utils/extras/platform_utils.py +5 -1
  31. bear_utils/extras/responses/__init__.py +1 -0
  32. bear_utils/extras/responses/function_response.py +301 -0
  33. bear_utils/extras/wrappers/__init__.py +1 -0
  34. bear_utils/extras/wrappers/add_methods.py +17 -15
  35. bear_utils/files/__init__.py +3 -1
  36. bear_utils/files/file_handlers/__init__.py +2 -0
  37. bear_utils/files/file_handlers/_base_file_handler.py +23 -3
  38. bear_utils/files/file_handlers/file_handler_factory.py +38 -38
  39. bear_utils/files/file_handlers/json_file_handler.py +49 -22
  40. bear_utils/files/file_handlers/log_file_handler.py +19 -12
  41. bear_utils/files/file_handlers/toml_file_handler.py +13 -5
  42. bear_utils/files/file_handlers/txt_file_handler.py +56 -14
  43. bear_utils/files/file_handlers/yaml_file_handler.py +19 -13
  44. bear_utils/files/ignore_parser.py +52 -57
  45. bear_utils/graphics/__init__.py +3 -1
  46. bear_utils/graphics/bear_gradient.py +17 -12
  47. bear_utils/graphics/image_helpers.py +11 -5
  48. bear_utils/gui/__init__.py +3 -1
  49. bear_utils/gui/gui_tools/__init__.py +3 -1
  50. bear_utils/gui/gui_tools/_settings.py +0 -1
  51. bear_utils/gui/gui_tools/qt_app.py +16 -11
  52. bear_utils/gui/gui_tools/qt_color_picker.py +24 -13
  53. bear_utils/gui/gui_tools/qt_file_handler.py +30 -38
  54. bear_utils/gui/gui_tools/qt_input_dialog.py +11 -14
  55. bear_utils/logging/__init__.py +6 -4
  56. bear_utils/logging/logger_manager/__init__.py +1 -0
  57. bear_utils/logging/logger_manager/_common.py +0 -1
  58. bear_utils/logging/logger_manager/_console_junk.py +15 -11
  59. bear_utils/logging/logger_manager/_styles.py +1 -2
  60. bear_utils/logging/logger_manager/loggers/__init__.py +1 -0
  61. bear_utils/logging/logger_manager/loggers/_base_logger.py +33 -33
  62. bear_utils/logging/logger_manager/loggers/_base_logger.pyi +6 -5
  63. bear_utils/logging/logger_manager/loggers/_buffer_logger.py +2 -3
  64. bear_utils/logging/logger_manager/loggers/_console_logger.py +54 -26
  65. bear_utils/logging/logger_manager/loggers/_console_logger.pyi +7 -21
  66. bear_utils/logging/logger_manager/loggers/_file_logger.py +20 -13
  67. bear_utils/logging/logger_manager/loggers/_level_sin.py +15 -15
  68. bear_utils/logging/logger_manager/loggers/_logger.py +4 -6
  69. bear_utils/logging/logger_manager/loggers/_sub_logger.py +16 -23
  70. bear_utils/logging/logger_manager/loggers/_sub_logger.pyi +4 -19
  71. bear_utils/logging/loggers.py +9 -13
  72. bear_utils/monitoring/__init__.py +7 -4
  73. bear_utils/monitoring/_common.py +28 -0
  74. bear_utils/monitoring/host_monitor.py +44 -48
  75. bear_utils/time/__init__.py +13 -6
  76. {bear_utils-0.7.21.dist-info → bear_utils-0.7.22.dist-info}/METADATA +50 -6
  77. bear_utils-0.7.22.dist-info/RECORD +83 -0
  78. bear_utils-0.7.21.dist-info/RECORD +0 -79
  79. {bear_utils-0.7.21.dist-info → bear_utils-0.7.22.dist-info}/WHEEL +0 -0
@@ -1,42 +1,30 @@
1
+ """Host Monitor Module."""
2
+
1
3
  import asyncio
2
- import subprocess
3
4
  from asyncio import Task
4
5
  from collections import deque
5
6
  from collections.abc import Awaitable, Callable
7
+ from contextlib import suppress
6
8
  from dataclasses import dataclass
7
- from enum import StrEnum
8
- from typing import Literal, Self, TypedDict, cast, overload
9
+ import subprocess
10
+ from typing import TYPE_CHECKING, Literal, Self, TypedDict, cast, overload
9
11
 
10
- from ..logging.loggers import BaseLogger, SubConsoleLogger, get_console
12
+ from bear_utils.logging.loggers import get_console
13
+ from bear_utils.monitoring._common import CPU, CPU_MEM, DISK, GPU, MEM, TaskChoice
11
14
 
12
15
  ROLLING_AVERAGE_TIME = 300
13
16
 
14
- _base_logger, console = get_console("HostMonitor")
15
-
16
-
17
- class TaskChoice(StrEnum):
18
- """Enum for task choices."""
19
-
20
- CPU = "cpu"
21
- MEM = "mem"
22
- DISK = "disk"
23
- GPU = "gpu"
17
+ if TYPE_CHECKING:
18
+ from subprocess import CompletedProcess
24
19
 
25
-
26
- CPU = TaskChoice.CPU
27
- MEM = TaskChoice.MEM
28
- DISK = TaskChoice.DISK
29
- GPU = TaskChoice.GPU
30
-
31
- CPU_MEM: list[TaskChoice] = [CPU, MEM]
32
- CPU_MEM_GPU: list[TaskChoice] = [CPU, MEM, GPU]
33
- ALL_TASKS: list[TaskChoice] = [CPU, MEM, DISK, GPU]
20
+ _base_logger, console = get_console("HostMonitor")
34
21
 
35
22
 
36
23
  def has_nvidia_gpu() -> bool:
37
24
  """Check if the system has an NVIDIA GPU."""
38
25
  try:
39
26
  result = subprocess.run(
27
+ check=False,
40
28
  args=["nvidia-smi", "--query-gpu=name", "--format=csv,noheader"],
41
29
  capture_output=True,
42
30
  text=True,
@@ -64,7 +52,8 @@ class GPUSamples:
64
52
  async def get_gpu_samples(cls) -> Self:
65
53
  """Get GPU samples using nvidia-smi."""
66
54
  try:
67
- result = subprocess.run(
55
+ result: CompletedProcess[str] = subprocess.run(
56
+ check=False,
68
57
  args=[
69
58
  "nvidia-smi",
70
59
  "--query-gpu=utilization.gpu,memory.used,memory.total,memory.free",
@@ -74,7 +63,8 @@ class GPUSamples:
74
63
  text=True,
75
64
  )
76
65
  if result.returncode != 0:
77
- raise RuntimeError("nvidia-smi command failed")
66
+ console.error(f"nvidia-smi command failed with return code {result.returncode}")
67
+ return cls()
78
68
  gpu_usage, gpu_mem_used, gpu_mem_total, gpu_mem_free = map(float, result.stdout.split(","))
79
69
  return cls(
80
70
  gpu_usage=gpu_usage,
@@ -89,6 +79,8 @@ class GPUSamples:
89
79
 
90
80
  @dataclass(slots=True)
91
81
  class HostMonitorResult:
82
+ """Result class for host monitoring."""
83
+
92
84
  # CPU
93
85
  cpu_usage_avg: float = 0.0
94
86
  cpu_max: float = 0.0
@@ -140,21 +132,25 @@ class HostMonitorResult:
140
132
 
141
133
 
142
134
  class SampleStore(TypedDict):
135
+ """TypedDict for storing samples and getter function."""
136
+
143
137
  samples: deque[float | GPUSamples]
144
138
  getter: Callable[[], Awaitable[float | GPUSamples]]
145
139
 
146
140
 
147
141
  class HostMonitor:
148
- def __init__(self, sample_interval: float = 1, tasks: list[TaskChoice] = [CPU, MEM]):
142
+ """Host Monitor for collecting and averaging system metrics."""
143
+
144
+ def __init__(self, sample_interval: float = 1, tasks: tuple = CPU_MEM):
145
+ """Initialize the HostMonitor with specified tasks and sample interval."""
149
146
  self.console = console
150
147
  self.disk_path = "/"
151
148
  self.sample_stores: dict[TaskChoice, SampleStore] = {}
152
- self.tasks: list[TaskChoice] = tasks
149
+ self.tasks: list[TaskChoice] = list(tasks)
153
150
 
154
- if self.is_task_enabled(GPU):
155
- if not has_nvidia_gpu():
156
- self.tasks.remove(TaskChoice.GPU)
157
- self.console.warning("No NVIDIA GPU detected, removing GPU task from monitoring.")
151
+ if self.is_task_enabled(TaskChoice.GPU) and not has_nvidia_gpu():
152
+ self.tasks.remove(TaskChoice.GPU)
153
+ self.console.warning("No NVIDIA GPU detected, removing GPU task from monitoring.")
158
154
 
159
155
  self.sample_stores = {
160
156
  task: {
@@ -166,7 +162,7 @@ class HostMonitor:
166
162
 
167
163
  self.sampling_task: Task | None = None
168
164
  self.is_monitoring: bool = False
169
- self.sample_interval = sample_interval
165
+ self.sample_interval: float = sample_interval
170
166
  self.last_result = HostMonitorResult()
171
167
 
172
168
  self.console.verbose("HostMonitor initialized")
@@ -176,20 +172,21 @@ class HostMonitor:
176
172
  return task in self.tasks
177
173
 
178
174
  async def start(self) -> None:
175
+ """Start the host monitoring."""
179
176
  self.is_monitoring = True
180
177
  self.sampling_task = asyncio.create_task(self._collect_samples())
181
178
 
182
179
  async def stop(self) -> None:
180
+ """Stop the host monitoring."""
183
181
  self.is_monitoring = False
184
182
  if self.sampling_task:
185
183
  self.sampling_task.cancel()
186
- try:
184
+ with suppress(asyncio.CancelledError):
187
185
  await self.sampling_task
188
- except asyncio.CancelledError:
189
- pass
190
186
  self.sampling_task = None
191
187
 
192
188
  async def clear(self) -> None:
189
+ """Clear all samples from the sample stores."""
193
190
  for store in self.sample_stores.values():
194
191
  store["samples"].clear()
195
192
 
@@ -210,6 +207,7 @@ class HostMonitor:
210
207
  if isinstance(result, GPUSamples):
211
208
  return result
212
209
  return float(result)
210
+ return 0.0
213
211
 
214
212
  async def _collect_samples(self) -> None:
215
213
  await self.clear()
@@ -239,7 +237,7 @@ class HostMonitor:
239
237
  return [0.0]
240
238
  try:
241
239
  sample = list(self.sample_stores[task]["samples"])
242
- return cast(list[GPUSamples], sample) if task == GPU else cast(list[float], sample)
240
+ return cast("list[GPUSamples]", sample) if task == GPU else cast("list[float]", sample)
243
241
  except Exception as e:
244
242
  self.console.error(f"Error getting {task} samples: {e}", exc_info=True)
245
243
  return [0.0]
@@ -255,8 +253,7 @@ class HostMonitor:
255
253
  if task == GPU and isinstance(result[0], GPUSamples):
256
254
  first_result: GPUSamples = result[0]
257
255
  return first_result.gpu_usage if isinstance(first_result, GPUSamples) else 0.0
258
- else:
259
- return result[0] if isinstance(result[0], float) else 0.0
256
+ return result[0] if isinstance(result[0], float) else 0.0
260
257
  except Exception as e:
261
258
  self.console.error(f"Error getting single {task} sample: {e}", exc_info=True)
262
259
  return 0.0
@@ -267,6 +264,7 @@ class HostMonitor:
267
264
  return self.is_monitoring and self.sampling_task is not None and bool(self.sample_stores)
268
265
 
269
266
  async def get_current_samples(self) -> HostMonitorResult:
267
+ """Get the current samples for all tasks."""
270
268
  result = HostMonitorResult()
271
269
  if not self.is_running:
272
270
  return result
@@ -300,51 +298,49 @@ class HostMonitor:
300
298
  return result
301
299
 
302
300
  async def get_avg_cpu_temp(self) -> float:
301
+ """Get the average CPU temperature."""
303
302
  if not self.is_monitoring or not self.sample_stores.get(CPU):
304
303
  return 0.0
305
304
  try:
306
305
  current_cpu_samples: list[float] = await self._get_samples(TaskChoice.CPU)
307
306
  if current_cpu_samples:
308
- average_cpu = round(sum(current_cpu_samples) / len(current_cpu_samples), 2)
309
- return average_cpu
307
+ return round(sum(current_cpu_samples) / len(current_cpu_samples), 2)
310
308
  except Exception as e:
311
309
  print(f"Error getting CPU temperature: {e}")
312
310
  return 0.0
313
311
 
314
312
  async def get_avg_mem_usage(self) -> float:
313
+ """Get the average memory usage."""
315
314
  if not self.is_monitoring or not self.sample_stores.get(MEM):
316
315
  return 0.0
317
316
  try:
318
317
  current_mem_samples: list[float] = await self._get_samples(TaskChoice.MEM)
319
318
  if current_mem_samples:
320
- average_mem: float = round(sum(current_mem_samples) / len(current_mem_samples), 2)
321
- return average_mem
319
+ return round(sum(current_mem_samples) / len(current_mem_samples), 2)
322
320
  except Exception as e:
323
321
  print(f"Error getting memory usage: {e}")
324
322
  return 0.0
325
323
 
326
324
  async def get_disk_usage(self) -> float:
325
+ """Get the average disk usage."""
327
326
  if not self.is_monitoring or not self.sample_stores.get(DISK):
328
327
  return 0.0
329
328
  try:
330
329
  current_disk_samples: list[float] = await self._get_samples(TaskChoice.DISK)
331
330
  if current_disk_samples:
332
- average_disk: float = round(sum(current_disk_samples) / len(current_disk_samples), 2)
333
- return average_disk
331
+ return round(sum(current_disk_samples) / len(current_disk_samples), 2)
334
332
  except Exception as e:
335
333
  print(f"Error getting disk usage: {e}")
336
334
  return 0.0
337
335
 
338
336
  async def get_avg_gpu_usage(self) -> float:
337
+ """Get the average GPU usage."""
339
338
  if not self.is_monitoring or not self.sample_stores.get(GPU):
340
339
  return 0.0
341
340
  try:
342
341
  current_gpu_samples: list[GPUSamples] = await self._get_samples(TaskChoice.GPU)
343
342
  if current_gpu_samples:
344
- average_gpu: float = round(
345
- sum(sample.gpu_usage for sample in current_gpu_samples) / len(current_gpu_samples), 2
346
- )
347
- return average_gpu
343
+ return round(sum(sample.gpu_usage for sample in current_gpu_samples) / len(current_gpu_samples), 2)
348
344
  except Exception as e:
349
345
  print(f"Error getting GPU usage: {e}")
350
346
  return 0.0
@@ -1,3 +1,7 @@
1
+ """A module for Bear Epoch Time utilities centering around the EpochTimestamp class."""
2
+
3
+ from importlib.metadata import version
4
+
1
5
  from bear_epoch_time import EpochTimestamp, TimerData, TimeTools, add_ord_suffix, create_timer, timer
2
6
  from bear_epoch_time.constants.date_related import (
3
7
  DATE_FORMAT,
@@ -11,13 +15,9 @@ from bear_epoch_time.constants.date_related import (
11
15
  UTC_TIME_ZONE,
12
16
  )
13
17
 
18
+ __version__: str = version(distribution_name="bear_epoch_time")
19
+
14
20
  __all__ = [
15
- "EpochTimestamp",
16
- "TimerData",
17
- "create_timer",
18
- "timer",
19
- "TimeTools",
20
- "add_ord_suffix",
21
21
  "DATE_FORMAT",
22
22
  "DATE_TIME_FORMAT",
23
23
  "DT_FORMAT_WITH_SECONDS",
@@ -27,4 +27,11 @@ __all__ = [
27
27
  "PT_TIME_ZONE",
28
28
  "TIME_FORMAT_WITH_SECONDS",
29
29
  "UTC_TIME_ZONE",
30
+ "EpochTimestamp",
31
+ "TimeTools",
32
+ "TimerData",
33
+ "__version__",
34
+ "add_ord_suffix",
35
+ "create_timer",
36
+ "timer",
30
37
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bear-utils
3
- Version: 0.7.21
3
+ Version: 0.7.22
4
4
  Summary: Various utilities for Bear programmers, including a rich logging utility, a disk cache, and a SQLite database wrapper amongst other things.
5
5
  Author-email: chaz <bright.lid5647@fastmail.com>
6
6
  Requires-Python: >=3.12
@@ -16,10 +16,11 @@ Requires-Dist: pyyaml>=6.0.2
16
16
  Requires-Dist: rich<15.0.0,>=14.0.0
17
17
  Requires-Dist: singleton-base>=1.0.5
18
18
  Requires-Dist: sqlalchemy<3.0.0,>=2.0.40
19
+ Requires-Dist: tinydb>=4.8.2
19
20
  Requires-Dist: toml>=0.10.2
20
21
  Description-Content-Type: text/markdown
21
22
 
22
- # Bear Utils v# Bear Utils v0.7.21
23
+ # Bear Utils v# Bear Utils v0.7.22
23
24
 
24
25
  Personal set of tools and utilities for Python projects, focusing on modularity and ease of use. This library includes components for caching, database management, logging, time handling, file operations, CLI prompts, image processing, clipboard interaction, gradient utilities, event systems, and async helpers.
25
26
 
@@ -30,11 +31,12 @@ Bear Utils is a collection of utility modules I've created for common tasks acro
30
31
  ## Installation
31
32
 
32
33
  ```bash
33
- # Using pip
34
- pip install bear-utils
34
+ pip install bear-util. # Core package (recommended for most users)
35
+ pip install bear-utils[gui] # With optional GUI functionality
35
36
 
36
- # Using poetry
37
- poetry add bear-utils
37
+ # Using UV
38
+ uv add bear-utils # Core only
39
+ uv add bear-utils --group gui # With GUI functionality
38
40
  ```
39
41
 
40
42
  ## Key Components
@@ -137,6 +139,48 @@ choice = restricted_prompt(
137
139
  )
138
140
  ```
139
141
 
142
+ ### GUI Utilities (Optional)
143
+
144
+ **Note: GUI functionality requires the optional PyQt6 dependency. Install with `pip install bear-utils[gui]`**
145
+
146
+ The `gui` package provides PyQt6-based dialog utilities for desktop applications:
147
+
148
+ ```python
149
+ # Color picker dialog
150
+ from bear_utils.gui import select_color
151
+
152
+ color_info = select_color(
153
+ initial_color="#FF5733",
154
+ title="Choose a Color"
155
+ )
156
+ if color_info:
157
+ print(f"Selected: {color_info.hex}") # e.g., "#FF5733"
158
+ print(f"RGB: {color_info.rgb}") # ColorTriplet(255, 87, 51)
159
+ print(f"RGBA: {color_info.rgba}") # (255, 87, 51, 255)
160
+
161
+ # Text input dialog
162
+ from bear_utils.gui import get_text
163
+
164
+ user_input = get_text(
165
+ title="Input Required",
166
+ label="Enter your name:",
167
+ default="Default text"
168
+ )
169
+
170
+ # Qt Application wrapper
171
+ from bear_utils.gui import QTApplication
172
+
173
+ app = QTApplication(
174
+ app_name="My App",
175
+ org_name="My Organization"
176
+ )
177
+ ```
178
+
179
+ **Error handling**: If PyQt6 is not installed, importing GUI components will raise a helpful error:
180
+ ```
181
+ ImportError: PyQt6 is required for GUI functionality. Install it with: pip install bear-utils[gui]
182
+ ```
183
+
140
184
  ### Image Helpers
141
185
 
142
186
  Utilities for working with images are located in the `graphics` package:
@@ -0,0 +1,83 @@
1
+ bear_utils/__init__.py,sha256=0pxXi4iMbFDxJQA2n9fgM9G2qjy62UZjmEHNKc_iF8M,1146
2
+ bear_utils/ai/__init__.py,sha256=Q5P1KpSYS6iMt3vRbmasdWU5Oy5UkXfOGGyDI7Qy3Po,747
3
+ bear_utils/ai/ai_helpers/__init__.py,sha256=g7Y7bnil6kYj8llA7GxEi9n0mXD-46jAlMh8U0-B1IY,4344
4
+ bear_utils/ai/ai_helpers/_common.py,sha256=KgaOb_IePfC8Z1VsdA0EiodfS_YGVYYnrZFR2ZdsUYM,418
5
+ bear_utils/ai/ai_helpers/_config.py,sha256=UX7wPIiEr2Uqt2kZWtMaYagmRFmUsQKSuopQ41XW53I,774
6
+ bear_utils/ai/ai_helpers/_parsers.py,sha256=KlkhLHru6eivy37di9sSlxZdttPEMKRnt08nJeYmuhk,8161
7
+ bear_utils/ai/ai_helpers/_types.py,sha256=UeCc-eIAnZAQ9j5mZXXD-JrnQpUE5BDlNiu7jZSZOQs,458
8
+ bear_utils/cache/__init__.py,sha256=c9z1mLhWpZJHZdXRlviYQXl8tc9KTJCM8vin3moDO3I,4578
9
+ bear_utils/cli/__init__.py,sha256=H2QpLyHpQS_Yn3sF2px7n4KqT97LEe7Oyzafg2iHcpc,503
10
+ bear_utils/cli/commands.py,sha256=5ppEjvVV_g28WLaIFtKgz-ctzwoo-g-KpHTXNx9xBzo,3161
11
+ bear_utils/cli/prompt_helpers.py,sha256=dHs7qToSKWQEe_iPshDJglg48OdjJXbNHSCA_3rjmHg,6581
12
+ bear_utils/cli/shell/__init__.py,sha256=2s3oR6CqLKj1iyERy7YafWT3t3KzTr70Z1yaLKa6IiQ,42
13
+ bear_utils/cli/shell/_base_command.py,sha256=5jReGU6wokNpJaFJioIfRG6uOtya5pTwNm-9FeLgsAA,2414
14
+ bear_utils/cli/shell/_base_shell.py,sha256=mZ67s_hEa-ouFwEYnW5ddwohKxE6rQ4OZqi5vth4-7U,16730
15
+ bear_utils/cli/shell/_common.py,sha256=_KQyL5lvqOfjonFIwlEOyp3K9G3TSOj19RhgVzfNNpg,669
16
+ bear_utils/config/__init__.py,sha256=HC_lWpmLF0kbPr5i1Wa2FLER2b446E_GecgU9EPmc04,353
17
+ bear_utils/config/config_manager.py,sha256=Xj0xOmY-wo_rwfcWiXyxNZWX9NknX_Jm9W56Gx8yyHQ,8244
18
+ bear_utils/config/dir_manager.py,sha256=slIy1oRr7VIPdsiwN66-xQiuSvgqm_j6d1IrKhxRsSk,2028
19
+ bear_utils/config/settings_manager.py,sha256=1mKpGGYgKrtRGp2Y_xvCSIYMW79QS95LtZpv1TVK_7A,5041
20
+ bear_utils/constants/__init__.py,sha256=fE3p01HDJDV9uAMWYB8q8h7K01ekSqZPxymvgbNaN7Y,563
21
+ bear_utils/constants/_exceptions.py,sha256=gnAGTmuD9NYpJakeLrYHAyPrAQPHDNahY_rS42Ct39k,251
22
+ bear_utils/constants/_lazy_typing.py,sha256=WfuWpRqx9XchvuyPWg3tVjMC5-C4QA-Bhwfskf4YmAE,339
23
+ bear_utils/constants/date_related.py,sha256=tRmiWJKKIOMFnp2PXOcH1jDPPs4g9G3Ss6lL90dAxa0,582
24
+ bear_utils/constants/logger_protocol.py,sha256=rfHwFlHZfQfP9IFLNLhI4cXDCqjFGFKZFolem9yJOi8,760
25
+ bear_utils/constants/time_related.py,sha256=Mykb27THqC-K0HFrbbrdkTNJUKhzBEOfmPJ0rx2-L6E,705
26
+ bear_utils/database/__init__.py,sha256=dS_HHJKESpsI6BFDLVx055o0GCJV9CMYOQVuHs7EfgY,192
27
+ bear_utils/database/_db_manager.py,sha256=qsvOJkEAjTtcq1Q8ZgZnqiuCzYtI9n_KgHyAeIBVszY,3859
28
+ bear_utils/events/__init__.py,sha256=EFqmuzhaEYK9kjkGlrM7bjdjPwFEDbKn6RjJKfIBEJY,414
29
+ bear_utils/events/events_class.py,sha256=vPDjWrbut8L3TFn7byyYFZpWYM5ADIqtW2Aeh-qtKfQ,1632
30
+ bear_utils/events/events_module.py,sha256=rv9NoCDFOaYY70EilrImG9ug90n_wpDBDz4XvxUYqdE,2291
31
+ bear_utils/extras/__init__.py,sha256=szflSapj7aGFc2j5sTitQFccXu-6_UdGG-eYuv6zVJI,607
32
+ bear_utils/extras/_async_helpers.py,sha256=cxq5d24NHkECmZqTVXEazv6K-XUa7skFnX6KQZb0Ycw,411
33
+ bear_utils/extras/_tools.py,sha256=HjP3BJRBmYexbzxb8Ko9VPZtVgPry4o-cCABWEP6XHs,7416
34
+ bear_utils/extras/platform_utils.py,sha256=Ai7ow7S-_cKb5zFwFh8dkC8xmbMJFy-0_-w3NCERdEw,1362
35
+ bear_utils/extras/responses/__init__.py,sha256=U5InC9ec9OI-f_eCi78z8UJsqtgEA5PGBvu94yvgjnA,89
36
+ bear_utils/extras/responses/function_response.py,sha256=GJCYKKXC5U4lT-mBf40YZj5a6UIS3bCRn0qzwM-CETM,12718
37
+ bear_utils/extras/wrappers/__init__.py,sha256=crh4sKOLvuhNMVX5bJYjCFWtXtH7G47UgNPOHq3HXTk,43
38
+ bear_utils/extras/wrappers/add_methods.py,sha256=z2XZG2ZoYOB1MaGiLli4NRyyTeRgBy7tuYsiy8mTa9s,4422
39
+ bear_utils/files/__init__.py,sha256=mIdnFSXoDE64ElM43bN2m6KuafURnN82ki0pdqN8q2o,201
40
+ bear_utils/files/ignore_parser.py,sha256=ipBqUH5ndipPSq27TEsGDa7Sqq53KrczGLZcnNbW9F0,10951
41
+ bear_utils/files/file_handlers/__init__.py,sha256=VF2IlWNr3UqeSvsbh3YCbLw9cLmlyf64mfeOKuhBdvk,136
42
+ bear_utils/files/file_handlers/_base_file_handler.py,sha256=2Df8s-tNfsiQtV_pVFaDJe2sS_edPHbeR9nd5htgfwg,3960
43
+ bear_utils/files/file_handlers/file_handler_factory.py,sha256=fDo2UcWp5-pOMtVWKCTuz-Fw4qSIB9fg5FgNRoYR6g4,9931
44
+ bear_utils/files/file_handlers/json_file_handler.py,sha256=DvGvQ8D4ZFHHswtQQXmuiEY9HMkFA0o68u0_ekwwiXQ,2668
45
+ bear_utils/files/file_handlers/log_file_handler.py,sha256=5yqW-ASikC4T0QPA7dkk-Putc8bEkg2MmZr_RCzYAvI,1542
46
+ bear_utils/files/file_handlers/toml_file_handler.py,sha256=7eXDJBF-376NPe1uq7_Rsy3mER0sbbD5mBahvPJGsm8,2626
47
+ bear_utils/files/file_handlers/txt_file_handler.py,sha256=24PLekOUUh_4XHGHCN61xqlubcM1GWgP6vonzEfoqac,2757
48
+ bear_utils/files/file_handlers/yaml_file_handler.py,sha256=B1R-HgQYkqM93EoXDm0nYPje23KnvEI_sGxpX7lk2OM,2462
49
+ bear_utils/graphics/__init__.py,sha256=uR_NFKfskJGDPT0PGiw38rRniV945H67fvDALxUTnVw,268
50
+ bear_utils/graphics/bear_gradient.py,sha256=36B9hjU_qDjdgZaVcRl4jE3uQyU8k8G_MiORFzaendE,5272
51
+ bear_utils/graphics/image_helpers.py,sha256=AaDQm6uunIdVkcMSXmoiaNQ68zRQQJ6bbhoApk6GSKU,1649
52
+ bear_utils/gui/__init__.py,sha256=i699iAUONA7KLN7_kqwV33fUJ5Zr71_qLzqMsSBUles,346
53
+ bear_utils/gui/gui_tools/__init__.py,sha256=cD6cKxU1cmKDVaBRT8KsqsCbulf6TUNAmVr50XGPpo8,446
54
+ bear_utils/gui/gui_tools/_settings.py,sha256=xSQ7I-axAifZNvEw_28mnFBFYIJd4xFuDpycFFQLib0,1201
55
+ bear_utils/gui/gui_tools/_types.py,sha256=krguJ-ccALKeUHz9auh_iyOCzeAuerOYcuhWW8jjJQ0,248
56
+ bear_utils/gui/gui_tools/qt_app.py,sha256=JJT1vFkBfiEjKTd9reie2hI6YqIhjmb2pxv7V880gvg,5858
57
+ bear_utils/gui/gui_tools/qt_color_picker.py,sha256=5NtLiBHk5r9Goma_oiymriH49D_JGIk844p4Hsi51io,4744
58
+ bear_utils/gui/gui_tools/qt_file_handler.py,sha256=FgWdS-9WnjVuyGIC8V30ByDCBeJGZKGc8KRTy34SFfI,4404
59
+ bear_utils/gui/gui_tools/qt_input_dialog.py,sha256=5KaCM9q8kmoy-Fd0j1FbXIVrLlE7W47NEGdhsWtvKwQ,9281
60
+ bear_utils/logging/__init__.py,sha256=ZW1DjUziSivNlR5HW2i3HrWROZtODbw-GX73lZZ9PuA,533
61
+ bear_utils/logging/loggers.py,sha256=1bzD0t5D8po-Bto5aa33a3_KWpA7eGNNm1hUBVX8vKs,2840
62
+ bear_utils/logging/logger_manager/__init__.py,sha256=kbWW34QymkDzwmHnp5Ibd9F-8mzBblTVoX40giwdrgw,38
63
+ bear_utils/logging/logger_manager/_common.py,sha256=m72yhFmBBgZN7u3omI43AERKQyR9bVwgeHEfbgPJV4Y,1581
64
+ bear_utils/logging/logger_manager/_console_junk.py,sha256=xzLetPpCIluPvSP-_vUJcnzRIh0n17q8hip6EzlHDpo,4887
65
+ bear_utils/logging/logger_manager/_styles.py,sha256=3A30TrvPSOm1h2IfHgdDEUc0WP71zWZDGCHrCRofdjc,2523
66
+ bear_utils/logging/logger_manager/loggers/__init__.py,sha256=ashcnkvQIUQDLbUtU6QILkMjP_fMaeHAN1w7pHLWqQk,67
67
+ bear_utils/logging/logger_manager/loggers/_base_logger.py,sha256=9HnXvXxyWYdHEbd4JjAxb2sXFGHpLEkXBW71VVwAhR0,9512
68
+ bear_utils/logging/logger_manager/loggers/_base_logger.pyi,sha256=bLB1UFG9NkQZ1GwcfcXldqYz6I4xR3y-sFp9yRpLhlY,2675
69
+ bear_utils/logging/logger_manager/loggers/_buffer_logger.py,sha256=JEd2afChzAKkM1va-L8xVOi1cF9n9W1vGzkI49YEf40,1527
70
+ bear_utils/logging/logger_manager/loggers/_console_logger.py,sha256=C25sr5C8C76iY18qN5JuVnmwAGHhR2HFDjsmUINnZvU,9909
71
+ bear_utils/logging/logger_manager/loggers/_console_logger.pyi,sha256=mI38SrE5vu4LZih_Y4ABqYcH499eeY-CDJ4VRr5JA8o,1874
72
+ bear_utils/logging/logger_manager/loggers/_file_logger.py,sha256=d-G5xeaAk0q3bd29Nbp-PfOrToVLyEq_JDCqhAu7wus,4760
73
+ bear_utils/logging/logger_manager/loggers/_level_sin.py,sha256=HxAhuQSBhJHygTB8hcAIYLoPl6u0pUbF1BZ2aLFmEHI,1747
74
+ bear_utils/logging/logger_manager/loggers/_logger.py,sha256=FA0ALmROX1BQIal7zhEemLnC0UnXTQY-YqJBlPEbQDM,537
75
+ bear_utils/logging/logger_manager/loggers/_sub_logger.py,sha256=Nd3hJFlBK9iVZZSJJoxH5M6tarIysf03skYI9aWBBmU,3428
76
+ bear_utils/logging/logger_manager/loggers/_sub_logger.pyi,sha256=rRcmrVFg7dhHO_tNQQXrpF3h4r0CdVyGxC4xtOIemzM,1002
77
+ bear_utils/monitoring/__init__.py,sha256=9DKNIWTp_voLnaWgiP-wJ-o_N0hYixo-MzjUmg8RUvI,240
78
+ bear_utils/monitoring/_common.py,sha256=LYQFxgTP9fk0cH71IQTuGwBYYPWCqHP_mMRNecoD76M,657
79
+ bear_utils/monitoring/host_monitor.py,sha256=iawDGJWvByUnTanJvgiZMlqSJr3JpEWJdgA99A-fol0,13214
80
+ bear_utils/time/__init__.py,sha256=d9Ovv-Dlx5NWgnOl1hY-evznVm9hboS6ypNp1wDFxQQ,934
81
+ bear_utils-0.7.22.dist-info/METADATA,sha256=aF6yfwKub0rL1ueDq2NLKJfvUmuWvljLzDY8gFlBbow,8629
82
+ bear_utils-0.7.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
+ bear_utils-0.7.22.dist-info/RECORD,,
@@ -1,79 +0,0 @@
1
- bear_utils/__init__.py,sha256=rwxVGk0zD-vvQ_E1SFHSIX3nmz9potELv129Q7j8Tkw,670
2
- bear_utils/ai/__init__.py,sha256=g7DiwwqbcKAktcwqq6Xs3rSwFqvq4H1yrG2aHoc6FQo,766
3
- bear_utils/ai/ai_helpers/__init__.py,sha256=siujxR7b7mjsHM2J24V9NXM-edlgcuRZQpxegVU9-is,3968
4
- bear_utils/ai/ai_helpers/_common.py,sha256=KgaOb_IePfC8Z1VsdA0EiodfS_YGVYYnrZFR2ZdsUYM,418
5
- bear_utils/ai/ai_helpers/_config.py,sha256=UX7wPIiEr2Uqt2kZWtMaYagmRFmUsQKSuopQ41XW53I,774
6
- bear_utils/ai/ai_helpers/_parsers.py,sha256=aWbbrB44pRI-CZpmPuVCQalcEd17BDUtE2FVQstq3rU,7993
7
- bear_utils/ai/ai_helpers/_types.py,sha256=yTvB00bKIZXu-BKoXtZv6I3vHrxBwxO0gpl61bEslrY,550
8
- bear_utils/cache/__init__.py,sha256=PRXhqzVCoMLlu1AwLcNz1w39n4dvjkj3__uYUFQk8Nk,4109
9
- bear_utils/cli/__init__.py,sha256=umMR79Zskl2YY2gWh3e8yI_DEEi5kfb9mPKWlTPxIfY,239
10
- bear_utils/cli/commands.py,sha256=2uVYhU3qXdpkmQ3gKaUgsplfJMpEVxVGvdnJl-3H7to,2806
11
- bear_utils/cli/prompt_helpers.py,sha256=aGfa4tnO24kFKC-CBJhoiKtll8kc_uU5RvXmxSoD5BM,6094
12
- bear_utils/cli/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- bear_utils/cli/shell/_base_command.py,sha256=4VsInKhWRSzPyllnXXdueCDKwJz6i7ioZP1bZN-K5T4,2360
14
- bear_utils/cli/shell/_base_shell.py,sha256=mw88NctENj47VzWtRX0eoTdBku_KTYUnNfZrDeevft4,15941
15
- bear_utils/cli/shell/_common.py,sha256=_KQyL5lvqOfjonFIwlEOyp3K9G3TSOj19RhgVzfNNpg,669
16
- bear_utils/config/__init__.py,sha256=htYbcAhIAGXgA4BaSQMKRtwu5RjWwNsnAiD0JxZ82aE,289
17
- bear_utils/config/config_manager.py,sha256=WojWwxsTo2Izf2EFxZJXjjUmhqcbbatZ-nBKq436BGw,2631
18
- bear_utils/config/dir_manager.py,sha256=zH0CQAyeFSCjorUQd6TPxkco33hoPqy9wdagByccqP4,1865
19
- bear_utils/config/settings_manager.py,sha256=1icasrvSmhgPS08fGFswYT7eHbbguqscFZgia5XtazM,7484
20
- bear_utils/constants/__init__.py,sha256=exQ6tfE05Wi72i6PyZ71WXRs_b9RO4zbupPUyV6fHQg,545
21
- bear_utils/constants/_exceptions.py,sha256=KCd4iT7RxrS4DxU1vLrTiYP2U6pyEjnyP_AGXbEpwR0,137
22
- bear_utils/constants/_lazy_typing.py,sha256=WfuWpRqx9XchvuyPWg3tVjMC5-C4QA-Bhwfskf4YmAE,339
23
- bear_utils/constants/date_related.py,sha256=EpQEZxg8o9e4pkvbflfnSyYUzb-pQDhCxAJKWpiWuT8,508
24
- bear_utils/constants/time_related.py,sha256=q-0wi0qnC5qHq4vOXbMAETVA5lEc-c7STFqi3fTjuLs,638
25
- bear_utils/database/__init__.py,sha256=JkpeqL9F1Rhcj9CMhM6ZP72qq-nDKPzWAR2aeJyyiZg,111
26
- bear_utils/database/_db_manager.py,sha256=1EY8ueSf3US8yUhnMP5R96pHolOyy_3ufNi5fv5d-NM,3776
27
- bear_utils/events/__init__.py,sha256=ZvPC95Y80QEMDki9MnsdP9sz_jH0mg78tuy5QO4DVPE,364
28
- bear_utils/events/events_class.py,sha256=pEdZNS8l5wwrn3I4WrFspZlNiy3Lzcwjxr6E2hTKXyM,1657
29
- bear_utils/events/events_module.py,sha256=NtWqlBpTWAtaC_KVJnweReQe6OU2PXt04yNtAEcATuc,1852
30
- bear_utils/extras/__init__.py,sha256=OzjuT-GSI6lT8lmOLBR4-ikA-QrpByy0YRlgiFd7cF4,547
31
- bear_utils/extras/_async_helpers.py,sha256=OcgPmCfdAKcTsqGA3Fm8ORkePgaJSok_1t9-sbf-zNQ,416
32
- bear_utils/extras/_tools.py,sha256=PdOX9KCB5uGEGzJ7SA9qeBukxyYRo160ePqBZU8dJCw,7094
33
- bear_utils/extras/platform_utils.py,sha256=vRLybOm_Kk4ysVyNdsv1oTrMHD64vPeGre23fg-kJxI,1257
34
- bear_utils/extras/wrappers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- bear_utils/extras/wrappers/add_methods.py,sha256=8JI9oFakHRBHcyix6sgqfiXZyXW5antLbyRdFL4F1_M,4222
36
- bear_utils/files/__init__.py,sha256=Xzo1229NTq-NaeQIvsqUSaFxwm8DFmpxEIfnhDb_uHg,142
37
- bear_utils/files/ignore_parser.py,sha256=W8SQDUm-_R9abUwvcaA7zr8me281N0kLIP823_sAoyA,10678
38
- bear_utils/files/file_handlers/__init__.py,sha256=hXoxBoUP343DyjjBFxQRF7cCB1tEMNor2huYOdlGvqo,87
39
- bear_utils/files/file_handlers/_base_file_handler.py,sha256=jNmdYfpN6DRplKNR590Yy3Vd9wuPg27DwnSlm79Ed3o,3164
40
- bear_utils/files/file_handlers/file_handler_factory.py,sha256=OJ8Gj0gIpWIr-rlhw52iiR02YJ6nTQuVpylPKCpvFSA,9856
41
- bear_utils/files/file_handlers/json_file_handler.py,sha256=YUz4yFHHzO6HcQl0kiiWZCMp57FEaUJ6_yNGhw6tJz4,1482
42
- bear_utils/files/file_handlers/log_file_handler.py,sha256=hScsVnJkO17y9tovJatY7VpMyO5kzFGv_1OnQ9oQCiU,1246
43
- bear_utils/files/file_handlers/toml_file_handler.py,sha256=TWg7dG6OV4diK1NBjDxYPJnYtYVXOYwXmUmeEz_d_g4,2287
44
- bear_utils/files/file_handlers/txt_file_handler.py,sha256=dsw1sO6KwzMcqmwt5_UZSv9SF1xisN2Zo2cRNYcO_XI,1250
45
- bear_utils/files/file_handlers/yaml_file_handler.py,sha256=Oe8U0fYtDv7q8sFWs_rO3uRQa9olEbrGWF1JuQ2iyTk,2083
46
- bear_utils/graphics/__init__.py,sha256=N6EXOyAVoytsKecFKvi4P9Q0biEZeLkLBDor5YFUqYg,218
47
- bear_utils/graphics/bear_gradient.py,sha256=bwjJobhgMguEA0FQnjpGzyU3CzFG4bxEvxJtJXAKBcc,4808
48
- bear_utils/graphics/image_helpers.py,sha256=fy96H_BkuiCXecDXCMmrlH-SWGsA5SkEUSxlKGzcibI,1374
49
- bear_utils/gui/__init__.py,sha256=fCq-WDA5w5lx2Lg7V5_zsYyBKV88gnStPRQSZcUqWjw,274
50
- bear_utils/gui/gui_tools/__init__.py,sha256=3iHLnm5lv7GVTvTiZ9MazLYtseK8-b2dYZmHRV3YuKw,335
51
- bear_utils/gui/gui_tools/_settings.py,sha256=1zFSMwTacybbleXs2LMDuoyZJwr8ixkLZBfcYVfLbiU,1202
52
- bear_utils/gui/gui_tools/_types.py,sha256=krguJ-ccALKeUHz9auh_iyOCzeAuerOYcuhWW8jjJQ0,248
53
- bear_utils/gui/gui_tools/qt_app.py,sha256=rTeiaGSZztKogZC1E6lDwOfJ0eVcZXWJmNGjOkbT9bw,5520
54
- bear_utils/gui/gui_tools/qt_color_picker.py,sha256=c_-VMaSqSiceDc3mmu7SPRJ3E_ZWj-s3Y4N-q2x3KSU,4437
55
- bear_utils/gui/gui_tools/qt_file_handler.py,sha256=vOYSlQTFiRi-FtXqagp1M_jRSOjz7W-LCb8KXlEtr50,4325
56
- bear_utils/gui/gui_tools/qt_input_dialog.py,sha256=MwZ2myLEKRZlldYH_rZtEzPeaz3-fRBP06xBmkTKyAk,9224
57
- bear_utils/logging/__init__.py,sha256=o5MX0ow4ugo3JhS2k9vFO0HMzTwUBVnzdhoJBCmqW1g,492
58
- bear_utils/logging/loggers.py,sha256=oFdKrm9ot7F4pKghzYQrq-BK7RfevKQSBaHsmSolHTA,3196
59
- bear_utils/logging/logger_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- bear_utils/logging/logger_manager/_common.py,sha256=6r69PIqk6IaIauxax35c5Paz1J1iv87ukbvoZ3uWI_Q,1582
61
- bear_utils/logging/logger_manager/_console_junk.py,sha256=vMChuVTNxyxly-onEad1u2tsb6syalXjFVfxOS2-qHw,4821
62
- bear_utils/logging/logger_manager/_styles.py,sha256=Q5Gwt7nmHZuanwpr3kJl7mfo_8jaElFKJgns1sq4IwE,2528
63
- bear_utils/logging/logger_manager/loggers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- bear_utils/logging/logger_manager/loggers/_base_logger.py,sha256=LnhPJuTChhgXsxrafJBE1w7aIntn5OW43ZOjFxwhysU,9453
65
- bear_utils/logging/logger_manager/loggers/_base_logger.pyi,sha256=fFjv7GHh9LAvBZDK5Bqth50wOheNwM_qt-sKowW8UWg,2606
66
- bear_utils/logging/logger_manager/loggers/_buffer_logger.py,sha256=l3XtjGWIZlWOtFH_2ltNjyxWgmKJ_ZqIwWYLofXn-1E,1535
67
- bear_utils/logging/logger_manager/loggers/_console_logger.py,sha256=b0qQeMJtktRnCekuZKlHp8mej8htj1xKJa-TvT2Rig0,9400
68
- bear_utils/logging/logger_manager/loggers/_console_logger.pyi,sha256=B3hjFePgAyy5lESlLjHZVTMu4Y18txvAVzv3kD_Akuc,2512
69
- bear_utils/logging/logger_manager/loggers/_file_logger.py,sha256=slx_eaxH5sn1s96wmxDehJU5O__9JHzXin5CqaqetTw,4684
70
- bear_utils/logging/logger_manager/loggers/_level_sin.py,sha256=n4EJUZc_z2YQkTzbVuFvPIhwiUt3gv4_Go90C46vsFc,1712
71
- bear_utils/logging/logger_manager/loggers/_logger.py,sha256=RbqfrHSyaxIbXEDO63WK5oGMVXsMJIL1Rx8_frYacsQ,547
72
- bear_utils/logging/logger_manager/loggers/_sub_logger.py,sha256=YMW03UP9fh_c51Ls1KEoMr-bcAfMt4tTT0OIELpDa_k,3471
73
- bear_utils/logging/logger_manager/loggers/_sub_logger.pyi,sha256=-SCh73lTkqolDq-5Ll-lstfl-88gi-E3y1FIknBoI5w,1520
74
- bear_utils/monitoring/__init__.py,sha256=cj7UYsipfYFwxQmXtMpziAv4suRtGzWEdjdwOCbxJN4,168
75
- bear_utils/monitoring/host_monitor.py,sha256=GwIK9X8rATUhYIbOXi4MINfACWgO3T1vzUK1gSK_TQc,12902
76
- bear_utils/time/__init__.py,sha256=EHzc9KiGG3l6mAPhiIeFcYqxQG_w0QQ1ES3yRFVr8ug,721
77
- bear_utils-0.7.21.dist-info/METADATA,sha256=Zycfs1dpb1uMnV_P2tjgDIs-S8k2npsmOA4RJ-PWct8,7298
78
- bear_utils-0.7.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
79
- bear_utils-0.7.21.dist-info/RECORD,,