fix: add --version option to Click CLI group
Some checks failed
CI / test (3.10) (push) Has started running
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled

- 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:
2026-02-02 09:25:12 +00:00
parent debe653cfb
commit 7d2a543e6e

View File

@@ -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