Skip to content

Instantly share code, notes, and snippets.

@dahlia
Created June 10, 2014 18:58
Show Gist options
  • Save dahlia/b59b20083782d90833b8 to your computer and use it in GitHub Desktop.
Save dahlia/b59b20083782d90833b8 to your computer and use it in GitHub Desktop.
libearth parser refactoring idea
import emails.utils
from ..compat import string_type
from ..feed import Entry, Feed, Person, Text
from .base import parser
parse_rss = parser()
@parse_rss.path('channel')
def parse_channel(element, parent):
assert isinstance(parent, string_type), 'parent must be feed_url'
return Feed(id=parent)
@parse_channel.path('item')
def parse_item(element, parent):
assert isinstance(parent, Feed), 'parent must be Feed'
entry = Entry()
parent.entries.append(entry)
return entry
@parse_channel.path('title')
@parse_item.path('title')
def parse_title(element, parent):
assert isinstance(parent, (Feed, Entry)), 'parent must be Feed or Entry'
parent.title = Text(value=element.text)
@parse_channel.path('managingEditor', attr='contributors')
@parse_channel.path('webMaster', attr='contributors')
@parse_item.path('author', attr='authors')
def parse_person(element, parent, attr):
assert isinstance(parent, (Feed, Entry)), 'parent must be Feed or Entry'
name, email_addr = email.utils.parseaddr(element.text)
if '@' not in email_addr:
if not name:
name = email_addr
email_addr = None
if not name:
name = email_addr
if name:
person = Person(name=name, email=email_addr or None)
getattr(parent, attr).append(person)
@parse_channel.path('category')
@parse_item.path('category')
def parse_category(element, parent):
category = Category(
term=element.text,
scheme_uri=element.attrib.get('domain')
)
parent.categories.append(category)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment