Skip to content

Commit

Permalink
Refactor Logger class to support multiple logging styles and update v…
Browse files Browse the repository at this point in the history
…ersion to 2.1.0
  • Loading branch information
sexfrance committed Jan 20, 2025
1 parent 2466d49 commit 402799f
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 37 deletions.
100 changes: 82 additions & 18 deletions logmagix/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,12 @@ class LogLevel(Enum):
FAILURE = 5
CRITICAL = 6

class Logger:
class BaseLogger:
def __init__(self, prefix: str | None = "discord.cyberious.xyz", github_repository: str = None, level: LogLevel = LogLevel.DEBUG, log_file: str | None = None):
self.WHITE = "\u001b[37m"
self.MAGENTA = "\033[38;5;97m"
self.BRIGHT_MAGENTA = "\033[38;2;157;38;255m"
self.LIGHT_CORAL = "\033[38;5;210m"
self.RED = "\033[38;5;196m"
self.GREEN = "\033[38;5;40m"
self.YELLOW = "\033[38;5;220m"
self.BLUE = "\033[38;5;21m"
self.PINK = "\033[38;5;176m"
self.CYAN = "\033[96m"
self.prefix = f"{self.PINK}[{self.MAGENTA}{prefix}{self.PINK}] " if prefix else f"{self.PINK}"
self.level = level
self.repo_url = github_repository
self.log_file = log_file
self.prefix = prefix

