bear-utils 0.7.23__py3-none-any.whl → 0.8.0__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 (42) hide show
  1. bear_utils/__init__.py +13 -13
  2. bear_utils/__main__.py +14 -0
  3. bear_utils/_internal/__init__.py +0 -0
  4. bear_utils/_internal/cli.py +73 -0
  5. bear_utils/_internal/debug.py +159 -0
  6. bear_utils/ai/ai_helpers/__init__.py +1 -1
  7. bear_utils/ai/ai_helpers/_types.py +1 -1
  8. bear_utils/cli/prompt_helpers.py +1 -1
  9. bear_utils/cli/shell/_base_shell.py +1 -1
  10. bear_utils/config/settings_manager.py +9 -8
  11. bear_utils/extras/_tools.py +2 -2
  12. bear_utils/extras/responses/__init__.py +8 -0
  13. bear_utils/extras/responses/function_response.py +73 -38
  14. bear_utils/files/file_handlers/_base_file_handler.py +3 -9
  15. bear_utils/files/file_handlers/json_file_handler.py +2 -2
  16. bear_utils/files/file_handlers/log_file_handler.py +2 -2
  17. bear_utils/files/file_handlers/toml_file_handler.py +1 -1
  18. bear_utils/files/file_handlers/txt_file_handler.py +2 -2
  19. bear_utils/files/file_handlers/yaml_file_handler.py +1 -0
  20. bear_utils/files/ignore_parser.py +1 -1
  21. bear_utils/gui/gui_tools/qt_app.py +1 -1
  22. bear_utils/{logging/loggers.py → logger_manager/__init__.py} +22 -6
  23. bear_utils/{logging/logger_manager → logger_manager}/loggers/_base_logger.py +2 -2
  24. bear_utils/{logging/logger_manager → logger_manager}/loggers/_base_logger.pyi +1 -1
  25. bear_utils/{logging/logger_manager → logger_manager}/loggers/_console_logger.py +2 -2
  26. bear_utils/{logging/logger_manager → logger_manager}/loggers/_console_logger.pyi +1 -1
  27. bear_utils/{logging/logger_manager → logger_manager}/loggers/_file_logger.py +2 -2
  28. bear_utils/{logging/logger_manager → logger_manager}/loggers/_sub_logger.py +1 -1
  29. bear_utils/monitoring/host_monitor.py +1 -1
  30. {bear_utils-0.7.23.dist-info → bear_utils-0.8.0.dist-info}/METADATA +2 -2
  31. {bear_utils-0.7.23.dist-info → bear_utils-0.8.0.dist-info}/RECORD +40 -38
  32. bear_utils/logging/__init__.py +0 -27
  33. bear_utils/logging/logger_manager/__init__.py +0 -1
  34. /bear_utils/{logging/logger_manager → logger_manager}/_common.py +0 -0
  35. /bear_utils/{logging/logger_manager → logger_manager}/_console_junk.py +0 -0
  36. /bear_utils/{logging/logger_manager → logger_manager}/_styles.py +0 -0
  37. /bear_utils/{logging/logger_manager → logger_manager}/loggers/__init__.py +0 -0
  38. /bear_utils/{logging/logger_manager → logger_manager}/loggers/_buffer_logger.py +0 -0
  39. /bear_utils/{logging/logger_manager → logger_manager}/loggers/_level_sin.py +0 -0
  40. /bear_utils/{logging/logger_manager → logger_manager}/loggers/_logger.py +0 -0
  41. /bear_utils/{logging/logger_manager → logger_manager}/loggers/_sub_logger.pyi +0 -0
  42. {bear_utils-0.7.23.dist-info → bear_utils-0.8.0.dist-info}/WHEEL +0 -0
bear_utils/__init__.py CHANGED
@@ -1,24 +1,23 @@
1
1
  """A module for Bear Utils, providing various utilities and tools."""
2
2
 
3
- from importlib.metadata import version
4
-
5
3
  from bear_epoch_time import EpochTimestamp, TimeTools
6
4
 
7
- from .cache import CacheWrapper, cache, cache_factory
8
- from .config.settings_manager import SettingsManager, get_settings_manager
9
- from .constants.date_related import DATE_FORMAT, DATE_TIME_FORMAT
10
- from .database import DatabaseManager
11
- from .events import Events
12
- from .files.file_handlers.file_handler_factory import FileHandlerFactory
13
- from .logging.logger_manager._common import VERBOSE_CONSOLE_FORMAT
14
- from .logging.logger_manager._styles import VERBOSE
15
- from .logging.loggers import BaseLogger, BufferLogger, ConsoleLogger, FileLogger
16
-
17
- __version__: str = version(distribution_name="bear_utils")
5
+ from bear_utils.cache import CacheWrapper, cache, cache_factory
6
+ from bear_utils.config.settings_manager import SettingsManager, get_settings_manager
7
+ from bear_utils.constants.date_related import DATE_FORMAT, DATE_TIME_FORMAT
8
+ from bear_utils.database import DatabaseManager
9
+ from bear_utils.events import Events
10
+ from bear_utils.extras.responses import FAILURE, SUCCESS, FunctionResponse
11
+ from bear_utils.files.file_handlers.file_handler_factory import FileHandlerFactory
12
+ from bear_utils.logger_manager import BaseLogger, BufferLogger, ConsoleLogger, FileLogger
13
+ from bear_utils.logger_manager._common import VERBOSE_CONSOLE_FORMAT
14
+ from bear_utils.logger_manager._styles import VERBOSE
18
15
 
