Skip to content

Commit

Permalink
Display Stats at the end of the build
Browse files Browse the repository at this point in the history
 * "debug-files" contains a sorted list of various declarations

Output example:
```
====> Display Stats
Valid | Deprecated | Removed | Description
------+------------+---------+--------------
  179 |          2 |       0 | APIs
  457 |         44 |      30 | Attributes
  292 |         43 |      25 | Constants
  141 |         12 |       0 | Macros
   44 |          0 |       0 | Structs
------+------------+---------+--------------
 1113 |        101 |      55 | Totals
```

Signed-off-by: Joshua Hursey <jhursey@us.ibm.com>
(cherry picked from commit ca3860e)
  • Loading branch information
jjhursey committed May 26, 2022
1 parent 9771c6b commit 7cf8ff8
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 12 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ figs/~$drawings.pptx
*.soc
_minted*
sources/_autogen_/
debug-files
28 changes: 16 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@

version=4.0
OPENPMIX_BRANCH ?= "v4.0"
default: pmix-standard.pdf

all: pmix-standard.pdf check

CHAPTERS= \
TitlePage.tex \
Expand Down Expand Up @@ -47,12 +48,13 @@ INTERMEDIATE_FILES=pmix-standard.pdf \
pmix-standard.blg \
pmix-standard.synctex.gz \
pmix-standard.xwm \
*.idx *.ilg *.ind
*.idx *.ilg *.ind \
debug-files

all: pmix-standard.pdf

pmix-standard.pdf: $(CHAPTERS) $(SOURCES) pmix.sty pmix-standard.tex figs/pmix-logo.png
rm -f $(INTERMEDIATE_FILES)
rm -rf $(INTERMEDIATE_FILES)
@echo "-------------------------------------------------------------"
@echo "If error occurs check pmix-standard.log and pmix-standard.ind"
@echo "-------------------------------------------------------------"
Expand All @@ -68,34 +70,36 @@ pmix-standard.pdf: $(CHAPTERS) $(SOURCES) pmix.sty pmix-standard.tex figs/pmix-l
pdflatex -interaction=batchmode -file-line-error pmix-standard.tex || \
pdflatex -interaction=errorstopmode -file-line-error pmix-standard.tex < /dev/null
pdflatex -interaction=batchmode -file-line-error pmix-standard.tex
@./bin/check-doc.sh
@echo "====> Success"
@cp pmix-standard.pdf pmix-standard-${version}.pdf

FORCECHECK:

check: check-doc check-openpmix
check: check-doc display-stats

# Includes
# - make check-decl
# - make check-attr-ref
check-doc: pmix-standard.pdf FORCECHECK
check-doc: pmix-standard.pdf
@./bin/check-doc.sh
@echo "========> Success <========"

check-attr-ref: pmix-standard.pdf FORCECHECK
check-attr-ref: pmix-standard.pdf
@echo "====> Checking for Attributes Declared, but not referenced"
@./bin/check-attr-refs.py

check-decl: pmix-standard.pdf FORCECHECK
check-decl: pmix-standard.pdf
@echo "====> Checking for Multi-declared items"
@./bin/check-multi-declare.py

# The default is defined near the top of the Makefile
# To change the default at runtime you can manually set the envar:
# OPENPMIX_BRANCH=master make check-openpmix
check-openpmix: pmix-standard.pdf FORCECHECK
check-openpmix: pmix-standard.pdf
@echo "====> Checking cross-reference with OpenPMIx"
@./bin/check-openpmix.py -b ${OPENPMIX_BRANCH}

display-stats: pmix-standard.pdf
@echo "====> Display Stats"
@mkdir -p debug-files
@./bin/display-stats.py -f debug-files/std

clean:
rm -f $(INTERMEDIATE_FILES) pmix-standard-*.pdf
144 changes: 144 additions & 0 deletions bin/display-stats.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/usr/bin/env -S python3 -u

import sys
import os
import re
import argparse
import subprocess
import shutil

class Reference:
def __init__(self, name):
self.name = name
self.is_dep = False
self.is_rm = False

