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:
52
generate_news.py
Normal file
52
generate_news.py
Normal 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&dn=i2pupdate-0.9.20.su3&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&dn=i2pupdate-0.9.20.su2&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
130
i2p.py
Normal 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
|
Reference in New Issue
Block a user