• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LeanderCS / flask-inputfilter / #389

24 May 2025 01:01PM UTC coverage: 93.409% (-0.2%) from 93.644%
#389

Pull #56

coveralls-python

LeanderCS
48 | Remove typing_extensions dep
Pull Request #56: 48 | Update ArrayElementValidator and IsDataclassValidator

64 of 73 new or added lines in 4 files covered. (87.67%)

87 existing lines in 18 files now uncovered.

1885 of 2018 relevant lines covered (93.41%)

0.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.15
/flask_inputfilter/validators/date_after_validator.py
1
from __future__ import annotations
1✔
2

3
from datetime import date, datetime
1✔
4
from typing import Any, Optional, Union
1✔
5

6
from flask_inputfilter.exceptions import ValidationError
1✔
7
from flask_inputfilter.validators import BaseValidator
1✔
8

9

10
class DateBeforeValidator(BaseValidator):
1✔
11
    """
12
    Validates that a given date is before a specified reference date.
13
    It supports datetime objects and ISO 8601 formatted strings.
14

15
    **Parameters:**
16

17
    - **reference_date** (*Union[str, date, datetime]*): The date that the input must be earlier than.
18
    - **error_message** (*Optional[str]*): Custom error message if validation fails.
19

20
    **Expected Behavior:**
21

22
    Parses the input and reference date into datetime objects and checks that the input date is earlier. Raises a ``ValidationError`` on failure.
23

24
    **Example Usage:**
25

26
    .. code-block:: python
27

28
        class RegistrationInputFilter(InputFilter):
29
            def __init__(self):
30
                super().__init__()
31

32
                self.add('birth_date', validators=[
33
                    DateBeforeValidator(reference_date="2005-01-01")
34
                ])
35
    """
36

37
    __slots__ = ("reference_date", "error_message")
1✔
38

39
    def __init__(
1✔
40
        self,
41
        reference_date: Union[str, date, datetime],
42
        error_message: Optional[str] = None,
43
    ) -> None:
44
        self.reference_date = reference_date
1✔
45
        self.error_message = error_message
1✔
46

47
    def validate(self, value: Any) -> None:
1✔
48
        value_reference_date = self.__parse_date(self.reference_date)
1✔
49
        value_datetime = self.__parse_date(value)
1✔
50

51
        if value_datetime >= value_reference_date:
1✔
52
            raise ValidationError(
1✔
53
                self.error_message
54
                or f"Date '{value}' is not before '{value_reference_date}'."
55
            )
56

57
    @staticmethod
1✔
58
    def __parse_date(value: Any) -> datetime:
59
        if isinstance(value, datetime):
1✔
60
            return value
1✔
61

62
        elif isinstance(value, date):
1✔
63
            return datetime.combine(value, datetime.min.time())
1✔
64

65
        elif isinstance(value, str):
1✔
66
            try:
1✔
67
                return datetime.fromisoformat(value)
1✔
68

69
            except ValueError:
1✔
70
                raise ValidationError(f"Invalid ISO 8601 format '{value}'.")
1✔
71

UNCOV
72
        raise ValidationError(
×
73
            f"Unsupported type for date comparison '{type(value)}'."
74
        )
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc