ConfigurationChecker.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import re
  2. from core.Utils import ModuleNotFoundError
  3. class InvalidSynapeName(Exception):
  4. """
  5. The name of the synapse is not correct. It should only contains alphanumerics at the beginning and the end of
  6. its name. It can also contains dash in beetween alphanumerics.
  7. """
  8. pass
  9. class NoSynapeName(Exception):
  10. """
  11. A synapse needs a name
  12. """
  13. pass
  14. class NoSynapeNeurons(Exception):
  15. """
  16. A synapse must contains at least one neuron
  17. .. seealso:: Synapse, Neuron
  18. """
  19. pass
  20. class NoSynapeSignals(Exception):
  21. """
  22. A synapse must contains at least an Event or an Order
  23. .. seealso:: Event, Order
  24. """
  25. pass
  26. class NoValidSignal(Exception):
  27. """
  28. A synapse must contains at least a valid Event or an Order
  29. .. seealso:: Event, Order
  30. """
  31. pass
  32. class NoEventPeriod(Exception):
  33. """
  34. An Event must contains a period corresponding to its execution
  35. .. seealso:: Event
  36. """
  37. pass
  38. class MultipleSameSynapseName(Exception):
  39. """
  40. A synapse name must be unique
  41. """
  42. pass
  43. class ConfigurationChecker:
  44. """
  45. This Class provides all method to Check the configuration files are properly set up.
  46. """
  47. def __init__(self):
  48. pass
  49. @staticmethod
  50. def check_synape_dict(synape_dict):
  51. """
  52. Return True if the provided dict is well corresponding to a Synapse
  53. :param synape_dict: The synapse Dictionary
  54. :type synape_dict: Dict
  55. :return: True if synapse are ok
  56. :rtype: Boolean
  57. :Example:
  58. ConfigurationChecker().check_synape_dict(synapses_dict):
  59. .. seealso:: Synapse
  60. .. raises:: NoSynapeName, InvalidSynapeName, NoSynapeNeurons, NoSynapeSignals
  61. .. warnings:: Static and Public
  62. """
  63. if 'name' not in synape_dict:
  64. raise NoSynapeName("The Synapse does not have a name: %s" % synape_dict)
  65. # check that the name is conform
  66. # Regex for [a - zA - Z0 - 9\-] with dashes allowed in between but not at the start or end
  67. pattern = r'(?=[a-zA-Z0-9\-]{4,100}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$'
  68. prog = re.compile(pattern)
  69. result = prog.match(synape_dict["name"])
  70. if result is None:
  71. raise InvalidSynapeName("Error with synapse name \"%s\".Valid syntax: [a - zA - Z0 - 9\-] with dashes "
  72. "allowed in between but not at the start or end" % synape_dict["name"])
  73. if 'neurons' not in synape_dict:
  74. raise NoSynapeNeurons("The Synapse does not have neurons: %s" % synape_dict)
  75. if 'signals' not in synape_dict:
  76. raise NoSynapeSignals("The Synapse does not have signals: %s" % synape_dict)
  77. return True
  78. @staticmethod
  79. def check_neuron_dict(neuron_dict):
  80. """
  81. Check received neuron dict is valid:
  82. :param neuron_dict: The neuron Dictionary
  83. :type neuron_dict: Dict
  84. :return: True if neuron is ok
  85. :rtype: Boolean
  86. :Example:
  87. ConfigurationChecker().check_neuron_dict(neurons_dict):
  88. .. seealso:: Synapse
  89. .. raises:: ModuleNotFoundError
  90. .. warnings:: Static and Public
  91. """
  92. def check_neuron_exist(neuron_name):
  93. package_name = "neurons"
  94. mod = __import__(package_name, fromlist=[neuron_name])
  95. try:
  96. getattr(mod, neuron_name)
  97. except AttributeError:
  98. raise ModuleNotFoundError("The module %s does not exist in package %s" % (neuron_name, package_name))
  99. return True
  100. if isinstance(neuron_dict, dict):
  101. for neuron_name in neuron_dict:
  102. check_neuron_exist(neuron_name)
  103. else:
  104. check_neuron_exist(neuron_dict)
  105. return True
  106. @staticmethod
  107. def check_signal_dict(signal_dict):
  108. """
  109. Check received signal dictionary is valid:
  110. :param signal_dict: The signal Dictionary
  111. :type signal_dict: Dict
  112. :return: True if signal are ok
  113. :rtype: Boolean
  114. :Example:
  115. ConfigurationChecker().check_signal_dict(signal_dict):
  116. .. seealso:: Order, Event
  117. .. raises:: NoValidSignal
  118. .. warnings:: Static and Public
  119. """
  120. if ('event' not in signal_dict) and ('order' not in signal_dict):
  121. raise NoValidSignal("The signal is not an event or an order %s" % signal_dict)
  122. return True
  123. @staticmethod
  124. def check_event_dict(event_dict):
  125. """
  126. Check received event dictionary is valid:
  127. :param event_dict: The event Dictionary
  128. :type event_dict: Dict
  129. :return: True if event are ok
  130. :rtype: Boolean
  131. :Example:
  132. ConfigurationChecker().check_event_dict(event_dict):
  133. .. seealso:: Event
  134. .. raises:: NoEventPeriod
  135. .. warnings:: Static and Public
  136. """
  137. if event_dict is None:
  138. raise NoEventPeriod("Event must contain a period: %s" % event_dict)
  139. return True
  140. @staticmethod
  141. def check_order_dict(order_dict):
  142. """
  143. Check received order dictionary is valid:
  144. :param order_dict: The Order Dict
  145. :type order_dict: Dict
  146. :return: True if event are ok
  147. :rtype: Boolean
  148. :Example:
  149. ConfigurationChecker().check_order_dict(order_dict):
  150. .. seealso:: Order
  151. .. raises:: NoEventPeriod
  152. .. warnings:: Static and Public
  153. """
  154. if order_dict is not None:
  155. return True
  156. return False
  157. @staticmethod
  158. def check_synapes(synapses_list):
  159. """
  160. Check the synapse list is ok:
  161. - No double same name
  162. :param synapses_list: The Synapse List
  163. :type synapses_list: List
  164. :return: list of Synapse
  165. :rtype: List
  166. :Example:
  167. ConfigurationChecker().check_synapes(order_dict):
  168. .. seealso:: Synapse
  169. .. raises:: MultipleSameSynapseName
  170. .. warnings:: Static and Public
  171. """
  172. seen = set()
  173. for synapse in synapses_list:
  174. # convert ascii to UTF-8
  175. synapse_name = synapse.name.encode('utf-8')
  176. if synapse_name in seen:
  177. raise MultipleSameSynapseName("Multiple synapse found with the same name: %s" % synapse_name)
  178. seen.add(synapse.name)
  179. return True