123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- _property = property
- import sys
- from odml import doc
- from odml import property
- from odml import section
- from odml import value
- from odml.dtypes import DType
- class odml_implementation(object):
- name = None
- provides = []
- Value = None
- Property = None
- Section = None
- Document = None
- class BasicImplementation(odml_implementation):
- name = 'basic'
- provides = ['basic']
- @_property
- def Value(self):
- return value.BaseValue
- @_property
- def Section(self):
- return section.BaseSection
- @_property
- def Property(self):
- return property.BaseProperty
- @_property
- def Document(self):
- return doc.BaseDocument
- # here the available implementations are stored
- impls = {}
- # the default implementation
- current_implementation = BasicImplementation()
- minimum_implementation = current_implementation
- def addImplementation(implementation, make_minimum=False, make_default=False, key=None):
- """register a new available implementation"""
- impls[implementation.name] = implementation
- if make_minimum and key is not None:
- setMinimumImplementation(key)
- if make_default and key is not None:
- setDefaultImplementation(key)
- def getImplementation(key=None):
- """retrieve a implementation named *key*"""
- if key is None:
- return current_implementation
- implementation = impls[key]
- return implementation
- def setDefaultImplementation(key):
- """
- set a new default implementation
- if it does not fulfill the minimum requirements, a TypeError is raised
- """
- global current_implementation
- if minimum_implementation.name not in impls[key].provides:
- raise TypeError(
- "Cannot set default odml-implementation to '%s', because %s-capabilities are required which are not provided (provides: %s)" %
- (key, minimum_implementation.name, ', '.join(impls[key].provides)))
- current_implementation = impls[key]
- def setMinimumImplementation(key):
- """
- Set a new minimum requirement for a default implementation.
- This can only be increased, i.e. 'downgrades' are not possible.
- If the current_implementation does not provide the requested capability,
- make the minimum implementation the default.
- """
- global minimum_implementation
- if key in minimum_implementation.provides:
- return # the minimum implementation is already capable of this feature
- if minimum_implementation.name not in impls[key].provides:
- raise TypeError(
- "Cannot set new minimum odml-implementation to '%s', because %s-capabilities are already required which are not provided (provides: %s)" %
- (key, minimum_implementation.name, ', '.join(impls[key].provides)))
- if key not in current_implementation.provides:
- setDefaultImplementation(key)
- minimum_implementation = impls[key]
- addImplementation(current_implementation)
- def Value(*args, **kwargs):
- return current_implementation.Value(*args, **kwargs)
- def Property(*args, **kwargs):
- return current_implementation.Property(*args, **kwargs)
- def Section(*args, **kwargs):
- return current_implementation.Section(*args, **kwargs)
- def Document(*args, **kwargs):
- return current_implementation.Document(*args, **kwargs)
- #__all__ = [Value, Property, Section, Document]
|