diff --git a/.flake8 b/.flake8 index d7459204..99d2e123 100644 --- a/.flake8 +++ b/.flake8 @@ -4,4 +4,4 @@ ignore = E203, E266, W503, ANN002, ANN003, ANN101, ANN102, ANN401, N807, N818 max-line-length = 79 max-complexity = 18 select = B,C,E,F,W,T4,B9,ANN,Q0,N8,VNE -exclude = venv, tests +exclude = .venv, tests diff --git a/app/main.py b/app/main.py index 6d375672..f80faed5 100644 --- a/app/main.py +++ b/app/main.py @@ -1,25 +1,72 @@ from abc import ABC +from typing import Any, Type class IntegerRange: - pass + def __init__(self, min_amount: int, max_amount: int) -> None: + self.min_amount = min_amount + self.max_amount = max_amount + + def __set_name__(self, owner: Type, name: str) -> None: + self.protected_name = "_" + name + + def __get__(self, instance: Any, owner: Type) -> int: + return getattr(instance, self.protected_name) + + def __set__(self, instance: Any, value: Any) -> None: + if not isinstance(value, int): + raise TypeError("Value must be an integer.") + if not (self.min_amount <= value <= self.max_amount): + raise ValueError(f"Value must be between {self.min_amount} " + f"and {self.max_amount}.") + setattr(instance, self.protected_name, value) class Visitor: - pass + def __init__( + self, + name: str, + age: int, + weight: int, + height: int + ) -> None: + self.name = name + self.age = age + self.weight = weight + self.height = height class SlideLimitationValidator(ABC): - pass + def __init__(self, age: int, weight: int, height: int) -> None: + self.age = age + self.weight = weight + self.height = height class ChildrenSlideLimitationValidator(SlideLimitationValidator): - pass + age = IntegerRange(4, 14) + weight = IntegerRange(20, 50) + height = IntegerRange(80, 120) class AdultSlideLimitationValidator(SlideLimitationValidator): - pass + age = IntegerRange(14, 60) + weight = IntegerRange(50, 120) + height = IntegerRange(120, 220) class Slide: - pass + def __init__( + self, + name: str, + limitation_class: Type[SlideLimitationValidator] + ) -> None: + self.name = name + self.limitation_class = limitation_class + + def can_access(self, visitor: Visitor) -> bool: + try: + self.limitation_class(visitor.age, visitor.weight, visitor.height) + except (TypeError, ValueError): + return False + return True