From 837fcec8f0db16be01f2a425ad4ee45793db1b5e 2020-07-29 21:22:09 From: Brett Smith Date: 2020-07-29 21:22:09 Subject: [PATCH] reports: Add BaseODS.set_common_properties() method. --- diff --git a/conservancy_beancount/reports/core.py b/conservancy_beancount/reports/core.py index 3fae1583dc32cbe1df40cf73d7cd7c7cdfa76817..95fde294c0accec61428c01e4bfcb40ed7de8471 100644 --- a/conservancy_beancount/reports/core.py +++ b/conservancy_beancount/reports/core.py @@ -22,11 +22,15 @@ import enum import itertools import operator import re +import shlex +import sys import urllib.parse as urlparse import babel.core # type:ignore[import] import babel.numbers # type:ignore[import] +import git # type:ignore[import] + import odf.config # type:ignore[import] import odf.element # type:ignore[import] import odf.meta # type:ignore[import] @@ -1052,6 +1056,22 @@ class BaseODS(BaseSpreadsheet[RT, ST], metaclass=abc.ABCMeta): ### Properties + def set_common_properties(self, + repo: Optional[git.Repo]=None, + command: Optional[Sequence[str]]=sys.argv, + ) -> None: + if repo is None: + git_shahex = '' + git_dirty = True + else: + git_shahex = repo.head.commit.hexsha + git_dirty = repo.is_dirty() + self.set_custom_property('GitSHA', git_shahex) + self.set_custom_property('GitDirty', git_dirty, 'boolean') + if command is not None: + command_s = ' '.join(shlex.quote(s) for s in command) + self.set_custom_property('ReportCommand', command_s) + def set_custom_property(self, name: str, value: Any, diff --git a/tests/test_reports_spreadsheet.py b/tests/test_reports_spreadsheet.py index 133b5e60e326a0ba99fa816154bfb9109c0b6b3c..20394760ce86acda38b3483a6ea419119d4222bb 100644 --- a/tests/test_reports_spreadsheet.py +++ b/tests/test_reports_spreadsheet.py @@ -748,3 +748,21 @@ def test_ods_writer_set_custom_property(ods_writer, value, exptype): else: expected = str(value) assert cprop.text == expected + +def test_ods_writer_set_common_properties(ods_writer): + ods_writer.set_common_properties() + get_child(ods_writer.document.meta, odf.meta.UserDefined, name='ReportCommand') + +def test_ods_writer_common_repo_properties(ods_writer): + repo = testutil.TestRepo('abcd1234', False) + ods_writer.set_common_properties(repo) + meta = ods_writer.document.meta + sha_prop = get_child(meta, odf.meta.UserDefined, name='GitSHA') + assert sha_prop.text == 'abcd1234' + dirty_prop = get_child(meta, odf.meta.UserDefined, name='GitDirty') + assert dirty_prop.text == 'false' + +def test_ods_writer_common_command(ods_writer): + ods_writer.set_common_properties(command=['testcmd', 'testarg*']) + cmd_prop = get_child(ods_writer.document.meta, odf.meta.UserDefined, name='ReportCommand') + assert cmd_prop.text == 'testcmd \'testarg*\'' diff --git a/tests/testutil.py b/tests/testutil.py index 9534bff4382ead304b93a66256879a0ad1905e69..74ae8f24cfae926af23fe02f6de24dfdd83ffc89 100644 --- a/tests/testutil.py +++ b/tests/testutil.py @@ -17,12 +17,14 @@ import datetime import itertools import re +import unittest.mock import beancount.core.amount as bc_amount import beancount.core.data as bc_data import beancount.loader as bc_loader import beancount.parser.options as bc_options +import git import odf.element import odf.opendocument import odf.table @@ -288,6 +290,13 @@ class TestConfig: return self._rt_wrapper +def TestRepo(head_hexsha='abcd1234', dirty=False): + retval = unittest.mock.Mock(spec=git.Repo) + retval.is_dirty.return_value = dirty + retval.head.commit.hexsha = head_hexsha + return retval + + class _TicketBuilder: MESSAGE_ATTACHMENTS = [ ('(Unnamed)', 'multipart/alternative', '0b'),