Source code for todo_example.spec
import attr
import sentaku
from .ux import TodoUX
ViaAPI = sentaku.ImplementationName('API')
ViaUX = sentaku.ImplementationName('UX')
ViaRPC = sentaku.ImplementationName('RPC')
[docs]class TodoAPI(sentaku.ImplementationContext):
"""example description for a simple todo application"""
@classmethod
[docs] def from_api(cls, api):
"""
create an application description for the todo app,
that based on the api can use either tha api or the ux for interaction
"""
ux = TodoUX(api)
from .pseudorpc import PseudoRpc
rpc = PseudoRpc(api)
return cls({ViaAPI: api, ViaUX: ux, ViaRPC: rpc})
create_collection = sentaku.ContextualMethod()
@attr.s
[docs]class TodoItem(sentaku.Element):
"""describing a todo list element"""
name = attr.ib()
completed = sentaku.ContextualProperty()
@TodoAPI.external_for(TodoAPI.create_collection, ViaAPI)
@TodoAPI.external_for(TodoAPI.create_collection, ViaUX)
def create_todo_collection(self, name):
self.impl.create_item(name)
return TodoCollection(self, name=name)
@attr.s
[docs]class TodoCollection(sentaku.Collection):
"""domain object describing a todo list"""
name = attr.ib()
create_item = sentaku.ContextualMethod()
get_by = sentaku.ContextualMethod()
clear_completed = sentaku.ContextualMethod()
@TodoAPI.external_for(TodoItem.completed.setter, ViaAPI)
@TodoAPI.external_for(TodoItem.completed.setter, ViaUX)
def completed(self, value):
col = self.impl.get_by(self.parent.name)
elem = col.get_by(self.name)
elem.completed = value
@TodoAPI.external_for(TodoCollection.create_item, ViaAPI)
@TodoAPI.external_for(TodoCollection.create_item, ViaUX)
def create_item(self, name):
collection = self.impl.get_by(self.name)
elem = collection.create_item(name=name)
assert elem
return TodoItem(self, name=name)
@TodoAPI.external_for(TodoCollection.get_by, ViaAPI)
@TodoAPI.external_for(TodoCollection.get_by, ViaUX)
def get_by(self, name):
collection = self.impl.get_by(self.name)
elem = collection.get_by(name)
if elem is not None:
return TodoItem(self, name=name)
@TodoAPI.external_for(TodoCollection.clear_completed, ViaUX)
@TodoAPI.external_for(TodoCollection.clear_completed, ViaAPI)
def clear_completed(self):
collection = self.impl.get_by(self.name)
collection.clear_completed()