def query_basic_ruler(t, default_ruler): """Define basic rule consisting of matching full words on payee field. """ default_field = 'payee' if not t[default_field]: return set_completer(sorted(complete_matches(t[default_field]))) ruler = quick_input('\n%s match %s' % (default_field.title(), '[%s]' % default_ruler if default_ruler else '')) ruler = tags.rulify(ruler) set_completer() return ruler
def query_cat(cached_cat): """Query category. If empty string entered then prompt to remove existing category, if any. """ set_completer(sorted(tags.TAGS.keys())) cat = quick_input('\nCategory', vanish=True).strip() if not cat and cached_cat: erase = quick_input('\nRemove existing category', 'yN', True) if erase.upper() == 'N': cat = cached_cat set_completer() return cat.strip() or None
def query_tag(cached_tag): """Query category. If empty string entered then prompt to remove existing category, if any. """ set_completer(sorted(tags.TAGS.keys())) tag = quick_input('Category').strip() print(CLEAR, end='') if not tag and cached_tag: erase = quick_input('Remove existing category', 'yN') if erase.upper() == 'N': tag = cached_tag set_completer() return tag
def query_match(payee): """Query a match for payee line as long as a correct one is not entered. """ set_completer(sorted(complete_matches(payee))) while True: match = quick_input('Match') if match.isspace(): # Go back, discard entered category print(2 * CLEAR, end='') break if not tags.is_match(match, payee): print(CLEAR + '%s Match rejected: %s' % (TERM.red('✖'), diff(payee, match, TERM, as_error=True))) else: print(CLEAR + "%s Match accepted: %s" % (TERM.green('✔'), str(match) if match else TERM.red('<none>'))) break set_completer() return match
def query_guru_ruler(t): """Define rules on a combination of fields. All rules must match corresponding fields for the ruler to be valid. """ extras = sorted([k for (k, v) in t.items() if (v and not k.isdigit())]) set_completer(extras) guru_ruler = {} extras = {} field = True while field: # Enter field while True: # Update fields match indicators print(TERM.move_y(0)) print_transaction(t, short=False, extras=extras) field = quick_input("\nMatch on field", clear=True).lower() regex = "*" in field field = field.strip("*") if not field or field in set(config.FIELDS_FULL.values()) - {"category"}: break # Enter match while field: print(TERM.move_y(0)) print_transaction(t, short=False, extras=extras) existing_match = guru_ruler.get(field, "") ruler = quick_input( "\n%s match (%s)%s" % ( field.title(), "regex" if regex else "chars", " [%s]" % existing_match if existing_match else "", ), clear=True, ) if ruler.isspace(): # remove field rule from ruler extras.pop(field, None) guru_ruler.pop(field, None) elif ruler: guru_ruler[field] = r"%s" % ruler if regex else re.escape(ruler) match, extras = check_ruler(guru_ruler, t) if match: break return guru_ruler
def query_match(payee): """Query a match for payee line as long as a correct one is not entered. """ set_completer(sorted(complete_matches(payee))) while True: match = quick_input('Match') if match.isspace(): # Go back, discard entered category print(2 * CLEAR, end='') break if not tags.is_match(match, payee): print(CLEAR + '%s Match rejected: %s' % (TERM.red('✖'), diff(payee, match, TERM, as_error=True))) else: print( CLEAR + "%s Match accepted: %s" % (TERM.green('✔'), str(match) if match else TERM.red('<none>'))) break set_completer() return match
def query_guru_ruler(t): """Define rules on a combination of fields. All rules must match corresponding fields for the ruler to be valid. """ extras = sorted([k for (k, v) in t.iteritems() if ( v and not k.isdigit())]) set_completer(extras) guru_ruler = {} extras = {} field = True while field: # Enter field while True: # Update fields match indicators print(TERM.move_y(0)) print_transaction(t, short=False, extras=extras) field = quick_input('\nMatch on field', vanish=True).lower() regex = '*' in field field = field.strip('*') if not field or field in set(FIELDS_FULL.values()) - {'category'}: break # Enter match while field: print(TERM.move_y(0)) print_transaction(t, short=False, extras=extras) existing_match = guru_ruler.get(field, '') ruler = quick_input('\n%s match (%s)%s' % (field.title(), 'regex' if regex else 'chars', ' [%s]' % existing_match if existing_match else ''), vanish=True) if ruler.isspace(): # remove field rule from ruler extras.pop(field, None) guru_ruler.pop(field, None) # break elif ruler: guru_ruler[field] = r'%s' % ruler if regex else re.escape( ruler) match, extras = check_ruler(guru_ruler, t) if match: break return guru_ruler