Atom extension for I2P namespace, and test generator of 0.9.20 news.atom.xml

First pass. It works, but there is more to do. Requires feedgen package to be
installed, and i2p.py to be copied to $PYLIBS/site-packages/feedgen/ext/
This commit is contained in:
str4d
2015-06-07 00:31:04 +00:00
parent c8dd0ce36e
commit c82458e664
2 changed files with 182 additions and 0 deletions

52
generate_news.py Normal file
View File

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from feedgen.feed import FeedGenerator
import sys
if __name__ == '__main__':
fg = FeedGenerator()
fg.id('urn:uuid:60a76c80-d399-11d9-b91C-543213999af6')
fg.title('I2P News')
fg.subtitle('News feed, and router updates')
fg.link( href='http://i2p-projekt.i2p/' )
fg.link( href='http://echelon.i2p/news/news.atom.xml', rel='self' )
fg.link( href='http://psi.i2p/news/news.xml', rel='alternate' )
fg.language('en')
fe = fg.add_entry()
fe.id('urn:uuid:1225c695-cfb8-4ebb-aaaa-7805333efa6a')
fe.title('0.9.20 Released')
fe.summary(u'0.9.20 released with performance improvements and bug fixes.')
fe.link( href='http://i2p-projekt.i2p/en/blog/post/2015/06/02/0.9.20-Release' )
fe.author( name='zzz' )
fe.content('''<p>
0.9.20 contains many important bug fixes, and several changes to increase floodfill capacity in the network.
</p><p>
Routers configured for 32-64 KB of shared bandwidth may now become floodfill,
and routers configured for 512 KB or more of shared bandwidth will have higher connection limits.
These changes may cause your router to use more resources.
If the router becomes too busy, the best way to reduce usage is to reduce the <a href="/config">bandwidth settings</a>.
If that doesn't help, you may now disable automatic floodfill on the <a href="/configadvanced">advanced configuration page</a>.
</p><p>
We're hopeful that these changes will increase network capacity and performance,
and reduce the congestion that's been affecting the network the last three months.
</p><p>
As usual, we recommend that you update to this release. The best way to
maintain security and help the network is to run the latest release.
</p>''', type='xhtml')
fg.load_extension('i2p')
r = fg.i2p.add_release()
r.date('2015-06-02')
r.version('0.9.20')
r.min_version('0.6.1.10')
r.min_java_version('1.6')
u = r.add_update('su3')
u.torrent('magnet:?xt=urn:btih:4b8b4c161f1829004627963b930d45f67f523b2e&amp;dn=i2pupdate-0.9.20.su3&amp;tr=http://tracker2.postman.i2p/announce.php')
u.url('http://stats.i2p/i2p/0.9.20/i2pupdate.su3')
u = r.add_update('su2')
u.torrent('magnet:?xt=urn:btih:3aba5739b585f5d7a46aec6095b0c6f8471f93cc&amp;dn=i2pupdate-0.9.20.su2&amp;tr=http://tracker2.postman.i2p/announce.php')
u.url('http://stats.i2p/i2p/0.9.20/i2pupdate.su2')
u = r.add_update('sud')
u.url('http://stats.i2p/i2p/0.9.20/i2pupdate.sud')
fg.atom_file('news.atom.xml', pretty=True)

130
i2p.py Normal file
View File

@ -0,0 +1,130 @@
from feedgen.ext.base import BaseExtension
from lxml import etree
I2P_NS = 'http://geti2p.net/en/docs/spec/updates'
class I2pExtension(BaseExtension):
def __init__(self):
self.__i2p_releases = []
def extend_ns(self):
return {'i2p': I2P_NS}
def extend_atom(self, atom_feed):
for release in self.__i2p_releases:
release = release.to_atom()
atom_feed.append(release)
return atom_feed
def add_release(self, release=None):
if release is None:
release = Release()
self.__i2p_releases.append(release)
return release
class I2pEntryExtension():
def extend_atom(self, atom_feed):
return atom_feed
class Release(object):
def __init__(self):
# required
self.__release_date = None
self.__release_version = None
self.__release_updates = {}
# recommended
self.__release_min_version = None
self.__release_min_java_version = None
def to_atom(self):
if not (self.__release_date and self.__release_version and self.__release_updates):
raise ValueError('Required fields not set')
release = etree.Element('{%s}release' % I2P_NS)
release.attrib['date'] = self.__release_date
version = etree.SubElement(release, '{%s}version' % I2P_NS)
version.text = self.__release_version
if self.__release_min_version is not None:
release.attrib['minVersion'] = self.__release_min_version
if self.__release_min_java_version is not None:
release.attrib['minJavaVersion'] = self.__release_min_java_version
for update_type, update in self.__release_updates.iteritems():
update_node = etree.SubElement(release, '{%s}update' % I2P_NS)
update_node.attrib['type'] = update_type
for href in update.clearnet():
clearnet = etree.SubElement(update_node, '{%s}clearnet' % I2P_NS)
clearnet.attrib['href'] = href
for href in update.clearnetssl():
clearnetssl = etree.SubElement(update_node, '{%s}clearnetssl' % I2P_NS)
clearnetssl.attrib['href'] = href
if update.torrent() is not None:
torrent = etree.SubElement(update_node, '{%s}torrent' % I2P_NS)
torrent.attrib['href'] = update.torrent()
for href in update.url():
url = etree.SubElement(update_node, '{%s}url' % I2P_NS)
url.attrib['href'] = href
return release
def date(self, date=None):
if date is not None:
self.__release_date = date
return self.__release_date
def version(self, version=None):
if version is not None:
self.__release_version = version
return self.__release_version
def min_version(self, min_version=None):
if min_version is not None:
self.__release_min_version = min_version
return self.__release_min_version
def min_java_version(self, min_java_version=None):
if min_java_version is not None:
self.__release_min_java_version = min_java_version
return self.__release_min_java_version
def add_update(self, update_type, update=None, replace=False):
if update_type not in ['sud', 'su2', 'su3']:
raise ValueError('update_type must be one of sud, su2 or su3')
if update is None:
update = Update()
if self.__release_updates.has_key(update_type) and not replace:
raise ValueError('Update type %s is already defined' % update_type)
self.__release_updates[update_type] = update
return update
class Update(object):
def __init__(self):
self.__update_clearnet = []
self.__update_clearnetssl = []
self.__update_torrent = None
self.__update_url = []
def clearnet(self, clearnet=None):
if clearnet is not None:
self.__update_clearnet.append(clearnet)
return self.__update_clearnet
def clearnetssl(self, clearnetssl=None):
if clearnetssl is not None:
self.__update_clearnetssl.append(clearnetssl)
return self.__update_clearnetssl
def torrent(self, torrent=None):
if torrent is not None:
self.__update_torrent = torrent
return self.__update_torrent
def url(self, url=None):
if url is not None:
self.__update_url.append(url)
return self.__update_url