SEP-005: Detailed ItemBuilder API use

SEP:5
Title:ItemBuilder API
Author:Ismael Carnales, Pablo Hoffman
Created:2009-07-24
StatusObsoleted by SEP-008

Item class for examples:

class NewsItem(Item):
    url = fields.TextField()
    headline = fields.TextField()
    content = fields.TextField()
    published = fields.DateField()

Setting expanders

class NewsItemBuilder(ItemBuilder):
    item_class = NewsItem

    headline = reducers.Reducer(extract, remove_tags(), unquote(), strip)

This approach will override the Reducer class for BuilderFields depending on their Item Field class:

Setting reducers

class NewsItemBuilder(ItemBuilder):
    item_class = NewsItem

    headline = reducers.TakeFirst(extract, remove_tags(), unquote(), strip)
    published = reducers.Reducer(extract, remove_tags(), unquote(), strip)

As with the previous example this would select join_strings as the reducer for content

Setting expanders/reducers new way

class NewsItemBuilder(ItemBuilder):
    item_class = NewsItem

    headline = BuilderField(extract, remove_tags(), unquote(), strip)
    content = BuilderField(extract, remove_tags(), unquote(), strip)

    class Reducer:
        headline = TakeFirst

Extending ItemBuilder

class SiteNewsItemBuilder(NewsItemBuilder):
    published = reducers.Reducer(extract, remove_tags(), unquote(), strip, to_date('%d.%m.%Y'))

Extending ItemBuilder using statich methods

class SiteNewsItemBuilder(NewsItemBuilder):
    published = reducers.Reducer(NewsItemBuilder.published, to_date('%d.%m.%Y'))

Using default_builder

class DefaultedNewsItemBuilder(ItemBuilder):
    item_class = NewsItem

    default_builder = reducers.Reducer(extract, remove_tags(), unquote(), strip)

This will use default_builder as the builder for every field in the item class. As a reducer is not set reducers will be set based on Item Field classess.

Reset default_builder for a field

class DefaultedNewsItemBuilder(ItemBuilder):
    item_class = NewsItem

    default_builder = reducers.Reducer(extract, remove_tags(), unquote(), strip)
    url = BuilderField()

Extending default ItemBuilder

class SiteNewsItemBuilder(NewsItemBuilder):
    published = reducers.Reducer(extract, remove_tags(), unquote(), strip, to_date('%d.%m.%Y'))

Extending default ItemBuilder using static methods

class SiteNewsItemBuilder(NewsItemBuilder):
    published = reducers.Reducer(NewsItemBuilder.default_builder, to_date('%d.%m.%Y'))