19
16
  __all__ = [
20
17
  "DATE_FORMAT",
21
18
  "DATE_TIME_FORMAT",
19
+ "FAILURE",
20
+ "SUCCESS",
22
21
  "VERBOSE",
23
22
  "VERBOSE_CONSOLE_FORMAT",
24
23
  "BaseLogger",
@@ -30,6 +29,7 @@ __all__ = [
30
29
  "Events",
31
30
  "FileHandlerFactory",
32
31
  "FileLogger",
32
+ "FunctionResponse",
33
33
  "SettingsManager",
34
34
  "TimeTools",
35
35
  "cache",
bear_utils/__main__.py ADDED
@@ -0,0 +1,14 @@
1
+ """Entry-point module, in case you use `python -m bear_utils`.
2
+
3
+ Why does this file exist, and why `__main__`? For more info, read:
4
+
5
+ - https://www.python.org/dev/peps/pep-0338/
6
+ - https://docs.python.org/3/using/cmdline.html#cmdoption-m
7
+ """
8
+
9
+ import sys
10
+
11
+ from bear_utils._internal.cli import main
12
+
13
+ if __name__ == "__main__":
14
+ sys.exit(main(sys.argv[1:]))
File without changes
@@ -0,0 +1,73 @@
1
+ # Why does this file exist, and why not put this in `__main__`?
2
+ #
3
+ # You might be tempted to import things from `__main__` later,
4
+ # but that will cause problems: the code will get executed twice:
5
+ #
6
+ # - When you run `python -m bear_utils` python will execute
7
+ # `__main__.py` as a script. That means there won't be any
8
+ # `bear_utils.__main__` in `sys.modules`.
9
+ # - When you import `__main__` it will get executed again (as a module) because
10
+ # there's no `bear_utils.__main__` in `sys.modules`.
11
+ from __future__ import annotations
12
+
13
+ from argparse import Action, ArgumentParser, Namespace
14
+ import sys
15
+ from typing import Any
16
+
17
+ from bear_utils._internal import debug
18
+
19
+
20
+ class _DebugInfo(Action):
21
+ def __init__(self, nargs: int | str | None = 0, **kwargs: Any) -> None:
22
+ super().__init__(nargs=nargs, **kwargs)
23
+
24
+ def __call__(self, *_: Any, **__: Any) -> None:
25
+ debug._print_debug_info()
26
+ sys.exit(0)
27
+
28
+
29
+ class _About(Action):
30
+ def __init__(self, nargs: int | str | None = 0, **kwargs: Any) -> None:
31
+ super().__init__(nargs=nargs, **kwargs)
32
+
33
+ def __call__(self, *_: Any, **__: Any) -> None:
34
+ print(debug._get_package_info())
35
+ sys.exit(0)
36
+
37
+
38
+ def get_parser() -> ArgumentParser:
39
+ name: str = debug._get_name()
40
+ version: str = f"{name} v{debug._get_version()}"
41
+ parser = ArgumentParser(description=name.capitalize(), prog=name, exit_on_error=False)
42
+ parser.add_argument("-V", "--version", action="version", version=version)
43
+ parser.add_argument("--about", action=_About, help="Print information about the package")
44
+ parser.add_argument("--debug_info", action=_DebugInfo, help="Print debug information")
45
+ return parser
46
+
47
+
48
+ def main(args: list[str] | None = None) -> int:
49
+ """Main entry point for the CLI.
50
+
51
+ This function is called when the CLI is executed. It can be used to
52
+ initialize the CLI, parse arguments, and execute commands.
53
+
54
+ Args:
55
+ args (list[str] | None): A list of command-line arguments. If None, uses sys.argv[1:].
56
+
57
+ Returns:
58
+ int: Exit code of the CLI execution. 0 for success, non-zero for failure.
59
+ """
60
+ if args is None:
61
+ args = sys.argv[1:]
62
+ try:
63
+ parser: ArgumentParser = get_parser()
64
+ opts: Namespace = parser.parse_args(args)
65
+ print(opts)
66
+ except Exception as e:
67
+ print(f"Error initializing CLI: {e}", file=sys.stderr)
68
+ return 1
69
+ return 0
70
+
71
+
72
+ if __name__ == "__main__":
73
+ main()
@@ -0,0 +1,159 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ import importlib.metadata
5
+ from importlib.metadata import PackageNotFoundError, metadata, version
6
+ import os
7
+ import platform
8
+ import sys
9
+
10
+ __PACKAGE_NAME__ = "bear-utils"
11
+
12
+
13
+ @dataclass
14
+ class _Package:
15
+ """Dataclass to store package information."""
16
+
17
+ name: str = __PACKAGE_NAME__
18
+ """Package name."""
19
+ version: str = "0.0.0"
20
+ """Package version."""
21
+ description: str = "No description available."
22
+ """Package description."""
23
+
24
+ def __str__(self) -> str:
25
+ """String representation of the package information."""
26
+ return f"{self.name} v{self.version}: {self.description}"
27
+
28
+
29
+ @dataclass
30
+ class _Variable:
31
+ """Dataclass describing an environment variable."""
32
+
33
+ name: str
34
+ """Variable name."""
35
+ value: str
36
+ """Variable value."""
37
+
38
+
39
+ @dataclass
40
+ class _Environment:
41
+ """Dataclass to store environment information."""
42
+
43
+ interpreter_name: str
44
+ """Python interpreter name."""
45
+ interpreter_version: str
46
+ """Python interpreter version."""
47
+ interpreter_path: str
48
+ """Path to Python executable."""
49
+ platform: str
50
+ """Operating System."""
51
+ packages: list[_Package]
52
+ """Installed packages."""
53
+ variables: list[_Variable]
54
+ """Environment variables."""
55
+
56
+
57
+ def _interpreter_name_version() -> tuple[str, str]:
58
+ if hasattr(sys, "implementation"):
59
+ impl = sys.implementation.version
60
+ version = f"{impl.major}.{impl.minor}.{impl.micro}"
61
+ kind = impl.releaselevel
62
+ if kind != "final":
63
+ version += kind[0] + str(impl.serial)
64
+ return sys.implementation.name, version
65
+ return "", "0.0.0"
66
+
67
+
68
+ def _get_package_info(dist: str = __PACKAGE_NAME__) -> _Package:
69
+ try:
70
+ return _Package(
71
+ name=dist,
72
+ version=version(dist),
73
+ description=metadata(dist)["Summary"],
74
+ )
75
+ except PackageNotFoundError:
76
+ return _Package(name=dist)
77
+
78
+
79
+ def _get_name(dist: str = __PACKAGE_NAME__) -> str:
80
+ """Get name of the given distribution.
81
+
82
+ Parameters:
83
+ dist: A distribution name.
84
+
85
+ Returns:
86
+ A package name.
87
+ """
88
+ return _get_package_info(dist).name
89
+
90
+
91
+ def _get_version(dist: str = __PACKAGE_NAME__) -> str:
92
+ """Get version of the given distribution.
93
+
94
+ Parameters:
95
+ dist: A distribution name.
96
+
97
+ Returns:
98
+ A version number.
99
+ """
100
+ return _get_package_info(dist).version
101
+
102
+
103
+ def _get_description(dist: str = __PACKAGE_NAME__) -> str:
104
+ """Get description of the given distribution.
105
+
106
+ Parameters:
107
+ dist: A distribution name.
108
+
109
+ Returns:
110
+ A description string.
111
+ """
112
+ return _get_package_info(dist).description
113
+
114
+
115
+ def _get_debug_info() -> _Environment:
116
+ """Get debug/environment information.
117
+
118
+ Returns:
119
+ Environment information.
120
+ """
121
+ py_name, py_version = _interpreter_name_version()
122
+ packages: list[str] = [__PACKAGE_NAME__]
123
+ variables: list[str] = [
124
+ "PYTHONPATH",
125
+ *[var for var in os.environ if var.startswith(__PACKAGE_NAME__.replace("-", "_"))],
126
+ ]
127
+ return _Environment(
128
+ interpreter_name=py_name,
129
+ interpreter_version=py_version,
130
+ interpreter_path=sys.executable,
131
+ platform=platform.platform(),
132
+ variables=[_Variable(var, val) for var in variables if (val := os.getenv(var))],
133
+ packages=[_Package(pkg, _get_version(pkg)) for pkg in packages],
134
+ )
135
+
136
+
137
+ def get_installed_packages() -> list[_Package]:
138
+ """Get all installed packages in current environment"""
139
+ packages = []
140
+ for dist in importlib.metadata.distributions():
141
+ packages.append({"name": dist.metadata["Name"], "version": dist.version})
142
+ return packages
143
+
144
+
145
+ def _print_debug_info() -> None:
146
+ """Print debug/environment information."""
147
+ info: _Environment = _get_debug_info()
148
+ print(f"- __System__: {info.platform}")
149
+ print(f"- __Python__: {info.interpreter_name} {info.interpreter_version} ({info.interpreter_path})")
150
+ print("- __Environment variables__:")
151
+ for var in info.variables:
152
+ print(f" - `{var.name}`: `{var.value}`")
153
+ print("- __Installed packages__:")
154
+ for pkg in info.packages:
155
+ print(f" - `{pkg.name}` v{pkg.version}")
156
+
157
+
158
+ if __name__ == "__main__":
159
+ _print_debug_info()
@@ -5,7 +5,7 @@ from typing import Any, cast
5
5
 
6
6
  from rich.markdown import Markdown
7
7
 
8
- from bear_utils.logging import BaseLogger
8
+ from bear_utils.logger_manager import BaseLogger
9
9
 
10
10
  from ._common import GPT_4_1_NANO, PRODUCTION_MODE, TESTING_MODE, AIModel, EnvironmentMode
11
11
  from ._config import AIEndpointConfig
@@ -1,6 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
 
3
- from bear_utils.logging import BaseLogger
3
+ from bear_utils.logger_manager import BaseLogger
4
4
 
5
5
 
6
6
  class ResponseParser[T_Response](ABC):
@@ -8,7 +8,7 @@ from prompt_toolkit.validation import ValidationError, Validator
8
8
 
9
9
  from bear_utils.constants._exceptions import UserCancelledError
10
10
  from bear_utils.constants._lazy_typing import LitBool, LitFloat, LitInt, LitStr, OptBool, OptFloat, OptInt, OptStr
11
- from bear_utils.logging.loggers import get_console
11
+ from bear_utils.logger_manager import get_console
12
12
 
13
13
  # TODO: Overhaul this trash, it is written like absolute garbage.
14
14
 
@@ -14,7 +14,7 @@ from subprocess import CompletedProcess
14
14
  from typing import Self, override
15
15
 
16
16
  from bear_utils.constants.logger_protocol import LoggerProtocol
17
- from bear_utils.logging import VERBOSE, BaseLogger, SubConsoleLogger
17
+ from bear_utils.logger_manager import VERBOSE, BaseLogger, SubConsoleLogger
18
18
 
19
19
  from ._base_command import BaseShellCommand
20
20
  from ._common import DEFAULT_SHELL
@@ -9,11 +9,11 @@ from typing import Any, Self
9
9
  from tinydb import Query, TinyDB
10
10
 
11
11
 
12
- def get_bear_config_path() -> Path:
13
- """Get the path to the bear configuration path"""
14
- path: Path = Path.home() / ".config" / "bear_utils"
15
- path.mkdir(parents=True, exist_ok=True)
16
- return path
12
+ def get_config_folder() -> Path:
13
+ """Get the path to the bear configuration directory."""
14
+ config_path: Path = Path.home() / ".bear_utils"
15
+ config_path.mkdir(parents=True, exist_ok=True)
16
+ return config_path
17
17
 
18
18
 
19
19
  class SettingsManager:
@@ -21,11 +21,12 @@ class SettingsManager:
21
21
 
22
22
  __slots__ = ("cache", "db", "file_path", "settings_name")
23
23
 
24
- def __init__(self, settings_name: str) -> None:
24
+ def __init__(self, settings_name: str, folder_path: str | Path | None = None) -> None:
25
25
  """Initialize the SettingsManager with a specific settings name."""
26
- self.settings_name = settings_name
26
+ self.settings_name: str = settings_name
27
27
  self.cache: dict[str, Any] = {}
28
- self.file_path: Path = get_bear_config_path() / f"{settings_name}.json"
28
+ file_name: str = f"{settings_name}.json"
29
+ self.file_path: Path = Path(folder_path) / file_name if folder_path else get_config_folder() / file_name
29
30
  self.db: TinyDB = TinyDB(self.file_path, indent=4, ensure_ascii=False)
30
31
 
31
32
  atexit.register(self.close)
@@ -8,7 +8,7 @@ from typing import TYPE_CHECKING
8
8
  from bear_utils.cli.shell._base_command import BaseShellCommand as ShellCommand
9
9
  from bear_utils.cli.shell._base_shell import AsyncShellSession
10
10
  from bear_utils.extras.platform_utils import OS, get_platform
11
- from bear_utils.logging.logger_manager.loggers._base_logger import BaseLogger
11
+ from bear_utils.logger_manager.loggers._base_logger import BaseLogger
12
12
 
13
13
  if TYPE_CHECKING:
14
14
  from subprocess import CompletedProcess
@@ -17,7 +17,7 @@ if TYPE_CHECKING:
17
17
  class TextHelper:
18
18
  @cached_property
19
19
  def local_console(self) -> BaseLogger:
20
- from bear_utils.logging.loggers import BaseLogger # noqa: PLC0415
20
+ from bear_utils.logger_manager import BaseLogger # noqa: PLC0415
21
21
 
22
22
  init: bool = not BaseLogger.has_instance()
23
23
  return BaseLogger.get_instance(init=init)
@@ -1 +1,9 @@
1
1
  """A module for handling responses for functions, methods, and classes in Bear Utils."""
2
+
3
+ from .function_response import FAILURE, SUCCESS, FunctionResponse
4
+
5
+ __all__ = [
6
+ "FAILURE",
7
+ "SUCCESS",
8
+ "FunctionResponse",
9
+ ]
@@ -5,12 +5,11 @@ from __future__ import annotations
5
5
  from io import StringIO
6
6
  import json
7
7
  from subprocess import CompletedProcess
8
- from typing import TYPE_CHECKING, Any, Literal, Self, overload
8
+ from typing import Any, Literal, Self, overload
9
9
 
10
10
  from pydantic import BaseModel, Field, field_validator
11
11
 
12
- if TYPE_CHECKING:
13
- from bear_utils.constants.logger_protocol import LoggerProtocol
12
+ from bear_utils.constants.logger_protocol import LoggerProtocol # noqa: TC001 # DO NOT PUT INTO A TYPE_CHECKING BLOCK
14
13
 
15
14
  SUCCESS: list[str] = ["name", "success"]
16
15
  FAILURE: list[str] = ["name"]
@@ -130,6 +129,25 @@ class FunctionResponse(BaseModel):
130
129
  """Check if the response indicates success."""
131
130
  return self.returncode == 0
132
131
 
132
+ def sub_task(
133
+ self,
134
+ name: str = "",
135
+ content: str | list[str] = "",
136
+ error: str | list[str] = "",
137
+ extra: dict[str, Any] | None = None,
138
+ returncode: int | None = None,
139
+ log_output: bool = False,
140
+ ) -> None:
141
+ """Add a sub-task response to the FunctionResponse."""
142
+ func_response: FunctionResponse = FunctionResponse(name=name, logger=self.logger).add(
143
+ content=content,
144
+ error=error,
145
+ returncode=returncode or self.returncode,
146
+ log_output=log_output,
147
+ extra=extra,
148
+ )
149
+ self.add(content=func_response)
150
+
133
151
  def successful(
134
152
  self,
135
153
  content: str | list[str] | CompletedProcess,
@@ -184,6 +202,19 @@ class FunctionResponse(BaseModel):
184
202
  except Exception as e:
185
203
  raise ValueError(f"Failed to add content: {e!s}") from e
186
204
 
205
+ def _handle_function_response(self, func_response: FunctionResponse) -> None:
206
+ """Handle a FunctionResponse object and update the current response."""
207
+ if func_response.extra:
208
+ self.extra.update(func_response.extra)
209
+ self._add_to_error(error=func_response.error, name=func_response.name)
210
+ self._add_to_content(content=func_response.content, name=func_response.name)
211
+
212
+ def _handle_completed_process(self, result: CompletedProcess[str]) -> None:
213
+ """Handle a CompletedProcess object and update the FunctionResponse."""
214
+ self._add_to_content(content=result.stdout.strip() if result.stdout else "")
215
+ self._add_to_error(error=result.stderr.strip() if result.stderr else "")
216
+ self.returncode = result.returncode
217
+
187
218
  def add(
188
219
  self,
189
220
  content: list[str] | str | FunctionResponse | CompletedProcess | None = None,
@@ -205,45 +236,49 @@ class FunctionResponse(BaseModel):
205
236
  Self: The updated FunctionResponse instance.
206
237
  """
207
238
  try:
208
- if isinstance(content, FunctionResponse):
209
- if content.extra:
210
- self.extra.update(content.extra)
211
- self._add_to_error(error=content.error, name=content.name)
212
- self._add_to_content(content=content.content, name=content.name)
213
- self.number_of_tasks += 1
214
- elif isinstance(content, CompletedProcess):
215
- result: CompletedProcess[str] = content
216
- self._add_to_content(content=result.stdout.strip() if result.stdout else "")
217
- self._add_to_error(error=result.stderr.strip() if result.stderr else "")
218
- self.returncode = result.returncode
219
- self.number_of_tasks += 1
220
- elif isinstance(content, str | list):
221
- self._add_to_content(content=content)
222
- self.number_of_tasks += 1
223
- if isinstance(error, str | list):
224
- self._add_to_error(error=error)
225
- if returncode is not None:
226
- self.returncode = returncode
227
- if extra is not None and isinstance(extra, dict):
228
- self.extra.update(extra)
229
- if log_output and self.logger is not None:
230
- if content is not None and error is None:
231
- if isinstance(content, list):
232
- for item in content:
233
- self.logger.info(message=f"{self.name}: {item}" if self.name else item)
234
- elif isinstance(content, str):
235
- self.logger.info(message=f"{self.name}: {content}" if self.name else content)
236
- elif error is not None and content is None:
237
- if isinstance(error, list):
238
- for err in error:
239
- self.logger.error(message=f"{self.name}: {err}" if self.name else err)
240
- elif isinstance(error, str):
241
- self.logger.error(message=f"{self.name}: {error}" if self.name else error)
242
-
239
+ match content:
240
+ case FunctionResponse():
241
+ self._handle_function_response(func_response=content)
242
+ self.number_of_tasks += 1
243
+ case CompletedProcess():
244
+ self._handle_completed_process(result=content)
245
+ self.number_of_tasks += 1
246
+ case str() | list() if content:
247
+ self._add_to_content(content=content)
248
+ self.number_of_tasks += 1
249
+ case None:
250
+ content = None
251
+ case _:
252
+ content = None
253
+ self._add_to_error(error=error) if isinstance(error, (str | list)) else None
254
+ self.returncode = returncode if returncode is not None else self.returncode
255
+ self.extra.update(extra) if isinstance(extra, dict) else None
256
+ if log_output and self.logger is not None and (content is not None or error is not None):
257
+ self._log_handling(content=content, error=error, logger=self.logger)
243
258
  except Exception as e:
244
259
  raise ValueError(f"Failed to add content: {e!s}") from e
245
260
  return self
246
261
 
262
+ def _log_handling(
263
+ self,
264
+ content: list[str] | str | FunctionResponse | CompletedProcess | None,
265
+ error: str | list[str] | None,
266
+ logger: LoggerProtocol,
267
+ ) -> None:
268
+ """Log the content and error messages if they exist."""
269
+ if content is not None and error is None:
270
+ if isinstance(content, list):
271
+ for item in content:
272
+ logger.info(message=f"{self.name}: {item}" if self.name else item)
273
+ elif isinstance(content, str):
274
+ logger.info(message=f"{self.name}: {content}" if self.name else content)
275
+ elif error is not None and content is None:
276
+ if isinstance(error, list):
277
+ for err in error:
278
+ logger.error(message=f"{self.name}: {err}" if self.name else err)
279
+ elif isinstance(error, str):
280
+ logger.error(message=f"{self.name}: {error}" if self.name else error)
281
+
247
282
  @overload
248
283
  def done(self, to_dict: Literal[True], suppress: list[str] | None = None) -> dict[str, Any]: ...
249
284
 
@@ -8,12 +8,6 @@ P = ParamSpec("P")
8
8
  R = TypeVar("R")
9
9
 
10
10
 
11
- def check_data_type(data: dict[str, Any] | str, valid_types: tuple[type, ...]) -> None:
12
- """Check if the data is of a valid type for text files."""
13
- if not isinstance(data, valid_types):
14
- raise TypeError(f"Data must be one of {valid_types}, got {type(data)}")
15
-
16
-
17
11
  class FileHandler(ABC):
18
12
  """Abstract class for file handling with read, write, and present methods
19
13
 
@@ -40,7 +34,7 @@ class FileHandler(ABC):
40
34
  return file_path.suffix.lstrip(".") in cls.valid_extensions
41
35
 
42
36
  @classmethod
43
- def check_data_type(cls, data: Any) -> Any:
37
+ def check_data_type(cls, data: dict[str, Any] | str, valid_types: tuple[type, ...]) -> None:
44
38
  """Check if the data is of the correct type.
45
39
 
46
40
  Args:
@@ -49,8 +43,8 @@ class FileHandler(ABC):
49
43
  Returns:
50
44
  bool: True if the data is of the correct type, False otherwise
51
45
  """
52
- if not isinstance(data, cls.valid_types):
53
- raise TypeError(f"Data must be one of {cls.valid_types}, got {type(data)}")
46
+ if not isinstance(data, valid_types):
47
+ raise TypeError(f"Data must be one of {valid_types}, got {type(data)}")
54
48
 
55
49
  @classmethod
56
50
  def ValidateFileType(cls, method: Callable[P, R]) -> Callable[P, R]: # noqa: N802 disable=invalid-name
@@ -4,7 +4,7 @@ import json
4
4
  from pathlib import Path
5
5
  from typing import Any, ClassVar, overload
6
6
 
7
- from ._base_file_handler import FileHandler, check_data_type
7
+ from ._base_file_handler import FileHandler
8
8
 
9
9
 
10
10
  class JsonFileHandler(FileHandler):
@@ -44,7 +44,7 @@ class JsonFileHandler(FileHandler):
44
44
  """Write data to a JSON file."""
45
45
  try:
46
46
  super().write_file(file_path=file_path, data=data)
47
- check_data_type(data=data, valid_types=self.valid_types)
47
+ self.check_data_type(data=data, valid_types=self.valid_types)
48
48
  data = self.present_file(data, indent=indent, sort_keys=sort_keys)
49
49
  file_path.write_text(data=data, encoding="utf-8")
50
50
  except Exception as e:
@@ -3,7 +3,7 @@
3
3
  from pathlib import Path
4
4
  from typing import Any, ClassVar, cast
5
5
 
6
- from ._base_file_handler import FileHandler, check_data_type
6
+ from ._base_file_handler import FileHandler
7
7
 
8
8
 
9
9
  class LogFileHandler(FileHandler):
@@ -27,7 +27,7 @@ class LogFileHandler(FileHandler):
27
27
  """Write data to a log file."""
28
28
  try:
29
29
  super().write_file(file_path=file_path, data=data)
30
- check_data_type(data=data, valid_types=self.valid_types)
30
+ self.check_data_type(data=data, valid_types=self.valid_types)
31
31
  with open(file_path, "w", encoding="utf-8") as file:
32
32
  file.write(cast("str", data))
33
33
  except Exception as e:
@@ -30,7 +30,7 @@ class TomlFileHandler(FileHandler):
30
30
  """Write data to a TOML file."""
31
31
  try:
32
32
  super().write_file(file_path=file_path, data=data)
33
-
33
+ self.check_data_type(data=data, valid_types=self.valid_types)
34
34
  with open(file_path, "w", encoding="utf-8") as file:
35
35
  if isinstance(data, dict):
36
36
  toml.dump(data, file, **kwargs)
@@ -4,7 +4,7 @@ import json
4
4
  from pathlib import Path
5
5
  from typing import Any, ClassVar, overload
6
6
 
7
- from ._base_file_handler import FileHandler, check_data_type
7
+ from ._base_file_handler import FileHandler
8
8
 
9
9
 
10
10
  class TextFileHandler(FileHandler):
@@ -44,7 +44,7 @@ class TextFileHandler(FileHandler):
44
44
  """Write data to a text file."""
45
45
  try:
46
46
  super().write_file(file_path=file_path, data=data)
47
- check_data_type(data, self.valid_types)
47
+ self.check_data_type(data=data, valid_types=self.valid_types)
48
48
  if isinstance(data, dict):
49
49
  data = json.dumps(data, indent=indent, sort_keys=sort_keys)
50
50
  elif isinstance(data, list):
@@ -50,6 +50,7 @@ class YamlFileHandler(FileHandler):
50
50
  """Write data to a YAML file."""
51
51
  try:
52
52
  super().write_file(file_path=file_path, data=data)
53
+ self.check_data_type(data=data, valid_types=self.valid_types)
53
54
  with open(file=file_path, mode="w", encoding="utf-8") as file:
54
55
  yaml.dump(data, stream=file, default_flow_style=False, sort_keys=False, **kwargs)
55
56
  except Exception as e:
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from pathspec import PathSpec
7
7
 
8
8
  from bear_utils.cli.prompt_helpers import ask_yes_no
9
- from bear_utils.logging import ConsoleLogger
9
+ from bear_utils.logger_manager import ConsoleLogger
10
10
 
11
11
  logger: ConsoleLogger = ConsoleLogger.get_instance(init=True)
12
12
 
@@ -9,7 +9,7 @@ from PyQt6.QtCore import QCoreApplication, QObject, Qt
9
9
  from PyQt6.QtGui import QAction, QIcon, QKeySequence, QShortcut
10
10
  from PyQt6.QtWidgets import QApplication, QDialog, QLabel, QMenu, QMenuBar, QMessageBox, QVBoxLayout
11
11
 
12
- from bear_utils.logging import VERBOSE, ConsoleLogger
12
+ from bear_utils.logger_manager import VERBOSE, ConsoleLogger
13
13
 
14
14
  from ._types import ActionHolder
15
15
 
@@ -1,10 +1,12 @@
1
- """A module for logging utilities."""
1
+ """Logging utilities for Bear Utils."""
2
2
 
3
- from .logger_manager.loggers._base_logger import BaseLogger
4
- from .logger_manager.loggers._buffer_logger import BufferLogger
5
- from .logger_manager.loggers._console_logger import ConsoleLogger
6
- from .logger_manager.loggers._file_logger import FileLogger
7
- from .logger_manager.loggers._sub_logger import SubConsoleLogger
3
+ from bear_utils.logger_manager._common import VERBOSE_CONSOLE_FORMAT
4
+ from bear_utils.logger_manager._styles import VERBOSE
5
+ from bear_utils.logger_manager.loggers._base_logger import BaseLogger
6
+ from bear_utils.logger_manager.loggers._buffer_logger import BufferLogger
7
+ from bear_utils.logger_manager.loggers._console_logger import ConsoleLogger
8
+ from bear_utils.logger_manager.loggers._file_logger import FileLogger
9
+ from bear_utils.logger_manager.loggers._sub_logger import SubConsoleLogger
8
10
 
9
11
  AllLoggers = BaseLogger | ConsoleLogger | SubConsoleLogger
10
12
  Loggers = BaseLogger | ConsoleLogger
@@ -70,3 +72,17 @@ def get_sub_logger(logger: BaseLogger | ConsoleLogger, namespace: str) -> SubCon
70
72
  raise TypeError("Expected logger to be an instance of BaseLogger or ConsoleLogger")
71
73
 
72
74
  return SubConsoleLogger(logger=logger, namespace=namespace)
75
+
76
+
77
+ __all__ = [
78
+ "VERBOSE",
79
+ "VERBOSE_CONSOLE_FORMAT",
80
+ "BaseLogger",
81
+ "BufferLogger",
82
+ "ConsoleLogger",
83
+ "FileLogger",
84
+ "SubConsoleLogger",
85
+ "get_console",
86
+ "get_logger",
87
+ "get_sub_logger",
88
+ ]
@@ -11,8 +11,8 @@ from rich.theme import Theme
11
11
  from rich.traceback import Traceback
12
12
  from singleton_base import SingletonBase
13
13
 
14
- from bear_utils.logging.logger_manager._common import ExecValues, StackLevelTracker
15
- from bear_utils.logging.logger_manager._styles import DEFAULT_THEME, LOGGER_METHODS, LoggerExtraInfo
14
+ from bear_utils.logger_manager._common import ExecValues, StackLevelTracker
15
+ from bear_utils.logger_manager._styles import DEFAULT_THEME, LOGGER_METHODS, LoggerExtraInfo
16
16
 
17
17
  from ._level_sin import INFO, add_level_name, check_level, lvl_exists
18
18
  from ._sub_logger import SubConsoleLogger
@@ -7,7 +7,7 @@ from rich.theme import Theme
7
7
  from rich.traceback import Traceback
8
8
  from singleton_base import SingletonBase
9
9
 
10
- from bear_utils.logging.logger_manager._common import ExecValues, StackLevelTracker
10
+ from bear_utils.logger_manager._common import ExecValues, StackLevelTracker
11
11
 
12
12
  from ._sub_logger import SubConsoleLogger
13
13
 
@@ -11,8 +11,8 @@ from rich.text import Text
11
11
  from rich.theme import Theme
12
12
 
13
13
  from bear_utils.constants.date_related import DATE_TIME_FORMAT
14
- from bear_utils.logging.logger_manager._common import FIVE_MEGABYTES, VERBOSE_CONSOLE_FORMAT, VERBOSE_FORMAT, ExecValues
15
- from bear_utils.logging.logger_manager._console_junk import ConsoleBuffering, ConsoleFormatter, ConsoleHandler
14
+ from bear_utils.logger_manager._common import FIVE_MEGABYTES, VERBOSE_CONSOLE_FORMAT, VERBOSE_FORMAT, ExecValues
15
+ from bear_utils.logger_manager._console_junk import ConsoleBuffering, ConsoleFormatter, ConsoleHandler
16
16
 
17
17
  from ._base_logger import BaseLogger
18
18
 
@@ -5,7 +5,7 @@ from typing import Any
5
5
  from rich.text import Text
6
6
  from rich.theme import Theme
7
7
 
8
- from bear_utils.logging.logger_manager._console_junk import ConsoleBuffering, ConsoleHandler
8
+ from bear_utils.logger_manager._console_junk import ConsoleBuffering, ConsoleHandler
9
9
 
10
10
  from ._base_logger import BaseLogger
11
11
  from ._sub_logger import SubConsoleLogger
@@ -4,13 +4,13 @@ from typing import TYPE_CHECKING, Any, override
4
4
 
5
5
  from rich.theme import Theme
6
6
 
7
- from bear_utils.logging.logger_manager._common import FIVE_MEGABYTES
7
+ from bear_utils.logger_manager._common import FIVE_MEGABYTES
8
8
 
9
9
  from ._console_logger import ConsoleLogger
10
10
  from ._sub_logger import SubConsoleLogger
11
11
 
12
12
  if TYPE_CHECKING:
13
- from bear_utils.logging.logger_manager._styles import LoggerExtraInfo
13
+ from bear_utils.logger_manager._styles import LoggerExtraInfo
14
14
 
15
15
 
16
16
  class FileLogger(ConsoleLogger):
@@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any, Generic, TypeVar
9
9
 
10
10
  from rich.text import Text
11
11
 
12
- from bear_utils.logging.logger_manager._styles import LOGGER_METHODS, LoggerExtraInfo
12
+ from bear_utils.logger_manager._styles import LOGGER_METHODS, LoggerExtraInfo
13
13
 
14
14
  from ._level_sin import check_level
15
15
 
@@ -9,7 +9,7 @@ from dataclasses import dataclass
9
9
  import subprocess
10
10
  from typing import TYPE_CHECKING, Literal, Self, TypedDict, cast, overload
11
11
 
12
- from bear_utils.logging.loggers import get_console
12
+ from bear_utils.logger_manager import get_console
13
13
  from bear_utils.monitoring._common import CPU, CPU_MEM, DISK, GPU, MEM, TaskChoice
14
14
 
15
15
  ROLLING_AVERAGE_TIME = 300
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bear-utils
3
- Version: 0.7.23
3
+ Version: 0.8.0
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
@@ -20,7 +20,7 @@ Requires-Dist: tinydb>=4.8.2
20
20
  Requires-Dist: toml>=0.10.2
21
21
  Description-Content-Type: text/markdown
22
22
 
23
- # Bear Utils v# Bear Utils v0.7.23
23
+ # Bear Utils v# Bear Utils v0.8.0
24
24
 
25
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.
26
26
 
@@ -1,22 +1,26 @@
1
- bear_utils/__init__.py,sha256=0pxXi4iMbFDxJQA2n9fgM9G2qjy62UZjmEHNKc_iF8M,1146
1
+ bear_utils/__init__.py,sha256=T-lPXm-iGMOBz2JShR_nSRiIZ9k63e80hCxP37n83mU,1248
2
+ bear_utils/__main__.py,sha256=-FlPquBlI1Tg2RoeX6d0Z8jTAiMFnJ0V06ZeRyiq58k,355
3
+ bear_utils/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ bear_utils/_internal/cli.py,sha256=w3Cj8AM4iW5FNyM3ffCkBmwRoCWHc4JNYF26A35cxzw,2447
5
+ bear_utils/_internal/debug.py,sha256=_Y2UzSuKqLYqNekuDR4NTE3CST5c4TnUHKnTRQ421Jk,4277
2
6
  bear_utils/ai/__init__.py,sha256=Q5P1KpSYS6iMt3vRbmasdWU5Oy5UkXfOGGyDI7Qy3Po,747
3
- bear_utils/ai/ai_helpers/__init__.py,sha256=g7Y7bnil6kYj8llA7GxEi9n0mXD-46jAlMh8U0-B1IY,4344
7
+ bear_utils/ai/ai_helpers/__init__.py,sha256=6SiOQ71NNGvIkMX8pMnZ3lxK9WDZ2Zgo3P6TRS5pvP4,4351
4
8
  bear_utils/ai/ai_helpers/_common.py,sha256=KgaOb_IePfC8Z1VsdA0EiodfS_YGVYYnrZFR2ZdsUYM,418
5
9
  bear_utils/ai/ai_helpers/_config.py,sha256=UX7wPIiEr2Uqt2kZWtMaYagmRFmUsQKSuopQ41XW53I,774
6
10
  bear_utils/ai/ai_helpers/_parsers.py,sha256=KlkhLHru6eivy37di9sSlxZdttPEMKRnt08nJeYmuhk,8161
7
- bear_utils/ai/ai_helpers/_types.py,sha256=UeCc-eIAnZAQ9j5mZXXD-JrnQpUE5BDlNiu7jZSZOQs,458
11
+ bear_utils/ai/ai_helpers/_types.py,sha256=rmnl8mTlUj0LyL9USzTb-EN_31TtXY6qzhkOEuHjvBI,465
8
12
  bear_utils/cache/__init__.py,sha256=c9z1mLhWpZJHZdXRlviYQXl8tc9KTJCM8vin3moDO3I,4578
9
13
  bear_utils/cli/__init__.py,sha256=H2QpLyHpQS_Yn3sF2px7n4KqT97LEe7Oyzafg2iHcpc,503
10
14
  bear_utils/cli/commands.py,sha256=5ppEjvVV_g28WLaIFtKgz-ctzwoo-g-KpHTXNx9xBzo,3161
11
- bear_utils/cli/prompt_helpers.py,sha256=dHs7qToSKWQEe_iPshDJglg48OdjJXbNHSCA_3rjmHg,6581
15
+ bear_utils/cli/prompt_helpers.py,sha256=DVdg1f5yZElVyFNao6RTPfrc6mKy4PoXLgY6az-ejo8,6580
12
16
  bear_utils/cli/shell/__init__.py,sha256=2s3oR6CqLKj1iyERy7YafWT3t3KzTr70Z1yaLKa6IiQ,42
13
17
  bear_utils/cli/shell/_base_command.py,sha256=eqvYSXR_NqWqJm5meGTONYJGSG32q0AQDfTGums2hI0,2471
14
- bear_utils/cli/shell/_base_shell.py,sha256=mZ67s_hEa-ouFwEYnW5ddwohKxE6rQ4OZqi5vth4-7U,16730
18
+ bear_utils/cli/shell/_base_shell.py,sha256=FGlXshVVEGXXB0CYcoLZd_tLn4-AVXP0qLt01yRaoQw,16737
15
19
  bear_utils/cli/shell/_common.py,sha256=_KQyL5lvqOfjonFIwlEOyp3K9G3TSOj19RhgVzfNNpg,669
16
20
  bear_utils/config/__init__.py,sha256=HC_lWpmLF0kbPr5i1Wa2FLER2b446E_GecgU9EPmc04,353
17
21
  bear_utils/config/config_manager.py,sha256=Xj0xOmY-wo_rwfcWiXyxNZWX9NknX_Jm9W56Gx8yyHQ,8244
18
22
  bear_utils/config/dir_manager.py,sha256=slIy1oRr7VIPdsiwN66-xQiuSvgqm_j6d1IrKhxRsSk,2028
19
- bear_utils/config/settings_manager.py,sha256=1mKpGGYgKrtRGp2Y_xvCSIYMW79QS95LtZpv1TVK_7A,5041
23
+ bear_utils/config/settings_manager.py,sha256=2j_79RI2_WJjavOdlJOEDNlgQCnoISt6_mE9spEVLTE,5180
20
24
  bear_utils/constants/__init__.py,sha256=fE3p01HDJDV9uAMWYB8q8h7K01ekSqZPxymvgbNaN7Y,563
21
25
  bear_utils/constants/_exceptions.py,sha256=gnAGTmuD9NYpJakeLrYHAyPrAQPHDNahY_rS42Ct39k,251
22
26
  bear_utils/constants/_lazy_typing.py,sha256=WfuWpRqx9XchvuyPWg3tVjMC5-C4QA-Bhwfskf4YmAE,339
@@ -30,22 +34,22 @@ bear_utils/events/events_class.py,sha256=vPDjWrbut8L3TFn7byyYFZpWYM5ADIqtW2Aeh-q
30
34
  bear_utils/events/events_module.py,sha256=rv9NoCDFOaYY70EilrImG9ug90n_wpDBDz4XvxUYqdE,2291
31
35
  bear_utils/extras/__init__.py,sha256=szflSapj7aGFc2j5sTitQFccXu-6_UdGG-eYuv6zVJI,607
32
36
  bear_utils/extras/_async_helpers.py,sha256=cxq5d24NHkECmZqTVXEazv6K-XUa7skFnX6KQZb0Ycw,411
33
- bear_utils/extras/_tools.py,sha256=OYzGEEp7F6H6qr1t1QlnHTnAb4JaH6p9_maSXeDGFFM,7681
37
+ bear_utils/extras/_tools.py,sha256=kxJ1jaqx3PvLpc0CZUIV8XQUwjQGrNCRLoka11aNtoc,7672
34
38
  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
39
+ bear_utils/extras/responses/__init__.py,sha256=XbE4VKemrKRwx9E5jqy__OiM_AAjA58ebnqQ2hytnT0,225
40
+ bear_utils/extras/responses/function_response.py,sha256=Zis2uIpGp3Mqbpc0RszyNt2JSsLAiGmWKhgezLjzUTM,14153
37
41
  bear_utils/extras/wrappers/__init__.py,sha256=crh4sKOLvuhNMVX5bJYjCFWtXtH7G47UgNPOHq3HXTk,43
38
42
  bear_utils/extras/wrappers/add_methods.py,sha256=z2XZG2ZoYOB1MaGiLli4NRyyTeRgBy7tuYsiy8mTa9s,4422
39
43
  bear_utils/files/__init__.py,sha256=mIdnFSXoDE64ElM43bN2m6KuafURnN82ki0pdqN8q2o,201
40
- bear_utils/files/ignore_parser.py,sha256=ipBqUH5ndipPSq27TEsGDa7Sqq53KrczGLZcnNbW9F0,10951
44
+ bear_utils/files/ignore_parser.py,sha256=2KlbfbEn012KGMqW4TdcV6jFbHXGmuCmA5DjjmIZ6_Y,10958
41
45
  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
46
+ bear_utils/files/file_handlers/_base_file_handler.py,sha256=Fl45rAuKSY-fVYBP-7o7op6thXlX8FLQbgwXEt4gDLQ,3726
43
47
  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
48
+ bear_utils/files/file_handlers/json_file_handler.py,sha256=0kqsG5QErFc3TVbK1I1l4cdzSxT6mYCmNuaW7hpFkYo,2656
49
+ bear_utils/files/file_handlers/log_file_handler.py,sha256=RDPOqNE_ujL_IIjfqi89LXNd4jntQ0bYTGqRVKiC_CU,1530
50
+ bear_utils/files/file_handlers/toml_file_handler.py,sha256=YPC9Y8DEURS9v3lV_iEng6URP0q97oDD74qdN870rhg,2699
51
+ bear_utils/files/file_handlers/txt_file_handler.py,sha256=Et_AxKEb3_XpVfJYIIsrHqvmDNXzzrBjmn2Ost3bPPA,2762
52
+ bear_utils/files/file_handlers/yaml_file_handler.py,sha256=iUFAJle2t67SX6uvPiutjdO8gSU1q_rXrZXH9MnJygg,2536
49
53
  bear_utils/graphics/__init__.py,sha256=uR_NFKfskJGDPT0PGiw38rRniV945H67fvDALxUTnVw,268
50
54
  bear_utils/graphics/bear_gradient.py,sha256=36B9hjU_qDjdgZaVcRl4jE3uQyU8k8G_MiORFzaendE,5272
51
55
  bear_utils/graphics/image_helpers.py,sha256=AaDQm6uunIdVkcMSXmoiaNQ68zRQQJ6bbhoApk6GSKU,1649
@@ -53,31 +57,29 @@ bear_utils/gui/__init__.py,sha256=i699iAUONA7KLN7_kqwV33fUJ5Zr71_qLzqMsSBUles,34
53
57
  bear_utils/gui/gui_tools/__init__.py,sha256=cD6cKxU1cmKDVaBRT8KsqsCbulf6TUNAmVr50XGPpo8,446
54
58
  bear_utils/gui/gui_tools/_settings.py,sha256=xSQ7I-axAifZNvEw_28mnFBFYIJd4xFuDpycFFQLib0,1201
55
59
  bear_utils/gui/gui_tools/_types.py,sha256=krguJ-ccALKeUHz9auh_iyOCzeAuerOYcuhWW8jjJQ0,248
56
- bear_utils/gui/gui_tools/qt_app.py,sha256=JJT1vFkBfiEjKTd9reie2hI6YqIhjmb2pxv7V880gvg,5858
60
+ bear_utils/gui/gui_tools/qt_app.py,sha256=hjZtHNJkCcpfT_KkUV35aa9y92ejEhpAV3AFgd27IbY,5865
57
61
  bear_utils/gui/gui_tools/qt_color_picker.py,sha256=5NtLiBHk5r9Goma_oiymriH49D_JGIk844p4Hsi51io,4744
58
62
  bear_utils/gui/gui_tools/qt_file_handler.py,sha256=FgWdS-9WnjVuyGIC8V30ByDCBeJGZKGc8KRTy34SFfI,4404
59
63
  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=2fwiYjZZps3GrH5An7aU3Bgvb_aAJiqNzTnKaku6m-0,4916
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=SgFrqy1mqC-Lc9p4K13vddyoF77ybKDgsrbo22rhmeM,9509
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=RUFXg3ZhXljw9nAhlSmbzTWr3osddG15pLADvto5y08,9882
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
64
+ bear_utils/logger_manager/__init__.py,sha256=SPzzveSMUqaft2fX-uwQAcfFyoQoUDJCzHN4ZOFz6Mw,3236
65
+ bear_utils/logger_manager/_common.py,sha256=m72yhFmBBgZN7u3omI43AERKQyR9bVwgeHEfbgPJV4Y,1581
66
+ bear_utils/logger_manager/_console_junk.py,sha256=2fwiYjZZps3GrH5An7aU3Bgvb_aAJiqNzTnKaku6m-0,4916
67
+ bear_utils/logger_manager/_styles.py,sha256=3A30TrvPSOm1h2IfHgdDEUc0WP71zWZDGCHrCRofdjc,2523
68
+ bear_utils/logger_manager/loggers/__init__.py,sha256=ashcnkvQIUQDLbUtU6QILkMjP_fMaeHAN1w7pHLWqQk,67
69
+ bear_utils/logger_manager/loggers/_base_logger.py,sha256=64ZzAKjuk4sZG_sUnXPSMjk57OY3GTKu_uc5RIajH_s,9493
70
+ bear_utils/logger_manager/loggers/_base_logger.pyi,sha256=bo_Pykv42XvfBsQ7AmP_e_TEZ7puT_DhLqtqhEWBsc8,2667
71
+ bear_utils/logger_manager/loggers/_buffer_logger.py,sha256=JEd2afChzAKkM1va-L8xVOi1cF9n9W1vGzkI49YEf40,1527
72
+ bear_utils/logger_manager/loggers/_console_logger.py,sha256=bzyTA-DkeokGngl7AIg5zIvLwQUaWTk4NKtlH7P9SW8,9866
73
+ bear_utils/logger_manager/loggers/_console_logger.pyi,sha256=FMoA5ov94IkCh9ovGiBHzY8rF3qrMKB3JxdjWxBxMN8,1866
74
+ bear_utils/logger_manager/loggers/_file_logger.py,sha256=sYWMSRHvwxsPO9IzSVUednzIqZoOeMm_Dds_yAOJtfg,4744
75
+ bear_utils/logger_manager/loggers/_level_sin.py,sha256=HxAhuQSBhJHygTB8hcAIYLoPl6u0pUbF1BZ2aLFmEHI,1747
76
+ bear_utils/logger_manager/loggers/_logger.py,sha256=FA0ALmROX1BQIal7zhEemLnC0UnXTQY-YqJBlPEbQDM,537
77
+ bear_utils/logger_manager/loggers/_sub_logger.py,sha256=vG8-hTrP833Zx-vIj3zBJmrCHNbLnU18CykK4V2X47M,3420
78
+ bear_utils/logger_manager/loggers/_sub_logger.pyi,sha256=rRcmrVFg7dhHO_tNQQXrpF3h4r0CdVyGxC4xtOIemzM,1002
77
79
  bear_utils/monitoring/__init__.py,sha256=9DKNIWTp_voLnaWgiP-wJ-o_N0hYixo-MzjUmg8RUvI,240
78
80
  bear_utils/monitoring/_common.py,sha256=LYQFxgTP9fk0cH71IQTuGwBYYPWCqHP_mMRNecoD76M,657
79
- bear_utils/monitoring/host_monitor.py,sha256=iawDGJWvByUnTanJvgiZMlqSJr3JpEWJdgA99A-fol0,13214
81
+ bear_utils/monitoring/host_monitor.py,sha256=gB7O9mByemCgEozhuet-GYoLNmnc6dAhwFLg38mE4aM,13213
80
82
  bear_utils/time/__init__.py,sha256=d9Ovv-Dlx5NWgnOl1hY-evznVm9hboS6ypNp1wDFxQQ,934
81
- bear_utils-0.7.23.dist-info/METADATA,sha256=wXfmG9H_JcV1OF_uoLJNbIxnVQ2ieEoMXUPa450yTtM,8629
82
- bear_utils-0.7.23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
- bear_utils-0.7.23.dist-info/RECORD,,
83
+ bear_utils-0.8.0.dist-info/METADATA,sha256=Uhl6l-Dosdt0M5s9g-fj3autylViA8JX6e9aO6WvjH0,8627
84
+ bear_utils-0.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
85
+ bear_utils-0.8.0.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- """Logging utilities for Bear Utils."""
2
-
3
- from .logger_manager._common import VERBOSE_CONSOLE_FORMAT
4
- from .logger_manager._styles import VERBOSE
5
- from .loggers import (
6
- BaseLogger,
7
- BufferLogger,
8
- ConsoleLogger,
9
- FileLogger,
10
- SubConsoleLogger,
11
- get_console,
12
- get_logger,
13
- get_sub_logger,
14
- )
15
-
16
- __all__ = [
17
- "VERBOSE",
18
- "VERBOSE_CONSOLE_FORMAT",
19
- "BaseLogger",
20
- "BufferLogger",
21
- "ConsoleLogger",
22
- "FileLogger",
23
- "SubConsoleLogger",
24
- "get_console",
25
- "get_logger",
26
- "get_sub_logger",
27
- ]
@@ -1 +0,0 @@
1
- """Logging Manager for Bear Utils."""