if log_file:
os.makedirs(os.path.dirname(log_file), exist_ok=True)
Expand All @@ -42,9 +32,9 @@ def __init__(self, prefix: str | None = "discord.cyberious.xyz", github_reposito
if self.repo_url:
username = self._extract_github_username(self.repo_url)
if username:
log.info(f"Developed by {username} - {self.repo_url}")
self.info(f"Developed by {username} - {self.repo_url}")
else:
log.info(f"GitHub Repository: {self.repo_url}")
self.info(f"GitHub Repository: {self.repo_url}")

def _extract_github_username(self, url: str) -> str | None:
url = url.replace('https://', '').replace('http://', '').replace('www.', '')
Expand All @@ -68,20 +58,34 @@ def _write_to_log(self, message: str) -> None:
print(f"Error writing to log file: {e}")

def _strip_ansi(self, text: str) -> str:
"""Remove ANSI escape sequences from text"""
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', text)

def get_time(self) -> str:
return datetime.datetime.now().strftime("%H:%M:%S")

def _should_log(self, message_level: LogLevel) -> bool:
return message_level.value >= self.level.value

class ColorLogger(BaseLogger):
def __init__(self, *args, **kwargs):
self.WHITE = "\u001b[37m"
self.MAGENTA = "\033[38;5;97m"
self.BRIGHT_MAGENTA = "\033[38;2;157;38;255m"
self.LIGHT_CORAL = "\033[38;5;210m"
self.RED = "\033[38;5;196m"
self.GREEN = "\033[38;5;40m"
self.YELLOW = "\033[38;5;220m"
self.BLUE = "\033[38;5;21m"
self.PINK = "\033[38;5;176m"
self.CYAN = "\033[96m"
super().__init__(*args, **kwargs)
self.prefix = f"{self.PINK}[{self.MAGENTA}{self.prefix}{self.PINK}] " if self.prefix else f"{self.PINK}"

def message3(self, level: str, message: str, start: int = None, end: int = None) -> str:
current_time = self.get_time()
return f"{self.prefix}[{self.BRIGHT_MAGENTA}{current_time}{self.PINK}] {self.PINK}[{self.CYAN}{level}{self.PINK}] -> {self.CYAN}{message}{Fore.RESET}"

def _should_log(self, message_level: LogLevel) -> bool:
return message_level.value >= self.level.value

def success(self, message: str, start: int = None, end: int = None, level: str = "Success") -> None:
if self._should_log(LogLevel.SUCCESS):
timer = f" {self.BRIGHT_MAGENTA}In{self.WHITE} -> {self.BRIGHT_MAGENTA}{str(end - start)[:5]} Seconds {Fore.RESET}" if start and end else ""
Expand Down Expand Up @@ -155,6 +159,66 @@ def debug(self, message: str, start: int = None, end: int = None) -> None:
print(log_message)
self._write_to_log(log_message)

class SimpleLogger(BaseLogger):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.prefix = f"{Fore.BLACK}{self.get_time()} » {Fore.RESET}"

def success(self, message: str, start: int = None, end: int = None, level: str = "SUCCESS") -> None:
if self._should_log(LogLevel.SUCCESS):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.LIGHTGREEN_EX}{level} {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def error(self, message: str, start: int = None, end: int = None, level: str = "ERROR") -> None:
if self._should_log(LogLevel.FAILURE):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.LIGHTRED_EX}{level} {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def warning(self, message: str, start: int = None, end: int = None, level: str = "WARNING") -> None:
if self._should_log(LogLevel.WARNING):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.LIGHTYELLOW_EX}{level} {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def message(self, message: str, start: int = None, end: int = None, level: str = "MESSAGE") -> None:
if self._should_log(LogLevel.WARNING):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.LIGHTMAGENTA_EX}{level} {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def info(self, message: str, start: int = None, end: int = None, level: str = "INFO") -> None:
if self._should_log(LogLevel.INFO):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.LIGHTBLUE_EX}{level} {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def debug(self, message: str, start: int = None, end: int = None) -> None:
if self._should_log(LogLevel.DEBUG):
timer = f" (In {str(end - start)[:5]}s)" if start and end else ""
log_message = f"{self.prefix}{Fore.GREEN}[{Fore.YELLOW}DEBUG{Fore.GREEN}] {Fore.BLACK}{Fore.RESET} {message}{timer}"
print(log_message)
self._write_to_log(log_message)

def question(self, message: str, level: str = "QUESTION") -> None:
question_message = f"{self.prefix}{Fore.LIGHTCYAN_EX}{level} {Fore.BLACK}{Fore.RESET} {message}"
print(question_message, end='')
i = input()
self._write_to_log(f"{question_message}")
self._write_to_log(f"User Answer: {i}")
return i

def Logger(style: int = 1, *args, **kwargs):
if style == 2:
return SimpleLogger(*args, **kwargs)
return ColorLogger(*args, **kwargs)

log = Logger()

class Loader:
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name="logmagix",
version="2.0.10",
version="2.1.0",
packages=find_packages(),
install_requires=["colorama", "pystyle"],
author="Sexfrance",
Expand Down
57 changes: 39 additions & 18 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,43 @@
import time
import uuid

log = Logger(
prefix="LogMagix",
# Test ColorLogger (Style 1 - Default)
log1 = Logger(
prefix="ColorLogger",
github_repository="https://github.com/sexfrance/LogMagix",
level=LogLevel.DEBUG,
log_file="logs/app.log"
log_file="logs/color.log"
)
print("\nTesting ColorLogger (Style 1):")
start_time = time.time()

# Log messages
log.success("Everything is running smoothly!")
log.warning("Watch out, something might happen!")
log.failure("Critical error occurred!")
log.info("System is working properly")
log.debug(f"The system uuid is {uuid.getnode()}")
log.message("Dad", f"How are you? I'm gonna come soon!", start=start_time, end=time.time())
log.question("How old are you? ")


# Use loader with custom prefix and context manager
log1.success("Everything is running smoothly!")
log1.warning("Watch out, something might happen!")
log1.failure("Critical error occurred!")
log1.info("System is working properly")
log1.debug(f"The system uuid is {uuid.getnode()}")
log1.message("Dad", f"How are you? I'm gonna come soon!", start=start_time, end=time.time())
log1.question("How old are you? ")

# Test SimpleLogger (Style 2)
log2 = Logger(
style=2,
prefix="SimpleLogger",
github_repository="https://github.com/sexfrance/LogMagix",
level=LogLevel.DEBUG,
log_file="logs/simple.log"
)
print("\nTesting SimpleLogger (Style 2):")
start_time = time.time()
log2.success("Everything is running smoothly!")
log2.info("System is working properly")
log2.error("Critical error occurred!")
log2.warning("Watch out, something might happen!")
log2.message("System is working properly")
log2.debug(f"The system uuid is {uuid.getnode()}")
log2.question("How old are you? ")

# Test loader with custom prefix and context manager
print("\nTesting Loader:")
with Loader(prefix="custom/loader/prefix", desc="Processing data..."):
time.sleep(2) # Simulate task

Expand All @@ -29,14 +47,17 @@
time.sleep(2) # Simulate task
loader.stop()

log.critical("Critical error occurred!")


# Display home screen
home_screen = Home(
text="LogMagix",
align="center",
adinfo1="Test Suite",
adinfo2="v1.0.0",
credits="Testing Framework",
clear=True
)
)
home_screen.display()

# Test critical error (commented out as it exits the program)
log1.critical("Critical error occurred!")

0 comments on commit 402799f

Please sign in to comment.