123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- import re
- from core.Utils import ModuleNotFoundError
- class InvalidSynapeName(Exception):
- """
- The name of the synapse is not correct. It should only contains alphanumerics at the beginning and the end of
- its name. It can also contains dash in beetween alphanumerics.
- """
- pass
- class NoSynapeName(Exception):
- """
- A synapse needs a name
- """
- pass
- class NoSynapeNeurons(Exception):
- """
- A synapse must contains at least one neuron
- .. seealso:: Synapse, Neuron
- """
- pass
- class NoSynapeSignals(Exception):
- """
- A synapse must contains at least an Event or an Order
- .. seealso:: Event, Order
- """
- pass
- class NoValidSignal(Exception):
- """
- A synapse must contains at least a valid Event or an Order
- .. seealso:: Event, Order
- """
- pass
- class NoEventPeriod(Exception):
- """
- An Event must contains a period corresponding to its execution
- .. seealso:: Event
- """
- pass
- class MultipleSameSynapseName(Exception):
- """
- A synapse name must be unique
- """
- pass
- class ConfigurationChecker:
- """
- This Class provides all method to Check the configuration files are properly set up.
- """
- def __init__(self):
- pass
- @staticmethod
- def check_synape_dict(synape_dict):
- """
- Return True if the provided dict is well corresponding to a Synapse
- :param synape_dict: The synapse Dictionary
- :type synape_dict: Dict
- :return: True if synapse are ok
- :rtype: Boolean
- :Example:
- ConfigurationChecker().check_synape_dict(synapses_dict):
- .. seealso:: Synapse
- .. raises:: NoSynapeName, InvalidSynapeName, NoSynapeNeurons, NoSynapeSignals
- .. warnings:: Static and Public
- """
- if 'name' not in synape_dict:
- raise NoSynapeName("The Synapse does not have a name: %s" % synape_dict)
- # check that the name is conform
- # Regex for [a - zA - Z0 - 9\-] with dashes allowed in between but not at the start or end
- pattern = r'(?=[a-zA-Z0-9\-]{4,100}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$'
- prog = re.compile(pattern)
- result = prog.match(synape_dict["name"])
- if result is None:
- raise InvalidSynapeName("Error with synapse name \"%s\".Valid syntax: [a - zA - Z0 - 9\-] with dashes "
- "allowed in between but not at the start or end" % synape_dict["name"])
- if 'neurons' not in synape_dict:
- raise NoSynapeNeurons("The Synapse does not have neurons: %s" % synape_dict)
- if 'signals' not in synape_dict:
- raise NoSynapeSignals("The Synapse does not have signals: %s" % synape_dict)
- return True
- @staticmethod
- def check_neuron_dict(neuron_dict):
- """
- Check received neuron dict is valid:
- :param neuron_dict: The neuron Dictionary
- :type neuron_dict: Dict
- :return: True if neuron is ok
- :rtype: Boolean
- :Example:
- ConfigurationChecker().check_neuron_dict(neurons_dict):
- .. seealso:: Synapse
- .. raises:: ModuleNotFoundError
- .. warnings:: Static and Public
- """
- def check_neuron_exist(neuron_module_name):
- """
- Return True if the neuron_name python Class exist in neurons package
- :param neuron_module_name: Name of the neuron module to check
- :type neuron_module_name: str
- :return:
- """
- package_name = "neurons"
- mod = __import__(package_name, fromlist=[neuron_module_name])
- try:
- getattr(mod, neuron_module_name)
- except AttributeError:
- raise ModuleNotFoundError("The module %s does not exist in package %s" % (neuron_module_name,
- package_name))
- return True
- if isinstance(neuron_dict, dict):
- for neuron_name in neuron_dict:
- check_neuron_exist(neuron_name)
- else:
- check_neuron_exist(neuron_dict)
- return True
- @staticmethod
- def check_signal_dict(signal_dict):
- """
- Check received signal dictionary is valid:
- :param signal_dict: The signal Dictionary
- :type signal_dict: Dict
- :return: True if signal are ok
- :rtype: Boolean
- :Example:
- ConfigurationChecker().check_signal_dict(signal_dict):
- .. seealso:: Order, Event
- .. raises:: NoValidSignal
- .. warnings:: Static and Public
- """
- if ('event' not in signal_dict) and ('order' not in signal_dict):
- raise NoValidSignal("The signal is not an event or an order %s" % signal_dict)
- return True
- @staticmethod
- def check_event_dict(event_dict):
- """
- Check received event dictionary is valid:
- :param event_dict: The event Dictionary
- :type event_dict: Dict
- :return: True if event are ok
- :rtype: Boolean
- :Example:
- ConfigurationChecker().check_event_dict(event_dict):
- .. seealso:: Event
- .. raises:: NoEventPeriod
- .. warnings:: Static and Public
- """
- if event_dict is None:
- raise NoEventPeriod("Event must contain a period: %s" % event_dict)
- return True
- @staticmethod
- def check_order_dict(order_dict):
- """
- Check received order dictionary is valid:
- :param order_dict: The Order Dict
- :type order_dict: Dict
- :return: True if event are ok
- :rtype: Boolean
- :Example:
- ConfigurationChecker().check_order_dict(order_dict):
- .. seealso:: Order
- .. warnings:: Static and Public
- """
- if order_dict is not None:
- return True
- return False
- @staticmethod
- def check_synapes(synapses_list):
- """
- Check the synapse list is ok:
- - No double same name
- :param synapses_list: The Synapse List
- :type synapses_list: List
- :return: list of Synapse
- :rtype: List
- :Example:
- ConfigurationChecker().check_synapes(order_dict):
- .. seealso:: Synapse
- .. raises:: MultipleSameSynapseName
- .. warnings:: Static and Public
- """
- seen = set()
- for synapse in synapses_list:
- # convert ascii to UTF-8
- synapse_name = synapse.name.encode('utf-8')
- if synapse_name in seen:
- raise MultipleSameSynapseName("Multiple synapse found with the same name: %s" % synapse_name)
- seen.add(synapse.name)
- return True
|