From e1c9756250d97350307e3aca21029267f40ff11e Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 25 Sep 2023 13:25:02 +0000 Subject: [PATCH] util.py: new fmt_dict() function, add test --- mmgen/data/release_date | 2 +- mmgen/data/version | 2 +- mmgen/util.py | 14 ++++++++++ test/unit_tests_d/ut_util.py | 50 +++++++++++++++++++++++++++++++++++- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/mmgen/data/release_date b/mmgen/data/release_date index c8277aeb..2aa79658 100644 --- a/mmgen/data/release_date +++ b/mmgen/data/release_date @@ -1 +1 @@ -July 2023 +September 2023 diff --git a/mmgen/data/version b/mmgen/data/version index 2ad46b4a..efa6c01e 100644 --- a/mmgen/data/version +++ b/mmgen/data/version @@ -1 +1 @@ -14.0.dev1 +14.0.dev2 diff --git a/mmgen/util.py b/mmgen/util.py index ef49595b..ead187d0 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -190,6 +190,20 @@ def fmt_list(iterable,fmt='dfl',indent='',conv=None): conv = conv or _conv return indent + (sep+indent).join(lq+conv(e)+rq for e in iterable) +def fmt_dict(mapping,fmt='dfl',kconv=None,vconv=None): + "pretty-format a dict" + kc,vc,sep,fs = { + 'dfl': ( str, str, ", ", "'{}' ({})" ), + 'square': ( str, str, ", ", "'{}' [{}]" ), + 'equal': ( str, str, ", ", "'{}'={}" ), + 'equal_spaced': ( str, str, ", ", "'{}' = {}" ), + 'kwargs': ( str, repr, ", ", "{}={}" ), + 'colon': ( str, repr, ", ", "{}:{}" ), + }[fmt] + kconv = kconv or kc + vconv = vconv or vc + return sep.join(fs.format(kconv(k),vconv(v)) for k,v in mapping.items()) + def list_gen(*data): """ Generate a list from an arg tuple of sublists diff --git a/test/unit_tests_d/ut_util.py b/test/unit_tests_d/ut_util.py index ff8caab3..faf0f025 100755 --- a/test/unit_tests_d/ut_util.py +++ b/test/unit_tests_d/ut_util.py @@ -5,7 +5,8 @@ test.unit_tests_d.ut_misc: utility unit tests for the MMGen suite """ from ..include.common import vmsg -from mmgen.util import fmt_list,list_gen +from mmgen.util import fmt_list,fmt_dict,list_gen +from mmgen.color import cyan class unit_tests: @@ -46,6 +47,53 @@ class unit_tests: vmsg('') return True + def fmt_dict(self,name,ut): + samples = { + 'url': { + 'name':'Example', + 'desc':'Sample URL', + 'rank': 1, + 'error': None, + 'url':'https://example.com/foobar.html', + }, + 'choice': { + 'c': 'curl', + 'a': 'aiohttp', + 'r': 'requests', + }, + 'cmdline': { + 'cmd': ["ls","-l"], + 'text': 'foo bar', + 'stdin': None, + 'offset': 123, + 'env': {}, + } + } + chks = { + 'cmdline': { + None: "'cmd' (['ls', '-l']), 'text' (foo bar), 'stdin' (None), 'offset' (123), 'env' ({})", + 'dfl': "'cmd' (['ls', '-l']), 'text' (foo bar), 'stdin' (None), 'offset' (123), 'env' ({})", + 'square': "'cmd' [['ls', '-l']], 'text' [foo bar], 'stdin' [None], 'offset' [123], 'env' [{}]", + 'equal': "'cmd'=['ls', '-l'], 'text'=foo bar, 'stdin'=None, 'offset'=123, 'env'={}", + 'equal_spaced': "'cmd' = ['ls', '-l'], 'text' = foo bar, 'stdin' = None, 'offset' = 123, 'env' = {}", + 'kwargs': "cmd=['ls', '-l'], text='foo bar', stdin=None, offset=123, env={}", + 'colon': "cmd:['ls', '-l'], text:'foo bar', stdin:None, offset:123, env:{}", + } + } + + col1_w = max(len(str(e)) for e in list(chks.values())[0]) + 1 + + for name,sample in samples.items(): + vmsg(cyan(f'Input: {sample}')) + for fmt,chk in list(chks.values())[0].items(): + res = fmt_dict(sample,fmt=fmt) if fmt else fmt_dict(sample) + vmsg(f' {str(fmt)+":":{col1_w}} {res}') + if name in chks: + assert res == chks[name][fmt], f'{res} != {chks[name][fmt]}' + + vmsg('') + return True + def list_gen(self,name,ut): res = list_gen( ['a'],