Created
June 10, 2014 18:58
-
-
Save dahlia/b59b20083782d90833b8 to your computer and use it in GitHub Desktop.
libearth parser refactoring idea
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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