def __str__(self):
if self.is_dep:
return self.name + " (Deprecated)"
elif self.is_rm:
return self.name + " (Removed)"
else:
return self.name

def __cmp__(self, other):
return (self.name < other.name)

def display_header():
print("Valid | Deprecated | Removed | Description")
display_footer()

def display_footer():
print("------+------------+---------+--------------")

def display_counts(refs, desc, filename = None):
num_total = len(refs)
num_dep = sum(x.is_dep for x in refs)
num_rm = sum(x.is_rm for x in refs)
num_active = num_total - num_dep - num_rm

print("%5d | %10d | %7d | %s" % (num_active, num_dep, num_rm, desc))

if filename is not None:
output = filename + "-" + desc + "-Deprecated.txt";
with open(output, "w") as f:
for x in sorted(refs, key=lambda x: x.name):
if x.is_dep is True:
f.write(x.name + "\n")
output = filename + "-" + desc + "-Removed.txt";
with open(output, "w") as f:
for x in sorted(refs, key=lambda x: x.name):
if x.is_rm is True:
f.write(x.name + "\n")
output = filename + "-" + desc + ".txt";
with open(output, "w") as f:
for x in sorted(refs, key=lambda x: x.name):
if x.is_dep is False and x.is_rm is False:
f.write(x.name + "\n")

if __name__ == "__main__":
std_all = []
std_attributes = []
std_macros = []
std_consts = []
std_structs = []
std_apis = []

#
# Command line parsing
#
parser = argparse.ArgumentParser(description="PMIx Standard Display Interface Stats")
parser.add_argument("-v", "--verbose", help="Verbose output", action="store_true")
parser.add_argument("-d", "--debug", help="Debugging output", action="store_true")
parser.add_argument("-f", "--filename", help="File prefix to write values")

parser.parse_args()
args = parser.parse_args()

if os.path.exists("pmix-standard.aux") is False:
print("Error: Cannot find the .aux files necessary for processing in the current directory.")
print(" Please run this script from the base PMIx Standard build directory, and with a recent build.")
sys.exit(1)

#
# Extract all declarations
#
all_ref_strs = ["attr", "const", "struct", "macro", "apifn"]
for ref_str in all_ref_strs:
if args.verbose is True:
print("-"*50)
print("Extracting Standard: \""+ref_str+"\"")
print("-"*50)

# subsection.A is Appendix A: Python Bindings
p = subprocess.Popen("grep \"newlabel{"+ref_str+"\" pmix-standard.aux | grep -v \"subsection.A\"",
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, close_fds=True)
sout = p.communicate()[0].decode("utf-8").splitlines()
if p.returncode != 0:
print("Error: Failed to extract declared \""+ref_str+"\". grep error code "+str(p.returncode)+")");
sys.exit(2)

for line in sout:
line = line.rstrip()
m = re.match(r"\s*\\newlabel{"+ re.escape(ref_str) + r":(\w+)", line)
if m is None:
print("Error: Failed to extract an \""+ref_str+"\" on the following line")
print(" line: "+line)
sys.exit(1)

ref = Reference(m.group(1))
ref.is_dep = re.search(r"Deprecated", line) is not None
ref.is_rm = re.search(r"Removed", line) is not None
std_all.append(ref)

if args.debug is True:
print("DEBUG: Classify: %s" % ref)

if ref_str == "attr":
std_attributes.append(ref)
elif ref_str == "const":
std_consts.append(ref)
elif ref_str == "struct":
std_structs.append(ref)
elif ref_str == "macro":
std_macros.append(ref)
elif ref_str == "apifn":
std_apis.append(ref)
else:
print("Error: Failed to classify: %s" % ref)
sys.exit(1)
p.wait()

#
# Display summary
#
display_header()
display_counts(std_apis, "APIs", args.filename)
display_counts(std_attributes, "Attributes", args.filename)
display_counts(std_consts, "Constants", args.filename)
display_counts(std_macros, "Macros", args.filename)
display_counts(std_structs, "Structs", args.filename)
display_footer()
display_counts(std_all, "Totals")

sys.exit(0)

0 comments on commit 7cf8ff8

Please sign in to comment.