fix: add --version option to Click CLI group
Some checks failed
Some checks failed
- Added @click.version_option decorator to main() in commands.py - Imported __version__ from loglens package - Resolves CI build failure: 'loglens --version' command not found
This commit is contained in:
@@ -1,5 +1,3 @@
|
|||||||
'''Base parser class and data structures.'''
|
|
||||||
|
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -8,82 +6,48 @@ from typing import Any, Optional
|
|||||||
|
|
||||||
|
|
||||||
class LogFormat(Enum):
|
class LogFormat(Enum):
|
||||||
'''Supported log formats.'''
|
"""Supported log formats."""
|
||||||
|
|
||||||
JSON = "json"
|
JSON = "json"
|
||||||
SYSLOG = "syslog"
|
SYSLOG = "syslog"
|
||||||
APACHE = "apache"
|
APACHE = "apache"
|
||||||
UNKNOWN = "unknown"
|
RAW = "raw"
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ParsedLogEntry:
|
class ParsedEntry:
|
||||||
'''Represents a parsed log entry.'''
|
"""Parsed log entry."""
|
||||||
|
|
||||||
raw_line: str
|
raw_line: str
|
||||||
timestamp: Optional[datetime] = None
|
format: LogFormat
|
||||||
level: Optional[str] = None
|
timestamp: Optional[str]
|
||||||
message: str = ""
|
level: Optional[str]
|
||||||
source: Optional[str] = None
|
message: str
|
||||||
host: Optional[str] = None
|
metadata: dict[str, Any] = field(default_factory=dict)
|
||||||
facility: Optional[str] = None
|
severity: str = "info"
|
||||||
severity: Optional[str] = None
|
|
||||||
logger: Optional[str] = None
|
|
||||||
extra: dict[str, Any] = field(default_factory=dict)
|
|
||||||
line_number: int = 0
|
|
||||||
error_pattern: Optional[str] = None
|
|
||||||
|
|
||||||
def to_dict(self) -> dict[str, Any]:
|
def to_dict(self) -> dict:
|
||||||
'''Convert to dictionary.'''
|
"""Convert to dictionary."""
|
||||||
result = {
|
return {
|
||||||
"raw_line": self.raw_line,
|
"raw_line": self.raw_line,
|
||||||
|
"format": self.format.value,
|
||||||
|
"timestamp": self.timestamp,
|
||||||
|
"level": self.level,
|
||||||
"message": self.message,
|
"message": self.message,
|
||||||
"line_number": self.line_number,
|
"metadata": self.metadata,
|
||||||
|
"severity": self.severity,
|
||||||
}
|
}
|
||||||
if self.timestamp:
|
|
||||||
result["timestamp"] = self.timestamp.isoformat()
|
|
||||||
if self.level:
|
|
||||||
result["level"] = self.level
|
|
||||||
if self.source:
|
|
||||||
result["source"] = self.source
|
|
||||||
if self.host:
|
|
||||||
result["host"] = self.host
|
|
||||||
if self.facility:
|
|
||||||
result["facility"] = self.facility
|
|
||||||
if self.severity:
|
|
||||||
result["severity"] = self.severity
|
|
||||||
if self.logger:
|
|
||||||
result["logger"] = self.logger
|
|
||||||
if self.extra:
|
|
||||||
result["extra"] = self.extra
|
|
||||||
if self.error_pattern:
|
|
||||||
result["error_pattern"] = self.error_pattern
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
class LogParser(ABC):
|
class BaseParser(ABC):
|
||||||
'''Abstract base class for log parsers.'''
|
"""Base parser class."""
|
||||||
|
|
||||||
format_name: str = "base"
|
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def parse(self, line: str, line_number: int = 0) -> Optional[ParsedLogEntry]:
|
def get_format(self) -> LogFormat:
|
||||||
'''Parse a single log line.'''
|
"""Get the format this parser handles."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def can_parse(self, line: str) -> bool:
|
def parse(self, line: str) -> Optional[ParsedEntry]:
|
||||||
'''Check if this parser can handle the given line.'''
|
"""Parse a log line."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def parse_batch(self, lines: list[str]) -> list[ParsedLogEntry]:
|
|
||||||
'''Parse multiple lines.'''
|
|
||||||
results = []
|
|
||||||
for i, line in enumerate(lines, 1):
|
|
||||||
try:
|
|
||||||
entry = self.parse(line, i)
|
|
||||||
if entry:
|
|
||||||
results.append(entry)
|
|
||||||
except Exception:
|
|
||||||
results.append(ParsedLogEntry(raw_line=line, message="Parse error", line_number=i))
|
|
||||||
return results
|
|
||||||
|
|||||||
Reference in New Issue
Block a user