Skip to main content

A base class for building prompt-based beancount importers

Project description

Prompt Importer

This package provides a PromptImporter base class to build other beancount importers with. The functionality PromptImporter provides is to prompt the user to input recipient accounts for each transaction while keeping a list of common accounts for easy access. For example:

02/05/2022: Online payment from CHK 1234, 100.00
What should the recipient account be? ('x' to not extract a transaction)
1. Expenses:Groceries   2. Expenses:Restaurants   3. Assets:Checking
>>

It also provides functionality to store regexes with which to automatically identify recipient accounts in the future.

Usage

Events

To create class that derives from PromptImporter you must first define a subclass of prompt_importer.Event. Events represent single transactions from whatever type of file you are importing. For example, if you are importing a csv file, you may have one event per row. The subclass should implement the following methods:

get_field(self, field: str) -> str

Each event may have different fields associated with it. This method should return the value of a field given an associated field name.

get_id(self) -> str

This should return the globally unique id associated with an event.

display(self) -> str

This is how the event will be displayed to the user before the prompt.

get_transaction(self, filename: str, index: int, recipient_account: str) -> data.Transaction

This should return a transaction associated with an event. To help build the transaction, it takes the file the event was sourced from, its index within the file, and the account that should be the "recipient" of the transaction.

Note that the data.Transaction type refers to the data from beancount.core.

Importers

Once you have defined an event you can create a subclass of PromptImporter. To do so, you must implement the typical methods associated with the beancountimporter.ImporterProtocol class. Important: the value the method name(self) returns should not contain characters not allowed in SQLite table names, such as periods.

The importer should also implement the following method:

get_events(self, f) -> list[Event]

Given a beancount file this should return a list of events for the importer to process.

Example

The following is an example of an event importer for Bank of America credit card reports. The implementation of the typical beancount importer methods (identify, file, etc.) are omitted as they are not the focus.

import csv

from prompt_importer.importer import PromptImporter, Event

from beancount.core import amount, data, flags
from beancount.core.number import D
from dateutil.parser import parse

class BofaCCEvent(Event):
    def __init__(self, row):
        self.data = {
            "Posted Date": row["Posted Date"],
            "Amount": row["Amount"],
            "Payee": row["Payee"],
            "Reference Number": row["Reference Number"],
        }

    def get_field(self, field: str) -> str:
        return self.data[field]

    def get_id(self) -> str:
        return f"{self.data['Reference Number']}"

    def display(self) -> str:
        return (
            f"{self.data['Posted Date']}: {self.data['Payee']}, {self.data['Amount']}"
        )

    def get_transaction(
        self, filename: str, index: int, recipient_account: str
    ) -> data.Transaction:
        return data.Transaction(
            meta=data.new_metadata(filename, index),
            date=parse(self.data["Posted Date"]),
            flag=flags.FLAG_OKAY,
            payee=self.data["Payee"],
            narration="",
            tags=set(),
            links=set(),
            postings=[
                data.Posting(
                    "Liabilities:BofaCreditCard",
                    amount.Amount(D(self.data["Amount"]), "USD"),
                    None,
                    None,
                    None,
                    None,
                ),
                data.Posting(recipient_account, None, None, None, None, None),
            ],
        )


class BofaCCImporter(PromptImporter):
    def __init__(self, db_file):
        super().__init__(db_file)

    def name(self):
        return "BofaCCImporter"

    def get_events(self, f) -> list[Event]:
        with open(f.name) as infile:
            return [BofaCCEvent(row) for row in csv.DictReader(infile)]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prompt_importer-0.1.2.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prompt_importer-0.1.2-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file prompt_importer-0.1.2.tar.gz.

File metadata

  • Download URL: prompt_importer-0.1.2.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.4 Darwin/20.5.0

File hashes

Hashes for prompt_importer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 2ddfd810ada82d0d02ac3db5db1bc765533b90801fa993d5a4846bc93b612af8
MD5 a39a3e52fb5a55a589c65308991a4ab7
BLAKE2b-256 485695159f8382f748f694ce3e67dfe0672681ebb9c9bd7ee51e5eb34ad7f7fa

See more details on using hashes here.

File details

Details for the file prompt_importer-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: prompt_importer-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 17.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.4 Darwin/20.5.0

File hashes

Hashes for prompt_importer-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 afbe92353dbdee0d4c1be69fc2784147b2edd2b4e0b688bf627985a72c10bd04
MD5 e8f2087a4cfa8072538e3cef594dcfc2
BLAKE2b-256 1d1a08364fd20269826fb1409eef47d382a97e7a0016d4704ce7dbbd4c2e01e4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page