sb: Move content to formatter classes

This commit is contained in:
Sebastian Huber 2014-12-08 07:19:07 +01:00
parent e794d0aba9
commit 6733a85981

View File

@ -60,20 +60,16 @@ def _make_path(p, *args):
p = path.join(p, arg) p = path.join(p, arg)
return os.path.abspath(path.host(p)) return os.path.abspath(path.host(p))
class chunk: class formatter(object):
def __init__(self): def __init__(self):
self.data = '' self.content = ''
def line(self, text): def line(self, text):
self.data += text + '\n' self.content += text + '\n'
def add(self, text): def add(self, text):
self.data += text self.content += text
def get(self):
return self.data
class formatter(object):
def set_sbpath(self, sbpath): def set_sbpath(self, sbpath):
self.sbpath = sbpath self.sbpath = sbpath
@ -84,75 +80,66 @@ class formatter(object):
raise error.general('internal error: formatter.ext() not implemented') raise error.general('internal error: formatter.ext() not implemented')
def introduction(self, name, now, intro_text): def introduction(self, name, now, intro_text):
c = chunk() self.line('=' * _line_len)
c.line('=' * _line_len) self.line('%s %s' % (_title, now))
c.line('%s %s' % (_title, now))
if intro_text: if intro_text:
c.line('') self.line('')
c.line('%s' % ('\n'.join(intro_text))) self.line('%s' % ('\n'.join(intro_text)))
c.line('=' * _line_len) self.line('=' * _line_len)
c.line('Report: %s' % (name)) self.line('Report: %s' % (name))
return c.get()
def epilogue(self, name): def epilogue(self, name):
return '' return
def config_start(self, nest_level, name): def config_start(self, nest_level, name):
return '' return
def config(self, nest_level, name, _config): def config(self, nest_level, name, _config):
c = chunk() self.line('-' * _line_len)
c.line('-' * _line_len) self.line('Package: %s' % (name))
c.line('Package: %s' % (name)) self.line(' Config: %s' % (_config.file_name()))
c.line(' Config: %s' % (_config.file_name()))
return c.get()
def config_end(self, nest_level, name): def config_end(self, nest_level, name):
return '' return
def buildset_start(self, nest_level, name): def buildset_start(self, nest_level, name):
c = chunk() self.line('=-' * (_line_len / 2))
c.line('=-' * (_line_len / 2)) self.line('Build Set: %s' % (name))
c.line('Build Set: %s' % (name))
return c.get()
def buildset_end(self, nest_level, name): def buildset_end(self, nest_level, name):
return '' return
def info(self, nest_level, name, info, separated): def info(self, nest_level, name, info, separated):
c = chunk() self.line(' ' + name + ':')
c.line(' ' + name + ':')
for l in info: for l in info:
c.line(' ' + l) self.line(' ' + l)
return c.get()
def directive(self, nest_level, name, data): def directive(self, nest_level, name, data):
c = chunk() self.line(' %s:' % (name))
c.line(' %s:' % (name))
for l in data: for l in data:
c.line(' ' + l) self.line(' ' + l)
return c.get()
def files(self, nest_level, sigular, plural, _files): def files(self, nest_level, sigular, plural, _files):
c = chunk() self.line(' ' + plural + ': %d' % (len(_files)))
c.line(' ' + plural + ': %d' % (len(_files)))
i = 0 i = 0
for name in _files: for name in _files:
for s in _files[name]: for s in _files[name]:
i += 1 i += 1
c.line(' %2d: %s' % (i, s[0])) self.line(' %2d: %s' % (i, s[0]))
if s[1] is None: if s[1] is None:
h = 'No checksum' h = 'No checksum'
else: else:
hash = s[1].split() hash = s[1].split()
h = '%s: %s' % (hash[0], hash[1]) h = '%s: %s' % (hash[0], hash[1])
c.line(' %s' % (h)) self.line(' %s' % (h))
return c.get()
def post_process(self, out): def post_process(self):
return out return self.content
class asciidoc_formatter(formatter): class asciidoc_formatter(formatter):
def __init__(self):
super(asciidoc_formatter, self).__init__()
def format(self): def format(self):
return 'asciidoc' return 'asciidoc'
@ -160,118 +147,102 @@ class asciidoc_formatter(formatter):
return '.txt' return '.txt'
def introduction(self, name, now, intro_text): def introduction(self, name, now, intro_text):
c = chunk()
h = 'RTEMS Source Builder Report' h = 'RTEMS Source Builder Report'
c.line(h) self.line(h)
c.line('=' * len(h)) self.line('=' * len(h))
c.line(':doctype: book') self.line(':doctype: book')
c.line(':toc2:') self.line(':toc2:')
c.line(':toclevels: 5') self.line(':toclevels: 5')
c.line(':icons:') self.line(':icons:')
c.line(':numbered:') self.line(':numbered:')
c.line(':data-uri:') self.line(':data-uri:')
c.line('') self.line('')
c.line(_title) self.line(_title)
c.line(now) self.line(now)
c.line('') self.line('')
image = _make_path(self.sbpath, options.basepath, 'images', 'rtemswhitebg.jpg') image = _make_path(self.sbpath, options.basepath, 'images', 'rtemswhitebg.jpg')
c.line('image:%s["RTEMS",width="20%%"]' % (image)) self.line('image:%s["RTEMS",width="20%%"]' % (image))
c.line('') self.line('')
if intro_text: if intro_text:
c.line('%s' % ('\n'.join(intro_text))) self.line('%s' % ('\n'.join(intro_text)))
return c.get()
def git_status(self, valid, dirty, head, remotes): def git_status(self, valid, dirty, head, remotes):
c = chunk() self.line('')
c.line('') self.line("'''")
c.line("'''") self.line('')
c.line('') self.line('.%s' % (_git_status_text))
c.line('.%s' % (_git_status_text))
if valid: if valid:
c.line('*Remotes*:;;') self.line('*Remotes*:;;')
for r in remotes: for r in remotes:
if 'url' in remotes[r]: if 'url' in remotes[r]:
text = remotes[r]['url'] text = remotes[r]['url']
else: else:
text = 'no URL found' text = 'no URL found'
text = '%s: %s' % (r, text) text = '%s: %s' % (r, text)
c.line('. %s' % (text)) self.line('. %s' % (text))
c.line('*Status*:;;') self.line('*Status*:;;')
if dirty: if dirty:
c.line('_Repository is dirty_') self.line('_Repository is dirty_')
else: else:
c.line('Clean') self.line('Clean')
c.line('*Head*:;;') self.line('*Head*:;;')
c.line('Commit: %s' % (head)) self.line('Commit: %s' % (head))
else: else:
c.line('_Not a valid GIT repository_') self.line('_Not a valid GIT repository_')
c.line('') self.line('')
c.line("'''") self.line("'''")
c.line('') self.line('')
return c.get()
def config(self, nest_level, name, _config): def config(self, nest_level, name, _config):
c = chunk() self.line('*Package*: _%s_ +' % (name))
c.line('*Package*: _%s_ +' % (name)) self.line('*Config*: %s' % (_config.file_name()))
c.line('*Config*: %s' % (_config.file_name())) self.line('')
c.line('')
return c.get()
def config_end(self, nest_level, name): def config_end(self, nest_level, name):
c = chunk() self.line('')
c.line('') self.line("'''")
c.line("'''") self.line('')
c.line('')
return c.get()
def buildset_start(self, nest_level, name): def buildset_start(self, nest_level, name):
c = chunk()
h = '%s' % (name) h = '%s' % (name)
c.line('=%s %s' % ('=' * nest_level, h)) self.line('=%s %s' % ('=' * nest_level, h))
return c.get()
def info(self, nest_level, name, info, separated): def info(self, nest_level, name, info, separated):
c = chunk()
end = '' end = ''
if separated: if separated:
c.line('*%s:*::' % (name)) self.line('*%s:*::' % (name))
c.line('') self.line('')
else: else:
c.line('*%s:* ' % (name)) self.line('*%s:* ' % (name))
end = ' +' end = ' +'
spaces = '' spaces = ''
for l in info: for l in info:
c.line('%s%s%s' % (spaces, l, end)) self.line('%s%s%s' % (spaces, l, end))
if separated: if separated:
c.line('') self.line('')
return c.get()
def directive(self, nest_level, name, data): def directive(self, nest_level, name, data):
c = chunk() self.line('')
c.line('') self.line('*%s*:' % (name))
c.line('*%s*:' % (name)) self.line('--------------------------------------------')
c.line('--------------------------------------------')
for l in data: for l in data:
c.line(l) self.line(l)
c.line('--------------------------------------------') self.line('--------------------------------------------')
return c.get()
def files(self, nest_level, singular, plural, _files): def files(self, nest_level, singular, plural, _files):
c = chunk() self.line('')
c.line('') self.line('*' + plural + ':*::')
c.line('*' + plural + ':*::')
if len(_files) == 0: if len(_files) == 0:
c.line('No ' + plural.lower()) self.line('No ' + plural.lower())
for name in _files: for name in _files:
for s in _files[name]: for s in _files[name]:
c.line('. %s' % (s[0])) self.line('. %s' % (s[0]))
if s[1] is None: if s[1] is None:
h = 'No checksum' h = 'No checksum'
else: else:
hash = s[1].split() hash = s[1].split()
h = '%s: %s' % (hash[0], hash[1]) h = '%s: %s' % (hash[0], hash[1])
c.line('+\n%s\n' % (h)) self.line('+\n%s\n' % (h))
return c.get()
class html_formatter(asciidoc_formatter): class html_formatter(asciidoc_formatter):
def __init__(self): def __init__(self):
@ -292,9 +263,9 @@ class html_formatter(asciidoc_formatter):
def ext(self): def ext(self):
return '.html' return '.html'
def post_process(self, out): def post_process(self):
import StringIO import StringIO
infile = StringIO.StringIO(out) infile = StringIO.StringIO(self.content)
outfile = StringIO.StringIO() outfile = StringIO.StringIO()
self.asciidoc.execute(infile, outfile) self.asciidoc.execute(infile, outfile)
out = outfile.getvalue() out = outfile.getvalue()
@ -314,27 +285,22 @@ class text_formatter(formatter):
return '.txt' return '.txt'
def introduction(self, name, now, intro_text): def introduction(self, name, now, intro_text):
c = chunk() self.line('=' * _line_len)
c.line('=' * _line_len) self.line('%s %s' % (_title, now))
c.line('%s %s' % (_title, now))
if intro_text: if intro_text:
c.line('') self.line('')
c.line('%s' % ('\n'.join(intro_text))) self.line('%s' % ('\n'.join(intro_text)))
c.line('=' * _line_len) self.line('=' * _line_len)
c.line('Report: %s' % (name)) self.line('Report: %s' % (name))
return c.get()
def git_status_header(self): def git_status_header(self):
c = chunk() self.line('-' * _line_len)
c.line('-' * _line_len) self.line('%s' % (_git_status_text))
c.line('%s' % (_git_status_text))
return c.get()
def git_status(self, valid, dirty, head, remotes): def git_status(self, valid, dirty, head, remotes):
c = chunk() self.git_status_header()
c.add(self.git_status_header())
if valid: if valid:
c.line('%s Remotes:' % (self.cini)) self.line('%s Remotes:' % (self.cini))
rc = 0 rc = 0
for r in remotes: for r in remotes:
rc += 1 rc += 1
@ -343,17 +309,16 @@ class text_formatter(formatter):
else: else:
text = 'no URL found' text = 'no URL found'
text = '%s: %s' % (r, text) text = '%s: %s' % (r, text)
c.line('%s %2d: %s' % (self.cini, rc, text)) self.line('%s %2d: %s' % (self.cini, rc, text))
c.line('%s Status:' % (self.cini)) self.line('%s Status:' % (self.cini))
if dirty: if dirty:
c.line('%s Repository is dirty' % (self.cini)) self.line('%s Repository is dirty' % (self.cini))
else: else:
c.line('%s Clean' % (self.cini)) self.line('%s Clean' % (self.cini))
c.line('%s Head:' % (self.cini)) self.line('%s Head:' % (self.cini))
c.line('%s Commit: %s' % (self.cini, head)) self.line('%s Commit: %s' % (self.cini, head))
else: else:
c.line('%s Not a valid GIT repository' % (self.cini)) self.line('%s Not a valid GIT repository' % (self.cini))
return c.get()
class ini_formatter(text_formatter): class ini_formatter(text_formatter):
def __init__(self): def __init__(self):
@ -367,38 +332,37 @@ class ini_formatter(text_formatter):
return '.ini' return '.ini'
def introduction(self, name, now, intro_text): def introduction(self, name, now, intro_text):
c = chunk() self.line(';')
c.line(';') self.line('; %s %s' % (_title, now))
c.line('; %s %s' % (_title, now))
if intro_text: if intro_text:
c.line(';') self.line(';')
c.line('; %s' % ('\n; '.join(intro_text))) self.line('; %s' % ('\n; '.join(intro_text)))
c.line(';') self.line(';')
return c.get()
def git_status_header(self): def git_status_header(self):
c = chunk() self.line(';')
c.line(';') self.line('; %s' % (_git_status_text))
c.line('; %s' % (_git_status_text)) self.line(';')
c.line(';')
return c.get()
def config(self, nest_level, name, _config): def config(self, nest_level, name, _config):
return '' return
def buildset_start(self, nest_level, name): def buildset_start(self, nest_level, name):
return '' return
def info(self, nest_level, name, info, separated): def info(self, nest_level, name, info, separated):
return '' return
def directive(self, nest_level, name, data): def directive(self, nest_level, name, data):
return '' return
def files(self, nest_level, singular, plural, _files): def files(self, nest_level, singular, plural, _files):
return '' return
class xml_formatter(formatter): class xml_formatter(formatter):
def __init__(self):
super(xml_formatter, self).__init__()
def format(self): def format(self):
return 'xml' return 'xml'
@ -406,82 +370,60 @@ class xml_formatter(formatter):
return '.xml' return '.xml'
def introduction(self, name, now, intro_text): def introduction(self, name, now, intro_text):
c = chunk() self.line('<RTEMSSourceBuilderReport>')
c.line('<RTEMSSourceBuilderReport>')
if intro_text: if intro_text:
c.line('\t<Introduction>%s</Introduction>' % (intro_text)) self.line('\t<Introduction>%s</Introduction>' % (intro_text))
return c.get()
def epilogue(self, name): def epilogue(self, name):
c = chunk() self.line('</RTEMSSourceBuilderReport>')
c.line('</RTEMSSourceBuilderReport>')
return c.get()
def git_status(self, valid, dirty, head, remotes): def git_status(self, valid, dirty, head, remotes):
c = chunk() self.line('\t<Git>')
c.line('\t<Git>')
if valid: if valid:
if dirty: if dirty:
c.line('\t\t<Status>dirty</Status>') self.line('\t\t<Status>dirty</Status>')
else: else:
c.line('\t\t<Status>clean</Status>') self.line('\t\t<Status>clean</Status>')
c.line('\t\t<Commit>' + head + '</Commit>') self.line('\t\t<Commit>' + head + '</Commit>')
else: else:
c.line('\t\t<Status>invalid</Status>') self.line('\t\t<Status>invalid</Status>')
c.line('\t</Git>') self.line('\t</Git>')
return c.get()
def config_start(self, nest_level, name): def config_start(self, nest_level, name):
c = chunk() self.line('\t' * nest_level + '<Package name="' + name + '">')
c.line('\t' * nest_level + '<Package name="' + name + '">')
return c.get()
def config(self, nest_level, name, _config): def config(self, nest_level, name, _config):
c = chunk() self.line('\t' * nest_level + '<Config>' + _config.file_name() + '</Config>')
c.line('\t' * nest_level + '<Config>' + _config.file_name() + '</Config>')
return c.get()
def config_end(self, nest_level, name): def config_end(self, nest_level, name):
c = chunk() self.line('\t' * nest_level + '</Package>')
c.line('\t' * nest_level + '</Package>')
return c.get()
def buildset_start(self, nest_level, name): def buildset_start(self, nest_level, name):
c = chunk() self.line('\t' * nest_level + '<BuildSet name="' + name + '">')
c.line('\t' * nest_level + '<BuildSet name="' + name + '">')
return c.get()
def buildset_end(self, nest_level, name): def buildset_end(self, nest_level, name):
c = chunk() self.line('\t' * nest_level + '</BuildSet>')
c.line('\t' * nest_level + '</BuildSet>')
return c.get()
def info(self, nest_level, name, info, separated): def info(self, nest_level, name, info, separated):
c = chunk() self.add('\t' * nest_level + '<' + name.replace(' ', '') + '>')
c.add('\t' * nest_level + '<' + name.replace(' ', '') + '>')
for l in info: for l in info:
c.add(l) self.add(l)
c.line('</' + name + '>') self.line('</' + name + '>')
return c.get()
def directive(self, nest_level, name, data): def directive(self, nest_level, name, data):
c = chunk() self.line('\t' * nest_level + '<' + name + '><![CDATA[')
c.line('\t' * nest_level + '<' + name + '><![CDATA[')
for l in data: for l in data:
c.line(l.replace(']]>', ']]]><![CDATA[]>')) self.line(l.replace(']]>', ']]]><![CDATA[]>'))
c.line(']]></' + name + '>') self.line(']]></' + name + '>')
return c.get()
def files(self, nest_level, sigular, plural, _files): def files(self, nest_level, sigular, plural, _files):
c = chunk()
for name in _files: for name in _files:
for s in _files[name]: for s in _files[name]:
c.add('\t' * nest_level + '<' + sigular) self.add('\t' * nest_level + '<' + sigular)
if not (s[1] is None): if not (s[1] is None):
hash = s[1].split() hash = s[1].split()
c.add(' ' + hash[0] + '="' + hash[1] + '"') self.add(' ' + hash[0] + '="' + hash[1] + '"')
c.line('>' + s[0] + '</' + sigular + '>') self.line('>' + s[0] + '</' + sigular + '>')
return c.get()
def _tree_name(path_): def _tree_name(path_):
return path.splitext(path.basename(path_))[0] return path.splitext(path.basename(path_))[0]
@ -526,15 +468,15 @@ class report:
def git_status(self): def git_status(self):
r = git.repo('.', self.opts, self.macros) r = git.repo('.', self.opts, self.macros)
self.out += self.formatter.git_status(r.valid(), r.dirty(), r.head(), r.remotes()) self.formatter.git_status(r.valid(), r.dirty(), r.head(), r.remotes())
def introduction(self, name, intro_text = None): def introduction(self, name, intro_text = None):
now = datetime.datetime.now().ctime() now = datetime.datetime.now().ctime()
self.out += self.formatter.introduction(name, now, intro_text) self.formatter.introduction(name, now, intro_text)
self.git_status() self.git_status()
def epilogue(self, name): def epilogue(self, name):
self.out += self.formatter.epilogue(name) self.formatter.epilogue(name)
def config_start(self, name, _config): def config_start(self, name, _config):
self.files['configs'] += [name] self.files['configs'] += [name]
@ -542,17 +484,17 @@ class report:
cfbn = path.basename(cf) cfbn = path.basename(cf)
if cfbn not in self.files['configs']: if cfbn not in self.files['configs']:
self.files['configs'] += [cfbn] self.files['configs'] += [cfbn]
self.out += self.formatter.config_start(self.bset_nesting + 1, name) self.formatter.config_start(self.bset_nesting + 1, name)
def config_end(self, name, _config): def config_end(self, name, _config):
self.out += self.formatter.config_end(self.bset_nesting + 1, name) self.formatter.config_end(self.bset_nesting + 1, name)
def buildset_start(self, name): def buildset_start(self, name):
self.files['buildsets'] += [name] self.files['buildsets'] += [name]
self.out += self.formatter.buildset_start(self.bset_nesting, name) self.formatter.buildset_start(self.bset_nesting, name)
def buildset_end(self, name): def buildset_end(self, name):
self.out += self.formatter.buildset_end(self.bset_nesting, name) self.formatter.buildset_end(self.bset_nesting, name)
def source(self, macros): def source(self, macros):
def err(msg): def err(msg):
@ -584,11 +526,11 @@ class report:
def output_info(self, name, info, separated = False): def output_info(self, name, info, separated = False):
if info is not None: if info is not None:
self.out += self.formatter.info(self.bset_nesting + 2, name, info, separated) self.formatter.info(self.bset_nesting + 2, name, info, separated)
def output_directive(self, name, directive): def output_directive(self, name, directive):
if directive is not None: if directive is not None:
self.out += self.formatter.directive(self.bset_nesting + 2, name, directive) self.formatter.directive(self.bset_nesting + 2, name, directive)
def tree_sources(self, name, tree, sources = []): def tree_sources(self, name, tree, sources = []):
if 'cfg' in tree: if 'cfg' in tree:
@ -626,14 +568,14 @@ class report:
else: else:
tree['patches'] = patches tree['patches'] = patches
self.config_start(name, _config) self.config_start(name, _config)
self.out += self.formatter.config(self.bset_nesting + 2, name, _config) self.formatter.config(self.bset_nesting + 2, name, _config)
self.output_info('Summary', package.get_info('summary'), True) self.output_info('Summary', package.get_info('summary'), True)
self.output_info('URL', package.get_info('url')) self.output_info('URL', package.get_info('url'))
self.output_info('Version', package.get_info('version')) self.output_info('Version', package.get_info('version'))
self.output_info('Release', package.get_info('release')) self.output_info('Release', package.get_info('release'))
self.output_info('Build Arch', package.get_info('buildarch')) self.output_info('Build Arch', package.get_info('buildarch'))
self.out += self.formatter.files(self.bset_nesting + 2, "Source", "Sources", sources) self.formatter.files(self.bset_nesting + 2, "Source", "Sources", sources)
self.out += self.formatter.files(self.bset_nesting + 2, "Patch", "Patches", patches) self.formatter.files(self.bset_nesting + 2, "Patch", "Patches", patches)
self.output_directive('Preparation', package.prep()) self.output_directive('Preparation', package.prep())
self.output_directive('Build', package.build()) self.output_directive('Build', package.build())
self.output_directive('Install', package.install()) self.output_directive('Install', package.install())
@ -728,7 +670,7 @@ class report:
self.generate_ini_node(_tree_name(node), self.tree[node]) self.generate_ini_node(_tree_name(node), self.tree[node])
def write(self, name): def write(self, name):
self.out = self.formatter.post_process(self.out) self.out = self.formatter.post_process()
if self.is_ini(): if self.is_ini():
self.generate_ini() self.generate_ini()
if name is not None: if name is not None: