#! /usr/bin/env python3 import os import sys import yaml import re from xdg import XDG_CONFIG_HOME, XDG_DATA_HOME from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import models import locale try: from yaml import CLoader as Loader except ImportError: from yaml import Loader CONFIG_DIR = os.path.join(XDG_CONFIG_HOME, "schmeckels") DATA_DIR = os.path.join(XDG_DATA_HOME, "schmeckels") def format_amount(cents): amount = cents / 100 return f"{amount:,.2f}" def create_dirs(): for directory in [CONFIG_DIR, DATA_DIR]: try: os.mkdir(directory) except FileExistsError: pass def build_database_filename(profile_name): return f"{DATA_DIR}/{profile_name}.db" def build_rules_filename(profile_name): return f"{CONFIG_DIR}/{profile_name}.yaml" def check_single_profile(): files = os.listdir(DATA_DIR) if len(files) == 1: return files[0].split(".")[0] else: print("--profile is required when you have more than one database.") sys.exit(1) def list_profiles(): files = os.listdir(DATA_DIR) return [x.split(".")[0] for x in files] def get_session(profile_name): if not profile_name: profile_name = check_single_profile() filename = build_database_filename(profile_name) if os.path.exists(filename) and os.path.isfile(filename): engine = create_engine(f"sqlite:///{filename}") Session = sessionmaker(bind=engine) return Session() else: print(f"No database for profile '{profile_name}'. Did you run 'init'?") sys.exit(1) def get_rules(profile_name): if not profile_name: profile_name = check_single_profile() filename = build_rules_filename(profile_name) if os.path.exists(filename) and os.path.isfile(filename): with open(filename) as fh: data = yaml.load(fh, Loader=Loader) for rule in data: if rule.get("name"): rule["name_regex"] = re.compile(rule["name"]) if rule.get("description"): rule["desc_regex"] = re.compile(rule["description"]) return data else: print(f"No rules for profile '{profile_name}'. Did you run 'init'?") sys.exit(1) def create_tag(name, profile, session): t = session.query(models.Tag).filter(models.Tag.name == name).first() if not t: t = models.Tag(name=name) session.add(t) session.commit() return t