Skip to content

Commit 017848e

Browse files
SNOW-2027116 Allow for UUID encoding in SnowflakeRestful interface (#2254)
1 parent 5e62183 commit 017848e

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
@@ -353,6 +353,15 @@ def close(self) -> None:
353353
self._idle_sessions.clear()
354354

355355

356+
# Customizable JSONEncoder to support additional types.
357+
class SnowflakeRestfulJsonEncoder(json.JSONEncoder):
358+
def default(self, o):
359+
if isinstance(o, uuid.UUID):
360+
return str(o)
361+
362+
return super().default(o)
363+
364+
356365
class SnowflakeRestful:
357366
"""Snowflake Restful class."""
358367

@@ -499,7 +508,7 @@ def request(
499508
return self._post_request(
500509
url,
501510
headers,
502-
json.dumps(body),
511+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
503512
token=self.token,
504513
_no_results=_no_results,
505514
timeout=timeout,
@@ -561,7 +570,7 @@ def _token_request(self, request_type):
561570
ret = self._post_request(
562571
url,
563572
headers,
564-
json.dumps(body),
573+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
565574
token=header_token,
566575
)
567576
if ret.get("success") and ret.get("data", {}).get("sessionToken"):
@@ -659,7 +668,7 @@ def delete_session(self, retry: bool = False) -> None:
659668
ret = self._post_request(
660669
url,
661670
headers,
662-
json.dumps(body),
671+
json.dumps(body, cls=SnowflakeRestfulJsonEncoder),
663672
token=self.token,
664673
timeout=5,
665674
no_retry=True,

test/unit/test_network.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
#!/usr/bin/env python
22
import io
3+
import json
34
import unittest.mock
5+
import uuid
46
from test.unit.mock_utils import mock_connection
57

68
import pytest
79

10+
from src.snowflake.connector.network import SnowflakeRestfulJsonEncoder
11+
812
try:
913
from snowflake.connector import Error, InterfaceError
1014
from snowflake.connector.network import SnowflakeRestful
@@ -63,3 +67,20 @@ def test_fetch():
6367
# if no retry is set to False, the function raises an InterfaceError
6468
with pytest.raises(InterfaceError) as exc:
6569
assert rest.fetch(**default_parameters, no_retry=False)
70+
71+
72+
@pytest.mark.parametrize(
73+
"u",
74+
[
75+
uuid.uuid1(),
76+
uuid.uuid3(uuid.NAMESPACE_URL, "www.snowflake.com"),
77+
uuid.uuid4(),
78+
uuid.uuid5(uuid.NAMESPACE_URL, "www.snowflake.com"),
79+
],
80+
)
81+
def test_json_serialize_uuid(u):
82+
expected = f'{{"u": "{u}", "a": 42}}'
83+
84+
assert (json.dumps(u, cls=SnowflakeRestfulJsonEncoder)) == f'"{u}"'
85+
86+
assert json.dumps({"u": u, "a": 42}, cls=SnowflakeRestfulJsonEncoder) == expected

0 commit comments

Comments
 (0)