def test_opml_parse(): opml = """<?xml version="1.0" encoding="utf-8"?> <opml version="1.1"> <head> <title>Subscriptions</title> <dateCreated>Fri, 06 Jul 2007 21:36:50 GMT</dateCreated> <ownerName></ownerName> </head> <body> <outline title="ABC Blog" text="abc" htmlUrl="http://www.example.org/blog/abc" type="rss" xmlUrl="http://www.example.org/blog/abc/atom.xml"/> <outline title="DEF Blog" text="def" htmlUrl="http://www.example.org/blog/def" type="rss" xmlUrl="http://www.example.org/blog/def/atom.xml"/> <outline title="GHI Blog" text="ghi" htmlUrl="http://www.example.org/blog/ghi" type="rss" xmlUrl="http://www.example.org/blog/ghi/atom.xml"/> </body> </opml> """ expected_feeds = ["http://www.example.org/blog/abc/atom.xml", "http://www.example.org/blog/def/atom.xml", "http://www.example.org/blog/ghi/atom.xml"] out_feeds = feeds_in_opml(opml) assert len(out_feeds) == len(expected_feeds) for url in expected_feeds: assert url in out_feeds
def test_opml_loop(): in_feeds = ["http://www.abc.com/def", "http://www.foo.bar.org/quux", "http://example.org/feed"] out_feeds = feeds_in_opml(dump_opml(in_feeds)) assert len(out_feeds) == len(in_feeds) for url in in_feeds: assert url in out_feeds
def test_opml_loop_titles(): in_feeds = ["http://www.abc.com/def", "http://www.foo.bar.org/quux", "http://example.org/feed"] feed_titles = {} feed_titles[in_feeds[0]] = 'Title 0' feed_titles[in_feeds[1]] = 'Title 1' # feed_titles[in_feeds[2]] = 'Title 2' NO TITLE out_feeds = feeds_in_opml(dump_opml(in_feeds, feed_titles=feed_titles), titles=True) assert len(out_feeds) == len(in_feeds) for url, title in out_feeds: assert url in in_feeds assert feed_titles.get(url, '') == title
def set_opml(self, id): composite = Composite.get(id, ctx) if composite is None: abort(404) opml_data = get_posted_data() try: feeds = set(feeds_in_opml(opml_data)) except: import traceback log.error(traceback.format_exc()) abort(400) result = defaultdict(list) oldfeeds = set(i.url for i in composite.subscriptions.itervalues()) remove = oldfeeds - feeds for url in remove: feed = RemoteFeed.get_by_url(url, ctx) if feed is not None: composite.unsubscribe(feed) result["unsubscribed"].append(url) log.debug('Unsubscribed composite "%s" from %s' % (id, url)) else: result["unsubscribe_failed"].append(url) log.error('Expected composite "%s" to have RemoteFeed for %s' % (id, url)) for url in feeds: if url not in oldfeeds: feed = get_or_immediate_create_by_url(url, ctx) if feed is None: result["subscribe_failed"].append(url) log.warn("Could not get or create feed for %s" % url) continue composite.subscribe(feed) result["subscribed"].append(url) log.debug('Subscribed composite "%s" to %s' % (id, url)) else: result["unchanged"].append(url) composite.save() log.debug('Composite "%s" saved' % id) return json_response(result)