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

LeanderCS / flask-inputfilter / #387

24 May 2025 12:54PM UTC coverage: 93.386% (-0.3%) from 93.644%
#387

Pull #56

coveralls-python

LeanderCS
48 | Updated IsDataclassValidator to also check against their types, including nested dataclasses, lists, and dictionaries
Pull Request #56: 48 | Update ArrayElementValidator and IsDataclassValidator

60 of 69 new or added lines in 4 files covered. (86.96%)

81 existing lines in 14 files now uncovered.

1878 of 2011 relevant lines covered (93.39%)

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 DateAfterValidator(BaseValidator):
1✔
11
    """
12
    Ensures that a given date is after a specified reference date. It
13
    supports both 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 later than.
18
    - **error_message** (*Optional[str]*): Custom error message if the validation fails.
19

20
    **Expected Behavior:**
21

22
    Converts both the input and the reference date to datetime objects and verifies that the input date is later. If the check fails, a ``ValidationError`` is raised.
23

24
    **Example Usage:**
25

26
    .. code-block:: python
27

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

32
                self.add('event_date', validators=[
33
                    DateAfterValidator(reference_date="2023-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 after '{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