2020TESTDIR = os .path .dirname (__file__ )
2121TEST_DATA_PATH = os .path .join (TESTDIR , 'test_data' )
2222TEST_OUTPUT_PATH = os .path .join (TESTDIR , 'test_output' )
23+ TEST_SUMMARY_PATH = os .path .join (TEST_OUTPUT_PATH , 'index.html' )
2324
2425
2526class ReadabilityTest :
@@ -73,9 +74,12 @@ def make_readability_test(dir_path, name, spec_dict):
7374
7475
7576def load_test_data (test ):
76- orig = open (test .orig_path , 'r' ).read ()
77- rdbl = open (test .rdbl_path , 'r' ).read ()
78- return ReadabilityTestData (test , orig , rdbl )
77+ if test .enabled :
78+ orig = open (test .orig_path , 'r' ).read ()
79+ rdbl = open (test .rdbl_path , 'r' ).read ()
80+ return ReadabilityTestData (test , orig , rdbl )
81+ else :
82+ return None
7983
8084
8185def load_readability_tests (dir_path , files ):
@@ -90,14 +94,122 @@ def load_readability_tests(dir_path, files):
9094
9195
9296def execute_test (test_data ):
93- doc = readability .Document (test_data .orig_html )
94- summary = doc .summary_with_metadata ()
95- benchmark_doc = (test_data .rdbl_html , 'benchmark' )
96- result_doc = (summary .html , 'result' )
97- # diff = lxml.html.diff.html_annotate([benchmark_doc, result_doc])
98- diff = lxml .html .diff .htmldiff (test_data .rdbl_html , summary .html )
99- # diff = test_data.orig_html
100- return ReadabilityTestResult (test_data , summary .html , diff )
97+ if test_data is None :
98+ return None
99+ else :
100+ doc = readability .Document (test_data .orig_html )
101+ summary = doc .summary ()
102+ benchmark_doc = (test_data .rdbl_html , 'benchmark' )
103+ result_doc = (summary .html , 'result' )
104+ diff = lxml .html .diff .htmldiff (test_data .rdbl_html , summary .html )
105+ return ReadabilityTestResult (test_data , summary .html , diff )
106+
107+
108+ SUMMARY_CSS = '''
109+ table, th, td {
110+ border: 1px solid black;
111+ border-collapse: collapse;
112+ font-family: Georgia, 'Times New Roman', serif;
113+ }
114+ table {
115+ margin: auto;
116+ }
117+ .skipped {
118+ color: gray;
119+ }
120+ td, th {
121+ font-size: 1.2em;
122+ border: 1px solid black;
123+ padding: 3px 7px 2px 7px;
124+ }
125+ th {
126+ font-size: 16px;
127+ text-align: left;
128+ padding-top: 5px;
129+ padding-bottom: 4px;
130+ }
131+ '''
132+
133+
134+ def element_string_lengths (elems ):
135+ return [len (e .xpath ('string()' )) for e in elems ]
136+
137+
138+ class ResultSummary ():
139+
140+ def __init__ (self , result ):
141+ doc = lxml .html .fragment_fromstring (result .diff_html )
142+ insertions = doc .xpath ('//ins' )
143+ insertion_lengths = element_string_lengths (insertions )
144+ deletions = doc .xpath ('//del' )
145+ deletion_lengths = element_string_lengths (deletions )
146+ self .insertions = sum (insertion_lengths )
147+ self .insertion_blocks = len (insertions )
148+ self .deletions = sum (deletion_lengths )
149+ self .deletion_blocks = len (deletions )
150+ pass
151+
152+
153+ def make_summary_row (test , result ):
154+ def data (suffix ):
155+ return os .path .join ('..' , TEST_DATA_PATH , test .name + suffix )
156+ def output (suffix ):
157+ return test .name + suffix
158+ if test .enabled :
159+ s = ResultSummary (result )
160+ return B .TR (
161+ B .TD (test .name ),
162+ B .TD ('%d (%d)' % (s .insertions , s .insertion_blocks )),
163+ B .TD ('%d (%d)' % (s .deletions , s .deletion_blocks )),
164+ B .TD (
165+ B .A ('original' , href = data (ORIGINAL_SUFFIX )),
166+ ' ' ,
167+ B .A ('benchmark' , href = output (READABLE_SUFFIX )),
168+ ' ' ,
169+ B .A ('result' , href = output (RESULT_SUFFIX )),
170+ ' ' ,
171+ B .A ('diff' , href = output (DIFF_SUFFIX ))
172+ )
173+ )
174+ else :
175+ return B .TR (
176+ B .CLASS ('skipped' ),
177+ B .TD ('%s (SKIPPED)' % test .name ),
178+ B .TD ('N/A' ),
179+ B .TD ('N/A' ),
180+ B .TD ('N/A' )
181+ )
182+
183+
184+ def make_summary_doc (tests_w_results ):
185+ tbody = B .TBODY (
186+ B .TR (
187+ B .TH ('Test Name' ),
188+ B .TH ('Inserted (in # of blocks)' ),
189+ B .TH ('Deleted (in # of blocks)' ),
190+ B .TH ('Links' )
191+ )
192+ )
193+ for (test , result ) in tests_w_results :
194+ row = make_summary_row (test , result )
195+ tbody .append (row )
196+ return B .HTML (
197+ B .HEAD (
198+ B .TITLE ('Readability Test Summary' ),
199+ B .STYLE (SUMMARY_CSS , type = 'text/css' )
200+ ),
201+ B .BODY (
202+ B .TABLE (
203+ tbody
204+ )
205+ )
206+ )
207+
208+
209+ def write_summary (path , tests_w_results ):
210+ doc = make_summary_doc (tests_w_results )
211+ with open (path , 'w' ) as f :
212+ f .write (lxml .html .tostring (doc ))
101213
102214
103215CSS = '''
@@ -158,6 +270,7 @@ def write_output_fragment(fragment, output_dir_path, test_name, suffix):
158270def write_result (output_dir_path , result ):
159271 test_name = result .test_data .test .name
160272 specs = [
273+ (result .test_data .rdbl_html , READABLE_SUFFIX ),
161274 (result .diff_html , DIFF_SUFFIX ),
162275 (result .result_html , RESULT_SUFFIX )
163276 ]
@@ -176,12 +289,13 @@ def print_test_info(test):
176289def run_readability_tests ():
177290 files = os .listdir (TEST_DATA_PATH )
178291 tests = load_readability_tests (TEST_DATA_PATH , files )
179- for test in tests :
292+ test_datas = [load_test_data (t ) for t in tests ]
293+ results = [execute_test (t ) for t in test_datas ]
294+ for (test , result ) in zip (tests , results ):
180295 print_test_info (test )
181- if test .enabled :
182- test_data = load_test_data (test )
183- result = execute_test (test_data )
296+ if result :
184297 write_result (TEST_OUTPUT_PATH , result )
298+ write_summary (TEST_SUMMARY_PATH , zip (tests , results ))
185299
186300def main ():
187301 if len (sys .argv ) > 1 and sys .argv [1 ] == 'unittest' :
0 commit comments