Skip to content

Commit 34a873b

Browse files
sfc-gh-lspiegelbergsfc-gh-pczajka
authored andcommitted
SNOW-2027116 Allow for UUID encoding in SnowflakeRestful interface (#2254)
1 parent 0dc54a6 commit 34a873b

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/snowflake/connector/network.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,15 @@ def close(self) -> None:
357357
self._idle_sessions.clear()
358358

359359

360+
# Customizable JSONEncoder to support additional types.
361+
class SnowflakeRestfulJsonEncoder(json.JSONEncoder):
362+
def default(self, o):
363+
if isinstance(o, uuid.UUID):
364+
return str(o)
365+
366+
return super().default(o)
367+
368+
360369
class SnowflakeRestful:
361370
"""Snowflake Restful class."""
362371

@@ -503,7 +512,7 @@ def request(
503512
return self._post_request(
504513
url,
505514
headers,
506-
json.dumps(body),
515+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
507516
token=self.token,
508517
_no_results=_no_results,
509518
timeout=timeout,
@@ -565,7 +574,7 @@ def _token_request(self, request_type):
565574
ret = self._post_request(
566575
url,
567576
headers,
568-
json.dumps(body),
577+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
569578
token=header_token,
570579
)
571580
if ret.get("success") and ret.get("data", {}).get("sessionToken"):
@@ -663,7 +672,7 @@ def delete_session(self, retry: bool = False) -> None:
663672
ret = self._post_request(
664673
url,
665674
headers,
666-
json.dumps(body),
675+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
667676
token=self.token,
668677
timeout=5,
669678
no_retry=True,

test/unit/test_network.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
#
55

66
import io
7+
import json
78
import unittest.mock
9+
import uuid
810
from test.unit.mock_utils import mock_connection
911

1012
import pytest
1113

14+
from src.snowflake.connector.network import SnowflakeRestfulJsonEncoder
15+
1216
try:
1317
from snowflake.connector import Error, InterfaceError
1418
from snowflake.connector.network import SnowflakeRestful
@@ -67,3 +71,20 @@ def test_fetch():
6771
# if no retry is set to False, the function raises an InterfaceError
6872
with pytest.raises(InterfaceError) as exc:
6973
assert rest.fetch(**default_parameters, no_retry=False)
74+
75+
76+
@pytest.mark.parametrize(
77+
"u",
78+
[
79+
uuid.uuid1(),
80+
uuid.uuid3(uuid.NAMESPACE_URL, "www.snowflake.com"),
81+
uuid.uuid4(),
82+
uuid.uuid5(uuid.NAMESPACE_URL, "www.snowflake.com"),
83+
],
84+
)
85+
def test_json_serialize_uuid(u):
86+
expected = f'{{"u": "{u}", "a": 42}}'
87+
88+
assert (json.dumps(u, cls=SnowflakeRestfulJsonEncoder)) == f'"{u}"'
89+
90+
assert json.dumps({"u": u, "a": 42}, cls=SnowflakeRestfulJsonEncoder) == expected

0 commit comments

Comments
 (0)