From b690755b849847c89edc6186fc55f44ac80a132d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 11 Mar 2016 10:24:19 +0100 Subject: [PATCH] Made utils.merge_dict None-safe, and removed lots of "thing or {}" --- pillarsdk/api.py | 16 +++++++--------- pillarsdk/utils.py | 9 +++++++++ tests/test_utils.py | 9 +++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/pillarsdk/api.py b/pillarsdk/api.py index cea9605..9ad41b2 100644 --- a/pillarsdk/api.py +++ b/pillarsdk/api.py @@ -30,7 +30,7 @@ class Api(object): password='PASSWORD' ) """ - kwargs = utils.merge_dict(options or {}, kwargs) + kwargs = utils.merge_dict(options, kwargs) self.endpoint = kwargs["endpoint"] self.username = kwargs["username"] @@ -50,7 +50,6 @@ class Api(object): token=kwargs["token"] if kwargs.get("token") else None) return Api._api_singleton - def basic_auth(self, token=None): """Returns base64 encoded token. Used to encode credentials for retrieving the token. @@ -92,7 +91,7 @@ class Api(object): :param files: Dictionary of files to be uploaded via POST """ - http_headers = utils.merge_dict(self.headers(), headers or {}) + http_headers = utils.merge_dict(self.headers(), headers) if http_headers.get('Pillar-Request-Id'): logging.info("Pillar-Request-Id: {0}".format(http_headers['Pillar-Request-Id'])) @@ -122,7 +121,6 @@ class Api(object): """ response = requests.request(method, url, **kwargs) - try: error = self.handle_response(response, response.content.decode('utf-8')) @@ -186,28 +184,28 @@ class Api(object): """Make GET request """ return self.request(utils.join_url(self.endpoint, action), 'GET', - headers=headers or {}) + headers=headers) def post(self, action, params=None, headers=None, files=None): """Make POST request """ return self.request(utils.join_url(self.endpoint, action), 'POST', - body=params or {}, headers=headers or {}, files=files) + body=params, headers=headers, files=files) def put(self, action, params=None, headers=None): """Make PUT request """ return self.request(utils.join_url(self.endpoint, action), 'PUT', - body=params or {}, headers=headers or {}) + body=params, headers=headers) def patch(self, action, params=None, headers=None, files=None): """Make PATCH request """ return self.request(utils.join_url(self.endpoint, action), 'PATCH', - body=params or {}, headers=headers or {}, files=files) + body=params, headers=headers, files=files) def delete(self, action, headers=None): """Make DELETE request """ return self.request(utils.join_url(self.endpoint, action), 'DELETE', - headers=headers or {}) + headers=headers) diff --git a/pillarsdk/utils.py b/pillarsdk/utils.py index f7030a7..110ca5a 100644 --- a/pillarsdk/utils.py +++ b/pillarsdk/utils.py @@ -72,9 +72,18 @@ def merge_dict(data, *override): >>> md = merge_dict({"foo": "bar"}, {1: 2}, {"foo1": "bar2"}) >>> md == {1: 2, 'foo': 'bar', 'foo1': 'bar2'} True + >>> merge_dict({'foo': 'bar'}, None) + {'foo': 'bar'} + >>> merge_dict(None, {'foo': 'bar'}) + {'foo': 'bar'} + >>> merge_dict(None, None) + {} """ + result = {} for current_dict in (data,) + override: + if current_dict is None: + continue result.update(current_dict) return result diff --git a/tests/test_utils.py b/tests/test_utils.py index 5c496c2..3d7abad 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -41,3 +41,12 @@ class PillarUtilsTests(unittest.TestCase): # Test unicode value in string self.assertEqual('url?dict=' + quote_plus(r'{"food": "\u0e1c\u0e31\u0e14\u0e44\u0e17\u0e22"}'), utils.join_url_params('url', {'dict': {'food': 'ผัดไทย'}})) + + def test_merge_dict(self): + self.assertEqual({1: 2, 'foo': 'bar', 'foo1': 'bar2'}, + utils.merge_dict({"foo": "bar"}, {1: 2}, {"foo1": "bar2"})) + + self.assertEqual({'foo': 'bar'}, utils.merge_dict({'foo': 'bar'}, None)) + + self.assertEqual({'foo': 'bar'}, utils.merge_dict(None, {'foo': 'bar'})) + self.assertEqual({}, utils.merge_dict(None, None))