Skip to content

Commit 6b217e7

Browse files
authored
Merge pull request #584 from splitio/FME-4287-imp-prop-validator
Updated validation and model
2 parents 0e87c99 + 35475f5 commit 6b217e7

File tree

6 files changed

+265
-158
lines changed

6 files changed

+265
-158
lines changed

splitio/client/input_validator.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ def validate_factory_instantiation(sdk_key):
564564
return True
565565

566566

567-
def valid_properties(properties):
567+
def valid_properties(properties, source):
568568
"""
569569
Check if properties is a valid dict and returns the properties
570570
that will be sent to the track method, avoiding unexpected types.
@@ -580,7 +580,7 @@ def valid_properties(properties):
580580
return True, None, size
581581

582582
if not isinstance(properties, dict):
583-
_LOGGER.error('track: properties must be of type dictionary.')
583+
_LOGGER.error('%s: properties must be of type dictionary.', source)
584584
return False, None, 0
585585

586586
valid_properties = dict()
@@ -597,7 +597,7 @@ def valid_properties(properties):
597597

598598
if not isinstance(element, str) and not isinstance(element, Number) \
599599
and not isinstance(element, bool):
600-
_LOGGER.warning('Property %s is of invalid type. Setting value to None', element)
600+
_LOGGER.warning('%s: Property %s is of invalid type. Setting value to None', source, element)
601601
element = None
602602

603603
valid_properties[property] = element
@@ -607,14 +607,13 @@ def valid_properties(properties):
607607

608608
if size > MAX_PROPERTIES_LENGTH_BYTES:
609609
_LOGGER.error(
610-
'The maximum size allowed for the properties is 32768 bytes. ' +
611-
'Current one is ' + str(size) + ' bytes. Event not queued'
612-
)
610+
'%s: The maximum size allowed for the properties is 32768 bytes. ' +
611+
'Current one is ' + str(size) + ' bytes. Event not queued', source)
613612
return False, None, size
614613

615614
if len(valid_properties.keys()) > 300:
616-
_LOGGER.warning('Event has more than 300 properties. Some of them will be trimmed' +
617-
' when processed')
615+
_LOGGER.warning('%s: Event has more than 300 properties. Some of them will be trimmed' +
616+
' when processed', source)
618617
return True, valid_properties if len(valid_properties) else None, size
619618

620619
def validate_pluggable_adapter(config):

splitio/engine/impressions/strategies.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,14 @@ def process_impressions(self, impressions):
3838
:returns: Tuple of to be stored, observed and counted impressions, and unique keys tuple
3939
:rtype: list[tuple[splitio.models.impression.Impression, dict]], list[], list[], list[]
4040
"""
41-
imps = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions]
41+
imps = []
42+
for imp, attrs in impressions:
43+
if imp.properties is not None:
44+
imps.append((imp, attrs))
45+
continue
46+
47+
imps.append((self._observer.test_and_set(imp), attrs))
48+
4249
return [i for i, _ in imps], imps, [], []
4350

4451
class StrategyNoneMode(BaseStrategy):
@@ -85,7 +92,14 @@ def process_impressions(self, impressions):
8592
:returns: Tuple of to be stored, observed and counted impressions, and unique keys tuple
8693
:rtype: list[tuple[splitio.models.impression.Impression, dict]], list[splitio.models.impression.Impression], list[splitio.models.impression.Impression], list[]
8794
"""
88-
imps = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions]
95+
imps = []
96+
for imp, attrs in impressions:
97+
if imp.properties is not None:
98+
imps.append((imp, attrs))
99+
continue
100+
101+
imps.append((self._observer.test_and_set(imp), attrs))
102+
89103
counter_imps = [imp for imp, _ in imps if imp.previous_time != None]
90104
this_hour = truncate_time(utctime_ms())
91105
return [i for i, _ in imps if i.previous_time is None or i.previous_time < this_hour], imps, counter_imps, []

splitio/models/impressions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
'change_number',
1313
'bucketing_key',
1414
'time',
15-
'previous_time'
15+
'previous_time',
16+
'properties'
1617
]
1718
)
1819

tests/api/test_impressions_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
from splitio.storage.inmemmory import InMemoryTelemetryStorage, InMemoryTelemetryStorageAsync
1515

1616
impressions_mock = [
17-
Impression('k1', 'f1', 'on', 'l1', 123456, 'b1', 321654),
18-
Impression('k2', 'f2', 'off', 'l1', 123456, 'b1', 321654),
19-
Impression('k3', 'f1', 'on', 'l1', 123456, 'b1', 321654)
17+
Impression('k1', 'f1', 'on', 'l1', 123456, 'b1', 321654, {}),
18+
Impression('k2', 'f2', 'off', 'l1', 123456, 'b1', 321654, {}),
19+
Impression('k3', 'f1', 'on', 'l1', 123456, 'b1', 321654, {})
2020
]
2121
expectedImpressions = [{
2222
'f': 'f1',

tests/client/test_input_validator.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -499,17 +499,17 @@ def _configs(treatment):
499499

500500
def test_valid_properties(self, mocker):
501501
"""Test valid_properties() method."""
502-
assert input_validator.valid_properties(None) == (True, None, 1024)
503-
assert input_validator.valid_properties([]) == (False, None, 0)
504-
assert input_validator.valid_properties(True) == (False, None, 0)
505-
assert input_validator.valid_properties(dict()) == (True, None, 1024)
506-
assert input_validator.valid_properties({2: 123}) == (True, None, 1024)
502+
assert input_validator.valid_properties(None, '') == (True, None, 1024)
503+
assert input_validator.valid_properties([], '') == (False, None, 0)
504+
assert input_validator.valid_properties(True, '') == (False, None, 0)
505+
assert input_validator.valid_properties(dict(), '') == (True, None, 1024)
506+
assert input_validator.valid_properties({2: 123}, '') == (True, None, 1024)
507507

508508
class Test:
509509
pass
510510
assert input_validator.valid_properties({
511511
"test": Test()
512-
}) == (True, {"test": None}, 1028)
512+
}, '') == (True, {"test": None}, 1028)
513513

514514
props1 = {
515515
"test1": "test",
@@ -519,7 +519,7 @@ class Test:
519519
"test5": [],
520520
2: "t",
521521
}
522-
r1, r2, r3 = input_validator.valid_properties(props1)
522+
r1, r2, r3 = input_validator.valid_properties(props1, '')
523523
assert r1 is True
524524
assert len(r2.keys()) == 5
525525
assert r2["test1"] == "test"
@@ -532,12 +532,12 @@ class Test:
532532
props2 = dict()
533533
for i in range(301):
534534
props2[str(i)] = i
535-
assert input_validator.valid_properties(props2) == (True, props2, 1817)
535+
assert input_validator.valid_properties(props2, '') == (True, props2, 1817)
536536

537537
props3 = dict()
538538
for i in range(100, 210):
539539
props3["prop" + str(i)] = "a" * 300
540-
r1, r2, r3 = input_validator.valid_properties(props3)
540+
r1, r2, r3 = input_validator.valid_properties(props3, '')
541541
assert r1 is False
542542
assert r3 == 32952
543543

0 commit comments

Comments
 (0)