ConfigurationChecker.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import re
  2. from core.Utils import Utils, ModuleNotFoundError
  3. class InvalidSynapeName(Exception):
  4. pass
  5. class NoSynapeName(Exception):
  6. pass
  7. class NoSynapeNeurons(Exception):
  8. pass
  9. class NoSynapeSignals(Exception):
  10. pass
  11. class NoValidSignal(Exception):
  12. pass
  13. class NoEventID(Exception):
  14. pass
  15. class NoEventPeriod(Exception):
  16. pass
  17. class MultipleSameSynapseName(Exception):
  18. pass
  19. class NotValidSynapseName(Exception):
  20. pass
  21. class ConfigurationChecker:
  22. def __init__(self):
  23. pass
  24. @staticmethod
  25. def check_synape_dict(synape_dict):
  26. if 'name' not in synape_dict:
  27. raise NoSynapeName("The Synapse does not have a name: %s" % synape_dict)
  28. # check that the name is conform
  29. # Regex for [a - zA - Z0 - 9\-] with dashes allowed in between but not at the start or end
  30. pattern = r'(?=[a-zA-Z0-9\-]{4,100}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$'
  31. prog = re.compile(pattern)
  32. result = prog.match(synape_dict["name"])
  33. if result is None:
  34. raise InvalidSynapeName("Error with synapse name \"%s\".Valid syntax: [a - zA - Z0 - 9\-] with dashes "
  35. "allowed in between but not at the start or end" % synape_dict["name"])
  36. if 'neurons' not in synape_dict:
  37. raise NoSynapeNeurons("The Synapse does not have neurons: %s" % synape_dict)
  38. if 'signals' not in synape_dict:
  39. raise NoSynapeSignals("The Synapse does not have signals: %s" % synape_dict)
  40. return True
  41. @staticmethod
  42. def check_neuron_dict(neuron_dict):
  43. """
  44. Check received neuron dict is valid:
  45. - neuron exist
  46. :param neuron_dict:
  47. :return:
  48. """
  49. def check_neuron_exist(neuron_name):
  50. package_name = "neurons"
  51. mod = __import__(package_name, fromlist=[neuron_name])
  52. try:
  53. getattr(mod, neuron_name)
  54. except AttributeError:
  55. raise ModuleNotFoundError("The module %s does not exist in package %s" % (neuron_name, package_name))
  56. return True
  57. if isinstance(neuron_dict, dict):
  58. for neuron_name in neuron_dict:
  59. check_neuron_exist(neuron_name)
  60. else:
  61. check_neuron_exist(neuron_dict)
  62. return True
  63. @staticmethod
  64. def check_signal_dict(signal_dict):
  65. if ('event' not in signal_dict) and ('order' not in signal_dict):
  66. raise NoValidSignal("The signal is not an event or an order %s" % signal_dict)
  67. return True
  68. @staticmethod
  69. def check_event_dict(event_dict):
  70. if event_dict is None:
  71. raise NoEventPeriod("Event must contain a period: %s" % event_dict)
  72. return True
  73. @staticmethod
  74. def check_order_dict(order_dict):
  75. if order_dict is not None:
  76. return True
  77. return False
  78. @staticmethod
  79. def check_synapes(synapses_list):
  80. """
  81. Check the synapse list is ok:
  82. - No double same name
  83. :param synapses_list:
  84. :type synapses_list: list of Synapse
  85. :return:
  86. """
  87. seen = set()
  88. for synapse in synapses_list:
  89. # convert ascii to UTF-8
  90. synapse_name = synapse.name.encode('utf-8')
  91. if synapse_name in seen:
  92. raise MultipleSameSynapseName("Multiple synapse found with the same name: %s" % synapse_name)
  93. seen.add(synapse.name)
  94. return True