diff --git a/snowplow_tracker/__init__.py b/snowplow_tracker/__init__.py index 8a2062dd..fdf9d611 100644 --- a/snowplow_tracker/__init__.py +++ b/snowplow_tracker/__init__.py @@ -1,6 +1,11 @@ from snowplow_tracker._version import __version__ from snowplow_tracker.subject import Subject -from snowplow_tracker.emitters import logger, Emitter, AsyncEmitter, CeleryEmitter, RedisEmitter +from snowplow_tracker.emitters import Emitter, AsyncEmitter, CeleryEmitter, RedisEmitter from snowplow_tracker.self_describing_json import SelfDescribingJson from snowplow_tracker.tracker import Tracker from contracts import disable_all as disable_contracts, enable_all as enable_contracts +import logging + +# Set default logging handler to avoid "No handler found" warnings. +logging.getLogger(__name__).addHandler(logging.NullHandler()) + diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index 2eccb0fb..1dcb269e 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -39,7 +39,6 @@ from snowplow_tracker.self_describing_json import SelfDescribingJson logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) DEFAULT_MAX_LENGTH = 10 PAYLOAD_DATA_SCHEMA = "iglu:com.snowplowanalytics.snowplow/payload_data/jsonschema/1-0-4" @@ -52,16 +51,6 @@ new_contract("redis", lambda x: isinstance(x, (redis.Redis, redis.StrictRedis))) -try: - # Check whether a custom Celery configuration module named "snowplow_celery_config" exists - import snowplow_celery_config - app = Celery() - app.config_from_object(snowplow_celery_config) - -except ImportError: - # Otherwise configure Celery with default settings - app = Celery("Snowplow", broker="redis://guest@localhost//") - class Emitter(object): """ @@ -172,7 +161,6 @@ def reached_limit(self): else: return self.bytes_queued >= self.byte_limit or len(self.buffer) >= self.buffer_size - @task(name="Flush") def flush(self): """ Sends all events in the buffer to the collector. diff --git a/snowplow_tracker/payload.py b/snowplow_tracker/payload.py index c7c788b5..e2bbb8b3 100644 --- a/snowplow_tracker/payload.py +++ b/snowplow_tracker/payload.py @@ -78,15 +78,15 @@ def add_json(self, dict_, encode_base64, type_when_encoded, type_when_not_encode """ if dict_ is not None and dict_ != {}: - json_dict = json.dumps(dict_, ensure_ascii=False) - if encode_base64: - encoded_dict = base64.urlsafe_b64encode(json_dict.encode("ascii")) - if not isinstance(encoded_dict, str): + try: + encoded_dict = base64.urlsafe_b64encode(json_dict) + if not isinstance(encoded_dict, str): + encoded_dict = encoded_dict.decode("utf-8") + except UnicodeDecodeError: encoded_dict = encoded_dict.decode("utf-8") - self.add(type_when_encoded, encoded_dict) - + self.add(type_when_encoded, encoded_dict) else: self.add(type_when_not_encoded, json_dict) diff --git a/snowplow_tracker/test/unit/test_payload.py b/snowplow_tracker/test/unit/test_payload.py index 93b2d7cb..57437fb3 100644 --- a/snowplow_tracker/test/unit/test_payload.py +++ b/snowplow_tracker/test/unit/test_payload.py @@ -66,3 +66,21 @@ def test_add_dict(self): p.add_dict({"name4": 4, "name3": 3}) # Order doesn't matter output = {"n1": "v1", "n2": "v2", "name3": 3, "name4": 4} self.assertTrue(is_subset(output, p.nv_pairs)) + + def test_add_json_encode_base64(self): + p = payload.Payload() + p.add_json({"name5": 5, "name6": 6}, True, "Encoded_type", "Not_encoded_type") + output = {'Encoded_type': 'eyJuYW1lNiI6IDYsICJuYW1lNSI6IDV9'} + self.assertDictEqual(output, p.nv_pairs) + + def test_add_json_not_encode_base64(self): + p = payload.Payload() + p.add_json({"name7": 7, "name8": 8}, False, "Encoded_type", "Not_encoded_type") + output = {'Not_encoded_type': '{"name7": 7, "name8": 8}'} + self.assertDictEqual(output, p.nv_pairs) + + def test_add_json_with_emoji(self): + p = payload.Payload() + p.add_json({"name9": "\xF0\xe0\xe7\x82\xf1\U0001f44d", "name10": 10}, True, "Encoded_type", "Not_encoded_type") + output = {'Encoded_type': 'eyJuYW1lMTAiOiAxMCwgIm5hbWU5IjogIvDg54LxXFxVMDAwMWY0NGQifQ=='} + self.assertDictEqual(output, p.nv_pairs) diff --git a/snowplow_tracker/tracker.py b/snowplow_tracker/tracker.py index a6830a68..4366b571 100644 --- a/snowplow_tracker/tracker.py +++ b/snowplow_tracker/tracker.py @@ -53,7 +53,7 @@ """ -class Tracker: +class Tracker(object): new_contract("not_none", lambda s: s is not None)