From a4d61c5fe534eb9995092fa4b9b85c35b475fe09 Mon Sep 17 00:00:00 2001 From: Halil Kaya Date: Mon, 30 May 2016 21:46:10 +0300 Subject: [PATCH 1/5] add and remove methods added --- kaptan/__init__.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/kaptan/__init__.py b/kaptan/__init__.py index b8a4fdb..18d7a6e 100644 --- a/kaptan/__init__.py +++ b/kaptan/__init__.py @@ -125,6 +125,53 @@ def get(self, key=None, default=SENTINEL): return default raise + def add(self, key=None, value=None, replace=False): + if not key: + raise RuntimeError("Unable to find key") + + current_data = self.configuration_data + keys = key.split('.') + new_key = keys[0] + is_key_exist = False + if len(keys) > 1: + new_key = keys[-1] + del keys[-1] + for chunk in keys: + try: + if not replace and new_key in current_data[chunk]: + is_key_exist = True + current_data = current_data[chunk] + except KeyError: + current_data[chunk] = {} + current_data = current_data[chunk] + try: + if replace: + current_data[new_key] = value + elif isinstance(current_data[new_key], list): + current_data[new_key].append(value) + elif is_key_exist: + raise RuntimeError("Key %s already exist" % new_key) + except KeyError as e: + current_data[new_key] = value + + return self + + def remove(self, key=None): + if not key: + raise RuntimeError("Unable to find key") + + current_data = self.configuration_data + keys = key.split('.') + exact_key = keys[0] + if len(keys) > 1: + exact_key = keys[-1] + del keys[-1] + for chunk in keys: + current_data = current_data[chunk] + del current_data[exact_key] + + return self + def export(self, handler=None, **kwargs): if not handler: handler_class = self.handler From ccded6adb7068d0842be63782274b9b5f6c52812 Mon Sep 17 00:00:00 2001 From: Halil Kaya Date: Mon, 30 May 2016 23:01:07 +0300 Subject: [PATCH 2/5] Test cases added for add and remove --- tests/test_kaptan.py | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/test_kaptan.py b/tests/test_kaptan.py index a08626a..e7cc388 100644 --- a/tests/test_kaptan.py +++ b/tests/test_kaptan.py @@ -86,6 +86,59 @@ def test_lists_on_configuration(): assert config.get('servers.0') == 'redis1' +def test_add_to_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'server': 'redis' + }) + config.add('uptime', 99.9) + + assert config.get('uptime') == 99.9 + + +def test_add_to_list_on_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'servers': ['redis1', 'redis2', 'redis3'], + }) + config.add('servers', 'redis4') + + assert config.get('servers.3') == 'redis4' + + +def test_replace_key_on_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'price': 22 + }) + config.add('price', 12.5, True) + + assert config.get('price') == 12.5 + + +def test_add_key_with_parent_on_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'product': 'Test' + }) + config.add('price.currency.name', 'TL') + + assert config.get('price.currency.name') == 'TL' + + +def test_remove_key_from_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'server': { + 'name': 'redis', + 'status': True + } + }) + config.remove('server.status') + + assert config.get('server') == {'name': 'redis'} + + def test_upsert(testconfig): config = kaptan.Kaptan() config.import_config(testconfig) From bcf42b9a16fb24586a811e772a04eaea5204b857 Mon Sep 17 00:00:00 2001 From: Halil Kaya Date: Mon, 30 May 2016 23:14:29 +0300 Subject: [PATCH 3/5] Deleting index from array on remove method --- kaptan/__init__.py | 7 +++++-- tests/test_kaptan.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/kaptan/__init__.py b/kaptan/__init__.py index 18d7a6e..22749ef 100644 --- a/kaptan/__init__.py +++ b/kaptan/__init__.py @@ -156,7 +156,7 @@ def add(self, key=None, value=None, replace=False): return self - def remove(self, key=None): + def remove(self, key=None, index=None): if not key: raise RuntimeError("Unable to find key") @@ -168,7 +168,10 @@ def remove(self, key=None): del keys[-1] for chunk in keys: current_data = current_data[chunk] - del current_data[exact_key] + if isinstance(index, int) and isinstance(current_data[exact_key], list): + current_data[exact_key].pop(index) + else: + del current_data[exact_key] return self diff --git a/tests/test_kaptan.py b/tests/test_kaptan.py index e7cc388..2d04d29 100644 --- a/tests/test_kaptan.py +++ b/tests/test_kaptan.py @@ -139,6 +139,18 @@ def test_remove_key_from_configuration(): assert config.get('server') == {'name': 'redis'} +def test_remove_item_from_array_on_configuration(): + config = kaptan.Kaptan() + config.import_config({ + 'price': { + 'currencies': ['TL', 'EUR', 'USD'] + } + }) + config.remove('price.currencies', 1) + + assert config.get('price.currencies') == ['TL', 'USD'] + + def test_upsert(testconfig): config = kaptan.Kaptan() config.import_config(testconfig) From 364090865908b8a9c7f1c215f081af8d359216b4 Mon Sep 17 00:00:00 2001 From: Halil Kaya Date: Fri, 3 Jun 2016 13:37:02 +0300 Subject: [PATCH 4/5] Code refactoring --- kaptan/__init__.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/kaptan/__init__.py b/kaptan/__init__.py index 22749ef..ce73c91 100644 --- a/kaptan/__init__.py +++ b/kaptan/__init__.py @@ -125,25 +125,20 @@ def get(self, key=None, default=SENTINEL): return default raise - def add(self, key=None, value=None, replace=False): - if not key: - raise RuntimeError("Unable to find key") - + def add(self, key, value=None, replace=False): current_data = self.configuration_data keys = key.split('.') new_key = keys[0] is_key_exist = False if len(keys) > 1: - new_key = keys[-1] - del keys[-1] + new_key = keys.pop() for chunk in keys: try: if not replace and new_key in current_data[chunk]: is_key_exist = True current_data = current_data[chunk] except KeyError: - current_data[chunk] = {} - current_data = current_data[chunk] + current_data = {} try: if replace: current_data[new_key] = value @@ -156,16 +151,12 @@ def add(self, key=None, value=None, replace=False): return self - def remove(self, key=None, index=None): - if not key: - raise RuntimeError("Unable to find key") - + def remove(self, key, index=None): current_data = self.configuration_data keys = key.split('.') exact_key = keys[0] if len(keys) > 1: - exact_key = keys[-1] - del keys[-1] + exact_key = keys.pop() for chunk in keys: current_data = current_data[chunk] if isinstance(index, int) and isinstance(current_data[exact_key], list): From 72e44e442dc6f1ddaabab4ca82f543bcc61f3e62 Mon Sep 17 00:00:00 2001 From: Halil Kaya Date: Fri, 3 Jun 2016 13:46:56 +0300 Subject: [PATCH 5/5] Rollback to old handler --- kaptan/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kaptan/__init__.py b/kaptan/__init__.py index ce73c91..5266f38 100644 --- a/kaptan/__init__.py +++ b/kaptan/__init__.py @@ -138,7 +138,8 @@ def add(self, key, value=None, replace=False): is_key_exist = True current_data = current_data[chunk] except KeyError: - current_data = {} + current_data[chunk] = {} + current_data = current_data[chunk] try: if replace: current_data[new_key] = value