#!/usr/bin/env python3 import argparse import csv import os import sys from typing import Dict, List sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) from pen_tracker.engine import Ink, InkTracker, Pen, PenTracker def get_default_pens_csv() -> str: env_path = os.getenv('PEN_TRACKER_CSV') if env_path: return env_path data_home = os.getenv('XDG_DATA_HOME', os.path.expanduser('~/.local/share')) app_data_dir = os.path.join(data_home, 'pen-tracker') os.makedirs(app_data_dir, exist_ok=True) return os.path.join(app_data_dir, 'pens.csv') def get_default_inks_csv() -> str: env_path = os.getenv('INK_TRACKER_CSV') if env_path: return env_path data_home = os.getenv('XDG_DATA_HOME', os.path.expanduser('~/.local/share')) app_data_dir = os.path.join(data_home, 'pen-tracker') os.makedirs(app_data_dir, exist_ok=True) return os.path.join(app_data_dir, 'inks.csv') def load_csv_rows(path: str, fieldnames: List[str]) -> List[Dict[str, str]]: if not os.path.exists(path): return [] with open(path, mode='r', encoding='utf-8-sig', newline='') as f: reader = csv.DictReader(f) if reader.fieldnames: reader.fieldnames = [h.strip() for h in reader.fieldnames] rows: List[Dict[str, str]] = [] for row in reader: clean_row = {k.strip(): (v.strip() if v else 'N/A') for k, v in row.items() if k is not None} for field in fieldnames: clean_row.setdefault(field, 'N/A') rows.append(clean_row) return rows def import_data(db_path: str, pens_csv: str, inks_csv: str) -> None: ink_tracker = InkTracker(db_path) pen_tracker = PenTracker(db_path) ink_rows = load_csv_rows(inks_csv, ink_tracker.headers) inks = [Ink(**row) for row in ink_rows] ink_tracker.inks = inks ink_tracker.save_data() pen_rows = load_csv_rows(pens_csv, pen_tracker.headers) pens = [Pen(**{pen_tracker.key_map.get(k, k): v for k, v in row.items()}) for row in pen_rows] pen_tracker.pens = pens pen_tracker.save_data() print(f'Imported {len(ink_tracker.inks)} inks from {inks_csv}') print(f'Imported {len(pen_tracker.pens)} pens from {pens_csv}') print(f'SQLite database initialized at: {db_path}') def main() -> None: parser = argparse.ArgumentParser(description='Import CSV data into pen-tracker SQLite database') parser.add_argument('--db', default=None, help='Path to the SQLite database file') parser.add_argument('--pens-csv', default=None, help='Path to pens CSV file') parser.add_argument('--inks-csv', default=None, help='Path to inks CSV file') args = parser.parse_args() db_path = args.db pens_csv = args.pens_csv or get_default_pens_csv() inks_csv = args.inks_csv or get_default_inks_csv() import_data(db_path, pens_csv, inks_csv) if __name__ == '__main__': main()