84 lines
2.9 KiB
Python
Executable file
84 lines
2.9 KiB
Python
Executable file
#!/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()
|