Skip to content

Commit

Permalink
Merge pull request #33 from PickwickSoft/feature/add-conditions-for-t…
Browse files Browse the repository at this point in the history
…ype-date

Feature/add conditions for type date
  • Loading branch information
garlontas committed Jun 19, 2023
2 parents 036ef0e + 374d150 commit 5c24162
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 46 deletions.
61 changes: 40 additions & 21 deletions pystreamapi/conditions/date.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from datetime import datetime as __datetime, timedelta as __timedelta, timezone as __timezone
from datetime import datetime as __datetime, timedelta as __timedelta, timezone as __timezone, \
date as __date
from typing import Union


def before(d: __datetime):
def before(d: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is before a given datetime.
:param d: The datetime to check against.
Expand All @@ -10,7 +12,7 @@ def before(d: __datetime):
return lambda y: y < d


def after(d: __datetime):
def after(d: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is after a given datetime.
:param d: The datetime to check against.
Expand All @@ -19,7 +21,7 @@ def after(d: __datetime):
return lambda y: y > d


def before_or_equal(d: __datetime):
def before_or_equal(d: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is before or equal to a given datetime.
:param d: The datetime to check against.
Expand All @@ -28,7 +30,7 @@ def before_or_equal(d: __datetime):
return lambda y: y <= d


def after_or_equal(d: __datetime):
def after_or_equal(d: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is after or equal to a given datetime.
:param d: The datetime to check against.
Expand All @@ -37,7 +39,7 @@ def after_or_equal(d: __datetime):
return lambda y: y >= d


def between_or_equal(d: __datetime, y: __datetime):
def between_or_equal(d: Union[__datetime, __date], y: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is between or equal to two given datetimes.
:param d: The datetime to check against.
Expand All @@ -47,7 +49,7 @@ def between_or_equal(d: __datetime, y: __datetime):
return lambda z: d <= z <= y


def not_between_or_equal(d: __datetime, y: __datetime):
def not_between_or_equal(d: Union[__datetime, __date], y: Union[__datetime, __date]):
"""
Returns a condition that checks if a datetime is not between or equal to two given datetimes.
:param d: The datetime to check against.
Expand All @@ -62,7 +64,8 @@ def today():
The condition that checks if a datetime is today.
:return: A condition that checks if a datetime is today.
"""
return lambda d: __datetime.now().date() == d.date()
return lambda d: __datetime.now().date() == d.date() if isinstance(d, __datetime) else \
__datetime.now().date() == d


def today_utc():
Expand All @@ -71,15 +74,17 @@ def today_utc():
in your Stream).
:return: A condition that checks if a datetime is today.
"""
return lambda d: __datetime.now(__timezone.utc).date() == d.astimezone(__timezone.utc).date()
return lambda d: __datetime.now(__timezone.utc).date() == d.astimezone(__timezone.utc).date() \
if isinstance(d, __datetime) else __datetime.now(__timezone.utc).date() == d


def yesterday():
"""
The condition that checks if a datetime is yesterday.
:return: A condition that checks if a datetime is yesterday.
"""
return lambda d: __datetime.now().date() - __timedelta(days=1) == d.date()
return lambda d: __datetime.now().date() - __timedelta(days=1) == d.date() if \
isinstance(d, __datetime) else __datetime.now().date() - __timedelta(days=1) == d


def yesterday_utc():
Expand All @@ -89,15 +94,17 @@ def yesterday_utc():
:return: A condition that checks if a datetime is yesterday.
"""
return lambda d: __datetime.now(__timezone.utc).date() - __timedelta(days=1) == d.astimezone(
__timezone.utc).date()
__timezone.utc).date() if isinstance(d, __datetime) \
else __datetime.now(__timezone.utc).date() - __timedelta(days=1) == d


def tomorrow():
"""
A condition that checks if a datetime is tomorrow.
:return: A condition that checks if a datetime is tomorrow.
"""
return lambda d: __datetime.now().date() + __timedelta(days=1) == d.date()
return lambda d: __datetime.now().date() + __timedelta(days=1) == d.date() if \
isinstance(d, __datetime) else __datetime.now().date() + __timedelta(days=1) == d


def tomorrow_utc():
Expand All @@ -107,15 +114,18 @@ def tomorrow_utc():
:return: A condition that checks if a datetime is tomorrow.
"""
return lambda d: __datetime.now(__timezone.utc).date() + __timedelta(days=1) == d.astimezone(
__timezone.utc).date()
__timezone.utc).date() if isinstance(d, __datetime) \
else __datetime.now(__timezone.utc).date() + __timedelta(days=1) == d


def this_week():
"""
A condition that checks if a datetime is this week.
:return: A condition that checks if a datetime is this week.
"""
return lambda d: __datetime.now().date().isocalendar()[1] == d.date().isocalendar()[1]
return lambda d: __datetime.now().date().isocalendar()[1] == d.date().isocalendar()[1] \
if isinstance(d, __datetime) \
else __datetime.now().date().isocalendar()[1] == d.isocalendar()[1]


def this_week_utc():
Expand All @@ -125,15 +135,18 @@ def this_week_utc():
:return: A condition that checks if a datetime is this week.
"""
return lambda d: __datetime.now(__timezone.utc).date().isocalendar()[1] == \
d.astimezone(__timezone.utc).date().isocalendar()[1]
d.astimezone(__timezone.utc).date().isocalendar()[1] if isinstance(d, __datetime) else \
__datetime.now(__timezone.utc).date().isocalendar()[1] == d.isocalendar()[1]


def last_week():
"""
A condition that checks if a datetime is last week.
:return: A condition that checks if a datetime is last week.
"""
return lambda d: __datetime.now().date().isocalendar()[1] - 1 == d.date().isocalendar()[1]
return lambda d: __datetime.now().date().isocalendar()[1] - 1 == d.date().isocalendar()[1] if \
isinstance(d, __datetime) \
else __datetime.now().date().isocalendar()[1] - 1 == d.isocalendar()[1]


def last_week_utc():
Expand All @@ -143,15 +156,18 @@ def last_week_utc():
:return: A condition that checks if a datetime is last week.
"""
return lambda d: __datetime.now(__timezone.utc).date().isocalendar()[1] - 1 == \
d.astimezone(__timezone.utc).date().isocalendar()[1]
d.astimezone(__timezone.utc).date().isocalendar()[1] if isinstance(d, __datetime) else \
__datetime.now(__timezone.utc).date().isocalendar()[1] - 1 == d.isocalendar()[1]


def next_week():
"""
A condition that checks if a datetime is next week.
:return: A condition that checks if a datetime is next week.
"""
return lambda d: __datetime.now().date().isocalendar()[1] + 1 == d.date().isocalendar()[1]
return lambda d: __datetime.now().date().isocalendar()[1] + 1 == d.date().isocalendar()[1] if \
isinstance(d, __datetime) \
else __datetime.now().date().isocalendar()[1] + 1 == d.isocalendar()[1]


def next_week_utc():
Expand All @@ -161,7 +177,8 @@ def next_week_utc():
:return: A condition that checks if a datetime is next week.
"""
return lambda d: __datetime.now(__timezone.utc).date().isocalendar()[1] + 1 == \
d.astimezone(__timezone.utc).date().isocalendar()[1]
d.astimezone(__timezone.utc).date().isocalendar()[1] if isinstance(d, __datetime) else \
__datetime.now(__timezone.utc).date().isocalendar()[1] + 1 == d.isocalendar()[1]


def this_month():
Expand Down Expand Up @@ -223,7 +240,8 @@ def __check_is_month(d: __datetime, offset: int = 0, tz: __timezone = None):
:param offset: The offset to check against.
:param tz: The timezone to check against.
"""
return __datetime.now(tz).date().month + offset == d.astimezone(tz).date().month
return __datetime.now(tz).date().month + offset == d.astimezone(tz).date().month if \
isinstance(d, __datetime) else __datetime.now(tz).date().month + offset == d.month


def this_year():
Expand Down Expand Up @@ -283,4 +301,5 @@ def __check_is_year(d: __datetime, offset: int = 0, tz: __timezone = None):
:param d: The datetime to check against.
:param offset: The offset to check against.
"""
return __datetime.now(tz).date().year + offset == d.astimezone(tz).date().year
return __datetime.now(tz).date().year + offset == d.astimezone(tz).date().year if \
isinstance(d, __datetime) else __datetime.now(tz).date().year + offset == d.year
27 changes: 27 additions & 0 deletions tests/date_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# pylint: disable=too-many-instance-attributes

from datetime import datetime, timedelta, timezone
from unittest import TestCase


class DateTest(TestCase):

def setUp(self):
self.now = datetime.now()
self.yesterday = self.now - timedelta(days=1)
self.tomorrow = self.now + timedelta(days=1)
self.last_week = self.now - timedelta(weeks=1)
self.next_week = self.now + timedelta(weeks=1)
self.last_month = (self.now.replace(day=1) - timedelta(days=1))
self.next_month = (self.now.replace(day=25) + timedelta(days=15))
self.last_year = self.now.replace(year=self.now.year - 1)
self.next_year = self.now.replace(year=self.now.year + 1)
self.now_utc = datetime.now(timezone.utc)
self.yesterday_utc = self.now_utc - timedelta(days=1)
self.tomorrow_utc = self.now_utc + timedelta(days=1)
self.last_week_utc = self.now_utc - timedelta(weeks=1)
self.next_week_utc = self.now_utc + timedelta(weeks=1)
self.last_month_utc = (self.now_utc.replace(day=1) - timedelta(days=1))
self.next_month_utc = (self.now_utc.replace(day=25) + timedelta(days=15))
self.last_year_utc = self.now_utc.replace(year=self.now_utc.year - 1)
self.next_year_utc = self.now_utc.replace(year=self.now_utc.year + 1)
28 changes: 3 additions & 25 deletions tests/test_date_conditions.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,11 @@
# pylint: disable=wildcard-import,too-many-instance-attributes

from datetime import datetime, timedelta, timezone
from unittest import TestCase
# pylint: disable=wildcard-import,too-many-instance-attributes,unused-wildcard-import

from date_test import DateTest
from pystreamapi.conditions import equal_to, not_equal_to, between, not_between
from pystreamapi.conditions.date import *


class TestDateConditions(TestCase):

def setUp(self):
self.now = datetime.now()
self.yesterday = self.now - timedelta(days=1)
self.tomorrow = self.now + timedelta(days=1)
self.last_week = self.now - timedelta(weeks=1)
self.next_week = self.now + timedelta(weeks=1)
self.last_month = (self.now.replace(day=1) - timedelta(days=1))
self.next_month = (self.now.replace(day=25) + timedelta(days=15))
self.last_year = self.now.replace(year=self.now.year - 1)
self.next_year = self.now.replace(year=self.now.year + 1)
self.now_utc = datetime.now(timezone.utc)
self.yesterday_utc = self.now_utc - timedelta(days=1)
self.tomorrow_utc = self.now_utc + timedelta(days=1)
self.last_week_utc = self.now_utc - timedelta(weeks=1)
self.next_week_utc = self.now_utc + timedelta(weeks=1)
self.last_month_utc = (self.now_utc.replace(day=1) - timedelta(days=1))
self.next_month_utc = (self.now_utc.replace(day=25) + timedelta(days=15))
self.last_year_utc = self.now_utc.replace(year=self.now_utc.year - 1)
self.next_year_utc = self.now_utc.replace(year=self.now_utc.year + 1)
class TestDateConditions(DateTest):

def test_before(self):
self.assertTrue(before(self.tomorrow)(self.now))
Expand Down
Loading

0 comments on commit 5c24162

Please sign in to comment.