python-peps / pep2rss.py

#!/usr/bin/env python

# usage: pep-hook.py $REPOS $REV
# (standard post-commit args)

import os, glob, time, datetime, stat, re, sys
import codecs
import PyRSS2Gen as rssgen

RSS_PATH = os.path.join(sys.argv[1], 'peps.rss')

def firstline_startingwith(full_path, text):
    for line in codecs.open(full_path, encoding="utf-8"):
        if line.startswith(text):
            return line[len(text):].strip()
    return None

# get list of peps with creation time (from "Created:" string in pep .txt)
peps = glob.glob('pep-*.txt')
def pep_creation_dt(full_path):
    created_str = firstline_startingwith(full_path, 'Created:')
    # bleh, I was hoping to avoid re but some PEPs editorialize
    # on the Created line
    m = re.search(r'''(\d+-\w+-\d{4})''', created_str)
    if not m:
        # some older ones have an empty line, that's okay, if it's old
        # we ipso facto don't care about it.
        # "return None" would make the most sense but datetime objects
        # refuse to compare with that. :-|
        return datetime.datetime(*time.localtime(0)[:6])
    created_str = m.group(1)
    try:
        t = time.strptime(created_str, '%d-%b-%Y')
    except ValueError:
        t = time.strptime(created_str, '%d-%B-%Y')
    return datetime.datetime(*t[:6])
peps_with_dt = [(pep_creation_dt(full_path), full_path) for full_path in peps]
# sort peps by date, newest first
peps_with_dt.sort(reverse=True)

# generate rss items for 10 most recent peps
items = []
for dt, full_path in peps_with_dt[:10]:
    try:
        n = int(full_path.split('-')[-1].split('.')[0])
    except ValueError:
        pass
    title = firstline_startingwith(full_path, 'Title:')
    author = firstline_startingwith(full_path, 'Author:')
    url = 'http://www.python.org/dev/peps/pep-%0.4d' % n
    item = rssgen.RSSItem(
        title = 'PEP %d: %s' % (n, title),
        link = url,
        description = 'Author: %s' % author,
        guid = rssgen.Guid(url),
        pubDate = dt)
    items.append(item)

# the rss envelope
desc = """
Newest Python Enhancement Proposals (PEPs) - Information on new
language features, and some meta-information like release
procedure and schedules
""".strip()
rss = rssgen.RSS2(
    title = 'Newest Python PEPs',
    link = 'http://www.python.org/dev/peps',
    description = desc,
    lastBuildDate = datetime.datetime.now(),
    items = items)

file(RSS_PATH, 'w').write(rss.to_xml())
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.