Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions tests/test_between.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,17 @@
# external
import pytest

# project
# local
from validators import between, ValidationFailure


T = TypeVar("T", int, float, str, datetime)


@pytest.mark.parametrize(
("value", "min_val", "max_val"),
[(12, 11, 13), (12, None, 14), (12, 11, None), (12, 12, 12)],
)
def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T) -> None:
def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T):
"""Test returns true on valid range."""
assert between(value, min_val=min_val, max_val=max_val)

Expand All @@ -28,7 +27,7 @@ def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T) -> None:
("value", "min_val", "max_val"),
[(12, 13, 12), (12, None, None)],
)
def test_raises_assertion_error_for_invalid_args(value: T, min_val: T, max_val: T) -> None:
def test_raises_assertion_error_for_invalid_args(value: T, min_val: T, max_val: T):
"""Test raises assertion error for invalid args."""
with pytest.raises(AssertionError):
assert between(value, min_val=min_val, max_val=max_val)
Expand All @@ -43,7 +42,7 @@ def test_raises_assertion_error_for_invalid_args(value: T, min_val: T, max_val:
(30, 40, "string"),
],
)
def test_raises_type_error_for_invalid_args(value: T, min_val: T, max_val: T) -> None:
def test_raises_type_error_for_invalid_args(value: T, min_val: T, max_val: T):
"""Test raises type error for invalid args."""
with pytest.raises(TypeError):
assert between(value, min_val=min_val, max_val=max_val)
Expand All @@ -53,7 +52,7 @@ def test_raises_type_error_for_invalid_args(value: T, min_val: T, max_val: T) ->
("value", "min_val", "max_val"),
[(12, 13, 14), (12, None, 11), (12, 13, None)],
)
def test_returns_failed_validation_on_invalid_range(value: T, min_val: T, max_val: T) -> None:
def test_returns_failed_validation_on_invalid_range(value: T, min_val: T, max_val: T):
"""Test returns failed validation on invalid range."""
result = between(value, min_val=min_val, max_val=max_val)
assert isinstance(result, ValidationFailure)
4 changes: 2 additions & 2 deletions validators/_extremes.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class AbsMax:
.. versionadded:: 0.2
"""

def __ge__(self, other: Any) -> bool:
def __ge__(self, other: Any):
"""GreaterThanOrEqual."""
return other is not AbsMax

Expand All @@ -55,6 +55,6 @@ class AbsMin:
.. versionadded:: 0.2
"""

def __le__(self, other: Any) -> bool:
def __le__(self, other: Any):
"""LessThanOrEqual."""
return other is not AbsMin
7 changes: 2 additions & 5 deletions validators/between.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from typing import TypeVar, Union
from datetime import datetime

# project
# local
from ._extremes import AbsMax, AbsMin
from .utils import validator

Expand All @@ -19,7 +19,7 @@ def between(
*,
min_val: Union[T, AbsMin, None] = None,
max_val: Union[T, AbsMax, None] = None,
) -> bool:
):
"""Validate that a number is between minimum and/or maximum value.

This will work with any comparable type, such as floats, decimals and dates
Expand Down Expand Up @@ -80,9 +80,6 @@ def between(
if min_val is None:
min_val = AbsMin()

# if isinstance(min_val, AbsMin) and isinstance(max_val, AbsMax):
# return min_val <= value <= max_val

if isinstance(min_val, AbsMin):
if type(value) is not type(max_val):
raise TypeError("`value` and `max_val` must be of same type")
Expand Down
2 changes: 1 addition & 1 deletion validators/length.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Length."""
# -*- coding: utf-8 -*-

# project
# local
from .between import between
from .utils import validator

Expand Down
14 changes: 7 additions & 7 deletions validators/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-

# standard
from typing import Any, Callable, Dict, Literal, Union
from typing import Any, Callable, Dict
from inspect import getfullargspec
from itertools import chain

Expand All @@ -15,23 +15,23 @@ def __init__(self, function: Callable[..., Any], arg_dict: Dict[str, Any]):
self.func = function
self.__dict__.update(arg_dict)

def __repr__(self) -> str:
def __repr__(self):
"""Repr Validation Failure."""
return (
f"ValidationFailure(func={self.func.__name__}, "
+ f"args={({k: v for (k, v) in self.__dict__.items() if k != 'func'})})"
)

def __str__(self) -> str:
def __str__(self):
"""Str Validation Failure."""
return repr(self)

def __bool__(self) -> Literal[False]:
def __bool__(self):
"""Bool Validation Failure."""
return False


def _func_args_as_dict(func: Callable[..., Any], *args: Any, **kwargs: Any) -> Dict[str, Any]:
def _func_args_as_dict(func: Callable[..., Any], *args: Any, **kwargs: Any):
"""Return function's positional and key value arguments as an ordered dictionary."""
# TODO: find more efficient way to do it
return dict(
Expand All @@ -40,7 +40,7 @@ def _func_args_as_dict(func: Callable[..., Any], *args: Any, **kwargs: Any) -> D
)


def validator(func: Callable[..., Any]) -> Callable[..., Union[Literal[True], ValidationFailure]]:
def validator(func: Callable[..., Any]):
"""A decorator that makes given function validator.

Whenever the given function is called and returns ``False`` value
Expand All @@ -65,7 +65,7 @@ def validator(func: Callable[..., Any]) -> Callable[..., Union[Literal[True], Va
Wrapper function as a decorator.
"""

def wrapper(*args: Any, **kwargs: Any) -> Union[Literal[True], ValidationFailure]:
def wrapper(*args: Any, **kwargs: Any):
return (
True
if func(*args, **kwargs)
Expand Down