Skip to content

Commit e06d267

Browse files
authored
fix(flags): Update relative date op names (#37)
1 parent 866919b commit e06d267

File tree

4 files changed

+35
-35
lines changed

4 files changed

+35
-35
lines changed

lib/posthog/client.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def add_local_person_and_group_properties(distinct_id, groups, person_properties
307307
symbolize_keys! value
308308
end
309309

310-
all_person_properties = { "$current_distinct_id" => distinct_id }.merge(person_properties)
310+
all_person_properties = { "distinct_id" => distinct_id }.merge(person_properties)
311311

312312
all_group_properties = {}
313313
if groups

lib/posthog/feature_flags.rb

+9-9
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def self.compare(lhs, rhs, operator)
220220
end
221221

222222
def self.relative_date_parse_for_feature_flag_matching(value)
223-
match = /^([0-9]+)([a-z])$/.match(value)
223+
match = /^-?([0-9]+)([a-z])$/.match(value)
224224
parsed_dt = DateTime.now.new_offset(0)
225225
if match
226226
number = match[1].to_i
@@ -310,20 +310,20 @@ def self.match_property(property, property_values)
310310
else
311311
self.compare(override_value.to_s, value.to_s, operator)
312312
end
313-
when 'is_date_before', 'is_date_after', 'is_relative_date_before', 'is_relative_date_after'
314-
if operator == 'is_relative_date_before' || operator == 'is_relative_date_after'
315-
parsed_date = self.relative_date_parse_for_feature_flag_matching(value.to_s)
316-
override_date = PostHog::Utils.convert_to_datetime(override_value.to_s)
317-
else
313+
when 'is_date_before', 'is_date_after'
314+
override_date = PostHog::Utils.convert_to_datetime(override_value.to_s)
315+
parsed_date = self.relative_date_parse_for_feature_flag_matching(value.to_s)
316+
317+
if parsed_date.nil?
318318
parsed_date = PostHog::Utils.convert_to_datetime(value.to_s)
319-
override_date = PostHog::Utils.convert_to_datetime(override_value.to_s)
320319
end
320+
321321
if !parsed_date
322322
raise InconclusiveMatchError.new("Invalid date format")
323323
end
324-
if operator == 'is_date_before' or operator == 'is_relative_date_before'
324+
if operator == 'is_date_before'
325325
return override_date < parsed_date
326-
elsif operator == 'is_date_after' or operator == 'is_relative_date_after'
326+
elsif operator == 'is_date_after'
327327
return override_date > parsed_date
328328
end
329329
else

spec/posthog/client_spec.rb

+7-7
Original file line numberDiff line numberDiff line change
@@ -567,42 +567,42 @@ def run
567567
body: {"distinct_id": "some_id", "groups": {"company": "id:5", "instance": "app.posthog.com"}, "group_properties": {
568568
"company": {"$group_key": "id:5", "x": "y"},
569569
"instance": {"$group_key": "app.posthog.com"}
570-
}, "person_properties": {"$current_distinct_id": "some_id", "x1": "y1"}, "token": "testsecret"})
570+
}, "person_properties": {"distinct_id": "some_id", "x1": "y1"}, "token": "testsecret"})
571571

572572
WebMock.reset_executed_requests!
573573

574-
client.get_feature_flag('random_key', 'some_id', groups: {"company" => "id:5", "instance" => "app.posthog.com"}, person_properties: {"$current_distinct_id" => "override" }, group_properties: {"company" => {"$group_key" => "group_override"}})
574+
client.get_feature_flag('random_key', 'some_id', groups: {"company" => "id:5", "instance" => "app.posthog.com"}, person_properties: {"distinct_id" => "override" }, group_properties: {"company" => {"$group_key" => "group_override"}})
575575
assert_requested :post, decide_endpoint, times: 1
576576
expect(WebMock).to have_requested(:post, decide_endpoint).with(
577577
body: {"distinct_id": "some_id", "groups": {"company": "id:5", "instance": "app.posthog.com"}, "group_properties": {
578578
"company": {"$group_key": "group_override"},
579579
"instance": {"$group_key": "app.posthog.com"}
580-
}, "person_properties": {"$current_distinct_id": "override"}, "token": "testsecret"})
580+
}, "person_properties": {"distinct_id": "override"}, "token": "testsecret"})
581581
WebMock.reset_executed_requests!
582582

