From 06c967658cc583330145e7c038db7da8e5aeaaea Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 31 Mar 2023 16:37:29 -0600 Subject: [PATCH 1/2] snowflake add support for private_key_passphrase --- data_diff/dbt.py | 5 +++-- tests/test_dbt.py | 27 ++++++++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/data_diff/dbt.py b/data_diff/dbt.py index cfd975e3..500e53cf 100644 --- a/data_diff/dbt.py +++ b/data_diff/dbt.py @@ -480,8 +480,8 @@ def set_connection(self): credentials, conn_type = self._get_connection_creds() if conn_type == "snowflake": - if credentials.get("authenticator") is not None or credentials.get("private_key_passphrase") is not None: - raise Exception("Federated authentication and key/pair with passphrase is not yet supported for Snowflake.") + if credentials.get("authenticator") is not None: + raise Exception("Federated authentication is not yet supported for Snowflake.") conn_info = { "driver": conn_type, "user": credentials.get("user"), @@ -498,6 +498,7 @@ def set_connection(self): if credentials.get("password") is not None: raise Exception("Cannot use password and key at the same time") conn_info["key"] = credentials.get("private_key_path") + conn_info["private_key_passphrase"] = credentials.get("private_key_passphrase") elif credentials.get("password") is not None: conn_info["password"] = credentials.get("password") else: diff --git a/tests/test_dbt.py b/tests/test_dbt.py index 49d96688..7a5b8140 100644 --- a/tests/test_dbt.py +++ b/tests/test_dbt.py @@ -166,6 +166,22 @@ def test_set_connection_snowflake_success_key(self): self.assertEqual(mock_self.connection.get("key"), expected_credentials["private_key_path"]) self.assertEqual(mock_self.requires_upper, True) + def test_set_connection_snowflake_success_key_and_passphrase(self): + expected_driver = "snowflake" + expected_credentials = {"user": "user", "private_key_path": "private_key_path", "private_key_passphrase": "private_key_passphrase"} + mock_self = Mock() + mock_self._get_connection_creds.return_value = (expected_credentials, expected_driver) + + DbtParser.set_connection(mock_self) + + self.assertIsInstance(mock_self.connection, dict) + self.assertEqual(mock_self.connection.get("driver"), expected_driver) + self.assertEqual(mock_self.connection.get("user"), expected_credentials["user"]) + self.assertEqual(mock_self.connection.get("password"), None) + self.assertEqual(mock_self.connection.get("key"), expected_credentials["private_key_path"]) + self.assertEqual(mock_self.connection.get("private_key_passphrase"), expected_credentials["private_key_passphrase"]) + self.assertEqual(mock_self.requires_upper, True) + def test_set_connection_snowflake_no_key_or_password(self): expected_driver = "snowflake" expected_credentials = {"user": "user"} @@ -199,17 +215,6 @@ def test_set_connection_snowflake_key_and_password(self): self.assertNotIsInstance(mock_self.connection, dict) - def test_set_connection_snowflake_private_key_passphrase(self): - expected_driver = "snowflake" - expected_credentials = {"user": "user", "private_key_passphrase": "private_key_passphrase"} - mock_self = Mock() - mock_self._get_connection_creds.return_value = (expected_credentials, expected_driver) - - with self.assertRaises(Exception): - DbtParser.set_connection(mock_self) - - self.assertNotIsInstance(mock_self.connection, dict) - def test_set_connection_bigquery_success(self): expected_driver = "bigquery" expected_credentials = { From 4d0f5066f950a090e9116c755a2d3745e32c9831 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 3 Apr 2023 09:36:36 -0600 Subject: [PATCH 2/2] increase sqeleton to 0.0.8 --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5bb97d78..eb3c8e60 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "agate" @@ -2077,14 +2077,14 @@ secure-local-storage = ["keyring (!=16.1.0,<24.0.0)"] [[package]] name = "sqeleton" -version = "0.0.7" +version = "0.0.8" description = "Python library for querying SQL databases" category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "sqeleton-0.0.7-py3-none-any.whl", hash = "sha256:9e16deb240e675af3facdd57de0264546507507728cad1f6fdba3922428891f4"}, - {file = "sqeleton-0.0.7.tar.gz", hash = "sha256:cbfb7f2689ad54b1cb528e67d0954ac1a18ab1f1f757883b62f4e5c9dce0b468"}, + {file = "sqeleton-0.0.8-py3-none-any.whl", hash = "sha256:43bf338a0d932c60663da1f5c13d076ef3474d67704fec3acfea4d4dc250eef1"}, + {file = "sqeleton-0.0.8.tar.gz", hash = "sha256:f7291285733edbb158e614eb9c866b1625c6398b53df3aaddde69c6df16a32e4"}, ] [package.dependencies] @@ -2362,4 +2362,4 @@ vertica = [] [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "b3c5efa8d2648d5847390a3e9dfd8e66828f6e352df2258361184c6abe6be08e" +content-hash = "c12f1818c8cc938a5950c70f1610226ad03d82447e50845bda6a720ecb84b69b" diff --git a/pyproject.toml b/pyproject.toml index d7330bd3..985e4d5f 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ dsnparse = "*" click = "^8.1" rich = "*" toml = "^0.10.2" -sqeleton = "^0.0.7" +sqeleton = "0.0.8" mysql-connector-python = {version="8.0.29", optional=true} psycopg2 = {version="*", optional=true} snowflake-connector-python = {version="^2.7.2", optional=true}