Skip to content

Commit 03711c9

Browse files
authored
Merge pull request #15 from Azure/remove_chardet
Improve unicode support in msrest
2 parents 78d9329 + a98d9e1 commit 03711c9

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

msrest/serialization.py

+15-24
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
except ImportError:
3838
from urllib.parse import quote
3939

40-
import chardet
4140
import isodate
4241

4342
from .exceptions import (
@@ -493,10 +492,10 @@ def serialize_dict(self, attr, dict_type, **kwargs):
493492
serialized = {}
494493
for key, value in attr.items():
495494
try:
496-
serialized[str(key)] = self.serialize_data(
495+
serialized[self.serialize_unicode(key)] = self.serialize_data(
497496
value, dict_type, **kwargs)
498497
except ValueError:
499-
serialized[str(key)] = None
498+
serialized[self.serialize_unicode(key)] = None
500499
return serialized
501500

502501
def serialize_object(self, attr, **kwargs):
@@ -518,10 +517,10 @@ def serialize_object(self, attr, **kwargs):
518517
serialized = {}
519518
for key, value in attr.items():
520519
try:
521-
serialized[str(key)] = self.serialize_object(
520+
serialized[self.serialize_unicode(key)] = self.serialize_object(
522521
value, **kwargs)
523522
except ValueError:
524-
serialized[str(key)] = None
523+
serialized[self.serialize_unicode(key)] = None
525524
return serialized
526525

527526
if obj_type == list:
@@ -792,25 +791,17 @@ def _unpack_content(self, raw_data):
792791
be returned.
793792
"""
794793
if raw_data and isinstance(raw_data, bytes):
795-
data = raw_data.decode(
796-
encoding=chardet.detect(raw_data)['encoding'])
794+
data = raw_data.decode(encoding='utf-8')
797795
else:
798796
data = raw_data
799797

800-
if hasattr(raw_data, 'content'):
801-
if not raw_data.content:
798+
try:
799+
# This is a requests.Response, json valid if nothing fail
800+
if not raw_data.text:
802801
return None
803-
804-
if isinstance(raw_data.content, bytes):
805-
encoding = chardet.detect(raw_data.content)["encoding"]
806-
data = raw_data.content.decode(encoding=encoding)
807-
else:
808-
data = raw_data.content
809-
try:
810-
return json.loads(data)
811-
except (ValueError, TypeError):
812-
return data
813-
802+
return json.loads(raw_data.text)
803+
except (ValueError, TypeError, AttributeError):
804+
pass
814805
return data
815806

816807
def _instantiate_model(self, response, attrs):
@@ -901,9 +892,9 @@ def deserialize_dict(self, attr, dict_type):
901892
:rtype: dict
902893
"""
903894
if isinstance(attr, list):
904-
return {str(x['key']): self.deserialize_data(
895+
return {x['key']: self.deserialize_data(
905896
x['value'], dict_type) for x in attr}
906-
return {str(k): self.deserialize_data(
897+
return {k: self.deserialize_data(
907898
v, dict_type) for k, v in attr.items()}
908899

909900
def deserialize_object(self, attr, **kwargs):
@@ -926,10 +917,10 @@ def deserialize_object(self, attr, **kwargs):
926917
deserialized = {}
927918
for key, value in attr.items():
928919
try:
929-
deserialized[str(key)] = self.deserialize_object(
920+
deserialized[key] = self.deserialize_object(
930921
value, **kwargs)
931922
except ValueError:
932-
deserialized[str(key)] = None
923+
deserialized[key] = None
933924
return deserialized
934925

935926
if obj_type == list:

setup.py

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
"requests_oauthlib>=0.5.0",
5353
"isodate>=0.5.4",
5454
"certifi>=2015.9.6.2",
55-
"chardet>=2.3.0",
5655
],
5756
extras_require={
5857
":python_version<'3.4'": ['enum34>=1.0.4'],

test/unittest_serialization.py

+45-35
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ def test_response(self):
125125
}
126126

127127
resp = mock.create_autospec(Response)
128-
resp.content = json.dumps(data)
128+
resp.text = json.dumps(data)
129+
resp.encoding = 'utf-8'
129130
model = self.d('GenericResource', resp)
130131
self.assertEqual(model.properties['platformFaultDomainCount'], 3)
131132
self.assertEqual(model.location, 'westus')
@@ -749,37 +750,38 @@ def test_non_obj_deserialization(self):
749750
Test direct deserialization of simple types.
750751
"""
751752
response_data = mock.create_autospec(Response)
753+
response_data.encoding = 'utf-8'
752754

753-
response_data.content = json.dumps({})
755+
response_data.text = ''
754756
response = self.d("[str]", response_data)
755757
self.assertIsNone(response)
756758

757-
response_data.content = ""
759+
response_data.text = json.dumps({})
758760
response = self.d("[str]", response_data)
759761
self.assertIsNone(response)
760762

761-
response_data.content = None
763+
response_data.text = ""
762764
response = self.d("[str]", response_data)
763765
self.assertIsNone(response)
764766

765767
message = ["a","b","b"]
766-
response_data.content = json.dumps(message)
768+
response_data.text = json.dumps(message)
767769
response = self.d("[str]", response_data)
768770
self.assertEqual(response, message)
769771

770-
response_data.content = json.dumps(12345)
772+
response_data.text = json.dumps(12345)
771773
with self.assertRaises(DeserializationError):
772774
response = self.d("[str]", response_data)
773775

774-
response_data.content = True
776+
response_data.text = 'true'
775777
response = self.d('bool', response_data)
776778
self.assertEqual(response, True)
777779

778-
response_data.content = json.dumps(1)
780+
response_data.text = json.dumps(1)
779781
response = self.d('bool', response_data)
780782
self.assertEqual(response, True)
781783

782-
response_data.content = json.dumps("true1")
784+
response_data.text = json.dumps("true1")
783785
with self.assertRaises(DeserializationError):
784786
response = self.d('bool', response_data)
785787

@@ -790,7 +792,8 @@ def test_obj_with_no_attr(self):
790792
"""
791793

792794
response_data = mock.create_autospec(Response)
793-
response_data.content = json.dumps({"a":"b"})
795+
response_data.text = json.dumps({"a":"b"})
796+
response_data.encoding = 'utf-8'
794797

795798
class EmptyResponse(Model):
796799
_attribute_map = {}
@@ -805,7 +808,8 @@ def test_obj_with_malformed_map(self):
805808
Test deserializing an object with a malformed attributes_map.
806809
"""
807810
response_data = mock.create_autospec(Response)
808-
response_data.content = json.dumps({"a":"b"})
811+
response_data.text = json.dumps({"a":"b"})
812+
response_data.encoding = 'utf-8'
809813

810814
class BadResponse(Model):
811815
_attribute_map = None
@@ -845,7 +849,7 @@ def test_attr_none(self):
845849

846850
response_data.status_code = None
847851
response_data.headers = {'client-request-id':None, 'etag':None}
848-
response_data.content = None
852+
response_data.text = ''
849853

850854
response = self.d(self.TestObj, response_data)
851855
self.assertIsNone(response)
@@ -857,19 +861,20 @@ def test_attr_int(self):
857861
response_data = mock.create_autospec(Response)
858862
response_data.status_code = 200
859863
response_data.headers = {'client-request-id':"123", 'etag':456.3}
860-
response_data.content = None
864+
response_data.text = ''
861865

862866
response = self.d(self.TestObj, response_data)
863867
self.assertIsNone(response)
864868

865869
message = {'AttrB':'1234'}
866-
response_data.content = json.dumps(message)
870+
response_data.text = json.dumps(message)
871+
response_data.encoding = 'utf-8'
867872
response = self.d(self.TestObj, response_data)
868873
self.assertTrue(hasattr(response, 'attr_b'))
869874
self.assertEqual(response.attr_b, int(message['AttrB']))
870875

871876
with self.assertRaises(DeserializationError):
872-
response_data.content = json.dumps({'AttrB':'NotANumber'})
877+
response_data.text = json.dumps({'AttrB':'NotANumber'})
873878
response = self.d(self.TestObj, response_data)
874879

875880
def test_attr_str(self):
@@ -880,23 +885,24 @@ def test_attr_str(self):
880885
response_data = mock.create_autospec(Response)
881886
response_data.status_code = 200
882887
response_data.headers = {'client-request-id': 'a', 'etag': 'b'}
883-
response_data.content = json.dumps(message)
888+
response_data.text = json.dumps(message)
889+
response_data.encoding = 'utf-8'
884890

885891
response = self.d(self.TestObj, response_data)
886892
self.assertTrue(hasattr(response, 'attr_a'))
887893
self.assertEqual(response.attr_a, message['id'])
888894

889895
message = {'id':1234}
890-
response_data.content = json.dumps(message)
896+
response_data.text = json.dumps(message)
891897
response = self.d(self.TestObj, response_data)
892898
self.assertEqual(response.attr_a, str(message['id']))
893899

894900
message = {'id':list()}
895-
response_data.content = json.dumps(message)
901+
response_data.text = json.dumps(message)
896902
response = self.d(self.TestObj, response_data)
897903
self.assertEqual(response.attr_a, str(message['id']))
898904

899-
response_data.content = json.dumps({'id':None})
905+
response_data.text = json.dumps({'id':None})
900906
response = self.d(self.TestObj, response_data)
901907
self.assertEqual(response.attr_a, None)
902908

@@ -907,22 +913,23 @@ def test_attr_bool(self):
907913
response_data = mock.create_autospec(Response)
908914
response_data.status_code = 200
909915
response_data.headers = {'client-request-id': 'a', 'etag': 'b'}
910-
response_data.content = json.dumps({'Key_C':True})
916+
response_data.text = json.dumps({'Key_C':True})
917+
response_data.encoding = 'utf-8'
911918

912919
response = self.d(self.TestObj, response_data)
913920

914921
self.assertTrue(hasattr(response, 'attr_c'))
915922
self.assertEqual(response.attr_c, True)
916923

917-
response_data.content = json.dumps({'Key_C':[]})
924+
response_data.text = json.dumps({'Key_C':[]})
918925
with self.assertRaises(DeserializationError):
919926
response = self.d(self.TestObj, response_data)
920927

921-
response_data.content = json.dumps({'Key_C':0})
928+
response_data.text = json.dumps({'Key_C':0})
922929
response = self.d(self.TestObj, response_data)
923930
self.assertEqual(response.attr_c, False)
924931

925-
response_data.content = json.dumps({'Key_C':"value"})
932+
response_data.text = json.dumps({'Key_C':"value"})
926933
with self.assertRaises(DeserializationError):
927934
response = self.d(self.TestObj, response_data)
928935

@@ -933,30 +940,31 @@ def test_attr_list_simple(self):
933940
response_data = mock.create_autospec(Response)
934941
response_data.status_code = 200
935942
response_data.headers = {'client-request-id': 'a', 'etag': 'b'}
936-
response_data.content = json.dumps({'AttrD': []})
943+
response_data.text = json.dumps({'AttrD': []})
944+
response_data.encoding = 'utf-8'
937945

938946
response = self.d(self.TestObj, response_data)
939947
deserialized_list = [d for d in response.attr_d]
940948
self.assertEqual(deserialized_list, [])
941949

942950
message = {'AttrD': [1,2,3]}
943-
response_data.content = json.dumps(message)
951+
response_data.text = json.dumps(message)
944952
response = self.d(self.TestObj, response_data)
945953
deserialized_list = [d for d in response.attr_d]
946954
self.assertEqual(deserialized_list, message['AttrD'])
947955

948956
message = {'AttrD': ["1","2","3"]}
949-
response_data.content = json.dumps(message)
957+
response_data.text = json.dumps(message)
950958
response = self.d(self.TestObj, response_data)
951959
deserialized_list = [d for d in response.attr_d]
952960
self.assertEqual(deserialized_list, [int(i) for i in message['AttrD']])
953961

954-
response_data.content = json.dumps({'AttrD': ["test","test2","test3"]})
962+
response_data.text = json.dumps({'AttrD': ["test","test2","test3"]})
955963
with self.assertRaises(DeserializationError):
956964
response = self.d(self.TestObj, response_data)
957965
deserialized_list = [d for d in response.attr_d]
958966

959-
response_data.content = json.dumps({'AttrD': "NotAList"})
967+
response_data.text = json.dumps({'AttrD': "NotAList"})
960968
with self.assertRaises(DeserializationError):
961969
response = self.d(self.TestObj, response_data)
962970
deserialized_list = [d for d in response.attr_d]
@@ -968,41 +976,42 @@ def test_attr_list_in_list(self):
968976
response_data = mock.create_autospec(Response)
969977
response_data.status_code = 200
970978
response_data.headers = {'client-request-id': 'a', 'etag': 'b'}
971-
response_data.content = json.dumps({'AttrF':[]})
979+
response_data.text = json.dumps({'AttrF':[]})
980+
response_data.encoding = 'utf-8'
972981

973982
response = self.d(self.TestObj, response_data)
974983
self.assertTrue(hasattr(response, 'attr_f'))
975984
self.assertEqual(response.attr_f, [])
976985

977-
response_data.content = json.dumps({'AttrF':None})
986+
response_data.text = json.dumps({'AttrF':None})
978987

979988
response = self.d(self.TestObj, response_data)
980989
self.assertTrue(hasattr(response, 'attr_f'))
981990
self.assertEqual(response.attr_f, None)
982991

983-
response_data.content = json.dumps({})
992+
response_data.text = json.dumps({})
984993

985994
response = self.d(self.TestObj, response_data)
986995

987996
self.assertTrue(hasattr(response, 'attr_f'))
988997
self.assertEqual(response.attr_f, None)
989998

990999
message = {'AttrF':[[]]}
991-
response_data.content = json.dumps(message)
1000+
response_data.text = json.dumps(message)
9921001

9931002
response = self.d(self.TestObj, response_data)
9941003
self.assertTrue(hasattr(response, 'attr_f'))
9951004
self.assertEqual(response.attr_f, message['AttrF'])
9961005

9971006
message = {'AttrF':[[1,2,3], ['a','b','c']]}
998-
response_data.content = json.dumps(message)
1007+
response_data.text = json.dumps(message)
9991008

10001009
response = self.d(self.TestObj, response_data)
10011010
self.assertTrue(hasattr(response, 'attr_f'))
10021011
self.assertEqual(response.attr_f, [[str(i) for i in k] for k in message['AttrF']])
10031012

10041013
with self.assertRaises(DeserializationError):
1005-
response_data.content = json.dumps({'AttrF':[1,2,3]})
1014+
response_data.text = json.dumps({'AttrF':[1,2,3]})
10061015
response = self.d(self.TestObj, response_data)
10071016

10081017
def test_attr_list_complex(self):
@@ -1020,7 +1029,8 @@ class CmplxTestObj(Model):
10201029
response_data = mock.create_autospec(Response)
10211030
response_data.status_code = 200
10221031
response_data.headers = {'client-request-id': 'a', 'etag': 'b'}
1023-
response_data.content = json.dumps({"id":[{"ABC": "123"}]})
1032+
response_data.text = json.dumps({"id":[{"ABC": "123"}]})
1033+
response_data.encoding = 'utf-8'
10241034

10251035
d = Deserializer({'ListObj':ListObj})
10261036
response = d(CmplxTestObj, response_data)

0 commit comments

Comments
 (0)