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.
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/PKG-INFO +1 -1
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/__init__.py +2 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/common/__init__.py +1 -1
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/dirs.py +2 -3
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/constants.py +12 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/__init__.py +63 -26
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/base_classes.py +13 -8
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/decorators.py +22 -1
- inspy_logger-3.1.0.dev3/inspy_logger/tool/__init__.py +4 -0
- inspy_logger-3.1.0.dev3/inspy_logger/types.py +169 -0
- inspy_logger-3.1.0.dev3/inspy_logger/version/VERSION.txt +1 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/version/__init__.py +3 -8
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/pyproject.toml +1 -1
- inspy_logger-3.1.0.dev1/inspy_logger/tool/config/__init__.py +0 -0
- inspy_logger-3.1.0.dev1/inspy_logger/version/VERSION.txt +0 -1
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/LICENSE.md +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/README.md +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/Scripts/main.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/__about__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/common/meta.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/config/levels.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/errors.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/engine/handlers.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/errors/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/command_line/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/environment.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/processor/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/winx/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/descriptors.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/network.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/units.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/manifest.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/linux.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/mac_os.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/system/win32.py +0 -0
- {inspy_logger-3.1.0.dev1/inspy_logger/tool → inspy_logger-3.1.0.dev3/inspy_logger/tool/config}/__init__.py +0 -0
- {inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/tool/config/arguments/__init__.py +0 -0
|
@@ -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
|
|
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.
|
|
110
|
+
self.internal('Initializing logger with buffering handler.')
|
|
107
111
|
else:
|
|
108
|
-
self.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
440
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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=
|
|
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.
|
|
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
|
-
|
|
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
|
-
]
|
|
116
|
-
|
|
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
|
|
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,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
|
-
|
|
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.
|
|
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'
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.1.0-dev.1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/command_line/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/environment.py
RENAMED
|
File without changes
|
{inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/helpers/debug/system/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{inspy_logger-3.1.0.dev1 → inspy_logger-3.1.0.dev3}/inspy_logger/tool/config/arguments/__init__.py
RENAMED
|
File without changes
|