def upstream_handler(): revs = scrape_page_history(page, base, opener, req_headers) output = structencoder(indent=u"yes") output.feed( ROOT( E((u'history'), (E(u'rev', {u'id': unicode(r['rev']), u'editor': unicode(r['editor']), u'date': unicode(r['date']).replace(' ', 'T')}) for r in revs) ) )) return output.read(), ctype
def test_coroutine_example2(): EXPECTED = """<b attr1="val1"><c>1</c><c>2</c><c>3</c></b>""" output = structencoder() f = output.cofeed(ROOT(E_CURSOR(u'b', {u'attr1': u'val1'}))) f.send(E(u'c', u'1')) f.send(E(u'c', u'2')) f.send(E(u'c', u'3')) f.close() result = output.read() treecompare.check_xml(result, XMLDECL + EXPECTED) return
def upstream_handler(): revs = scrape_page_history(page, base, opener, req_headers) output = structencoder(indent=u"yes") output.feed( ROOT( E((u'history'), (E( u'rev', { u'id': unicode(r['rev']), u'editor': unicode(r['editor']), u'date': unicode(r['date']).replace(' ', 'T') }) for r in revs)))) return output.read(), ctype
def test_coroutine_two_ply1(): from nose.plugins.skip import SkipTest raise SkipTest('Known failure. Incompletely developed test') EXPECTED = """<a><b attr1="val1"><c>1<d><e>2</e><e>3</e></d></c></b></a>""" output = structencoder() f = output.cofeed(ROOT(E(u'a', E_CURSOR(u'b', {u'attr1': u'val1'})))) f.send(E(u'c', u'1', E_CURSOR(u'd'))) f.send(E(u'e', u'2')) f.send(E(u'e', u'3')) f.close() result = output.read() treecompare.check_xml(result, XMLDECL + EXPECTED) return
def test_coroutine_with_nsdecls1(): EXPECTED = """<a xmlns="urn:bogus:x"><b attr1="val1"><c>1</c><c>2</c><c>3</c></b></a>""" XNS = u'urn:bogus:x' output = structencoder() f = output.cofeed( ROOT(E(u'a', NS(None, XNS), E_CURSOR(u'b', {u'attr1': u'val1'})))) f.send(E(u'c', u'1')) f.send(E(u'c', u'2')) f.send(E(u'c', u'3')) f.close() result = output.read() treecompare.check_xml(result, XMLDECL + EXPECTED) return
def atom_moin(body, ctype, maxcount=None, folder=None, feed=None): #Sample query: #curl --request POST "http://localhost:8880/atom.moin?feed=http://bitworking.org/news/feed/&maxcount=10&folder=foo091023" #You can set ...&maxcount=100 or whatever number, if you like maxcount = int(maxcount if maxcount else DEFAULT_MAX) H = httplib2.Http('.cache') if USER: H.add_credentials(USER, PASSWD) #Prepare the envelope for the output (POST response) w = structencoder() output = w.cofeed(ROOT(E_CURSOR(u'updates', {u'feed': feed}))) logger.debug('Feed: ' + feed) entries = atomtools.ejsonize(feed) for entry in islice(entries, 0, maxcount): try: logger.debug('ENTRY: ' + repr(entry)) aid = entry[u'label'] slug = atomtools.slug_from_title(aid) #logger.debug('GRIPPO' + repr((id,))) dest = folder + '/' + slug chunks = [ ' title:: ' + entry[u'title'] ] chunks.append(' last changed:: ' + entry[u'updated']) chunks.append(' link:: ' + (first_item(entry[u'link']) or '')) if u'summary' in entry: chunks.append('= Summary =\n' + entry[u'summary']) if u'content_src' in entry: chunks.append('= Content =\n' + entry[u'content_src']) if u'content_text' in entry: chunks.append('= Content =\n' + entry[u'content_text']) #logger.debug("Result IDs: " + ids) if u'categories' in entry: chunks.append(u'= Categories =') for categories in entry[u'categories']: chunks.append(' * ' + categories) chunks.append(' id:: ' + entry[u'id']) chunks.append('= akara:metadata =\n akara:type:: http://purl.org/com/zepheira/zen/resource/webfeed\n') url = absolutize(dest, MOINBASE) headers = {'Content-Type' : 'text/plain'} resp, content = H.request(url, "PUT", body='\n'.join(chunks).encode('utf-8'), headers=headers) logger.debug("Result: " + repr((resp, content))) output.send(E(u'update', {u'entry-id': entry[u'id'], u'page': url})) except (KeyboardInterrupt, SystemExit): raise except Exception, e: logger.info('Exception handling Entry page: ' + repr(e)) output.send(E(u'failure', {u'entry-id': entry[u'id']}))
def DISABLEDtest_coroutine_with_nsdecls2(): #FIXME: Puts out redundant nsdecls for now. Needs to be fixed in code #Trick for skipping tests: from nose.plugins.skip import SkipTest raise SkipTest('reason') EXPECTED = """<a><b attr1="val1"><c>1</c><c>2</c><c>3</c></b></a>""" XNS = u'urn:bogus:x' output = structencoder() f = output.cofeed( ROOT(E(u'a', NS(None, XNS), E_CURSOR((XNS, u'b'), {u'attr1': u'val1'})))) f.send(E((XNS, u'c'), u'1')) f.send(E((XNS, u'c'), u'2')) f.send(E((XNS, u'c'), u'3')) f.close() result = output.read() treecompare.check_xml(result, XMLDECL + EXPECTED) return
def upstream_handler(): #Sigh. Sometimes you have to break some Tag soup eggs to make a RESTful omlette with closing(opener.open(request)) as resp: rbody = resp.read() doc = htmlparse(rbody) raise_embedded_error(doc) attachment_nodes = doc.xml_select(u'//*[contains(@href, "action=AttachFile") and contains(@href, "do=view")]') targets = [] for node in attachment_nodes: target = [ param.split('=', 1)[1] for param in node.href.split(u'&') if param.startswith('target=') ][0] targets.append(target) output = structencoder(indent=u"yes") output.feed( ROOT( E((u'attachments'), (E(u'attachment', {u'href': unicode(t)}) for t in targets) ) )) return output.read(), ctype
def upstream_handler(): #Sigh. Sometimes you have to break some Tag soup eggs to make a RESTful omlette with closing(opener.open(request)) as resp: rbody = resp.read() doc = htmlparse(rbody) raise_embedded_error(doc) attachment_nodes = doc.xml_select( u'//*[contains(@href, "action=AttachFile") and contains(@href, "do=view")]' ) targets = [] for node in attachment_nodes: target = [ param.split('=', 1)[1] for param in node.href.split(u'&') if param.startswith('target=') ][0] targets.append(target) output = structencoder(indent=u"yes") output.feed( ROOT( E((u'attachments'), (E(u'attachment', {u'href': unicode(t)}) for t in targets)))) return output.read(), ctype
def execute(pagename, request): """ Send recent changes as an RSS document """ cfg = request.cfg # get params items_limit = 100 try: max_items = int(request.values["items"]) max_items = min(max_items, items_limit) # not more than `items_limit` except (KeyError, ValueError): # not more than 15 items in a RSS file by default max_items = 15 try: unique = int(request.values.get("unique", 0)) except ValueError: unique = 0 try: diffs = int(request.values.get("diffs", 0)) except ValueError: diffs = 0 ## ddiffs inserted by Ralf Zosel <*****@*****.**>, 04.12.2003 try: ddiffs = int(request.values.get("ddiffs", 0)) except ValueError: ddiffs = 0 urlfilter = request.values.get("filter") if urlfilter: urlfilter = re.compile(urlfilter) else: urlfilter = None # get data log = editlog.EditLog(request) logdata = [] counter = 0 pages = {} lastmod = 0 for line in log.reverse(): if urlfilter and not (urlfilter.match(line.pagename)): continue if not request.user.may.read(line.pagename): continue if not line.action.startswith("SAVE") or ((line.pagename in pages) and unique): continue # if log.dayChanged() and log.daycount > _MAX_DAYS: break line.editor = line.getInterwikiEditorData(request) line.time = timefuncs.tmtuple(wikiutil.version2timestamp(line.ed_time_usecs)) # UTC logdata.append(line) pages[line.pagename] = None if not lastmod: lastmod = wikiutil.version2timestamp(line.ed_time_usecs) counter += 1 if counter >= max_items: break del log timestamp = timefuncs.formathttpdate(lastmod) etag = "%d-%d-%d-%d-%d" % (lastmod, max_items, diffs, ddiffs, unique) # for 304, we look at if-modified-since and if-none-match headers, # one of them must match and the other is either not there or must match. if request.if_modified_since == timestamp: if request.if_none_match: if request.if_none_match == etag: request.status_code = 304 else: request.status_code = 304 elif request.if_none_match == etag: if request.if_modified_since: if request.if_modified_since == timestamp: request.status_code = 304 else: request.status_code = 304 else: # generate an Expires header, using whatever setting the admin # defined for suggested cache lifetime of the RecentChanges RSS doc expires = time.time() + cfg.rss_cache request.mimetype = "application/rss+xml" request.expires = expires request.last_modified = lastmod request.headers["Etag"] = etag # send the generated XML document baseurl = request.url_root logo = re.search(r'src="([^"]*)"', cfg.logo_string) if logo: logo = request.getQualifiedURL(logo.group(1)) # prepare output output = structencoder(indent=u"yes") FEED_HEADER_COMMENT = """ <!-- Add an "items=nnn" URL parameter to get more than the default 15 items. You cannot get more than %d items though. Add "unique=1" to get a list of changes where page names are unique, i.e. where only the latest change of each page is reflected. Add "diffs=1" to add change diffs to the description of each items. Add "ddiffs=1" to link directly to the diff (good for FeedReader). Current settings: items=%i, unique=%i, diffs=%i, ddiffs=%i --> """ % ( items_limit, max_items, unique, diffs, ddiffs, ) # Feed envelope page = Page(request, pagename) f = output.cofeed( ROOT(NS(u"", ATOM_NAMESPACE), NS(u"wiki", RSSWIKI_NAMESPACE), E_CURSOR((ATOM_NAMESPACE, u"feed"))) ) f.send(E((ATOM_NAMESPACE, u"id"), full_url(request, page).encode(config.charset))), f.send(E((ATOM_NAMESPACE, u"title"), cfg.sitename.encode(config.charset))), f.send(E((ATOM_NAMESPACE, u"link"), {u"href": request.url_root.encode(config.charset)})), f.send(E((ATOM_NAMESPACE, u"summary"), ("RecentChanges at %s" % cfg.sitename).encode(config.charset))), # Icon # E((ATOM_NAMESPACE, u'link'), {u'href': logo.encode(config.charset)}), # if cfg.interwikiname: # handler.simpleNode(('wiki', 'interwiki'), cfg.interwikiname) for item in logdata: anchor = "%04d%02d%02d%02d%02d%02d" % item.time[:6] page = Page(request, item.pagename) # link = full_url(request, page, anchor=anchor) if ddiffs: link = full_url(request, page, querystr={"action": "diff"}) else: link = full_url(request, page) # description desc_text = item.comment if diffs: # TODO: rewrite / extend wikiutil.pagediff # searching for the matching pages doesn't really belong here revisions = page.getRevList() rl = len(revisions) for idx in range(rl): rev = revisions[idx] if rev <= item.rev: if idx + 1 < rl: lines = wikiutil.pagediff( request, item.pagename, revisions[idx + 1], item.pagename, 0, ignorews=1 ) if len(lines) > 20: lines = lines[:20] + ["...\n"] lines = "\n".join(lines) lines = wikiutil.escape(lines) desc_text = "%s\n<pre>\n%s\n</pre>\n" % (desc_text, lines) break # if desc_text: # handler.simpleNode('description', desc_text) # contributor edattr = {} # if cfg.show_hosts: # edattr[(handler.xmlns['wiki'], 'host')] = item.hostname if item.editor[0] == "interwiki": edname = "%s:%s" % item.editor[1] ##edattr[(None, 'link')] = baseurl + wikiutil.quoteWikiname(edname) else: # 'ip' edname = item.editor[1] ##edattr[(None, 'link')] = link + "?action=info" history_link = full_url(request, page, querystr={"action": "info"}) f.send( E( (ATOM_NAMESPACE, u"entry"), E((ATOM_NAMESPACE, u"id"), link.encode(config.charset)), E((ATOM_NAMESPACE, u"title"), item.pagename.encode(config.charset)), E((ATOM_NAMESPACE, u"updated"), timefuncs.W3CDate(item.time).encode(config.charset)), E((ATOM_NAMESPACE, u"link"), {u"href": link.encode(config.charset)}), E((ATOM_NAMESPACE, u"summary"), desc_text.encode(config.charset)), E((ATOM_NAMESPACE, u"author"), E((ATOM_NAMESPACE, u"name"), edname.encode(config.charset))), # E((ATOM_NAMESPACE, u'title'), item.pagename.encode(config.charset)), # wiki extensions E((RSSWIKI_NAMESPACE, u"wiki:version"), ("%i" % (item.ed_time_usecs)).encode(config.charset)), E((RSSWIKI_NAMESPACE, u"wiki:status"), (u"deleted", u"updated")[page.exists()]), E((RSSWIKI_NAMESPACE, u"wiki:diff"), link.encode(config.charset)), E((RSSWIKI_NAMESPACE, u"wiki:history"), history_link.encode(config.charset)), # handler.simpleNode(('wiki', 'importance'), ) # ( major | minor ) # handler.simpleNode(('wiki', 'version'), ) # ( #PCDATA ) ) ) # emit logo data # if logo: # handler.startNode('image', attr={ # (handler.xmlns['rdf'], 'about'): logo, # }) # handler.simpleNode('title', cfg.sitename) # handler.simpleNode('link', baseurl) # handler.simpleNode('url', logo) # handler.endNode('image') f.close() request.write(output.read())
def execute(pagename, request): """ Send recent changes as an RSS document """ cfg = request.cfg # get params items_limit = 100 try: max_items = int(request.values['items']) max_items = min(max_items, items_limit) # not more than `items_limit` except (KeyError, ValueError): # not more than 15 items in a RSS file by default max_items = 15 try: unique = int(request.values.get('unique', 0)) except ValueError: unique = 0 try: diffs = int(request.values.get('diffs', 0)) except ValueError: diffs = 0 ## ddiffs inserted by Ralf Zosel <*****@*****.**>, 04.12.2003 try: ddiffs = int(request.values.get('ddiffs', 0)) except ValueError: ddiffs = 0 urlfilter = request.values.get('filter') if urlfilter: urlfilter = re.compile(urlfilter) else: urlfilter = None # get data log = editlog.EditLog(request) logdata = [] counter = 0 pages = {} lastmod = 0 for line in log.reverse(): if urlfilter and not (urlfilter.match(line.pagename)): continue if not request.user.may.read(line.pagename): continue if (not line.action.startswith('SAVE') or ((line.pagename in pages) and unique)): continue #if log.dayChanged() and log.daycount > _MAX_DAYS: break line.editor = line.getInterwikiEditorData(request) line.time = timefuncs.tmtuple( wikiutil.version2timestamp(line.ed_time_usecs)) # UTC logdata.append(line) pages[line.pagename] = None if not lastmod: lastmod = wikiutil.version2timestamp(line.ed_time_usecs) counter += 1 if counter >= max_items: break del log timestamp = timefuncs.formathttpdate(lastmod) etag = "%d-%d-%d-%d-%d" % (lastmod, max_items, diffs, ddiffs, unique) # for 304, we look at if-modified-since and if-none-match headers, # one of them must match and the other is either not there or must match. if request.if_modified_since == timestamp: if request.if_none_match: if request.if_none_match == etag: request.status_code = 304 else: request.status_code = 304 elif request.if_none_match == etag: if request.if_modified_since: if request.if_modified_since == timestamp: request.status_code = 304 else: request.status_code = 304 else: # generate an Expires header, using whatever setting the admin # defined for suggested cache lifetime of the RecentChanges RSS doc expires = time.time() + cfg.rss_cache request.mimetype = 'application/rss+xml' request.expires = expires request.last_modified = lastmod request.headers['Etag'] = etag # send the generated XML document baseurl = request.url_root logo = re.search(r'src="([^"]*)"', cfg.logo_string) if logo: logo = request.getQualifiedURL(logo.group(1)) # prepare output output = structencoder(indent=u"yes") FEED_HEADER_COMMENT = ''' <!-- Add an "items=nnn" URL parameter to get more than the default 15 items. You cannot get more than %d items though. Add "unique=1" to get a list of changes where page names are unique, i.e. where only the latest change of each page is reflected. Add "diffs=1" to add change diffs to the description of each items. Add "ddiffs=1" to link directly to the diff (good for FeedReader). Current settings: items=%i, unique=%i, diffs=%i, ddiffs=%i --> ''' % (items_limit, max_items, unique, diffs, ddiffs) # Feed envelope page = Page(request, pagename) f = output.cofeed( ROOT(NS(u'', ATOM_NAMESPACE), NS(u'wiki', RSSWIKI_NAMESPACE), E_CURSOR((ATOM_NAMESPACE, u'feed'), ))) f.send( E((ATOM_NAMESPACE, u'id'), full_url(request, page).encode(config.charset))), f.send( E((ATOM_NAMESPACE, u'title'), cfg.sitename.encode(config.charset))), f.send( E((ATOM_NAMESPACE, u'link'), {u'href': request.url_root.encode(config.charset)})), f.send( E((ATOM_NAMESPACE, u'summary'), ('RecentChanges at %s' % cfg.sitename).encode(config.charset))), #Icon #E((ATOM_NAMESPACE, u'link'), {u'href': logo.encode(config.charset)}), #if cfg.interwikiname: # handler.simpleNode(('wiki', 'interwiki'), cfg.interwikiname) for item in logdata: anchor = "%04d%02d%02d%02d%02d%02d" % item.time[:6] page = Page(request, item.pagename) #link = full_url(request, page, anchor=anchor) if ddiffs: link = full_url(request, page, querystr={'action': 'diff'}) else: link = full_url(request, page) # description desc_text = item.comment if diffs: # TODO: rewrite / extend wikiutil.pagediff # searching for the matching pages doesn't really belong here revisions = page.getRevList() rl = len(revisions) for idx in range(rl): rev = revisions[idx] if rev <= item.rev: if idx + 1 < rl: lines = wikiutil.pagediff(request, item.pagename, revisions[idx + 1], item.pagename, 0, ignorews=1) if len(lines) > 20: lines = lines[:20] + ['...\n'] lines = '\n'.join(lines) lines = wikiutil.escape(lines) desc_text = '%s\n<pre>\n%s\n</pre>\n' % (desc_text, lines) break #if desc_text: # handler.simpleNode('description', desc_text) # contributor edattr = {} #if cfg.show_hosts: # edattr[(handler.xmlns['wiki'], 'host')] = item.hostname if item.editor[0] == 'interwiki': edname = "%s:%s" % item.editor[1] ##edattr[(None, 'link')] = baseurl + wikiutil.quoteWikiname(edname) else: # 'ip' edname = item.editor[1] ##edattr[(None, 'link')] = link + "?action=info" history_link = full_url(request, page, querystr={'action': 'info'}) f.send( E( (ATOM_NAMESPACE, u'entry'), E((ATOM_NAMESPACE, u'id'), link.encode(config.charset)), E((ATOM_NAMESPACE, u'title'), item.pagename.encode(config.charset)), E((ATOM_NAMESPACE, u'updated'), timefuncs.W3CDate(item.time).encode(config.charset)), E((ATOM_NAMESPACE, u'link'), {u'href': link.encode(config.charset)}), E((ATOM_NAMESPACE, u'summary'), desc_text.encode(config.charset)), E((ATOM_NAMESPACE, u'author'), E((ATOM_NAMESPACE, u'name'), edname.encode(config.charset))), #E((ATOM_NAMESPACE, u'title'), item.pagename.encode(config.charset)), # wiki extensions E((RSSWIKI_NAMESPACE, u'wiki:version'), ("%i" % (item.ed_time_usecs)).encode(config.charset)), E((RSSWIKI_NAMESPACE, u'wiki:status'), (u'deleted', u'updated')[page.exists()]), E((RSSWIKI_NAMESPACE, u'wiki:diff'), link.encode(config.charset)), E((RSSWIKI_NAMESPACE, u'wiki:history'), history_link.encode(config.charset)), # handler.simpleNode(('wiki', 'importance'), ) # ( major | minor ) # handler.simpleNode(('wiki', 'version'), ) # ( #PCDATA ) )) # emit logo data #if logo: # handler.startNode('image', attr={ # (handler.xmlns['rdf'], 'about'): logo, # }) # handler.simpleNode('title', cfg.sitename) # handler.simpleNode('link', baseurl) # handler.simpleNode('url', logo) # handler.endNode('image') f.close() request.write(output.read())