File tree Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Original file line number Diff line number Diff 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+
356365class 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 ,
Original file line number Diff line number Diff line change 11#!/usr/bin/env python
22import io
3+ import json
34import unittest .mock
5+ import uuid
46from test .unit .mock_utils import mock_connection
57
68import pytest
79
10+ from src .snowflake .connector .network import SnowflakeRestfulJsonEncoder
11+
812try :
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
You can’t perform that action at this time.
0 commit comments