583583
# test nones
584584
client.get_all_flags_and_payloads('some_id', groups: {}, person_properties: nil, group_properties: nil)
585585
assert_requested :post, decide_endpoint, times: 1
586586
expect(WebMock).to have_requested(:post, decide_endpoint).with(
587-
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"$current_distinct_id": "some_id"}, "token": "testsecret"})
587+
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"distinct_id": "some_id"}, "token": "testsecret"})
588588
WebMock.reset_executed_requests!
589589

590590
client.get_all_flags('some_id', groups: {"company" => "id:5"}, person_properties: nil, group_properties: nil)
591591
assert_requested :post, decide_endpoint, times: 1
592592
expect(WebMock).to have_requested(:post, decide_endpoint).with(
593-
body: {"distinct_id": "some_id", "groups": {"company": "id:5"}, "group_properties": {"company": {"$group_key": "id:5"}}, "person_properties": {"$current_distinct_id": "some_id"}, "token": "testsecret"})
593+
body: {"distinct_id": "some_id", "groups": {"company": "id:5"}, "group_properties": {"company": {"$group_key": "id:5"}}, "person_properties": {"distinct_id": "some_id"}, "token": "testsecret"})
594594
WebMock.reset_executed_requests!
595595

596596
client.get_feature_flag_payload('random_key', 'some_id', groups: {}, person_properties: nil, group_properties: nil)
597597
assert_requested :post, decide_endpoint, times: 1
598598
expect(WebMock).to have_requested(:post, decide_endpoint).with(
599-
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"$current_distinct_id": "some_id"}, "token": "testsecret"})
599+
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"distinct_id": "some_id"}, "token": "testsecret"})
600600
WebMock.reset_executed_requests!
601601

602602
client.is_feature_enabled('random_key', 'some_id', groups: {}, person_properties: nil, group_properties: nil)
603603
assert_requested :post, decide_endpoint, times: 1
604604
expect(WebMock).to have_requested(:post, decide_endpoint).with(
605-
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"$current_distinct_id": "some_id"}, "token": "testsecret"})
605+
body: {"distinct_id": "some_id", "groups": {}, "group_properties": {}, "person_properties": {"distinct_id": "some_id"}, "token": "testsecret"})
606606
WebMock.reset_executed_requests!
607607
end
608608

spec/posthog/feature_flag_spec.rb

+18-18
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class PostHog
234234
expect(c.get_feature_flag("complex-flag", "some-distinct-id_outside_rollout?", person_properties: {"region" => "USA", "email" => "[email protected]"})).to eq("decide-fallback-value")
235235
assert_requested :post, decide_endpoint, times: 1
236236
expect(WebMock).to have_requested(:post, decide_endpoint).with(
237-
body: {"distinct_id": "some-distinct-id_outside_rollout?", "groups": {}, "group_properties": {}, "person_properties": {"$current_distinct_id": "some-distinct-id_outside_rollout?", "region" => "USA", "email" => "[email protected]"}, "token": "testsecret"})
237+
body: {"distinct_id": "some-distinct-id_outside_rollout?", "groups": {}, "group_properties": {}, "person_properties": {"distinct_id": "some-distinct-id_outside_rollout?", "region" => "USA", "email" => "[email protected]"}, "token": "testsecret"})
238238

239239
WebMock.reset_executed_requests!
240240

@@ -243,7 +243,7 @@ class PostHog
243243
assert_requested :post, decide_endpoint, times: 1
244244

245245
expect(WebMock).to have_requested(:post, decide_endpoint).with(
246-
body: {"distinct_id": "some-distinct-id", "groups": {}, "group_properties": {}, "person_properties": {"$current_distinct_id": "some-distinct-id", "doesnt_matter" => "1"}, "token": "testsecret"})
246+
body: {"distinct_id": "some-distinct-id", "groups": {}, "group_properties": {}, "person_properties": {"distinct_id": "some-distinct-id", "doesnt_matter" => "1"}, "token": "testsecret"})
247247

248248
WebMock.reset_executed_requests!
249249

@@ -1235,9 +1235,9 @@ class PostHog
12351235

12361236
end
12371237

1238-
it 'with relative date operators - is_relative_date_before' do
1238+
it 'with relative date operators - is_date_before' do
12391239
Timecop.freeze(Time.gm(2022, 5, 1)) do
1240-
property_a = { 'key' => 'key', 'value' => '6h', 'operator' => 'is_relative_date_before'}
1240+
property_a = { 'key' => 'key', 'value' => '-6h', 'operator' => 'is_date_before'}
12411241
expect(FeatureFlagsPoller.match_property(property_a, { 'key' => '2022-03-01' })).to be true
12421242
expect(FeatureFlagsPoller.match_property(property_a, { 'key' => '2022-04-30' })).to be true
12431243
expect(FeatureFlagsPoller.match_property(property_a, { 'key' => DateTime.new(2022, 4, 30, 1, 2, 3) })).to be true
@@ -1259,9 +1259,9 @@ class PostHog
12591259
end
12601260
end
12611261

1262-
it 'with relative date operators - is_relative_date_after' do
1262+
it 'with relative date operators - is_date_after' do
12631263
Timecop.freeze(Time.gm(2022, 5, 1)) do
1264-
property_b = { 'key' => 'key', 'value' => '1h', 'operator' => 'is_relative_date_after'}
1264+
property_b = { 'key' => 'key', 'value' => '1h', 'operator' => 'is_date_after'}
12651265
expect(FeatureFlagsPoller.match_property(property_b, { 'key' => '2022-05-02' })).to be true
12661266
expect(FeatureFlagsPoller.match_property(property_b, { 'key' => '2022-05-30' })).to be true
12671267
expect(FeatureFlagsPoller.match_property(property_b, { 'key' => DateTime.new(2022, 5, 30) })).to be true
@@ -1271,15 +1271,15 @@ class PostHog
12711271
# can't be invalid string
12721272
expect{ FeatureFlagsPoller.match_property(property_b, { 'key' => 'abcdef'}) }.to raise_error(InconclusiveMatchError)
12731273
# invalid flag property
1274-
property_c = { 'key' => 'key', 'value' => 1234, 'operator' => 'is_relative_date_after'}
1274+
property_c = { 'key' => 'key', 'value' => 1234, 'operator' => 'is_date_after'}
12751275
expect{ FeatureFlagsPoller.match_property(property_c, { 'key' => 1}) }.to raise_error(InconclusiveMatchError)
12761276
expect{ FeatureFlagsPoller.match_property(property_c, { 'key' => '2022-05-30'}) }.to raise_error(InconclusiveMatchError)
12771277
end
12781278
end
12791279

12801280
it 'with relative date operators - all possible relative dates' do
12811281
Timecop.freeze(Time.gm(2022, 5, 1)) do
1282-
property_d = { 'key' => 'key', 'value' => '12d', 'operator' => 'is_relative_date_before'}
1282+
property_d = { 'key' => 'key', 'value' => '-12d', 'operator' => 'is_date_before'}
12831283
expect(FeatureFlagsPoller.match_property(property_d, { 'key' => '2022-05-30' })).to be false
12841284

12851285
expect(FeatureFlagsPoller.match_property(property_d, { 'key' => '2022-03-30' })).to be true
@@ -1288,45 +1288,45 @@ class PostHog
12881288
expect(FeatureFlagsPoller.match_property(property_d, { 'key' => '2022-04-19 02:00:01+02:00' })).to be false
12891289

12901290
# Try all possible relative dates
1291-
property_e = { 'key' => 'key', 'value' => '1h', 'operator' => 'is_relative_date_before'}
1291+
property_e = { 'key' => 'key', 'value' => '1h', 'operator' => 'is_date_before'}
12921292
expect(FeatureFlagsPoller.match_property(property_e, { 'key' => '2022-05-01 00:00:00' })).to be false
12931293
expect(FeatureFlagsPoller.match_property(property_e, { 'key' => '2022-04-30 22:00:00' })).to be true
12941294

1295-
property_f = { 'key' => 'key', 'value' => '1d', 'operator' => 'is_relative_date_before'}
1295+
property_f = { 'key' => 'key', 'value' => '1d', 'operator' => 'is_date_before'}
12961296
expect(FeatureFlagsPoller.match_property(property_f, { 'key' => '2022-04-29 23:59:00' })).to be true
12971297
expect(FeatureFlagsPoller.match_property(property_f, { 'key' => '2022-04-30 00:00:01' })).to be false
12981298

