From 0a589c68e047baea95f640165c155c22beb40277 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 1 Oct 2018 09:46:14 -0400 Subject: [PATCH 01/13] Update PyPI deployment to use Twine (close #207) --- .travis.yml | 1 + .travis/deploy.py | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7424bc4e..ee02e065 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ python: - '3.4' - '3.5' install: +- pip install -U pip setuptools virtualenv twine - pip install -r requirements-test.txt - pip install release-manager - pip install -e . diff --git a/.travis/deploy.py b/.travis/deploy.py index 7efde113..3ee3e0e5 100755 --- a/.travis/deploy.py +++ b/.travis/deploy.py @@ -13,7 +13,6 @@ HOME = expanduser("~") -DEFAULT_SERVER = 'https://pypi.python.org/pypi' DEFAULT_REPO = 'pypi' PYPIRC_FILE = '%s/.pypirc' % HOME @@ -55,7 +54,6 @@ def write_config(): ' %s\n' % DEFAULT_REPO, '\n', '[%s]\n' % DEFAULT_REPO, - 'repository=%s\n' % DEFAULT_SERVER, 'username=snowplow\n', 'password=%s\n' % PYPI_PASSWORD ] @@ -71,8 +69,8 @@ def deploy_to_pypi(): """Deploys the release to PyPi""" logger.log_start("Deploying to PyPi") os.chdir(TRAVIS_BUILD_DIR) - utils.execute("python setup.py register -r pypi", shell=True) - utils.execute("python setup.py sdist upload -r pypi", shell=True) + utils.execute("python setup.py sdist bdist_wheel", shell=True) + utils.execute("twine upload dist/*", shell=True) logger.log_info("Module deployed to PyPi!") logger.log_done() From ee6fed590f0f4594a10140f3c212e380f58d1ed4 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 1 Oct 2018 09:48:40 -0400 Subject: [PATCH 02/13] Remove Python 3.3 from tests (close #206) --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ee02e065..42d762c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ services: - redis-server python: - '2.7' -- '3.3' - '3.4' - '3.5' install: From ca42f4a7683531ee5ea96105b57b87493bf197e4 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 1 Oct 2018 09:52:30 -0400 Subject: [PATCH 03/13] Add version bounds for all dependencies (close #208) --- setup.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 88392f47..53a836ec 100644 --- a/setup.py +++ b/setup.py @@ -75,12 +75,12 @@ ], install_requires=[ - "greenlet==0.4.10", - "requests==2.2.1", - "pycontracts==1.7.6", - "celery==3.1.11", - "gevent==1.0.2", - "redis==2.9.1", - "six==1.9.0" + "greenlet>=0.4.10,<1.0", + "requests>=2.2.1,<3.0", + "pycontracts>=1.7.6,<2.0", + "celery>=3.1.11,<4.0", + "gevent>=1.0.2,<2.0", + "redis>=2.9.1,<3.0", + "six>=1.9.0,<2.0" ], ) From cee48e9899dfeac9cd8ec6446b89f698a0a1bfe7 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 1 Oct 2018 10:03:28 -0400 Subject: [PATCH 04/13] Fix date for 0.8.0 release in CHANGELOG (close #183) --- CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index fe6d5d23..4f54a382 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,4 @@ -Version 0.8.0 (2016-09-xx) +Version 0.8.0 (2016-10-13) -------------------------- Add byte_limit to Emitter (#170) Add support for dvce_sent_tstamp (#159) From bf3df5ceb804c926c680240a5cce1b224699bdf3 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 22 Oct 2018 16:09:20 -0400 Subject: [PATCH 05/13] Upgrade Celery to 4.x (close #210) --- setup.py | 2 +- snowplow_tracker/emitters.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 53a836ec..48f7ce13 100644 --- a/setup.py +++ b/setup.py @@ -78,7 +78,7 @@ "greenlet>=0.4.10,<1.0", "requests>=2.2.1,<3.0", "pycontracts>=1.7.6,<2.0", - "celery>=3.1.11,<4.0", + "celery>=4.0,<5.0", "gevent>=1.0.2,<2.0", "redis>=2.9.1,<3.0", "six>=1.9.0,<2.0" diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index 2eccb0fb..2d93d24d 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -31,7 +31,6 @@ from queue import Queue from celery import Celery -from celery.contrib.methods import task import redis import requests from contracts import contract, new_contract @@ -172,7 +171,7 @@ def reached_limit(self): else: return self.bytes_queued >= self.byte_limit or len(self.buffer) >= self.buffer_size - @task(name="Flush") + @app.task(name="Flush") def flush(self): """ Sends all events in the buffer to the collector. From 3f4954021e395867c5c73b21ba41251b6b9888d9 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 1 Oct 2018 10:01:23 -0400 Subject: [PATCH 06/13] Prepared for release --- CHANGES.txt | 8 ++++++++ snowplow_tracker/_version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 4f54a382..7c1659cd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,11 @@ +Version 0.8.1 (2018-10-02) +-------------------------- +Fix date for 0.8.0 release in CHANGELOG (#183) +Remove Python 3.3 from tests (#206) +Update PyPI deployment to use Twine (#207) +Add version bounds for all dependencies (#208) +Upgrade Celery to 4.x (#210) + Version 0.8.0 (2016-10-13) -------------------------- Add byte_limit to Emitter (#170) diff --git a/snowplow_tracker/_version.py b/snowplow_tracker/_version.py index 02e250a1..c9739747 100644 --- a/snowplow_tracker/_version.py +++ b/snowplow_tracker/_version.py @@ -20,6 +20,6 @@ """ -__version_info__ = (0, 8, 0) +__version_info__ = (0, 8, 1) __version__ = ".".join(str(x) for x in __version_info__) __build_version__ = __version__ + '' From f3f5a74c7842d8d9591524fd198c4e3fbc162bb3 Mon Sep 17 00:00:00 2001 From: mhadam Date: Mon, 22 Oct 2018 20:07:11 -0400 Subject: [PATCH 07/13] Flush argument shadows the async keyword --- snowplow_tracker/emitters.py | 2 +- snowplow_tracker/tracker.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index 2d93d24d..f0d017d2 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -171,7 +171,7 @@ def reached_limit(self): else: return self.bytes_queued >= self.byte_limit or len(self.buffer) >= self.buffer_size - @app.task(name="Flush") + @app.task(bind=True, name="Flush") def flush(self): """ Sends all events in the buffer to the collector. diff --git a/snowplow_tracker/tracker.py b/snowplow_tracker/tracker.py index a6830a68..18516925 100644 --- a/snowplow_tracker/tracker.py +++ b/snowplow_tracker/tracker.py @@ -626,16 +626,16 @@ def track_unstruct_event(self, event_json, context=None, tstamp=None): track_self_describing_event = track_unstruct_event @contract - def flush(self, async=False): + def flush(self, is_async=False): """ Flush the emitter - :param async: Whether the flush is done asynchronously. Default is False - :type async: bool + :param is_async: Whether the flush is done asynchronously. Default is False + :type is_async: bool :rtype: tracker """ for emitter in self.emitters: - if async: + if is_async: emitter.flush() else: emitter.sync_flush() From db858f61ae753d31404b0f1240aa677dc3b0e006 Mon Sep 17 00:00:00 2001 From: markendev Date: Wed, 28 Nov 2018 12:26:33 +0200 Subject: [PATCH 08/13] Update dependencies --- setup.py | 12 ++++++------ snowplow_tracker/emitters.py | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index 88392f47..5e4c5ab0 100644 --- a/setup.py +++ b/setup.py @@ -75,12 +75,12 @@ ], install_requires=[ - "greenlet==0.4.10", - "requests==2.2.1", + "greenlet==0.4.15", + "requests==2.19.1", "pycontracts==1.7.6", - "celery==3.1.11", - "gevent==1.0.2", - "redis==2.9.1", - "six==1.9.0" + "celery==4.2.0", + "gevent==1.3.3", + "redis==2.10.6", + "six==1.11.0" ], ) diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index 2eccb0fb..2d93d24d 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -31,7 +31,6 @@ from queue import Queue from celery import Celery -from celery.contrib.methods import task import redis import requests from contracts import contract, new_contract @@ -172,7 +171,7 @@ def reached_limit(self): else: return self.bytes_queued >= self.byte_limit or len(self.buffer) >= self.buffer_size - @task(name="Flush") + @app.task(name="Flush") def flush(self): """ Sends all events in the buffer to the collector. From b9821fe8e9fb86ffb872212b568dfdb7eab3062c Mon Sep 17 00:00:00 2001 From: markendev Date: Sat, 1 Dec 2018 00:14:41 +0200 Subject: [PATCH 09/13] Fix codebase for celery task and cleanup --- snowplow_tracker/emitters.py | 97 +++++++++++++++++------------------- snowplow_tracker/subject.py | 87 ++++++++++++++++++++++++++++++++ snowplow_tracker/tracker.py | 2 - snowplow_tracker/utils.py | 44 ++++++++++++++++ 4 files changed, 176 insertions(+), 54 deletions(-) create mode 100644 snowplow_tracker/utils.py diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index 2d93d24d..b3d9dd8d 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -30,11 +30,13 @@ # Python 3 from queue import Queue -from celery import Celery +from celery import shared_task import redis import requests from contracts import contract, new_contract +from snowplow_tracker.utils import http_get, http_post, is_good_status_code + from snowplow_tracker.self_describing_json import SelfDescribingJson logger = logging.getLogger(__name__) @@ -51,16 +53,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): """ @@ -171,7 +163,6 @@ def reached_limit(self): else: return self.bytes_queued >= self.byte_limit or len(self.buffer) >= self.buffer_size - @app.task(name="Flush") def flush(self): """ Sends all events in the buffer to the collector. @@ -231,44 +222,7 @@ def send_events(self, evts): :param evts: Array of events to be sent :type evts: list(dict(string:*)) """ - if len(evts) > 0: - logger.info("Attempting to send %s requests" % len(evts)) - Emitter.attach_sent_timestamp(evts) - if self.method == 'post': - data = SelfDescribingJson(PAYLOAD_DATA_SCHEMA, evts).to_string() - post_succeeded = False - try: - status_code = self.http_post(data).status_code - post_succeeded = self.is_good_status_code(status_code) - except requests.RequestException as e: - logger.warn(e) - if post_succeeded: - if self.on_success is not None: - self.on_success(len(evts)) - elif self.on_failure is not None: - self.on_failure(0, evts) - - elif self.method == 'get': - success_count = 0 - unsent_requests = [] - for evt in evts: - get_succeeded = False - try: - status_code = self.http_get(evt).status_code - get_succeeded = self.is_good_status_code(status_code) - except requests.RequestException as e: - logger.warn(e) - if get_succeeded: - success_count += 1 - else: - unsent_requests.append(evt) - if len(unsent_requests) == 0: - if self.on_success is not None: - self.on_success(success_count) - elif self.on_failure is not None: - self.on_failure(success_count, unsent_requests) - else: - logger.info("Skipping flush since buffer is empty") + send_events(self.endpoint, evts, self.method) @contract def set_flush_timer(self, timeout, flush_now=False): @@ -392,14 +346,17 @@ class CeleryEmitter(Emitter): Works like the base Emitter class, but on_success and on_failure callbacks cannot be set. """ + celery_app = None + def __init__(self, endpoint, protocol="http", port=None, method="get", buffer_size=None, byte_limit=None): super(CeleryEmitter, self).__init__(endpoint, protocol, port, method, buffer_size, None, None, byte_limit) - def flush(self): + + def send_events(self, evts): """ Schedules a flush task """ - super(CeleryEmitter, self).flush.delay() + send_events.delay(self.endpoint, evts, self.method) logger.info("Scheduled a Celery task to flush the event queue") @@ -435,3 +392,39 @@ def flush(self): def sync_flush(self): self.flush() + + +@shared_task +def send_events(endpoint, evts, method): + if len(evts) > 0: + logger.info("Attempting to send %s requests" % len(evts)) + Emitter.attach_sent_timestamp(evts) + if method == 'post': + data = SelfDescribingJson(PAYLOAD_DATA_SCHEMA, evts).to_string() + post_succeeded = False + try: + status_code = http_post(endpoint, data).status_code + post_succeeded = is_good_status_code(status_code) + except requests.RequestException as e: + logger.warn(e) + if post_succeeded: + logger.info("Success") + else: + logger.info("Fail") + + elif method == 'get': + success_count = 0 + unsent_requests = [] + for evt in evts: + get_succeeded = False + try: + status_code = http_get(endpoint, evt).status_code + get_succeeded = is_good_status_code(status_code) + except requests.RequestException as e: + logger.warn(e) + if get_succeeded: + success_count += 1 + else: + unsent_requests.append(evt) + else: + logger.info("Skipping flush since buffer is empty") \ No newline at end of file diff --git a/snowplow_tracker/subject.py b/snowplow_tracker/subject.py index 85ab5e24..47a0a44c 100644 --- a/snowplow_tracker/subject.py +++ b/snowplow_tracker/subject.py @@ -163,3 +163,90 @@ def set_network_user_id(self, nuid): """ self.standard_nv_pairs["tnuid"] = nuid return self + + def set_custom(self, field, value): + """ + Set custom field + + :param field: Field name + :param value: Value for a field + """ + self.standard_nv_pairs[field] = value + return self + + def set_custom_by_name(self, field, value): + """ + Set custom field by getting field name from SNOWPLOW_REVERTED_TRANSFORM_MAP + + :param field: Field name + :param value: Value for a field + """ + self.standard_nv_pairs[SNOWPLOW_REVERTED_TRANSFORM_MAP.get(field, field)] = value + return self + + +SNOWPLOW_REVERTED_TRANSFORM_MAP = { + "event": "e", + "user_ipaddress": "ip", + "app_id": "aid", + "platform": "p", + "txn_id": "tid", + "user_id": "uid", + "domain_userid": "duid", + "network_userid": "nuid", + "useragent": "ua", + "user_fingerprint": "fp", + "domain_sessionidx": "vid", + "domain_sessionid": "sid", + "dvce_created_tstamp": "dtm", + "true_tstamp": "ttm", + "dvce_sent_tstamp": "stm", + "name_tracker": "tna", + "v_tracker": "tv", + "v_collector": "cv", + "br_lang": "lang", + "br_features_pdf": "f_pdf", + "br_features_flash": "f_fla", + "br_features_java": "f_java", + "br_features_director": "f_dir", + "br_features_quicktime": "f_qt", + "br_features_realplayer": "f_realp", + "br_features_windowsmedia": "f_wma", + "br_features_gears": "f_gears", + "br_features_silverlight": "f_ag", + "br_cookies": "cookie", + "br_colordepth": "cd", + "os_timezone": "tz", + "page_referrer": "refr", + "page_url": "url", + "page_title": "page", + "doc_charset": "cs", + "event_id": "eid", + "contexts": "cx", + "se_category": "se_ca", + "se_action": "se_ac", + "se_label": "se_la", + "se_property": "se_pr", + "se_value": "se_va", + "unstruct_event": "ue_pr", + "tr_orderid": "tr_id", + "tr_affiliation": "tr_af", + "tr_total": "tr_tt", + "tr_tax": "tr_tx", + "tr_shipping": "tr_sh", + "tr_city": "tr_ci", + "tr_state": "tr_st", + "tr_country": "tr_co", + "ti_orderid": "ti_id", + "ti_sku": "ti_sk", + "ti_name": "ti_nm", + "ti_category": "ti_ca", + "ti_price": "ti_pr", + "ti_quantity": "ti_qu", + "pp_xoffset_min": "pp_mix", + "pp_xoffset_max": "pp_max", + "pp_yoffset_min": "pp_miy", + "pp_yoffset_max": "pp_may", + "tr_currency": "tr_cu", + "ti_currency": "ti_cu", +} \ No newline at end of file diff --git a/snowplow_tracker/tracker.py b/snowplow_tracker/tracker.py index a6830a68..43412145 100644 --- a/snowplow_tracker/tracker.py +++ b/snowplow_tracker/tracker.py @@ -185,7 +185,6 @@ def complete_payload(self, pb, context, tstamp): pb.add_dict(self.standard_nv_pairs) pb.add_dict(self.subject.standard_nv_pairs) - return self.track(pb) @contract @@ -208,7 +207,6 @@ def track_page_view(self, page_url, page_title=None, referrer=None, context=None pb.add("url", page_url) pb.add("page", page_title) pb.add("refr", referrer) - return self.complete_payload(pb, context, tstamp) @contract diff --git a/snowplow_tracker/utils.py b/snowplow_tracker/utils.py new file mode 100644 index 00000000..2253f4ff --- /dev/null +++ b/snowplow_tracker/utils.py @@ -0,0 +1,44 @@ +import logging +import requests + + +logger = logging.getLogger(__name__) + + +def http_post(endpoint, data): + """ + :param endpoint: endpoint URL + :param data: The array of JSONs to be sent + :type endpoint: string + :type data: string + """ + logger.info("Sending POST request to %s..." % endpoint) + logger.debug("Payload: %s" % data) + r = requests.post(endpoint, data=data, headers={'content-type': 'application/json; charset=utf-8'}) + getattr(logger, "info" if is_good_status_code(r.status_code) else "warn")( + "POST request finished with status code: " + str(r.status_code)) + return r + + +def http_get(endpoint, payload): + """ + :param endpoint: endpoint URL + :param payload: The event properties + :type endpoint: string + :type payload: dict(string:*) + """ + logger.info("Sending GET request to %s..." % endpoint) + logger.debug("Payload: %s" % payload) + r = requests.get(endpoint, params=payload) + getattr(logger, "info" if is_good_status_code(r.status_code) else "warn")( + "GET request finished with status code: " + str(r.status_code)) + return r + + +def is_good_status_code(status_code): + """ + :param status_code: HTTP status code + :type status_code: int + :rtype: bool + """ + return 200 <= status_code < 400 From 4d71610fbae8a85a0a24a0b1b3ffe4d1f23d2bda Mon Sep 17 00:00:00 2001 From: Paul Logston Date: Sat, 1 Dec 2018 19:04:50 -0500 Subject: [PATCH 10/13] Ensure packages can upgrade freely --- setup.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 5e4c5ab0..02eb5745 100644 --- a/setup.py +++ b/setup.py @@ -75,12 +75,12 @@ ], install_requires=[ - "greenlet==0.4.15", - "requests==2.19.1", - "pycontracts==1.7.6", - "celery==4.2.0", - "gevent==1.3.3", - "redis==2.10.6", - "six==1.11.0" + "greenlet>=0.4.15", + "requests>=2.19.1", + "pycontracts>=1.7.6", + "celery>=4.2.0", + "gevent>=1.3.3", + "redis>=2.10.6", + "six>=1.11.0" ], ) From feb1b3b8de80b3844e80d551fec7350482f61d0b Mon Sep 17 00:00:00 2001 From: Paul Logston Date: Sat, 1 Dec 2018 19:09:19 -0500 Subject: [PATCH 11/13] Update package name for PyPI --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 02eb5745..ceacf8a5 100644 --- a/setup.py +++ b/setup.py @@ -50,8 +50,8 @@ authors_email_str = ', '.join(authors_email_list) setup( - name='snowplow-tracker', - version=__version__, + name='15five-snowplow-tracker', + version='0.8.155', author=authors_str, author_email=authors_email_str, packages=['snowplow_tracker', 'snowplow_tracker.test'], From 9b0f6e952c2552fae92504181466634b278c6941 Mon Sep 17 00:00:00 2001 From: Paul Logston Date: Sat, 1 Dec 2018 19:26:12 -0500 Subject: [PATCH 12/13] Update module docstrings for license compliance --- setup.py | 4 ++++ snowplow_tracker/emitters.py | 6 +++++- snowplow_tracker/subject.py | 6 +++++- snowplow_tracker/tracker.py | 4 ++++ snowplow_tracker/utils.py | 5 +++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index ceacf8a5..3b06a991 100644 --- a/setup.py +++ b/setup.py @@ -17,6 +17,10 @@ Authors: Anuj More, Alex Dean, Fred Blundun Copyright: Copyright (c) 2013-2014 Snowplow Analytics Ltd License: Apache License Version 2.0 + + + !!!MODIFIED BY 15FIVE!!! + Modifiers: Andrii Pleskach, Paul Logston """ diff --git a/snowplow_tracker/emitters.py b/snowplow_tracker/emitters.py index b3d9dd8d..08515594 100644 --- a/snowplow_tracker/emitters.py +++ b/snowplow_tracker/emitters.py @@ -17,6 +17,10 @@ Authors: Anuj More, Alex Dean, Fred Blundun Copyright: Copyright (c) 2013-2014 Snowplow Analytics Ltd License: Apache License Version 2.0 + + !!!MODIFIED BY 15FIVE!!! + Modifiers: Andrii Pleskach, Paul Logston + """ import json @@ -427,4 +431,4 @@ def send_events(endpoint, evts, method): else: unsent_requests.append(evt) else: - logger.info("Skipping flush since buffer is empty") \ No newline at end of file + logger.info("Skipping flush since buffer is empty") diff --git a/snowplow_tracker/subject.py b/snowplow_tracker/subject.py index 47a0a44c..367c9b9f 100644 --- a/snowplow_tracker/subject.py +++ b/snowplow_tracker/subject.py @@ -17,6 +17,10 @@ Authors: Anuj More, Alex Dean, Fred Blundun Copyright: Copyright (c) 2013-2014 Snowplow Analytics Ltd License: Apache License Version 2.0 + + !!!MODIFIED BY 15FIVE!!! + Modifiers: Andrii Pleskach, Paul Logston + """ from contracts import contract, new_contract @@ -249,4 +253,4 @@ def set_custom_by_name(self, field, value): "pp_yoffset_max": "pp_may", "tr_currency": "tr_cu", "ti_currency": "ti_cu", -} \ No newline at end of file +} diff --git a/snowplow_tracker/tracker.py b/snowplow_tracker/tracker.py index 3f5df37e..5611a7c6 100644 --- a/snowplow_tracker/tracker.py +++ b/snowplow_tracker/tracker.py @@ -17,6 +17,10 @@ Authors: Anuj More, Alex Dean, Fred Blundun Copyright: Copyright (c) 2013-2014 Snowplow Analytics Ltd License: Apache License Version 2.0 + + !!!MODIFIED BY 15FIVE!!! + Modifiers: Andrii Pleskach, Paul Logston + """ import time diff --git a/snowplow_tracker/utils.py b/snowplow_tracker/utils.py index 2253f4ff..07a18d2f 100644 --- a/snowplow_tracker/utils.py +++ b/snowplow_tracker/utils.py @@ -1,3 +1,8 @@ +""" + !!!MODIFIED BY 15FIVE!!! + Modifiers: Andrii Pleskach, Paul Logston + +""" import logging import requests From a22848f3909b00c849c8b5856b551cc97dd86533 Mon Sep 17 00:00:00 2001 From: Paul Logston Date: Sat, 1 Dec 2018 19:32:35 -0500 Subject: [PATCH 13/13] Bump version number for PyPI reasons --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3b06a991..13d2c21c 100644 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ setup( name='15five-snowplow-tracker', - version='0.8.155', + version='0.8.156', author=authors_str, author_email=authors_email_str, packages=['snowplow_tracker', 'snowplow_tracker.test'],