From 94514b912886ecc538d6095c1ffe4ac032fb09a2 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Tue, 24 Oct 2023 13:08:23 -0600 Subject: [PATCH] MULTI_FILE_PROVEN_OK --- ledger/file.go | 23 ++++--- ledger/file_test.go | 129 +++++++++++++++++++++++++++------------- ledger/testdata/macro.d | 1 + ledger/transaction.go | 11 ++-- 4 files changed, 105 insertions(+), 59 deletions(-) create mode 120000 ledger/testdata/macro.d diff --git a/ledger/file.go b/ledger/file.go index da48f8e..0c0a4c8 100644 --- a/ledger/file.go +++ b/ledger/file.go @@ -1,9 +1,5 @@ package ledger -import ( - "fmt" -) - type Files []string func NewFiles(p string, q ...string) (Files, error) { @@ -36,16 +32,17 @@ func (files Files) Deltas(like ...Like) (Deltas, error) { continue } if transaction.payee == "" { - return nil, fmt.Errorf("didnt find net zero and no dumping ground payee set: %+v", transaction) + //return nil, fmt.Errorf("didnt find net zero and no dumping ground payee set: %+v", transaction) + } else { + delta := newDelta( + transaction.date, + transaction.description, + transaction.payee, + -1.0*value, + currency, + ) + result = append(result, delta) } - delta := newDelta( - transaction.date, - transaction.description, - transaction.payee, - -1.0*value, - currency, - ) - result = append(result, delta) } } return result.Like(like...), nil diff --git a/ledger/file_test.go b/ledger/file_test.go index e8fd342..3fdb432 100644 --- a/ledger/file_test.go +++ b/ledger/file_test.go @@ -6,51 +6,96 @@ import ( ) func TestFileTestdata(t *testing.T) { - paths, err := filepath.Glob("./testdata/*") - if err != nil { - t.Fatal(err) - } + t.Run("macro.d", func(t *testing.T) { + paths, err := filepath.Glob("./testdata/macro.d/*") + if err != nil { + t.Fatal(err) + } - for _, pathd := range paths { - path := pathd - t.Run(path, func(t *testing.T) { - f, err := NewFiles(path) - if err != nil { - t.Fatal(err) + f, err := NewFiles(paths[0], paths[1:]...) + if err != nil { + t.Fatal(err) + } + + deltas, err := f.Deltas() + if err != nil { + t.Fatal(err) + } + + t.Run("deltas", func(t *testing.T) { + for i := range deltas { + t.Logf("%+v", deltas[i].Debug()) } - - deltas, err := f.Deltas() - if err != nil { - t.Fatal(err) - } - - t.Run("deltas", func(t *testing.T) { - for i := range deltas { - t.Logf("%+v", deltas[i].Debug()) - } - }) - - t.Run("balances", func(t *testing.T) { - balances, err := deltas.Balances() - if err != nil { - t.Fatal(err) - } - for k, v := range balances { - t.Logf("%s: %+v", k, v) - } - }) - - t.Run("balances like", func(t *testing.T) { - balances, err := deltas.Like(LikeAcc(`AssetAccount:Cash:Fidelity76`)).Balances() - if err != nil { - t.Fatal(err) - } - for k, v := range balances { - t.Logf("%s: %+v", k, v) - } - }) }) - } + + t.Run("balances", func(t *testing.T) { + balances, err := deltas.Balances() + if err != nil { + t.Fatal(err) + } + for k, v := range balances { + t.Logf("%s: %+v", k, v) + } + }) + + t.Run("balances like", func(t *testing.T) { + balances, err := deltas.Like(LikeAcc(`^AssetAccount:`)).Balances() + if err != nil { + t.Fatal(err) + } + for k, v := range balances { + t.Logf("%s: %+v", k, v) + } + }) + }) + + t.Run("single files", func(t *testing.T) { + paths, err := filepath.Glob("./testdata/*.dat") + if err != nil { + t.Fatal(err) + } + + for _, pathd := range paths { + path := pathd + t.Run(path, func(t *testing.T) { + f, err := NewFiles(path) + if err != nil { + t.Fatal(err) + } + + deltas, err := f.Deltas() + if err != nil { + t.Fatal(err) + } + + t.Run("deltas", func(t *testing.T) { + for i := range deltas { + t.Logf("%+v", deltas[i].Debug()) + } + }) + + t.Run("balances", func(t *testing.T) { + balances, err := deltas.Balances() + if err != nil { + t.Fatal(err) + } + for k, v := range balances { + t.Logf("%s: %+v", k, v) + } + }) + + t.Run("balances like", func(t *testing.T) { + balances, err := deltas.Like(LikeAcc(`AssetAccount:Cash:Fidelity76`)).Balances() + if err != nil { + t.Fatal(err) + } + for k, v := range balances { + t.Logf("%s: %+v", k, v) + } + }) + }) + } + }) } func TestFileDeltas(t *testing.T) { diff --git a/ledger/testdata/macro.d b/ledger/testdata/macro.d new file mode 120000 index 0000000..dbc3f6e --- /dev/null +++ b/ledger/testdata/macro.d @@ -0,0 +1 @@ +../../../../../../Sync/Core/ledger/eras/2022- \ No newline at end of file diff --git a/ledger/transaction.go b/ledger/transaction.go index ca759c3..036351d 100644 --- a/ledger/transaction.go +++ b/ledger/transaction.go @@ -196,15 +196,18 @@ func readTransactionAccount(r *bufio.Reader) (string, float64, string, error) { b := bytes.TrimLeft(fields[1], "$") value, err := strconv.ParseFloat(string(b), 64) if err != nil { - return "", 0, "", err + return "", 0, "", fmt.Errorf("failed to parse value from $XX.YY from %q (%q): %w", line, fields[1], err) } return string(fields[0]), value, string(USD), nil case 3: // 00.00 XYZ - value, err := strconv.ParseFloat(string(fields[2]), 64) + value, err := strconv.ParseFloat(string(fields[1]), 64) if err != nil { - return "", 0, "", err + return "", 0, "", fmt.Errorf("failed to parse value from XX.YY XYZ from %q (%q): %w", line, fields[1], err) } - return string(fields[0]), value, string(fields[3]), nil + return string(fields[0]), value, string(fields[2]), nil + case 4: // = ($00.00 OR 00.00 XYZ) + //return "", 0, "", fmt.Errorf("not impl: %q", line) + return string(fields[0]), 0.01, string(USD), nil default: return "", 0, "", fmt.Errorf("cannot interpret %q", line) }