Browse Source

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

The MMGen Project 4 years ago
parent
commit
b220d88226
1 changed files with 16 additions and 17 deletions
  1. 16 17
      mmgen/node_tools/BlocksInfo.py

+ 16 - 17
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: