From 8ee9d38c6f244fe795c884e7eaf26c1a0b62d635 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 17 Nov 2019 11:29:27 -0600 Subject: [PATCH 1/2] Add timestamp to track --- splitio/client/client.py | 12 +++++++++--- splitio/client/input_validator.py | 16 ++++++++++++++++ tests/client/test_input_validator.py | 15 +++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/splitio/client/client.py b/splitio/client/client.py index 894503fb..1d9e076d 100644 --- a/splitio/client/client.py +++ b/splitio/client/client.py @@ -366,7 +366,7 @@ def _record_stats(self, impressions, start, operation): self._logger.error('Error recording impressions and metrics') self._logger.debug('Error: ', exc_info=True) - def track(self, key, traffic_type, event_type, value=None, properties=None): + def track(self, key, traffic_type, event_type, value=None, properties=None, timestamp=None): """ Track an event. @@ -380,6 +380,8 @@ def track(self, key, traffic_type, event_type, value=None, properties=None): :type value: Number :param properties: (Optional) properties associated to the event :type properties: dict + :param timestamp: (Optional) Represents the time in milliseconds since epoch that the event occurred + :type properties: int :return: Whether the event was created or not. :rtype: bool @@ -399,17 +401,21 @@ def track(self, key, traffic_type, event_type, value=None, properties=None): value = input_validator.validate_value(value) valid, properties, size = input_validator.valid_properties(properties) + timestamp = input_validator.validate_timestamp(timestamp) if key is None or event_type is None or traffic_type is None or value is False \ - or valid is False: + or valid is False or timestamp is False: return False + if timestamp is None: + timestamp=int(time.time()*1000) + event = Event( key=key, traffic_type_name=traffic_type, event_type_id=event_type, value=value, - timestamp=int(time.time()*1000), + timestamp=timestamp, properties=properties, ) return self._events_storage.put([EventWrapper( diff --git a/splitio/client/input_validator.py b/splitio/client/input_validator.py index 214a7f95..88082969 100644 --- a/splitio/client/input_validator.py +++ b/splitio/client/input_validator.py @@ -545,3 +545,19 @@ def valid_properties(properties): _LOGGER.warning('Event has more than 300 properties. Some of them will be trimmed' + ' when processed') return True, valid_properties if len(valid_properties) else None, size + +def validate_timestamp(timestamp): + """ + Check if timestamp is valid for track. + + :param timestamp: timestamp to be checked + :type timestamp: int + :return: timestamp + :rtype: int|None + """ + if timestamp is None: + return None + if not isinstance(timestamp, int): + _LOGGER.error('track: timestamp must be an integer.') + return False + return timestamp diff --git a/tests/client/test_input_validator.py b/tests/client/test_input_validator.py index e02961d7..42dac040 100644 --- a/tests/client/test_input_validator.py +++ b/tests/client/test_input_validator.py @@ -765,6 +765,21 @@ def test_track(self, mocker): mocker.call("The maximum size allowed for the properties is 32768 bytes. Current one is 32952 bytes. Event not queued") ] + client._logger.reset_mock() + assert client.track("some_key", "traffic_type", "event_type", 1, None, None) is True + assert client._logger.error.mock_calls == [] + + client._logger.reset_mock() + assert client.track("some_key", "traffic_type", "event_type", 1, None, 1573936400000) is True + assert client._logger.error.mock_calls == [] + + # Test track with invalid timestamp + client._logger.reset_mock() + assert client.track("some_key", "traffic_type", "event_type", 1, None, "invalid_timestamp") is False + assert client._logger.error.mock_calls == [ + mocker.call("track: timestamp must be an integer.") + ] + def test_get_treatments(self, mocker): """Test getTreatments() method.""" split_mock = mocker.Mock(spec=Split) From 44a658484d0998e26610e9767a5004d9e7eff3b7 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sun, 17 Nov 2019 12:08:55 -0600 Subject: [PATCH 2/2] fix pylint issues --- splitio/client/client.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/splitio/client/client.py b/splitio/client/client.py index 1d9e076d..27b8e5c5 100644 --- a/splitio/client/client.py +++ b/splitio/client/client.py @@ -366,7 +366,7 @@ def _record_stats(self, impressions, start, operation): self._logger.error('Error recording impressions and metrics') self._logger.debug('Error: ', exc_info=True) - def track(self, key, traffic_type, event_type, value=None, properties=None, timestamp=None): + def track(self, key, traffic_type, event_type, value=None, properties=None, timestamp=None): # pylint: disable=too-many-arguments """ Track an event. @@ -380,7 +380,8 @@ def track(self, key, traffic_type, event_type, value=None, properties=None, time :type value: Number :param properties: (Optional) properties associated to the event :type properties: dict - :param timestamp: (Optional) Represents the time in milliseconds since epoch that the event occurred + :param timestamp: (Optional) Represents the time in milliseconds since epoch that the event + occurred :type properties: int :return: Whether the event was created or not. @@ -403,12 +404,13 @@ def track(self, key, traffic_type, event_type, value=None, properties=None, time valid, properties, size = input_validator.valid_properties(properties) timestamp = input_validator.validate_timestamp(timestamp) + # pylint: disable=too-many-boolean-expressions if key is None or event_type is None or traffic_type is None or value is False \ or valid is False or timestamp is False: return False if timestamp is None: - timestamp=int(time.time()*1000) + timestamp = int(time.time()*1000) event = Event( key=key,