mmnode-blocks-info: enable JSON output of averages stats

This commit is contained in:
The MMGen Project 2021-03-21 12:43:32 +00:00
commit b220d88226
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2

View file

@ -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: