From 92ce7318900707999e75bc423e961b0578dd2371 Mon Sep 17 00:00:00 2001 From: Kyle Mandli Date: Sat, 16 Jul 2011 16:54:23 -0500 Subject: [PATCH] Change look and feel of table, add better handling of table columns Add many improvements to table look including support for tags such as missing, partial, done, and not applicable. The tabularcolumns directive does not seem to be affecting the tables width and columns however. --- doc/source/_static/default.css_t | 15 ++- doc/source/coverage_generator.py | 162 +++++++++++++++++++++++-------- 2 files changed, 132 insertions(+), 45 deletions(-) diff --git a/doc/source/_static/default.css_t b/doc/source/_static/default.css_t index af08871e..d6ae53b3 100644 --- a/doc/source/_static/default.css_t +++ b/doc/source/_static/default.css_t @@ -275,12 +275,23 @@ th { /* Coverage States */ span.missing{ - color: #FFFFFF; + color: #000; background-color: #ff5840; border-color: #A77272; + font-weight: bold; } -span.covered{ +span.partial{ + color: #806600; + background-color: #ffc343; + font-weight: bold; +} +span.done{ color: #106600; background-color: #60f030; border-color: #4F8530; + font-weight: bold; +} +span.na{ + color: #A8A8A8; + border-color: #4F8530; } \ No newline at end of file diff --git a/doc/source/coverage_generator.py b/doc/source/coverage_generator.py index b80ba02a..59094daa 100644 --- a/doc/source/coverage_generator.py +++ b/doc/source/coverage_generator.py @@ -4,68 +4,144 @@ import sys import os import csv -# Parameters -missing_string = ":missing:`Not Implemented`" -page_title = "Coverage Tables" -table_names = ["Image Display and Exploration","Image File I/O"] +# Import StringIO module +try: + import cStringIO as StringIO +except ImportError: + import StringIO -def table_seperator(cols,lengths,character="-"): - output = "+" - output += '+'.join([character*(length+2) for length in lengths]) - output += "+" - return output +# Missing item value +MISSING_STRING=":missing:`Not Implemented`" + +def read_table_titles(reader): + r"""Create a dictionary with keys as section names and values as a list of + table names -def table_row(data,lengths,num_columns=None): + return (dict) + """ + section_titles = [] + table_names = {} + try: + for row in reader: + names = [] + # End of names table + if len(row[0]) == 0: + break + # Extract names of the tables + for name in row[1:]: + if len(name) > 0: + names.append(name) + else: + break + section_titles.append(row[0]) + table_names[row[0]] = names + except csv.Error, e: + sys.exit('line %d: %s' % (reader.line_num, e)) + + return section_titles,table_names + +def table_seperator(stream,cols,lengths,character="-"): + stream.write("+") + stream.write('+'.join([character*(length+2) for length in lengths])) + stream.write("+") + +def table_row(stream,data,lengths,num_columns=None): if num_columns is None: num_columns = len(data) - output = "|" + stream.write("|") for i in xrange(num_columns): if len(data)-1 >= i: - entry = data[i] + if len(data[i]) == 0: + entry = MISSING_STRING + else: + entry = data[i] else: - entry = missing_string - output += " " + entry + " "*(lengths[i] - len(entry)) + " |" - return output + entry = MISSING_STRING + stream.write(" " + entry + " "*(lengths[i] - len(entry)) + " |") -def generate_table(reader,column_titles=["Functionality","Matlab","Scipy"]): +def generate_table(reader,stream,table_name, + column_titles=["Functionality","Matlab","Scipy","Scipy"]): # Find number of columns and column widths, base number of columns is # determined by the headers - num_columns = 3 + num_columns = len(column_titles) data = [column_titles] - for row in reader: - if len(row) == 0: - break - data.append([entry.expandtabs() for entry in row]) - num_columns = max(num_columns,len(row)) + try: + for row in reader: + # print row + if len(row[0]) == 0: + break + data.append([entry.expandtabs() for entry in row]) + num_columns = max(num_columns,len(row)) + except csv.Error, e: + sys.exit('line %d: %s' % (reader.line_num, e)) - column_lengths = [len(missing_string)]*num_columns + column_lengths = [len(MISSING_STRING)]*num_columns for row in data: for i in xrange(len(row)): column_lengths[i] = max(column_lengths[i],len(row[i])) - output = table + "\n" - output += "-"*len(table)+"\n\n" - output += table_seperator(num_columns,column_lengths,character="-") + "\n" - output += table_row(data[0],column_lengths,num_columns) + "\n" - output += table_seperator(num_columns,column_lengths,character="=") + "\n" + # Output table header + stream.write(table_name + "\n") + stream.write("~"*len(table_name)+"\n\n") + stream.write(".. tabularcolumns:: |p{40%}|p{20%}|p{20%}|p{20%}|\n\n") + stream.write(".. table::%s\n\n" % table_name) + table_seperator(stream,num_columns,column_lengths,character="-") + stream.write("\n") + table_row(stream,data[0],column_lengths,num_columns) + stream.write("\n") + table_seperator(stream,num_columns,column_lengths,character="=") + stream.write("\n") + + # Output table data for row in data[1:]: - output += table_row(row,column_lengths,num_columns) + "\n" - output += table_seperator(num_columns,column_lengths,character='-') + "\n" - output += "\n\n" - return output + table_row(stream,row,column_lengths,num_columns) + stream.write("\n") + table_seperator(stream,num_columns,column_lengths,character='-') + stream.write("\n") + stream.write("\n\n") + +def generate_page(reader,stream,page_title="Coverage Tables"): + stream.write("%s\n" % page_title) + stream.write("="*len(page_title) + "\n\n") + stream.write(".. role:: missing\n") + stream.write(".. role:: partial\n") + stream.write(".. role:: done\n") + stream.write(".. role:: na\n\n") + stream.write("Color Key\n") + stream.write("---------\n") + stream.write(":done:`Complete` ") + stream.write(":partial:`Partial` ") + stream.write(":missing:`Missing` ") + stream.write(":na:`Not applicable`\n\n") + + sections,table_names = read_table_titles(reader) + for section_name in sections: + stream.write(section_name + "\n") + stream.write("-"*len(section_name) + "\n\n") + for table_name in table_names[section_name]: + generate_table(reader,stream,table_name) if __name__ == "__main__": - if len(sys.argv) > 1: + csv_path = './coverage.csv' + output_path = './coverage_table.txt' + if len(sys.argv) == 2: csv_path = os.path.abspath(sys.argv[1]) - else: - csv_path = './coverage.csv' + if len(sys.argv) == 3: + output_path = os.path.abspath(sys.argv[2]) + + # Figure out dialect and create csv reader + csv_file = open(csv_path,'U') + # dialect = csv.Sniffer().sniff(csv_file.read(1024)) + # csv_file.seek(0) + # reader = csv.reader(csv_file, dialect) + reader = csv.reader(csv_file,) + + output = open(output_path,'w') + generate_page(reader,output) + + csv_file.close() + output.close() + + print "Generated %s from %s." % (output_path,csv_path) - reader = csv.reader(open(csv_path,'r'),delimiter=',',quotechar='"') -print page_title -print "="*len(page_title) -print -print ".. role:: missing" -print -for table in table_names: - print generate_table(reader)