Source code for opennode.oms.model.traverser
from grokcore.component import context
import opennode.oms.model.model.root
from opennode.oms.model.model.base import IContainer, IModel
from opennode.oms.model.traversal import Traverser
[docs]class ModelTraverser(Traverser):
"""Generic traverser for all IModel instances."""
context(IModel)
[docs] def traverse(self, name):
"""Traverses the object to find the next object in the path to
traverse.
Only traversing `.` and `..` is supported generically for all objects.
"""
if name == '..':
return self.context.__parent__
elif name == '.':
return self.context
[docs]class ContainerTraverser(ModelTraverser):
"""Generic traverser for all IContainer instances."""
context(IContainer)
[docs] def traverse(self, name):
"""Amends ModelTraverser.traverse to add the ability to
traverse child objects in IContainer instances.
Uses the `__parent__` property and the `__getitem__` accessor for traversal.
"""
ret = super(ContainerTraverser, self).traverse(name)
if ret is not None:
return ret
else:
return self.context[name]
[docs]class RootTraverser(ContainerTraverser):
context(opennode.oms.model.model.root.OmsRoot)
[docs] def traverse(self, name):
if name == '..':
return self.context
else:
return super(RootTraverser, self).traverse(name)