Covert storage to sqlite backed, added ink history
This commit is contained in:
parent
1d16056f4f
commit
c38a3cabc4
12 changed files with 397 additions and 150 deletions
84
import_csv_to_sqlite.py
Executable file
84
import_csv_to_sqlite.py
Executable 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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue