entry = root.find('entry')
info['revision'] = entry.get('revision')
info['url'] = entry.find('url').text
relurl = entry.find('relative-url').text
# relative path has ^ at the beginning
if relurl.startswith('^'):
relurl = relurl[1:]
info['relative-url'] = relurl
return info
# TODO: add this to svnversion function
except OSError as e:
import errno
# ignore No such file or directory
if e.errno != errno.ENOENT:
raise
return None
class GrassTestFilesReporter(object):
def __init__(self, results_dir):
# TODO: no directory cleaning (self.clean_before)? now cleaned by caller
ensure_dir(os.path.abspath(results_dir))
# having all variables public although not really part of API
self.main_index = open(os.path.join(results_dir, 'index.html'), 'w')
# this might be moved to some report start method
self.main_start_time = datetime.datetime.now()
svn_info = get_svn_info()
if not svn_info:
svn_text = (''
'SVN revision cannot be be obtained'
'')
else:
url = get_source_url(path=svn_info['relative-url'],
revision=svn_info['revision'])
svn_text = ('SVN revision'
' '
'{rev}'
).format(url=url, rev=svn_info['revision'])
self.main_index.write(''
'Test results
'
'{time:%Y-%m-%d %H:%M:%S}'
' ({svn})'
''
''
'Tested directory | '
'Test file | '
'Status | '
'
'.format(
time=self.main_start_time,
svn=svn_text))
self.file_start_time = None
self._start_file_test_called = False
def finish(self):
self.main_index.write('
'
'')
self.main_index.close()
def start_file_test(self, module):
self.file_start_time = datetime.datetime.now()
self._start_file_test_called = True
self.main_index.flush() # to get previous ones to the report
def wrap_stdstream_to_html(self, infile, outfile, module, stream):
before = '%s
' % (module.name + ' ' + stream)
after = '
'
html = open(outfile, 'w')
html.write(before)
with open(infile) as text:
for line in text:
html.write(color_error_line(html_escape(line)))
html.write(after)
html.close()
def returncode_to_html_text(self, returncode):
if returncode:
return 'FAILED'
else:
return 'succeeded' # SUCCEEDED
def returncode_to_html_sentence(self, returncode):
if returncode:
return '❌ Test failed (return code %d)' % (returncode)
else:
return '✓ Test succeeded (return code %d)' % (returncode)
def end_file_test(self, module, cwd, returncode, stdout, stderr):
assert self._start_file_test_called
file_time = datetime.datetime.now() - self.file_start_time
self.main_index.write(
'{d} | '
'{m} | {sf} | '
'
'.format(
d=module.tested_dir, m=module.name,
sf=self.returncode_to_html_text(returncode)))
self.wrap_stdstream_to_html(infile=stdout,
outfile=os.path.join(cwd, 'stdout.html'),
module=module, stream='stdout')
self.wrap_stdstream_to_html(infile=stderr,
outfile=os.path.join(cwd, 'stderr.html'),
module=module, stream='stderr')
file_index_path = os.path.join(cwd, 'index.html')
file_index = open(file_index_path, 'w')
file_index.write(''
'{m.name}
'
'{m.tested_dir} – {m.name}
'
'{status}'
'
Test duration: {dur}'
'
'
''.format(
dur=file_time, m=module,
status=self.returncode_to_html_sentence(returncode)))
file_index.close()
if returncode:
sys.stderr.write('{d}/{m} failed (see {f})\n'.format(d=module.tested_dir,
m=module.name,
f=file_index_path))
self._start_file_test_called = False