- Add return type annotations to __hash__ (-> int) and __eq__ (-> bool) in HistoryEntry - Add TextIO import and type annotations for file parameters - Add type ignore comment for fuzzywuzzy import - Add HistoryEntry import and list type annotations in time_analysis - Add assert statements for Optional[datetime] timestamps - Add TypedDict classes for type-safe pattern dictionaries - Add CommandPattern import and list[CommandPattern] type annotation - Add -> None return types to all test methods - Remove unused HistoryEntry import (F401)
39 lines
1.0 KiB
Python
39 lines
1.0 KiB
Python
"""Utility functions for shell history automation."""
|
|
|
|
import os
|
|
import re
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
|
|
def normalize_command(command: str) -> str:
|
|
"""Normalize a shell command for comparison."""
|
|
return command.strip()
|
|
|
|
|
|
def extract_command_keywords(command: str) -> list[str]:
|
|
"""Extract keywords from a command."""
|
|
parts = command.split()
|
|
keywords = [p for p in parts if not p.startswith("-")]
|
|
return keywords
|
|
|
|
|
|
def format_timestamp(dt: Optional[datetime]) -> str:
|
|
"""Format a datetime object to a readable string."""
|
|
if dt is None:
|
|
return "Unknown"
|
|
return dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
def parse_timestamp(ts: str) -> Optional[datetime]:
|
|
"""Parse a timestamp string to datetime."""
|
|
try:
|
|
return datetime.strptime(ts, "%Y-%m-%d %H:%M:%S")
|
|
except ValueError:
|
|
return None
|
|
|
|
|
|
def escape_shell_string(s: str) -> str:
|
|
"""Escape special characters in a string for shell use."""
|
|
return re.sub(r"([\\'"])", r"\\\1", s)
|