From 2b36ddd6f0195e6733d8a8c0ad9c8030b9ee9bf7 Mon Sep 17 00:00:00 2001 From: Dmitry Sorokin Date: Tue, 5 Mar 2024 12:52:07 +0000 Subject: [PATCH 01/16] Change to unique uuid Signed-off-by: Dmitry Sorokin --- kedro-telemetry/kedro_telemetry/plugin.py | 48 +++++++++++++++++------ kedro-telemetry/pyproject.toml | 1 + 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index ff44d4f1d..5164b5ecd 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -1,11 +1,13 @@ """Kedro Telemetry plugin for collecting Kedro usage data.""" -import getpass import hashlib import json import logging import os import sys +import uuid +from appdirs import user_config_dir +from configparser import ConfigParser from copy import deepcopy from datetime import datetime from pathlib import Path @@ -41,6 +43,7 @@ "BUILDKITE", # https://buildkite.com/docs/pipelines/environment-variables } TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" +CONFIG_FILENAME = "telemetry.conf" logger = logging.getLogger(__name__) @@ -49,16 +52,35 @@ def _hash(string: str) -> str: return hashlib.sha512(bytes(string, encoding="utf8")).hexdigest() -def _get_hashed_username(): - try: - username = getpass.getuser() - return _hash(username) - except Exception as exc: - logger.warning( - "Something went wrong with getting the username. Exception: %s", - exc, - ) - return "" +def _get_or_create_uuid(): + """ + Reads a UUID from a configuration file or generates and saves a new one if not present. + """ + + config_path = user_config_dir("kedro") + full_path = os.path.join(config_path, CONFIG_FILENAME) + config = ConfigParser() + + if os.path.exists(full_path): + config.read(full_path) + + if config.has_section("telemetry") and "uuid" in config["telemetry"]: + try: + return uuid.UUID(config["telemetry"]["uuid"]).hex + except ValueError: + pass # Invalid UUID found, will generate a new one + + # Generate a new UUID and save it to the config file + if not config.has_section("telemetry"): + config.add_section("telemetry") + new_uuid = uuid.uuid4().hex + config.set("telemetry", "uuid", new_uuid) + + os.makedirs(config_path, exist_ok=True) + with open(full_path, "w") as configfile: + config.write(configfile) + + return new_uuid class KedroTelemetryCLIHooks: @@ -90,7 +112,7 @@ def before_command_run( main_command = masked_command_args[0] if masked_command_args else "kedro" logger.debug("You have opted into product usage analytics.") - hashed_username = _get_hashed_username() + hashed_username = _get_or_create_uuid() project_properties = _get_project_properties( hashed_username, project_metadata.project_path ) @@ -141,7 +163,7 @@ def after_catalog_created(self, catalog): logger.debug("You have opted into product usage analytics.") default_pipeline = pipelines.get("__default__") # __default__ - hashed_username = _get_hashed_username() + hashed_username = _get_or_create_uuid() project_properties = _get_project_properties(hashed_username, self.project_path) diff --git a/kedro-telemetry/pyproject.toml b/kedro-telemetry/pyproject.toml index 9ab6933ac..16c4449d1 100644 --- a/kedro-telemetry/pyproject.toml +++ b/kedro-telemetry/pyproject.toml @@ -13,6 +13,7 @@ license = {text = "Apache Software License (Apache 2.0)"} dependencies = [ "kedro>=0.18.0", "requests~=2.20", + "appdirs>=1.4.4", ] dynamic = ["readme", "version"] From 273520654efa934ba3a5462fc900ec10dc283886 Mon Sep 17 00:00:00 2001 From: Dmitry Sorokin Date: Tue, 5 Mar 2024 16:14:13 +0000 Subject: [PATCH 02/16] Fix tests Signed-off-by: Dmitry Sorokin --- kedro-telemetry/tests/test_plugin.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 6a3ee2cc5..15a33cd01 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -131,7 +131,7 @@ def test_before_command_run(self, mocker, fake_metadata): mocked_anon_id.return_value = "digested" mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( - "kedro_telemetry.plugin._get_hashed_username", + "kedro_telemetry.plugin._get_or_create_uuid", return_value="hashed_username", ) @@ -177,7 +177,7 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): mocked_anon_id.return_value = "digested" mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( - "kedro_telemetry.plugin._get_hashed_username", + "kedro_telemetry.plugin._get_or_create_uuid", return_value="hashed_username", ) @@ -474,7 +474,7 @@ def test_after_context_created_without_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin._hash", return_value="digested") mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( - "kedro_telemetry.plugin._get_hashed_username", + "kedro_telemetry.plugin._get_or_create_uuid", return_value="hashed_username", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") @@ -530,7 +530,7 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin._hash", return_value="digested") mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( - "kedro_telemetry.plugin._get_hashed_username", + "kedro_telemetry.plugin._get_or_create_uuid", return_value="hashed_username", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") @@ -589,7 +589,7 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin._hash", return_value="digested") mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( - "kedro_telemetry.plugin._get_hashed_username", + "kedro_telemetry.plugin._get_or_create_uuid", return_value="hashed_username", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") From a17da4a29453f71bd98b9df221b185192e604866 Mon Sep 17 00:00:00 2001 From: Dmitry Sorokin Date: Tue, 5 Mar 2024 17:14:00 +0000 Subject: [PATCH 03/16] fix tests and empty value Signed-off-by: Dmitry Sorokin --- kedro-telemetry/kedro_telemetry/plugin.py | 54 ++++++++++++----------- kedro-telemetry/tests/test_plugin.py | 12 +++-- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 5164b5ecd..4c437cfbb 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -56,31 +56,35 @@ def _get_or_create_uuid(): """ Reads a UUID from a configuration file or generates and saves a new one if not present. """ - - config_path = user_config_dir("kedro") - full_path = os.path.join(config_path, CONFIG_FILENAME) - config = ConfigParser() - - if os.path.exists(full_path): - config.read(full_path) - - if config.has_section("telemetry") and "uuid" in config["telemetry"]: - try: - return uuid.UUID(config["telemetry"]["uuid"]).hex - except ValueError: - pass # Invalid UUID found, will generate a new one - - # Generate a new UUID and save it to the config file - if not config.has_section("telemetry"): - config.add_section("telemetry") - new_uuid = uuid.uuid4().hex - config.set("telemetry", "uuid", new_uuid) - - os.makedirs(config_path, exist_ok=True) - with open(full_path, "w") as configfile: - config.write(configfile) - - return new_uuid + try: + config_path = user_config_dir("kedro") + full_path = os.path.join(config_path, CONFIG_FILENAME) + config = ConfigParser() + + if os.path.exists(full_path): + config.read(full_path) + + if config.has_section("telemetry") and "uuid" in config["telemetry"]: + try: + return uuid.UUID(config["telemetry"]["uuid"]).hex + except ValueError: + pass # Invalid UUID found, will generate a new one + + # Generate a new UUID and save it to the config file + if not config.has_section("telemetry"): + config.add_section("telemetry") + new_uuid = uuid.uuid4().hex + config.set("telemetry", "uuid", new_uuid) + + os.makedirs(config_path, exist_ok=True) + with open(full_path, "w") as configfile: + config.write(configfile) + + return new_uuid + + except Exception as e: + logging.error(f"Failed to get or create UUID: {e}") + return "" class KedroTelemetryCLIHooks: diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 15a33cd01..9d57c13f5 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -226,13 +226,17 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): mocked_anon_id = mocker.patch("kedro_telemetry.plugin._hash") mocked_anon_id.return_value = "digested" mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") + mocker.patch( + "kedro_telemetry.plugin._get_or_create_uuid", + return_value="hashed_username", + ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") telemetry_hook = KedroTelemetryCLIHooks() command_args = [] telemetry_hook.before_command_run(fake_metadata, command_args) expected_properties = { - "username": "digested", + "username": "hashed_username", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -249,12 +253,12 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): expected_calls = [ mocker.call( event_name="Command run: kedro", - identity="digested", + identity="hashed_username", properties=expected_properties, ), mocker.call( event_name="CLI command", - identity="digested", + identity="hashed_username", properties=generic_properties, ), ] @@ -296,7 +300,7 @@ def test_before_command_run_anonymous(self, mocker, fake_metadata): mocked_anon_id = mocker.patch("kedro_telemetry.plugin._hash") mocked_anon_id.return_value = "digested" mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") - mocker.patch("getpass.getuser", side_effect=Exception) + mocker.patch("kedro_telemetry.plugin.user_config_dir", side_effect=Exception) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") telemetry_hook = KedroTelemetryCLIHooks() From 5c1f2bee4a7764ff177de8505d36a1e3662b1888 Mon Sep 17 00:00:00 2001 From: Dmitry Sorokin Date: Tue, 5 Mar 2024 17:33:48 +0000 Subject: [PATCH 04/16] fix lint Signed-off-by: Dmitry Sorokin --- kedro-telemetry/kedro_telemetry/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 4c437cfbb..3ae0792e8 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -6,7 +6,6 @@ import os import sys import uuid -from appdirs import user_config_dir from configparser import ConfigParser from copy import deepcopy from datetime import datetime @@ -17,6 +16,7 @@ import requests import toml import yaml +from appdirs import user_config_dir from kedro import __version__ as KEDRO_VERSION from kedro.framework.cli.cli import KedroCLI from kedro.framework.cli.hooks import cli_hook_impl From 75480b66ed4be36662a4bd277623d75bafae57d9 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 6 Mar 2024 10:58:02 -0300 Subject: [PATCH 05/16] Reformat _get_or_create_uuid to not be entirely inside the try block Signed-off-by: lrcouto --- MagicMock/user_config_dir()/140095031570448/telemetry.conf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 MagicMock/user_config_dir()/140095031570448/telemetry.conf diff --git a/MagicMock/user_config_dir()/140095031570448/telemetry.conf b/MagicMock/user_config_dir()/140095031570448/telemetry.conf new file mode 100644 index 000000000..363c7c849 --- /dev/null +++ b/MagicMock/user_config_dir()/140095031570448/telemetry.conf @@ -0,0 +1,3 @@ +[telemetry] +uuid = 20bdf01b447d4c95845b5f01496b3ff7 + From 11c28b16cb951747edcf181d56229801c934aa35 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 6 Mar 2024 10:58:26 -0300 Subject: [PATCH 06/16] Reformat _get_or_create_uuid to not be entirely inside the try block Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 3ae0792e8..38c66ea50 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -56,11 +56,11 @@ def _get_or_create_uuid(): """ Reads a UUID from a configuration file or generates and saves a new one if not present. """ - try: - config_path = user_config_dir("kedro") - full_path = os.path.join(config_path, CONFIG_FILENAME) - config = ConfigParser() + config_path = user_config_dir("kedro") + full_path = os.path.join(config_path, CONFIG_FILENAME) + config = ConfigParser() + try: if os.path.exists(full_path): config.read(full_path) From 4c9427c1ac36ba6151fc0fa5de831cb5be5c256e Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 6 Mar 2024 11:02:32 -0300 Subject: [PATCH 07/16] Remove incorrectly sent file Signed-off-by: lrcouto --- MagicMock/user_config_dir()/140095031570448/telemetry.conf | 3 --- kedro-telemetry/tests/test_plugin.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 MagicMock/user_config_dir()/140095031570448/telemetry.conf diff --git a/MagicMock/user_config_dir()/140095031570448/telemetry.conf b/MagicMock/user_config_dir()/140095031570448/telemetry.conf deleted file mode 100644 index 363c7c849..000000000 --- a/MagicMock/user_config_dir()/140095031570448/telemetry.conf +++ /dev/null @@ -1,3 +0,0 @@ -[telemetry] -uuid = 20bdf01b447d4c95845b5f01496b3ff7 - diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 9d57c13f5..0e53954da 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -300,7 +300,7 @@ def test_before_command_run_anonymous(self, mocker, fake_metadata): mocked_anon_id = mocker.patch("kedro_telemetry.plugin._hash") mocked_anon_id.return_value = "digested" mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") - mocker.patch("kedro_telemetry.plugin.user_config_dir", side_effect=Exception) + mocker.patch("builtins.open", side_effect=Exception) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") telemetry_hook = KedroTelemetryCLIHooks() From a20d0d86d923f3123a0f2dde2f4e0806fe5afc2b Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 6 Mar 2024 13:33:31 -0300 Subject: [PATCH 08/16] Update RELEASE.md Signed-off-by: lrcouto --- kedro-telemetry/RELEASE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/kedro-telemetry/RELEASE.md b/kedro-telemetry/RELEASE.md index d3dd74d5a..08471d07c 100644 --- a/kedro-telemetry/RELEASE.md +++ b/kedro-telemetry/RELEASE.md @@ -1,4 +1,5 @@ # Upcoming release +* Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. # Release 0.3.2 * Updated plugin to share if a project is being run in a ci environment. From ea96a13b20b1a40a1fe323d0af9c876b4bf8eead Mon Sep 17 00:00:00 2001 From: lrcouto Date: Thu, 7 Mar 2024 12:39:02 -0300 Subject: [PATCH 09/16] Return empty ID if the existing ID cannot be read Signed-off-by: lrcouto --- kedro-telemetry/RELEASE.md | 2 +- kedro-telemetry/kedro_telemetry/plugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kedro-telemetry/RELEASE.md b/kedro-telemetry/RELEASE.md index 08471d07c..136fc5d83 100644 --- a/kedro-telemetry/RELEASE.md +++ b/kedro-telemetry/RELEASE.md @@ -1,5 +1,5 @@ # Upcoming release -* Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. +* Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. (On release 0.4) # Release 0.3.2 * Updated plugin to share if a project is being run in a ci environment. diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 38c66ea50..ceb7998d5 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -68,7 +68,7 @@ def _get_or_create_uuid(): try: return uuid.UUID(config["telemetry"]["uuid"]).hex except ValueError: - pass # Invalid UUID found, will generate a new one + return "" # Generate a new UUID and save it to the config file if not config.has_section("telemetry"): From e16cde693fc87b2164bb3fe34eaf88cc2177be78 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Fri, 8 Mar 2024 11:12:50 -0300 Subject: [PATCH 10/16] Extract new uuid generation to its own function Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index ceb7998d5..3562f8f86 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -72,7 +72,18 @@ def _get_or_create_uuid(): # Generate a new UUID and save it to the config file if not config.has_section("telemetry"): - config.add_section("telemetry") + new_uuid = _generate_new_uuid(config, config_path, full_path) + + return new_uuid + + except Exception as e: + logging.error(f"Failed to retrieve UUID: {e}") + return "" + + +def _generate_new_uuid(config, config_path, full_path): + try: + config.add_section("telemetry") new_uuid = uuid.uuid4().hex config.set("telemetry", "uuid", new_uuid) @@ -81,9 +92,8 @@ def _get_or_create_uuid(): config.write(configfile) return new_uuid - except Exception as e: - logging.error(f"Failed to get or create UUID: {e}") + logging.error(f"Failed to create UUID: {e}") return "" From ec0594e399fbdd60751ce38435a070fe5cb9cc9c Mon Sep 17 00:00:00 2001 From: lrcouto Date: Fri, 8 Mar 2024 11:36:08 -0300 Subject: [PATCH 11/16] Convert .conf file to .toml Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 33 +++++++++++------------ 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 3562f8f86..4c5afb46c 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -6,7 +6,6 @@ import os import sys import uuid -from configparser import ConfigParser from copy import deepcopy from datetime import datetime from pathlib import Path @@ -43,7 +42,7 @@ "BUILDKITE", # https://buildkite.com/docs/pipelines/environment-variables } TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" -CONFIG_FILENAME = "telemetry.conf" +CONFIG_FILENAME = "telemetry.toml" logger = logging.getLogger(__name__) @@ -58,21 +57,20 @@ def _get_or_create_uuid(): """ config_path = user_config_dir("kedro") full_path = os.path.join(config_path, CONFIG_FILENAME) - config = ConfigParser() try: if os.path.exists(full_path): - config.read(full_path) + with open(full_path, 'r') as f: + config = toml.load(f) - if config.has_section("telemetry") and "uuid" in config["telemetry"]: - try: - return uuid.UUID(config["telemetry"]["uuid"]).hex - except ValueError: - return "" + if "telemetry" in config and "uuid" in config["telemetry"]: + try: + return uuid.UUID(config["telemetry"]["uuid"]).hex + except ValueError: + return "" # Generate a new UUID and save it to the config file - if not config.has_section("telemetry"): - new_uuid = _generate_new_uuid(config, config_path, full_path) + new_uuid = _generate_new_uuid(full_path) return new_uuid @@ -81,15 +79,16 @@ def _get_or_create_uuid(): return "" -def _generate_new_uuid(config, config_path, full_path): +def _generate_new_uuid(full_path): try: - config.add_section("telemetry") + config = {} + config["telemetry"] = {} new_uuid = uuid.uuid4().hex - config.set("telemetry", "uuid", new_uuid) + config["telemetry"]["uuid"] = new_uuid - os.makedirs(config_path, exist_ok=True) - with open(full_path, "w") as configfile: - config.write(configfile) + os.makedirs(os.path.dirname(full_path), exist_ok=True) + with open(full_path, "w") as f: + toml.dump(config, f) return new_uuid except Exception as e: From 3bc75463f4aa0a66dbbf4d51d3aded43ddd66457 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Fri, 8 Mar 2024 11:37:57 -0300 Subject: [PATCH 12/16] Lint Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 4c5afb46c..854b14907 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -60,7 +60,7 @@ def _get_or_create_uuid(): try: if os.path.exists(full_path): - with open(full_path, 'r') as f: + with open(full_path) as f: config = toml.load(f) if "telemetry" in config and "uuid" in config["telemetry"]: From 9795b5e40f7f3d9f92c479952c36ebf91423cf83 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Fri, 8 Mar 2024 11:54:57 -0300 Subject: [PATCH 13/16] Remove redundant try/except block Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 854b14907..fca497c0f 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -64,10 +64,7 @@ def _get_or_create_uuid(): config = toml.load(f) if "telemetry" in config and "uuid" in config["telemetry"]: - try: - return uuid.UUID(config["telemetry"]["uuid"]).hex - except ValueError: - return "" + return uuid.UUID(config["telemetry"]["uuid"]).hex # Generate a new UUID and save it to the config file new_uuid = _generate_new_uuid(full_path) From ae5694a4f2a5dcbdfa9bc814aaa5db7a02a691f1 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Fri, 8 Mar 2024 13:33:44 -0300 Subject: [PATCH 14/16] Add type hints, change variable names to be more descriptive Signed-off-by: lrcouto --- kedro-telemetry/kedro_telemetry/plugin.py | 22 ++++++------ kedro-telemetry/tests/test_plugin.py | 42 +++++++++++------------ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index fca497c0f..84371c032 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -51,7 +51,7 @@ def _hash(string: str) -> str: return hashlib.sha512(bytes(string, encoding="utf8")).hexdigest() -def _get_or_create_uuid(): +def _get_or_create_uuid() -> str: """ Reads a UUID from a configuration file or generates and saves a new one if not present. """ @@ -76,7 +76,7 @@ def _get_or_create_uuid(): return "" -def _generate_new_uuid(full_path): +def _generate_new_uuid(full_path: str) -> str: try: config = {} config["telemetry"] = {} @@ -122,9 +122,9 @@ def before_command_run( main_command = masked_command_args[0] if masked_command_args else "kedro" logger.debug("You have opted into product usage analytics.") - hashed_username = _get_or_create_uuid() + user_uuid = _get_or_create_uuid() project_properties = _get_project_properties( - hashed_username, project_metadata.project_path + user_uuid, project_metadata.project_path ) cli_properties = _format_user_cli_data( project_properties, masked_command_args @@ -132,7 +132,7 @@ def before_command_run( _send_heap_event( event_name=f"Command run: {main_command}", - identity=hashed_username, + identity=user_uuid, properties=cli_properties, ) @@ -141,7 +141,7 @@ def before_command_run( generic_properties["main_command"] = main_command _send_heap_event( event_name="CLI command", - identity=hashed_username, + identity=user_uuid, properties=generic_properties, ) except Exception as exc: @@ -173,16 +173,16 @@ def after_catalog_created(self, catalog): logger.debug("You have opted into product usage analytics.") default_pipeline = pipelines.get("__default__") # __default__ - hashed_username = _get_or_create_uuid() + user_uuid = _get_or_create_uuid() - project_properties = _get_project_properties(hashed_username, self.project_path) + project_properties = _get_project_properties(user_uuid, self.project_path) project_statistics_properties = _format_project_statistics_data( project_properties, catalog, default_pipeline, pipelines ) _send_heap_event( event_name="Kedro Project Statistics", - identity=hashed_username, + identity=user_uuid, properties=project_statistics_properties, ) @@ -195,10 +195,10 @@ def _is_known_ci_env(known_ci_env_var_keys=KNOWN_CI_ENV_VAR_KEYS): return any(os.getenv(key) for key in known_ci_env_var_keys) -def _get_project_properties(hashed_username: str, project_path: str) -> Dict: +def _get_project_properties(user_uuid: str, project_path: str) -> Dict: hashed_package_name = _hash(PACKAGE_NAME) if PACKAGE_NAME else "undefined" properties = { - "username": hashed_username, + "username": user_uuid, "package_name": hashed_package_name, "project_version": KEDRO_VERSION, "telemetry_version": TELEMETRY_VERSION, diff --git a/kedro-telemetry/tests/test_plugin.py b/kedro-telemetry/tests/test_plugin.py index 0e53954da..96bd89bdd 100644 --- a/kedro-telemetry/tests/test_plugin.py +++ b/kedro-telemetry/tests/test_plugin.py @@ -132,7 +132,7 @@ def test_before_command_run(self, mocker, fake_metadata): mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") @@ -140,7 +140,7 @@ def test_before_command_run(self, mocker, fake_metadata): command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) expected_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -157,12 +157,12 @@ def test_before_command_run(self, mocker, fake_metadata): expected_calls = [ mocker.call( event_name="Command run: --version", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ), mocker.call( event_name="CLI command", - identity="hashed_username", + identity="user_uuid", properties=generic_properties, ), ] @@ -178,7 +178,7 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") @@ -188,7 +188,7 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): command_args = ["--version"] telemetry_hook.before_command_run(fake_metadata, command_args) expected_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -207,12 +207,12 @@ def test_before_command_run_with_tools(self, mocker, fake_metadata): expected_calls = [ mocker.call( event_name="Command run: --version", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ), mocker.call( event_name="CLI command", - identity="hashed_username", + identity="user_uuid", properties=generic_properties, ), ] @@ -228,7 +228,7 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") @@ -236,7 +236,7 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): command_args = [] telemetry_hook.before_command_run(fake_metadata, command_args) expected_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -253,12 +253,12 @@ def test_before_command_run_empty_args(self, mocker, fake_metadata): expected_calls = [ mocker.call( event_name="Command run: kedro", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ), mocker.call( event_name="CLI command", - identity="hashed_username", + identity="user_uuid", properties=generic_properties, ), ] @@ -479,7 +479,7 @@ def test_after_context_created_without_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") mocker.patch("kedro_telemetry.plugin.open") @@ -491,7 +491,7 @@ def test_after_context_created_without_kedro_run( # noqa: PLR0913 telemetry_hook.after_catalog_created(fake_catalog) project_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -508,7 +508,7 @@ def test_after_context_created_without_kedro_run( # noqa: PLR0913 expected_call = mocker.call( event_name="Kedro Project Statistics", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ) @@ -535,7 +535,7 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") mocker.patch("kedro_telemetry.plugin.toml.load") @@ -550,7 +550,7 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 telemetry_hook.after_catalog_created(fake_catalog) project_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -567,7 +567,7 @@ def test_after_context_created_with_kedro_run( # noqa: PLR0913 expected_call = mocker.call( event_name="Kedro Project Statistics", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ) @@ -594,7 +594,7 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 mocker.patch("kedro_telemetry.plugin.PACKAGE_NAME", "spaceflights") mocker.patch( "kedro_telemetry.plugin._get_or_create_uuid", - return_value="hashed_username", + return_value="user_uuid", ) mocked_heap_call = mocker.patch("kedro_telemetry.plugin._send_heap_event") mocker.patch("builtins.open", mocker.mock_open(read_data=MOCK_PYPROJECT_TOOLS)) @@ -611,7 +611,7 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 telemetry_hook.after_catalog_created(fake_catalog) project_properties = { - "username": "hashed_username", + "username": "user_uuid", "package_name": "digested", "project_version": kedro_version, "telemetry_version": TELEMETRY_VERSION, @@ -630,7 +630,7 @@ def test_after_context_created_with_kedro_run_and_tools( # noqa: PLR0913 expected_call = mocker.call( event_name="Kedro Project Statistics", - identity="hashed_username", + identity="user_uuid", properties=expected_properties, ) From 0c706f0a1ed211d27a8f9813193be963d7248932 Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 13 Mar 2024 01:51:34 -0300 Subject: [PATCH 15/16] Small fixes Signed-off-by: lrcouto --- kedro-telemetry/RELEASE.md | 2 +- kedro-telemetry/kedro_telemetry/plugin.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kedro-telemetry/RELEASE.md b/kedro-telemetry/RELEASE.md index 136fc5d83..08471d07c 100644 --- a/kedro-telemetry/RELEASE.md +++ b/kedro-telemetry/RELEASE.md @@ -1,5 +1,5 @@ # Upcoming release -* Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. (On release 0.4) +* Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. # Release 0.3.2 * Updated plugin to share if a project is being run in a ci environment. diff --git a/kedro-telemetry/kedro_telemetry/plugin.py b/kedro-telemetry/kedro_telemetry/plugin.py index 84371c032..4e8c90401 100644 --- a/kedro-telemetry/kedro_telemetry/plugin.py +++ b/kedro-telemetry/kedro_telemetry/plugin.py @@ -114,7 +114,7 @@ def before_command_run( return # get KedroCLI and its structure from actual project root - cli = KedroCLI(project_path=Path.cwd()) + cli = KedroCLI(project_path=project_metadata.project_path) cli_struct = _get_cli_structure(cli_obj=cli, get_help=False) masked_command_args = _mask_kedro_cli( cli_struct=cli_struct, command_args=command_args From b1bca739a1aaf49525d2e48fe109155070152a7b Mon Sep 17 00:00:00 2001 From: lrcouto Date: Wed, 13 Mar 2024 10:25:24 -0300 Subject: [PATCH 16/16] Make release note more explicit Signed-off-by: lrcouto --- kedro-telemetry/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kedro-telemetry/RELEASE.md b/kedro-telemetry/RELEASE.md index 08471d07c..a4201d32e 100644 --- a/kedro-telemetry/RELEASE.md +++ b/kedro-telemetry/RELEASE.md @@ -1,4 +1,4 @@ -# Upcoming release +# Upcoming release 0.4.0 * Updated the plugin to generate an unique UUID for each user of `kedro-telemetry`. # Release 0.3.2