Covert storage to sqlite backed, added ink history

This commit is contained in:
Don Harper 2026-06-14 00:24:13 -05:00
parent 1d16056f4f
commit c38a3cabc4
12 changed files with 397 additions and 150 deletions

84
import_csv_to_sqlite.py Executable file
View file

@ -0,0 +1,84 @@
#!/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()