Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/add conditions for type date #33

Merged
merged 6 commits into from
Jun 19, 2023
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
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
Loading