Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sort meta keys before printing to fix tests broken by Beancount 2.3.6 #213

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion beancount_import/journal_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
import beancount.parser.booking
from beancount.core.number import MISSING

from .sorted_entry_printer import SortedEntryPrinter

# Inclusive starting original line, exclusive ending original line.
LineRange = Tuple[int, int]

Expand Down Expand Up @@ -820,7 +822,7 @@ def get_diff(self) -> JournalDiff:
new_entries = []
old_entries = []

printer = beancount.parser.printer.EntryPrinter()
printer = SortedEntryPrinter()

for filename, changed_entries in self.changed_entries.items():
changed_entries.sort(key=lambda x: float('inf')
Expand Down
19 changes: 19 additions & 0 deletions beancount_import/sorted_entry_printer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import beancount.parser.printer


class SortedEntryPrinter(beancount.parser.printer.EntryPrinter):
"""A subclass of EntryPrinter that sorts the meta keys before printing.

This preserves the behavior of EntryPrinter from Beancount 2.3.5 and
earlier.

"""
def __init__(self, **kwargs):
super().__init__(**kwargs)

def write_metadata(self, meta, oss, prefix=None):
if meta is None:
sorted_meta = None
else:
sorted_meta = dict(sorted(meta.items()))
super().write_metadata(sorted_meta, oss, prefix)
5 changes: 3 additions & 2 deletions beancount_import/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import beancount.parser.printer
from beancount.core.data import Directive, Entries, Posting, Transaction, Meta

from .sorted_entry_printer import SortedEntryPrinter


def parse(text: str) -> Entries:
entries, errors, options = beancount.parser.parser.parse_string(
Expand All @@ -19,8 +21,7 @@ def parse(text: str) -> Entries:


def format_entries(entries: Entries, indent=0):
result = '\n\n'.join(
beancount.parser.printer.format_entry(e) for e in entries)
result = '\n\n'.join(SortedEntryPrinter()(e) for e in entries)
indent_str = ' ' * indent
return '\n'.join(indent_str + x.rstrip() for x in result.split('\n'))

Expand Down
Loading