From b220d8822659d25dbad1e7fdd6e774453436024f Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 21 Mar 2021 12:43:32 +0000 Subject: [PATCH] mmnode-blocks-info: enable JSON output of averages stats --- mmgen/node_tools/BlocksInfo.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/mmgen/node_tools/BlocksInfo.py b/mmgen/node_tools/BlocksInfo.py index 6c70e04..5dec41f 100644 --- a/mmgen/node_tools/BlocksInfo.py +++ b/mmgen/node_tools/BlocksInfo.py @@ -97,6 +97,7 @@ class BlocksInfo: all_stats = ['avg','range','diff'] dfl_stats = ['range','diff'] + noindent_stats = ['avg'] fmt_funcs = { 'df': lambda arg: strftime('%Y-%m-%d %X',gmtime(arg)), @@ -181,7 +182,7 @@ class BlocksInfo: self.block_data = namedtuple('block_data',self.fnames) self.stats = get_stats() if opt.stats else self.dfl_stats - def gen_fs(self,fnames,fill=[],fill_char='-'): + def gen_fs(self,fnames,fill=[],fill_char='-',add_name=False): for i in range(len(fnames)): name = fnames[i] ls = (' ','')[name in self.fs_lsqueeze + self.fs_lsqueeze2] @@ -193,11 +194,8 @@ class BlocksInfo: if name in group and fnames[i-1] in group: ls = '' break - yield ( - ls - + (self.fields[name].fs.replace(':',':'+fill_char) if name in fill else self.fields[name].fs) - + rs - ) + repl = (name if add_name else '') + ':' + (fill_char if name in fill else '') + yield (ls + self.fields[name].fs.replace(':',repl) + rs) def conv_blkspec(self,arg): if arg == 'cur': @@ -388,19 +386,20 @@ class BlocksInfo: yield self.fs.format(*hdr1) yield self.fs.format(*hdr2) - def process_stats(self,name): - return self.output_stats(getattr(self,f'create_{name}_stats')()) + def process_stats(self,sname): + return self.output_stats(getattr(self,f'create_{sname}_stats')(),sname) - async def output_stats(self,res): + async def output_stats(self,res,sname): def gen(data): for d in data: if len(d) == 2: - yield (' '+d[0]).format(**d[1]) + yield (indent+d[0]).format(**d[1]) elif len(d) == 3: - yield (' '+d[0]).format(d[2]) + yield (indent+d[0]).format(d[2]) else: yield d - name,data = await res + foo,data = await res + indent = '' if sname in self.noindent_stats else ' ' Msg('\n'.join(gen(data))) async def create_range_stats(self): @@ -482,13 +481,13 @@ class BlocksInfo: def gen(): for field in self.fnames: if field in skip: - yield '' + yield ( field, '' ) else: ret = sum(getattr(block,field) for block in self.res) // len(self.res) vn = self.fields[field].varname - yield self.fmt_funcs[vn](ret) if vn in self.fmt_funcs else ret - fs = ''.join(self.gen_fs(self.fnames,fill=skip)).strip() - return ( 'averages', ( 'Averages:', fs.format(*gen()) ) ) + yield ( field, (self.fmt_funcs[vn](ret) if vn in self.fmt_funcs else ret) ) + fs = ''.join(self.gen_fs(self.fnames,fill=skip,add_name=True)).strip() + return ('averages', ('Averages:', (fs, dict(gen())) )) def process_stats_pre(self,i): if not (self.opt.stats_only and i == 0): @@ -551,7 +550,7 @@ class JSONBlocksInfo(BlocksInfo): def print_header(self): pass - async def output_stats(self,res): + async def output_stats(self,res,sname): def gen(data): for d in data: if len(d) == 2: