validator.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import re
  2. from numbers import Number
  3. from src.errors.argument_exception import argument_exception
  4. class validator:
  5. def check_type(self, value, exp_type):
  6. """
  7. Валидация аргумента по типу
  8. Args:
  9. value (any): Передаваемый аргумент
  10. type(Type): Ожидаемый тип
  11. Raises:
  12. argument_exception: Некорректный тип аргумента
  13. """
  14. if not isinstance(value, exp_type):
  15. raise argument_exception(f"Некорректный тип аргумента ({type(value)}, expected {exp_type})")
  16. return True
  17. def check_type_any(self, value, *types):
  18. """
  19. Валидация аргумента по соответствию одному из типов
  20. Args:
  21. value (any): Передаваемый аргумент
  22. *types (Type): Ожидаемые типы
  23. Raises:
  24. argument_exception: Аргумент не соответствует ни одному из ожидаемых типов
  25. """
  26. flag = False
  27. for type in types:
  28. if isinstance(value, type):
  29. flag = True
  30. break
  31. if not flag:
  32. raise argument_exception("Аргумент не соответствует ни одному из ожидаемых типов "\
  33. + f"({type(value)}, expected={', '.join(types)})")
  34. return True
  35. def check_length(self, value, length: int):
  36. """
  37. Валидация аргумента по длине
  38. Args:
  39. value (any): Передаваемый аргумент
  40. length (int): Ожидаемая длина
  41. Raises:
  42. argument_exception: Несоответствующая длина аргумента
  43. """
  44. if isinstance(value, int):
  45. value = str(value)
  46. if len(value) != length:
  47. raise argument_exception(f"Несоответствующая длина аргумента ({len(value)}, expected {length})")
  48. return True
  49. def check_length_less(self, value, length: int, inclusive=False):
  50. """
  51. Валидация аргумента по максимальной длине
  52. Args:
  53. value (any): Передаваемый аргумент
  54. length (int): Максимальная допустимая длина
  55. inclusive (bool): Сравнивать включительно? default=True
  56. Raises:
  57. argument_exception: Превышена длина аргумента
  58. """
  59. if value is int:
  60. value = str(value)
  61. if (len(value) > length if inclusive \
  62. else len(value) >= length):
  63. raise argument_exception(f"Превышена длина аргумента ({len(value)}, max={length})")
  64. return True
  65. def check_length_greater(self, value, length: int, inclusive=False):
  66. """
  67. Валидация аргумента по минимальной длине
  68. Args:
  69. value (any): Передаваемый аргумент
  70. length (int): Максимальная допустимая длина
  71. inclusive (bool): Сравнивать включительно? default=True
  72. Raises:
  73. argument_exception: Недостаточная длина аргумента
  74. """
  75. if value is int:
  76. value = str(value)
  77. if (len(value) < length if inclusive \
  78. else len(value) <= length):
  79. raise argument_exception("Недостаточная длина аргумента ({len(value)}, min={length})")
  80. return True
  81. def check_length_bound(self, value, min_length: int, max_length: int, inclusive_min=True, inclusive_max=True):
  82. """
  83. Валидация аргумента по минимальной и максимальной длинам
  84. Args:
  85. value (any): Передаваемый аргумент
  86. min_length (int): Минимальная длина
  87. max_length (int): Максимальная длина
  88. inclusive_min (bool): Сравнимать минимальную длину включительно? default=True
  89. inclusive_max (bool): Сравнивать максимальную длину включительно? default=True
  90. Raises:
  91. argument_exception: Недостаточная длина аргумента
  92. argument_exception: Превышена длина аргумента
  93. """
  94. self.check_length_less(value, max_length, inclusive_max)
  95. self.check_length_greater(value, min_length, inclusive_min)
  96. return True
  97. def check_type_length(self, value, exp_type, length: int):
  98. """
  99. Валидация аргумента по типу и длине
  100. Args:
  101. value (any): Передаваемый аргумент
  102. exp_type (Type): Ожидаемый тип
  103. length (int): Ожидаемая длина
  104. Raises:
  105. argument_exception: Несоответствие типа аргумента
  106. argument_exception: Несоответствие длины аргумента
  107. """
  108. self.check_type(value, exp_type)
  109. self.check_length(value, length)
  110. return True
  111. def check_regex(self, value, expression: str):
  112. """
  113. Валидация аргумента по регулярному выражению
  114. Args:
  115. value (any): Передаваемый аргумент
  116. expression (str): Регулярное выражение
  117. Raises:
  118. argument_exception: Аргумент не соответствует регулярному выражению
  119. """
  120. if re.match(expression, value) is None:
  121. raise argument_exception(f"Аргумент не соответствует регулярному выражению ({str(value)}, regex: {expression})")
  122. return True
  123. def check_number(self, value):
  124. """
  125. Валидация аргумента по соответствию типу Число
  126. Args:
  127. value: Передаваемый аргумент
  128. Raises:
  129. argument_exception: Аргумент не является числом
  130. """
  131. if not isinstance(value, Number):
  132. raise argument_exception(f"Аргумент не является числом (type={type(value)})")
  133. return True