1299-
property_g = { 'key' => 'key', 'value' => '1w', 'operator' => 'is_relative_date_before'}
1299+
property_g = { 'key' => 'key', 'value' => '1w', 'operator' => 'is_date_before'}
13001300
expect(FeatureFlagsPoller.match_property(property_g, { 'key' => '2022-04-23 00:00:00' })).to be true
13011301
expect(FeatureFlagsPoller.match_property(property_g, { 'key' => '2022-04-24 00:00:00' })).to be false
13021302
expect(FeatureFlagsPoller.match_property(property_g, { 'key' => '2022-04-24 00:00:01' })).to be false
13031303

1304-
property_h = { 'key' => 'key', 'value' => '1m', 'operator' => 'is_relative_date_before'}
1304+
property_h = { 'key' => 'key', 'value' => '1m', 'operator' => 'is_date_before'}
13051305
expect(FeatureFlagsPoller.match_property(property_h, { 'key' => '2022-03-01 00:00:00' })).to be true
13061306
expect(FeatureFlagsPoller.match_property(property_h, { 'key' => '2022-04-05 00:00:00' })).to be false
13071307

1308-
property_i = { 'key' => 'key', 'value' => '1y', 'operator' => 'is_relative_date_before'}
1308+
property_i = { 'key' => 'key', 'value' => '1y', 'operator' => 'is_date_before'}
13091309
expect(FeatureFlagsPoller.match_property(property_i, { 'key' => '2021-04-28 00:00:00' })).to be true
13101310
expect(FeatureFlagsPoller.match_property(property_i, { 'key' => '2021-05-01 00:00:01' })).to be false
13111311

1312-
property_j = { 'key' => 'key', 'value' => '122h', 'operator' => 'is_relative_date_after'}
1312+
property_j = { 'key' => 'key', 'value' => '122h', 'operator' => 'is_date_after'}
13131313
expect(FeatureFlagsPoller.match_property(property_j, { 'key' => '2022-05-01 00:00:00' })).to be true
13141314
expect(FeatureFlagsPoller.match_property(property_j, { 'key' => '2022-04-23 01:00:00' })).to be false
13151315

1316-
property_k = { 'key' => 'key', 'value' => '2d', 'operator' => 'is_relative_date_after'}
1316+
property_k = { 'key' => 'key', 'value' => '-2d', 'operator' => 'is_date_after'}
13171317
expect(FeatureFlagsPoller.match_property(property_k, { 'key' => '2022-05-01 00:00:00' })).to be true
13181318
expect(FeatureFlagsPoller.match_property(property_k, { 'key' => '2022-04-29 00:00:01' })).to be true
13191319
expect(FeatureFlagsPoller.match_property(property_k, { 'key' => '2022-04-29 00:00:00' })).to be false
13201320

1321-
property_l = { 'key' => 'key', 'value' => '02w', 'operator' => 'is_relative_date_after'}
1321+
property_l = { 'key' => 'key', 'value' => '02w', 'operator' => 'is_date_after'}
13221322
expect(FeatureFlagsPoller.match_property(property_l, { 'key' => '2022-05-01 00:00:00' })).to be true
13231323
expect(FeatureFlagsPoller.match_property(property_l, { 'key' => '2022-04-16 00:00:00' })).to be false
13241324

1325-
property_m = { 'key' => 'key', 'value' => '1m', 'operator' => 'is_relative_date_after'}
1325+
property_m = { 'key' => 'key', 'value' => '1m', 'operator' => 'is_date_after'}
13261326
expect(FeatureFlagsPoller.match_property(property_m, { 'key' => '2022-04-01 00:00:01' })).to be true
13271327
expect(FeatureFlagsPoller.match_property(property_m, { 'key' => '2022-04-01 00:00:00' })).to be false
13281328

1329-
property_n = { 'key' => 'key', 'value' => '1y', 'operator' => 'is_relative_date_after'}
1329+
property_n = { 'key' => 'key', 'value' => '1y', 'operator' => 'is_date_after'}
13301330
expect(FeatureFlagsPoller.match_property(property_n, { 'key' => '2022-05-01 00:00:00' })).to be true
13311331
expect(FeatureFlagsPoller.match_property(property_n, { 'key' => '2021-05-01 00:00:01' })).to be true
13321332
expect(FeatureFlagsPoller.match_property(property_n, { 'key' => '2021-05-01 00:00:00' })).to be false

0 commit comments

Comments
 (0)