Source code for todo_example.api

import attr


@attr.s
[docs]class TodoElement(object): """ Element of a todo list """ name = attr.ib() completed = attr.ib(default=False)
[docs]def get_by(self, name): """get element by name""" return next( (item for item in self if item.name == name), None)
def create_by_name(cls, collection_name): def create_item(self, name): "create a new named %r item" assert self.get_by(name) is None item = cls(name=name) getattr(self, collection_name).append(item) return item create_item.__doc__ %= cls return create_item @attr.s
[docs]class TodoList(object): """a named todolist""" name = attr.ib() items = attr.ib(default=attr.Factory(list), convert=list) def __iter__(self): return iter(self.items) get_by = get_by create_item = create_by_name(TodoElement, 'items')
[docs] def clear_completed(self): """ removes completed elements """ self.items = [i for i in self.items if not i.completed]
@attr.s
[docs]class TodoApp(object): """ A Basic Todo List Storage """ collections = attr.ib(default=attr.Factory(list), convert=list) def __iter__(self): return iter(self.collections) def __repr__(self): return '<TodoApp %r>' % ( sorted(x.name for x in self.collections),) get_by = get_by create_item = create_by_name(TodoList, 'collections')