Skip to content

Commit 33645ec

Browse files
authored
feat: add date comparison to local evaluation (#74)
1 parent 81debce commit 33645ec

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.1.1 - 2022-09-14
2+
3+
Changes:
4+
5+
1. Feature flags local evaluation now supports date property filters as well.
16
## 2.1.0 - 2022-08-11
27

38
Changes:

posthog/feature_flags.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import datetime
12
import hashlib
23
import re
34

5+
from dateutil import parser
6+
47
from posthog.utils import is_valid_regex
58

69
__LONG_SCALE__ = float(0xFFFFFFFFFFFFFFF)
@@ -126,4 +129,27 @@ def match_property(property, property_values) -> bool:
126129
if operator == "lte":
127130
return type(override_value) == type(value) and override_value <= value
128131

132+
if operator in ["is_date_before", "is_date_after"]:
133+
try:
134+
parsed_date = parser.parse(value)
135+
except Exception:
136+
raise InconclusiveMatchError("The date set on the flag is not a valid format")
137+
138+
if isinstance(override_value, datetime.date):
139+
if operator == "is_date_before":
140+
return override_value < parsed_date
141+
else:
142+
return override_value > parsed_date
143+
elif isinstance(override_value, str):
144+
try:
145+
override_date = parser.parse(override_value)
146+
if operator == "is_date_before":
147+
return override_date < parsed_date
148+
else:
149+
return override_date > parsed_date
150+
except Exception:
151+
raise InconclusiveMatchError("The date provided is not a valid format")
152+
else:
153+
raise InconclusiveMatchError("The date provided must be a string or date object")
154+
129155
return False

posthog/test/test_feature_flags.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import unittest
2+
from datetime import datetime
23

34
import mock
5+
from dateutil import parser
46
from freezegun import freeze_time
57

68
from posthog.client import Client
@@ -1118,6 +1120,39 @@ def test_match_properties_math_operators(self):
11181120
self.assertFalse(match_property(property_d, {"key": "44"}))
11191121
self.assertFalse(match_property(property_d, {"key": 44}))
11201122

1123+
def test_match_property_date_operators(self):
1124+
property_a = self.property(key="key", value="2022-05-01", operator="is_date_before")
1125+
self.assertTrue(match_property(property_a, {"key": "2022-03-01"}))
1126+
self.assertTrue(match_property(property_a, {"key": "2022-04-30"}))
1127+
self.assertTrue(match_property(property_a, {"key": datetime(2022, 4, 30)}))
1128+
self.assertTrue(match_property(property_a, {"key": parser.parse("2022-04-30")}))
1129+
self.assertFalse(match_property(property_a, {"key": "2022-05-30"}))
1130+
1131+
# Can't be a number
1132+
with self.assertRaises(InconclusiveMatchError):
1133+
match_property(property_a, {"key": 1})
1134+
1135+
# can't be invalid string
1136+
with self.assertRaises(InconclusiveMatchError):
1137+
match_property(property_a, {"key": "abcdef"})
1138+
1139+
property_b = self.property(key="key", value="2022-05-01", operator="is_date_after")
1140+
self.assertTrue(match_property(property_b, {"key": "2022-05-02"}))
1141+
self.assertTrue(match_property(property_b, {"key": "2022-05-30"}))
1142+
self.assertTrue(match_property(property_b, {"key": datetime(2022, 5, 30)}))
1143+
self.assertTrue(match_property(property_b, {"key": parser.parse("2022-05-30")}))
1144+
self.assertFalse(match_property(property_b, {"key": "2022-04-30"}))
1145+
1146+
# can't be invalid string
1147+
with self.assertRaises(InconclusiveMatchError):
1148+
match_property(property_b, {"key": "abcdef"})
1149+
1150+
# Invalid flag property
1151+
property_c = self.property(key="key", value=1234, operator="is_date_before")
1152+
1153+
with self.assertRaises(InconclusiveMatchError):
1154+
match_property(property_c, {"key": 1})
1155+
11211156

11221157
class TestCaptureCalls(unittest.TestCase):
11231158
@mock.patch.object(Client, "capture")

posthog/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION = "2.1.0"
1+
VERSION = "2.1.1"
22

33
if __name__ == "__main__":
44
print(VERSION, end="")

0 commit comments

Comments
 (0)