Skip to content

Commit eec1d66

Browse files
committed
maint: improves between.py and length.py
- follows google's python style guide for docstrings - adds `flake8-docstrings` as dev dependency - update `README`'s workflow badge - improves `between.py` and `length.py` scripts - adapts associated test cases as well - makes `_extremes.py` a private module
1 parent 899dd78 commit eec1d66

16 files changed

+442
-278
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ True
2020
- [Issue Tracker](http://github.com/kvesteri/validators/issues)
2121
- [Code](http://github.com/kvesteri/validators/)
2222

23-
[bs-badge]: https://github.com/kvesteri/validators/workflows/GH/badge.svg
24-
[bs-link]: https://github.com/kvesteri/validators/actions/workflows/main.yml
23+
[bs-badge]: https://github.com/python-validators/validators/actions/workflows/main.yml/badge.svg
24+
[bs-link]: https://github.com/python-validators/validators/actions/workflows/main.yml
2525
[vs-badge]: https://img.shields.io/pypi/v/validators.svg
2626
[vs-link]: https://pypi.python.org/pypi/validators/
2727
[dw-badge]: https://img.shields.io/pypi/dm/validators.svg

README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ Resources
2626
- `Code <http://github.com/kvesteri/validators/>`_
2727

2828

29-
.. |Build Status| image:: https://github.com/kvesteri/validators/workflows/GH/badge.svg
30-
:target: https://github.com/kvesteri/validators/actions/workflows/main.yml
29+
.. |Build Status| image:: https://github.com/python-validators/validators/actions/workflows/main.yml/badge.svg
30+
:target: https://github.com/python-validators/validators/actions/workflows/main.yml
3131
.. |Version Status| image:: https://img.shields.io/pypi/v/validators.svg
3232
:target: https://pypi.python.org/pypi/validators/
3333
.. |Downloads| image:: https://img.shields.io/pypi/dm/validators.svg

poetry.lock

Lines changed: 47 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ python = "^3.9"
3131
bandit = "^1.7.4"
3232
black = "^23.1.0"
3333
flake8 = "^6.0.0"
34+
flake8-docstrings = "^1.7.0"
3435
pyright = "^1.1.293"
3536
pytest = "^7.2.1"
3637
setuptools = "^67.2.0"

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
[flake8]
55
max-line-length = 100
6+
docstring-convention = google
67

78
# [isort]
89
# known_first_party = sqlalchemy_utils,tests

tests/test__extremes.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""Test Extremes."""
2+
# -*- coding: utf-8 -*-
3+
4+
# standard
5+
from typing import Any
6+
7+
# external
8+
import pytest
9+
10+
# project
11+
from validators._extremes import AbsMax, AbsMin
12+
13+
abs_max = AbsMax()
14+
abs_min = AbsMin()
15+
16+
17+
@pytest.mark.parametrize(
18+
("value",),
19+
[(None,), ("",), (12,), (abs_min,)],
20+
)
21+
def test_abs_max_is_greater_than_every_other_value(value: Any):
22+
"""Test if AbsMax is greater than every other value."""
23+
assert value < abs_max
24+
assert abs_max > value
25+
26+
27+
def test_abs_max_is_not_greater_than_itself():
28+
"""Test if AbsMax is not greater than itself."""
29+
assert not (abs_max > abs_max)
30+
31+
32+
def test_other_comparison_methods_for_abs_max():
33+
"""Test other comparison methods for AbsMax."""
34+
assert abs_max <= abs_max
35+
assert abs_max == abs_max
36+
assert abs_max == abs_max
37+
38+
39+
@pytest.mark.parametrize(
40+
("value",),
41+
[(None,), ("",), (12,), (abs_max,)],
42+
)
43+
def test_abs_min_is_smaller_than_every_other_value(value: Any):
44+
"""Test if AbsMin is less than every other value."""
45+
assert value > abs_min
46+
47+
48+
def test_abs_min_is_not_greater_than_itself():
49+
"""Test if AbsMin is not less than itself."""
50+
assert not (abs_min < abs_min)
51+
52+
53+
def test_other_comparison_methods_for_abs_min():
54+
"""Test other comparison methods for AbsMin."""
55+
assert abs_min <= abs_min
56+
assert abs_min == abs_min
57+
assert abs_min == abs_min

tests/test_between.py

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,58 @@
1+
"""Test Between."""
12
# -*- coding: utf-8 -*-
3+
4+
# standard
5+
from datetime import datetime
6+
from typing import TypeVar
7+
8+
# external
29
import pytest
310

4-
import validators
11+
# project
12+
from validators import between, ValidationFailure
13+
514

15+
T = TypeVar("T", int, float, str, datetime)
616

7-
@pytest.mark.parametrize(('value', 'min', 'max'), [
8-
(12, 11, 13),
9-
(12, None, 14),
10-
(12, 11, None),
11-
(12, 12, 12)
12-
])
13-
def test_returns_true_on_valid_range(value, min, max):
14-
assert validators.between(value, min=min, max=max)
1517

18+
@pytest.mark.parametrize(
19+
("value", "min_val", "max_val"),
20+
[(12, 11, 13), (12, None, 14), (12, 11, None), (12, 12, 12)],
21+
)
22+
def test_returns_true_on_valid_range(value: T, min_val: T, max_val: T) -> None:
23+
"""Test returns true on valid range."""
24+
assert between(value, min_val=min_val, max_val=max_val)
1625

17-
@pytest.mark.parametrize(('value', 'min', 'max'), [
18-
(12, 13, 12),
19-
(12, None, None),
20-
])
21-
def test_raises_assertion_error_for_invalid_args(value, min, max):
26+
27+
@pytest.mark.parametrize(
28+
("value", "min_val", "max_val"),
29+
[(12, 13, 12), (12, None, None)],
30+
)
31+
def test_raises_assertion_error_for_invalid_args(value: T, min_val: T, max_val: T) -> None:
32+
"""Test raises assertion error for invalid args."""
2233
with pytest.raises(AssertionError):
23-
assert validators.between(value, min=min, max=max)
34+
assert between(value, min_val=min_val, max_val=max_val)
35+
36+
37+
@pytest.mark.parametrize(
38+
("value", "min_val", "max_val"),
39+
[
40+
(12, "13.5", datetime(1970, 1, 1)),
41+
("12", 20.5, "None"),
42+
(datetime(1970, 1, 1), 20, "string"),
43+
],
44+
)
45+
def test_raises_type_error_for_invalid_args(value: T, min_val: T, max_val: T) -> None:
46+
"""Test raises type error for invalid args."""
47+
with pytest.raises(TypeError):
48+
assert between(value, min_val=min_val, max_val=max_val)
2449

2550

26-
@pytest.mark.parametrize(('value', 'min', 'max'), [
27-
(12, 13, 14),
28-
(12, None, 11),
29-
(12, 13, None)
30-
])
31-
def test_returns_failed_validation_on_invalid_range(value, min, max):
32-
result = validators.between(value, min=min, max=max)
33-
assert isinstance(result, validators.ValidationFailure)
51+
@pytest.mark.parametrize(
52+
("value", "min_val", "max_val"),
53+
[(12, 13, 14), (12, None, 11), (12, 13, None)],
54+
)
55+
def test_returns_failed_validation_on_invalid_range(value: T, min_val: T, max_val: T) -> None:
56+
"""Test returns failed validation on invalid range."""
57+
result = between(value, min_val=min_val, max_val=max_val)
58+
assert isinstance(result, ValidationFailure)

tests/test_extremes.py

Lines changed: 0 additions & 45 deletions
This file was deleted.

tests/test_length.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
1+
"""Test Length."""
12
# -*- coding: utf-8 -*-
3+
4+
# external
25
import pytest
36

4-
import validators
7+
# project
8+
from validators import length, ValidationFailure
59

610

7-
@pytest.mark.parametrize(('value', 'min', 'max'), [
8-
('password', 2, 10),
9-
('password', None, 10),
10-
('password', 2, None),
11-
('password', 8, 8)
12-
])
13-
def test_returns_true_on_valid_length(value, min, max):
14-
assert validators.length(value, min=min, max=max)
11+
@pytest.mark.parametrize(
12+
("value", "min_val", "max_val"),
13+
[("password", 2, 10), ("password", 0, 10), ("password", 8, 8)],
14+
)
15+
def test_returns_true_on_valid_length(value: str, min_val: int, max_val: int):
16+
"""Test returns true on valid length."""
17+
assert length(value, min_val=min_val, max_val=max_val)
1518

1619

17-
@pytest.mark.parametrize(('value', 'min', 'max'), [
18-
('something', 13, 12),
19-
('something', -1, None),
20-
('something', -1, None),
21-
('something', -3, -2)
22-
])
23-
def test_raises_assertion_error_for_invalid_args(value, min, max):
20+
@pytest.mark.parametrize(
21+
("value", "min_val", "max_val"),
22+
[("something", 14, 12), ("something", -10, -20), ("something", 0, -2)],
23+
)
24+
def test_raises_assertion_error_for_invalid_args(value: str, min_val: int, max_val: int):
25+
"""Test raises assertion error for invalid args."""
2426
with pytest.raises(AssertionError):
25-
assert validators.length(value, min=min, max=max)
26-
27-
28-
@pytest.mark.parametrize(('value', 'min', 'max'), [
29-
('something', 13, 14),
30-
('something', None, 6),
31-
('something', 13, None)
32-
])
33-
def test_returns_failed_validation_on_invalid_range(value, min, max):
34-
assert isinstance(
35-
validators.length(value, min=min, max=max),
36-
validators.ValidationFailure
37-
)
27+
assert length(value, min_val=min_val, max_val=max_val)
28+
29+
30+
@pytest.mark.parametrize(
31+
("value", "min_val", "max_val"),
32+
[("something", 13, 14), ("something", 0, 6), ("something", 14, 20)],
33+
)
34+
def test_returns_failed_validation_on_invalid_range(value: str, min_val: int, max_val: int):
35+
"""Test returns failed validation on invalid range."""
36+
assert isinstance(length(value, min_val=min_val, max_val=max_val), ValidationFailure)

0 commit comments

Comments
 (0)