inspy-logger 3.1.0.dev1__tar.gz → 3.1.0.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/PKG-INFO +1 -1
  2. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/__init__.py +2 -0
  3. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/common/__init__.py +1 -1
  4. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/dirs.py +2 -3
  5. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/constants.py +12 -0
  6. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/__init__.py +63 -26
  7. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/base_classes.py +13 -8
  8. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/decorators.py +22 -1
  9. inspy_logger-3.1.0.dev3/inspy_logger/tool/__init__.py +4 -0
  10. inspy_logger-3.1.0.dev3/inspy_logger/types.py +169 -0
  11. inspy_logger-3.1.0.dev3/inspy_logger/version/VERSION.txt +1 -0
  12. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/version/__init__.py +3 -8
  13. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/pyproject.toml +1 -1
  14. inspy_logger-3.1.0.dev1/inspy_logger/tool/config/__init__.py +0 -0
  15. inspy_logger-3.1.0.dev1/inspy_logger/version/VERSION.txt +0 -1
  16. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/LICENSE.md +0 -0
  17. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/README.md +0 -0
  18. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/Scripts/main.py +0 -0
  19. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/__about__.py +0 -0
  20. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/common/meta.py +0 -0
  21. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/__init__.py +0 -0
  22. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/levels.py +0 -0
  23. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/errors.py +0 -0
  24. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/handlers.py +0 -0
  25. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/errors/__init__.py +0 -0
  26. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/__init__.py +0 -0
  27. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/command_line/__init__.py +0 -0
  28. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/__init__.py +0 -0
  29. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/environment.py +0 -0
  30. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/__init__.py +0 -0
  31. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/processor/__init__.py +0 -0
  32. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/winx/__init__.py +0 -0
  33. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/descriptors.py +0 -0
  34. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/network.py +0 -0
  35. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/units.py +0 -0
  36. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/manifest.py +0 -0
  37. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/__init__.py +0 -0
  38. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/linux.py +0 -0
  39. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/mac_os.py +0 -0
  40. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/win32.py +0 -0
  41. {inspy_logger-3.1.0.dev1/inspy_logger/tool → inspy_logger-3.1.0.dev3/inspy_logger/tool/config}/__init__.py +0 -0
  42. {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/tool/config/arguments/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: inspy-logger
3
- Version: 3.1.0.dev1
3
+ Version: 3.1.0.dev3
4
4
  Summary: Colorable, scalable logger for CLI
5
5
  Home-page: https://github.com/Inspyre-Softworks/inSPy-Logger
6
6
  License: MIT
@@ -56,6 +56,8 @@ CLIENT_PROG_NAME = determine_client_prog_name()
56
56
 
57
57
  INIT_LOG_LEVEL = determine_level(CLIENT_PROG_NAME)
58
58
 
59
+ INTERACTIVE_SESSION = find_variable_in_call_stack('INSPY_INTERACTIVE_SESSION', default=False)
60
+
59
61
 
60
62
  def start_logger(override_block=True):
61
63
  """
@@ -70,7 +70,7 @@ LEVELS = list(LEVEL_MAP.values())
70
70
  """The list of level names."""
71
71
 
72
72
 
73
- DEFAULT_LOGGING_LEVEL = logging.DEBUG
73
+ DEFAULT_LOGGING_LEVEL = logging.INFO
74
74
  """The default logging level."""
75
75
 
76
76
 
@@ -15,8 +15,7 @@ from typing import Optional, Union
15
15
 
16
16
  INSPY_LOGGER_LOG_DIR_PATH = user_log_path(
17
17
  appname=PROG_NAME or find_valid_vars_in_call_stack(VALID_PROG_NAME_VARS),
18
- appauthor=SOFTWARE_ORG,
19
- ensure_exists=True
18
+ appauthor=SOFTWARE_ORG
20
19
  )
21
20
 
22
21
  INSPY_LOGGER_LOG_FILE_NAME = 'app.log'
@@ -124,7 +123,7 @@ def get_log_file_path(
124
123
  if prog_name:
125
124
  file_name = f"{prog_name}.log"
126
125
  if dev_name:
127
- log_file_path = Path(user_log_path(appname=prog_name, appauthor=dev_name, ensure_exists=True)).joinpath(file_name)
126
+ log_file_path = Path(user_log_path(appname=prog_name, appauthor=dev_name).joinpath(file_name))
128
127
  else:
129
128
  log_file_path = INSPY_LOGGER_LOG_DIR_PATH.joinpath(file_name)
130
129
 
@@ -15,11 +15,14 @@ Description:
15
15
 
16
16
 
17
17
  """
18
+
19
+
18
20
  import logging
19
21
 
20
22
  DEFAULT_LOGGING_LEVEL = logging.DEBUG
21
23
 
22
24
  LEVEL_MAP = {
25
+ 'internal': 5,
23
26
  'debug': logging.DEBUG,
24
27
  'info': logging.INFO,
25
28
  'warning': logging.WARNING,
@@ -28,3 +31,12 @@ LEVEL_MAP = {
28
31
  'fatal': logging.FATAL,
29
32
  }
30
33
  """A mapping of level names to their corresponding logging levels."""
34
+
35
+
36
+ LEVELS = [level.upper() for level in LEVEL_MAP]
37
+
38
+ INTERNAL = LEVEL_MAP['debug'] - 5
39
+
40
+
41
+ INTERACTIVE_SESSION = __name__ != '__main__'
42
+ """A flag to indicate whether the session is interactive."""
@@ -6,6 +6,7 @@ import sys
6
6
  from rich.logging import RichHandler
7
7
 
8
8
  from inspy_logger.config import DEFAULT_LOG_FILE_PATH
9
+ from inspy_logger.constants import LEVELS, INTERACTIVE_SESSION, INTERNAL
9
10
  from inspy_logger.engine.handlers import BufferingHandler
10
11
  from inspy_logger.common import InspyLogger, DEFAULT_LOGGING_LEVEL
11
12
  from inspy_logger.helpers import translate_to_logging_level, CustomFormatter, get_level_name, RestrictedSetter
@@ -20,6 +21,8 @@ class Logger(InspyLogger):
20
21
  A Singleton class responsible for managing the logging mechanisms of the application.
21
22
  """
22
23
 
24
+ LEVELS = LEVELS
25
+ INTERACTIVE_SESSION = INTERACTIVE_SESSION
23
26
  instances = {} # A dictionary to hold instances of the Logger class.
24
27
 
25
28
  # Set the file path for the log file.
@@ -52,6 +55,7 @@ class Logger(InspyLogger):
52
55
  file_path=DEFAULT_LOG_FILE_PATH.parent,
53
56
  no_file_logging=False,
54
57
  parent=None,
58
+ skip_interactive_check: bool=False
55
59
  ):
56
60
  """
57
61
  Initializes a logger instance.
@@ -93,8 +97,8 @@ class Logger(InspyLogger):
93
97
  self.__no_file_logging = None
94
98
  self.__file_path = None
95
99
 
100
+
96
101
  self.logger = logging.getLogger(name)
97
- self.logger.debug('Debug message from logger')
98
102
  self.logger.setLevel(translate_to_logging_level(console_level))
99
103
 
100
104
  self.logger.propagate = False
@@ -103,9 +107,9 @@ class Logger(InspyLogger):
103
107
  if 'inSPy-Logger' in self.logger.name:
104
108
  self.buffering_handler = BufferingHandler()
105
109
  self.logger.addHandler(self.buffering_handler)
106
- self.logger.debug('Initializing logger with buffering handler.')
110
+ self.internal('Initializing logger with buffering handler.')
107
111
  else:
108
- self.logger.debug('Initializing logger without buffering handler.')
112
+ self.internal('Initializing logger without buffering handler.')
109
113
 
110
114
  self.no_file_logging = no_file_logging
111
115
 
@@ -167,6 +171,7 @@ class Logger(InspyLogger):
167
171
 
168
172
  @property
169
173
  def console_level_name(self):
174
+ self.internal('Test message')
170
175
  return get_level_name(self.console_level)
171
176
 
172
177
  @property
@@ -242,6 +247,10 @@ class Logger(InspyLogger):
242
247
  # self.__file_path = old
243
248
  # raise e
244
249
 
250
+ @property
251
+ def interactive_session(self):
252
+ return hasattr(sys, 'ps1') and sys.ps1
253
+
245
254
  @property
246
255
  def name(self):
247
256
  """
@@ -304,6 +313,22 @@ class Logger(InspyLogger):
304
313
 
305
314
  return handler
306
315
 
316
+ def has_child(self, name):
317
+ """
318
+ Checks if the logger has a child with the specified name.
319
+
320
+ Args:
321
+ name (str):
322
+ The name of the child logger.
323
+
324
+ Returns:
325
+ bool:
326
+ True if the logger has a child with the specified name, else False.
327
+ """
328
+
329
+ return name in self.child_names
330
+
331
+
307
332
  @validate_type(str, Path, preferred_type=Path)
308
333
  def set_file_path(self, file_path):
309
334
  """
@@ -321,14 +346,12 @@ class Logger(InspyLogger):
321
346
  self.file_path = old
322
347
  raise
323
348
 
324
-
325
-
326
349
  def set_up_console(self):
327
350
  """
328
351
  Configures and attaches a console handler to the logger.
329
352
  """
330
353
 
331
- self.logger.debug("Setting up console handler")
354
+ self.internal("Setting up console handler")
332
355
  console_handler = RichHandler(
333
356
  show_level=True, markup=True, rich_tracebacks=True, tracebacks_show_locals=True
334
357
  )
@@ -367,7 +390,7 @@ class Logger(InspyLogger):
367
390
  None
368
391
  """
369
392
 
370
- self.logger.debug("Setting log levels")
393
+ self.internal("Setting log levels")
371
394
 
372
395
  # If we received a console level, update the console level.
373
396
  if console_level is not None:
@@ -419,25 +442,21 @@ class Logger(InspyLogger):
419
442
  InspyLogger:
420
443
  The child logger with the specified name, console level, and file level.
421
444
  """
422
- # Determine the console level and file level for the child logger.
423
-
424
- # If the console level is not provided, use the console level of the parent logger
425
- console_level = console_level or self.console_level
426
-
427
- # If the file level is not provided, use the file level of the parent logger
428
- file_level = file_level or self.file_level
429
-
430
445
  # Get the name of the calling function if no name is provided
431
446
  caller_frame = inspect.stack()[1]
432
447
 
433
448
  cl_name = self.__build_name_from_caller(caller_frame, name)
434
449
 
435
- cl_name
450
+ if found_child := self.find_child_by_name(cl_name, exact_match=True):
451
+ return found_child
452
+
453
+ # Determine the console level and file level for the child logger.
436
454
 
437
- found_child = self.find_child_by_name(cl_name, exact_match=True)
455
+ # If the console level is not provided, use the console level of the parent logger
456
+ console_level = console_level or self.console_level
438
457
 
439
- if found_child:
440
- return found_child
458
+ # If the file level is not provided, use the file level of the parent logger
459
+ file_level = file_level or self.file_level
441
460
 
442
461
  child_logger = Logger(name=cl_name, console_level=console_level, file_level=file_level, parent=self)
443
462
 
@@ -451,7 +470,7 @@ class Logger(InspyLogger):
451
470
  Fetches the names of all child loggers associated with this logger instance.
452
471
  """
453
472
 
454
- self.logger.debug("Getting child logger names")
473
+ self.internal("Getting child logger names")
455
474
  return [child.logger.name for child in self.children]
456
475
 
457
476
  def get_parent(self) -> InspyLogger:
@@ -459,7 +478,7 @@ class Logger(InspyLogger):
459
478
  Fetches the parent logger associated with this logger instance.
460
479
  """
461
480
 
462
- self.logger.debug("Getting parent logger")
481
+ self.internal("Getting parent logger")
463
482
  return self.parent
464
483
 
465
484
  def find_child_by_name(self, name: str, case_sensitive=True, exact_match=False) -> (List, InspyLogger):
@@ -481,7 +500,7 @@ class Logger(InspyLogger):
481
500
  If exact_match is False, returns a list of Logger instances whose names contain the
482
501
  search term.
483
502
  """
484
- self.logger.debug(f'Searching for child with name: {name}')
503
+ self.internal(f'Searching for child with name: {name}')
485
504
  results = []
486
505
 
487
506
  if not case_sensitive:
@@ -497,14 +516,17 @@ class Logger(InspyLogger):
497
516
  return results
498
517
 
499
518
  @count_invocations
500
- def debug(self, message):
519
+ def debug(self, message, stack_level=3):
501
520
  """
502
521
  Logs a debug message.
503
522
 
504
523
  Args:
505
- message (str): The message to log.
524
+ message (str): The message to log.
525
+
526
+ stack_level (int, optional):
527
+ The stacklevel to use when logging. Defaults to 3.
506
528
  """
507
- self._log(logging.DEBUG, message, args=(), stacklevel=2)
529
+ self._log(logging.DEBUG, message, args=(), stacklevel=stack_level)
508
530
 
509
531
  @count_invocations
510
532
  def info(self, message):
@@ -516,6 +538,16 @@ class Logger(InspyLogger):
516
538
  """
517
539
  self._log(logging.INFO, message, args=(), stacklevel=2)
518
540
 
541
+ def internal(self, message, *args, **kwargs):
542
+ """
543
+ Logs an internal message.
544
+
545
+ Args:
546
+ message (str): The message to log.
547
+ """
548
+ if self.logger.isEnabledFor(INTERNAL):
549
+ self._log(INTERNAL, message, args=args, stacklevel=2)
550
+
519
551
  @count_invocations
520
552
  def warning(self, message):
521
553
  """
@@ -624,7 +656,7 @@ class Logger(InspyLogger):
624
656
  """
625
657
  Starts the logger.
626
658
  """
627
- self.logger.warning('InspyLogger.start() is deprecated.')
659
+ self.warning('InspyLogger.start() is deprecated.')
628
660
  if not self.logger.handlers:
629
661
  self.set_up_handlers()
630
662
 
@@ -656,6 +688,11 @@ class Logger(InspyLogger):
656
688
  """
657
689
  Low-level logging implementation, passing stacklevel to findCaller.
658
690
  """
691
+ #caller_frame = inspect.currentframe().f_back
692
+ #print(caller_frame.f_code.co_name)
693
+ if INTERACTIVE_SESSION:
694
+ stacklevel -= 1
695
+
659
696
  if self.logger.isEnabledFor(level):
660
697
  self.logger._log(level, msg, args, exc_info, extra, stack_info, stacklevel + 1)
661
698
 
@@ -2,7 +2,6 @@ import inspect
2
2
  from inspy_logger import LOG_DEVICE, Logger
3
3
 
4
4
 
5
-
6
5
  class LoggableDescriptor:
7
6
  """
8
7
  Descriptor for accessing a logger specific to a class method.
@@ -19,7 +18,7 @@ class LoggableDescriptor:
19
18
  for frame_record in stack[1:]:
20
19
  if 'self' in frame_record.frame.f_locals and frame_record.frame.f_locals['self'] is instance:
21
20
  method_name = frame_record.function
22
- print(method_name)
21
+
23
22
  break
24
23
  else:
25
24
  raise Exception("Could not determine the calling method's name.")
@@ -72,6 +71,7 @@ class Loggable:
72
71
  """
73
72
  self.parent_log_device = parent_log_device
74
73
  self.__log_name = self.__class__.__name__
74
+
75
75
  if self.parent_log_device is not None:
76
76
  self.__log_device = self.parent_log_device.get_child(self.__log_name)
77
77
  else:
@@ -106,14 +106,15 @@ class Loggable:
106
106
  Returns:
107
107
  Logger: An instance of the Logger class that represents the child logger.
108
108
  """
109
- if not override:
110
- self.__is_member__()
111
-
112
109
  if name is None:
113
110
  name = inspect.stack()[1][
114
111
  3
115
- ] # Get the name of the calling function if no name is provided
116
- #print(inspect.stack()[1])
112
+ ]
113
+ if self.log_device.has_child(name):
114
+ return self.log_device.find_child_by_name(name)
115
+ if not override:
116
+ self.__is_member__()
117
+
117
118
  return self.log_device.get_child(name)
118
119
 
119
120
  def __is_member__(self):
@@ -123,8 +124,12 @@ class Loggable:
123
124
  Raises:
124
125
  PermissionError: If the caller of this method is not a member of the same class.
125
126
  """
127
+ print(self.log_device.children)
128
+ log_name = f'{self.log_device.name}.__is_member__'
129
+
130
+
126
131
  log_device = self.log_device.get_child("__is_member__")
127
- log = log_device.logger
132
+ log = log_device
128
133
 
129
134
  current_frame = inspect.currentframe()
130
135
  log.debug(f"Current frame: {current_frame}")
@@ -27,6 +27,27 @@ __all__ = [
27
27
  ]
28
28
 
29
29
 
30
+ def property_logging(func):
31
+ @wraps(func)
32
+ def wrapper(self, *args, **kwargs):
33
+ if self.creating_logger:
34
+ return
35
+ if found := self.class_logger.find_child_by_name(func.__name__, exact_match=True):
36
+ log = found
37
+ else:
38
+ self.creating_logger = True
39
+ log = self.class_logger.add_child(func.__name__)
40
+ self.creating_logger = False
41
+
42
+ log.debug(f'Getting {func.__name__} from instance of {self.__class__.__name__}...', stack_level=4)
43
+ res = func(self, *args, **kwargs)
44
+ log.debug(f'Got {func.__name__} from instance of {self.__class__.__name__}: {res}', stack_level=4)
45
+
46
+ return res
47
+ return wrapper
48
+
49
+
50
+
30
51
  def method_alias(*alias_names: (str, list[str])):
31
52
  """
32
53
  A decorator that allows you to add aliases to a class's method.
@@ -162,7 +183,7 @@ def validate_type(*allowed_types, preferred_type=None, allowed_values=None, case
162
183
  def decorator(func):
163
184
  @wraps(func)
164
185
  def wrapper(self, value):
165
- if not isinstance(value, allowed_types):
186
+ if not isinstance(value, tuple(allowed_types)):
166
187
  allowed = ', '.join([t.__name__ for t in allowed_types])
167
188
  raise TypeError(f"Value must be of type {allowed}, got type {type(value).__name__}")
168
189
 
@@ -0,0 +1,4 @@
1
+ import logging
2
+
3
+
4
+ logging.addLevelName(5, 'INTERNAL')
@@ -0,0 +1,169 @@
1
+ """
2
+
3
+
4
+ Author:
5
+ Inspyre Softworks
6
+
7
+ Project:
8
+ inSPy-Logger
9
+
10
+ File:
11
+ inspy_logger/types.py
12
+
13
+
14
+ Description:
15
+
16
+
17
+ """
18
+ from inspy_logger.constants import LEVEL_MAP
19
+ from inspy_logger.helpers import translate_to_logging_level
20
+ from inspy_logger.helpers.decorators import validate_type
21
+
22
+
23
+ class LogLevel:
24
+ """
25
+ A class for defining log levels for the logger.
26
+ """
27
+ LOG_LEVELS = {
28
+ 'DEBUG',
29
+ 'INFO',
30
+ 'WARNING',
31
+ 'ERROR',
32
+ 'CRITICAL',
33
+ }
34
+
35
+ __allowed_values = LOG_LEVELS
36
+
37
+ __case_sensitive = None
38
+
39
+ def __init__(self, log_level: str = 'INFO', case_sensitive=False):
40
+ self.__level_name = None
41
+
42
+ self.case_sensitive = case_sensitive
43
+
44
+ levels = list(self.LOG_LEVELS)
45
+
46
+ if isinstance(log_level, str):
47
+ if not case_sensitive:
48
+ for level in levels:
49
+ self.__allowed_values.add(level.lower())
50
+
51
+ elif isinstance(log_level, int):
52
+ self.level_name = self.from_int(log_level)
53
+
54
+ self.level_name = log_level
55
+
56
+ @property
57
+ def allowed_values(self):
58
+ return self.__allowed_values
59
+
60
+ @property
61
+ def case_sensitive(self):
62
+ return self.__case_sensitive
63
+
64
+ @case_sensitive.setter
65
+ @validate_type(bool)
66
+ def case_sensitive(self, case_sensitive: bool):
67
+ self.__case_sensitive = case_sensitive
68
+
69
+ @property
70
+ def level_name(self):
71
+ return self.__level_name
72
+
73
+ @level_name.setter
74
+ @validate_type(str, case_sensitive=False, allowed_values=LOG_LEVELS)
75
+ def level_name(self, new_level: str):
76
+ self.__level_name = new_level.upper()
77
+
78
+ @classmethod
79
+ def from_str(cls, level_string):
80
+ level = level_string.upper()
81
+ if level not in cls.LOG_LEVELS:
82
+ raise ValueError(f"Invalid log level: {level_string}, must be one of {cls.LOG_LEVELS}")
83
+
84
+ return cls(level)
85
+
86
+ @classmethod
87
+ def from_int(cls, level_integer):
88
+ for level in cls.LOG_LEVELS:
89
+ if translate_to_logging_level(level) == level_integer:
90
+ return cls(level)
91
+
92
+ raise ValueError(f"Invalid log level: {level_integer}, must be one of {cls.LOG_LEVELS}")
93
+
94
+ def as_int(self):
95
+ return translate_to_logging_level(self.level_name)
96
+
97
+ def upper(self):
98
+ return self.level_name.upper()
99
+
100
+ def lower(self):
101
+ return self.level_name.lower()
102
+
103
+ def __str__(self):
104
+ return self.level_name
105
+
106
+ def __int__(self):
107
+ return translate_to_logging_level(self.level_name)
108
+
109
+ @classmethod
110
+ def get_levels(cls):
111
+ return [cls.DEBUG, cls.INFO, cls.WARNING, cls.ERROR, cls.CRITICAL]
112
+
113
+
114
+ class LogLevel(LogLevel):
115
+ def __init__(self, *args, **kwargs):
116
+ super().__init__(*args, **kwargs)
117
+
118
+ def __convert_if_needed(self, other):
119
+ if not isinstance(other, LogLevel):
120
+ if isinstance(other, str):
121
+ other = self.from_str(other)
122
+ elif isinstance(other, int):
123
+ other = self.from_int(other)
124
+
125
+ return other
126
+
127
+ def __eq__(self, other):
128
+ other = self.__convert_if_needed(other)
129
+ return self.level_name == other.level_name
130
+
131
+ def __hash__(self):
132
+ return hash(self.level_name)
133
+
134
+ def __le__(self, other):
135
+ other = self.__convert_if_needed(other)
136
+ return self.as_int() <= other.as_int()
137
+
138
+
139
+ def __lt__(self, other):
140
+ other = self.__convert_if_needed(other)
141
+
142
+ return self.as_int() < other.as_int()
143
+
144
+
145
+ def __ge__(self, other):
146
+ other = self.__convert_if_needed(other)
147
+ return self.as_int() >= other.as_int()
148
+
149
+
150
+ def __gt__(self, other):
151
+ other = self.__convert_if_needed(other)
152
+ return self.as_int() > other.as_int()
153
+
154
+
155
+ def __repr__(self):
156
+ return f"LogLevel: {self.level_name} | {self.as_int()} at {hex(id(self))})"
157
+
158
+
159
+ def assemble_log_levels():
160
+ _ = list(LogLevel.LOG_LEVELS)
161
+ levels = [level for level in _ if level.isupper()]
162
+
163
+ levels = sorted(levels, key=lambda x: LEVEL_MAP[x.lower()])
164
+
165
+ return {LogLevel(level) for level in levels}
166
+
167
+
168
+ if 'LOG_LEVELS' not in globals():
169
+ LOG_LEVELS = assemble_log_levels()
@@ -0,0 +1 @@
1
+ 3.1.0-dev.3
@@ -1,3 +1,4 @@
1
+ import contextlib
1
2
  import requests
2
3
  from packaging import version as pkg_version
3
4
  import sys
@@ -159,17 +160,14 @@ class VersionParser:
159
160
 
160
161
  def print_version(self, skip_rich=False):
161
162
  if not skip_rich:
162
- try:
163
+ with contextlib.suppress(ImportError):
163
164
  self.__rich__()
164
165
  return
165
- except ImportError:
166
- pass
167
-
168
166
  self._print_version()
169
167
 
170
168
  def _print_version(self):
171
169
  version_info = self.version_info
172
- print()
170
+ print(version_info)
173
171
 
174
172
  def __str__(self):
175
173
  return self.version_str
@@ -222,9 +220,6 @@ class VersionParser:
222
220
  return self.version_info['release_num']
223
221
 
224
222
 
225
- print(__file__)
226
-
227
-
228
223
  def parse_version_file():
229
224
  with open(Path(__file__).parent.joinpath('VERSION.txt'), 'r') as f:
230
225
  return VersionParser(f.read().strip())
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "inspy-logger"
3
- version = "3.1.0-dev.1"
3
+ version = "3.1.0-dev.3"
4
4
  description = "Colorable, scalable logger for CLI"
5
5
  authors = ["Taylor-Jayde Blackstone <tayjaybabee@gmail.com>"]
6
6
  homepage = 'https://github.com/Inspyre-Softworks/inSPy-Logger'
@@ -1 +0,0 @@
1
- 3.1.0-dev.1