class XMLGenerator(object): def __init__(self, out, encoding='utf-8'): self.out = out self.encoding = encoding self.builder = TreeBuilder() def getOutputStream(self): return self.out def getEncoding(self): return self.encoding def write(self, data): self.builder.data(data) def startDocument(self): self.out.write('<?xml version="1.0" encoding="%s"?>' %(self.encoding)) def endDocument(self): root = self.builder.close() ElementTree(root).write(self.out, self.encoding) self.out.flush() def startElement(self, tag, attrs): self.builder.start(tag, attrs) def endElement(self, tag): self.builder.end(tag) def characters(self, data): if data: self.builder.data(data)
def do_rss(self, repo_data, latest): """ Write the RSS feed. @param repo_data: the dict containing repository data @type repo_data: dict @param latest: the list of tuples returned by get_latest_packages @type latest: list @rtype: void """ self.say('Generating rss feed...') etb = TreeBuilder() out = os.path.join(self.outdir, RSSFILE) etb.start('rss', {'version': '2.0'}) etb.start('channel') etb.start('title') etb.data(repo_data['title']) etb.end('title') etb.start('link') etb.data('%s/repoview/%s' % (self.opts.url, RSSFILE)) etb.end('link') etb.start('description') etb.data('Latest packages for %s' % repo_data['title']) etb.end('description') etb.start('lastBuildDate') etb.data(time.strftime(ISOFORMAT)) etb.end('lastBuildDate') etb.start('generator') etb.data('Repoview-%s' % repo_data['my_version']) etb.end('generator') rss_tpt = os.path.join(self.opts.templatedir, RSSKID) rss_kid = Template(file=rss_tpt) rss_kid.assume_encoding = "utf-8" rss_kid.repo_data = repo_data rss_kid.url = self.opts.url for row in latest: pkg_data = self.get_package_data(row[0]) rpm = pkg_data['rpms'][0] (epoch, version, release, arch, built) = rpm[:5] etb.start('item') etb.start('guid') etb.data('%s/repoview/%s+%s:%s-%s.%s' % (self.opts.url, pkg_data['filename'], epoch, version, release, arch)) etb.end('guid') etb.start('link') etb.data('%s/repoview/%s' % (self.opts.url, pkg_data['filename'])) etb.end('link') etb.start('pubDate') etb.data(time.strftime(ISOFORMAT, time.gmtime(int(built)))) etb.end('pubDate') etb.start('title') etb.data('Update: %s-%s-%s' % (pkg_data['name'], version, release)) etb.end('title') rss_kid.pkg_data = pkg_data description = rss_kid.serialize() etb.start('description') etb.data(description.decode('utf-8')) etb.end('description') etb.end('item') etb.end('channel') etb.end('rss') rss = etb.close() etree = ElementTree(rss) out = os.path.join(self.outdir, RSSFILE) etree.write(out, 'utf-8') self.say('done\n')