Source code for cis_interface.metaschema.properties
import os
import glob
import importlib
from collections import OrderedDict
from cis_interface.metaschema.properties import MetaschemaProperty
_metaschema_properties = OrderedDict()
[docs]def register_metaschema_property(prop_class):
r"""Register a schema property.
Args:
prop_class (class): Class to be registered.
Raises:
ValueError: If a property class has already been registered under the
same name.
ValueError: If the base validator already has a validator function for
the property and the new property class has a schema defined.
ValueError: If the base validator already has a validator function for
the property and the validate method on the new property class is
not disabled.
ValueError: If the property class does not have an entry in the existing
metaschema.
"""
from cis_interface.metaschema import _metaschema, _base_validator
global _metaschema_properties
prop_name = prop_class.name
if prop_name in _metaschema_properties:
raise ValueError("Property '%s' already registered." % prop_name)
if prop_name in _base_validator.VALIDATORS:
if (prop_class.schema is not None):
raise ValueError("Replacement property '%s' modifies the default schema."
% prop_name)
if (((prop_class._validate not in [None, False])
or ('validate' in prop_class.__dict__))):
raise ValueError("Replacement property '%s' modifies the default validator."
% prop_name)
prop_class._validate = False
# prop_class.types = [] # To ensure base class not modified by all
# prop_class.python_types = []
# Check metaschema if it exists
if _metaschema is not None:
if prop_name not in _metaschema['properties']:
raise ValueError("Property '%s' not in pre-loaded metaschema." % prop_name)
_metaschema_properties[prop_name] = prop_class
return prop_class
[docs]def get_registered_properties():
r"""Return a dictionary of registered properties.
Returns:
dict: Registered property/class pairs.
"""
return _metaschema_properties
[docs]def get_metaschema_property(property_name, skip_generic=False):
r"""Get the property class associated with a metaschema property.
Args:
property_name (str): Name of property to get class for.
skip_generic (bool, optional): If True and the property dosn't have a
class, None is returned. Defaults to False.
Returns:
MetaschemaProperty: Associated property class.
"""
if property_name in _metaschema_properties:
return _metaschema_properties[property_name]
else:
if skip_generic:
return None
else:
return MetaschemaProperty.MetaschemaProperty
[docs]def import_all_properties():
r"""Import all types to ensure they are registered."""
for x in glob.glob(os.path.join(os.path.dirname(__file__), '*.py')):
mod = os.path.basename(x)[:-3]
if not mod.startswith('__'):
importlib.import_module('cis_interface.metaschema.properties.%s' % mod)