Hello,
I've recently been trying to write an importer script and was trying to use
a Custom
<https://beancount.github.io/docs/beancount_language_syntax.html#custom>
directive. There isn't a lot of documentation on this, and I haven't been
able to figure out what the problem is from the source, and was wondering
if anyone here had any ideas. I'm not sure if I'm using
beancount.core.data.Custom wrong or if you're supposed to use a different
object entirely.
Issue occurs when there is a beancount.core.data.Custom object in the list
returned by the extract() function of a subclass of
beancount.ingest.importer.ImporterProtocol. This is being ran by the
'bean-extract' command. The exception appears to be raised when printing
the formatted beancount directives. I've written a test file which
hopefully reproduces the issue on other machines below.
(To prevent an XYZ problem) I have a small number of rental properties
which are run on a short term basis. I wanted to have a custom directive
define a 'stay' so I could keep some relevant metadata for transactions
(i.e. OTA platform, dates and length of stay, address of the property) ,
but I don't want to reference this metadata multiple times when there are
multiple transactions involving a single stay. I was then hoping to link
'^' all the transactions involving a single stay with a unique code,
including this custom directive. I could do the same thing with the first
transaction for a stay, but when 9/10 times I only want to know the
property which a transaction was for, I don't want ten other metadata
fields showing up in fava when I don't want them.
. . . At this point though I'm rather curious why I'm getting the
exception, regardless of my use of the directive.
Other notes:
- I am running a python virtual environment for my beancount and fava
executables, plus the modules used for importers.
- python version is 3.11.7. Binary is from Arch Linux repo.
- I am running the beancount version pulled from pip; Beancount 2.3.6
(git:d77540c4; 2023-10-05)
- (I'm unsure whether I should post this type of thing to github issues,
mostly because I don't know if I'm doing something wrong or if this is a
bug. Assuming I don't see an issue already I'm assuming I'm doing something
wrong, so I'm posting this here).
- pdb identifies entry.values to be the last argument of the
beancount.core.data.Custom, which is a list of arbitrary values.
Other questions involving custom directive:
- If I want to add links, tags to the directive, do I just append a str
starting with '^' and '#' respectively to the values list?
Below is output with the exception:
;; -*- mode: beancount -*-
**** /home/mason/Documents/beancount/Test/test.txt
1970-01-01 * "Vendor" "Narration"
Income:Example 10 USD
Assets:Example
Traceback (most recent call last):
File "/home/mason/.local/bin/bean-extract", line 8, in <module>
sys.exit(extract_main())
^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
scripts_utils.py", line 36, in extract_main
return trampoline_to_ingest(extract)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
scripts_utils.py", line 198, in trampoline_to_ingest
return run_import_script_and_ingest(parser)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
scripts_utils.py", line 246, in run_import_script_and_ingest
return ingest(importers_list)
^^^^^^^^^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
scripts_utils.py", line 140, in ingest
args.command(args, parser, importers_list, abs_downloads, hooks=hooks)
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
extract.py", line 243, in run
extract(importers_list, files_or_directories, sys.stdout,
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
extract.py", line 214, in extract
print_extracted_entries(new_entries, output)
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/ingest/
extract.py", line 137, in print_extracted_entries
entry_string = printer.format_entry(entry)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/parser/
printer.py", line 374, in format_entry
return EntryPrinter(dcontext, render_weights, prefix=prefix)(entry)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/parser/
printer.py", line 124, in __call__
method(obj, oss)
File
"/home/mason/Documents/beancount/beancount-bin/lib/python3.11/site-packages/beancount/parser/
printer.py", line 345, in Custom
for value, dtype in entry.values:
^^^^^^^^^^^^
ValueError: too many values to unpack (expected 2)
Below is a command, config file (green), and importer script (blue). The
exception isn't raised when you comment out the line with data.Custom.
Where test.txt is an empty file:
$ bean-extract exampleimporter.config test.txt
# exampleimporter.config
import sys
testdir = '' # add full directory test.py is in here
sys.path.append(testdir1)
import test
CONFIG = [
test.Importer()
]
#EOF
# test.py
from datetime import date as fdate
from beancount.core.data import EMPTY_SET
from beancount.ingest import importer
from beancount.core.number import D, ZERO
from beancount.core import data, account, amount, position
class Importer(importer.ImporterProtocol):
def __init__(self, *args, **kwargs):
pass
def identify(self, file):
return True
def extract(self, file):
ret = []
meta = data.new_metadata(file.name, 1)
date = fdate(1970,1,1)
amnt = amount.Amount(D(10), 'USD')
ret.append(data.Transaction(meta, date, '*', "Vendor", "Narration",
EMPTY_SET, EMPTY_SET, [
data.Posting('Income:Example', amnt, None, None, None, None),
data.Posting('Assets:Example', None, None, None, None, None) ]))
ret.append(data.Custom(meta, date, "example", ["value1", "value2",
"value3"]))
return ret
#EOF
--
You received this message because you are subscribed to the Google Groups
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beancount/3d5180ea-d784-4447-9401-df70ac05c653n%40googlegroups.com.