From 7401901a1798354f6460ce6b0b94d4b25f887935 Mon Sep 17 00:00:00 2001 From: Ron Harlev Date: Fri, 6 Mar 2020 18:00:47 -0800 Subject: [PATCH 1/4] support api_key --- jsonbox.py | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/jsonbox.py b/jsonbox.py index d82110f..324cfdb 100644 --- a/jsonbox.py +++ b/jsonbox.py @@ -1,4 +1,5 @@ import requests +import uuid from six.moves.urllib import parse @@ -45,6 +46,10 @@ def get_record_id(self, data): else: return data[self.RECORD_ID_KEY] + @staticmethod + def get_new_api_key(): + return str(uuid.uuid4()) + def read(self, box_id, collection_or_record=None, @@ -57,19 +62,28 @@ def read(self, response = requests.get(url) return self._check_response(response) - def write(self, data, box_id, collection=None): + def write(self, data, box_id, collection=None, api_key=None): url = self._get_url(box_id, collection) - response = requests.post(url, json=data) + headers = self._get_headers(api_key) + + response = requests.post(url, json=data, headers=headers) return self._check_response(response) - def update(self, data, box_id, record_id): + def _get_headers(self, api_key): + headers = None + if api_key: + headers = {"x-api-key": api_key} + return headers + + def update(self, data, box_id, record_id, api_key=None): url = self._get_url(box_id, record_id) + headers = self._get_headers(api_key) - response = requests.put(url, json=data) + response = requests.put(url, json=data, headers=headers) return self._check_response(response) - def delete(self, box_id, record_ids=None, query=None): + def delete(self, box_id, record_ids=None, query=None, api_key=None): if record_ids: if isinstance(record_ids, list): result = [] @@ -77,20 +91,22 @@ def delete(self, box_id, record_ids=None, query=None): result.append(self._delete_one(box_id, record_id)) return result else: - return self._delete_one(box_id, record_ids) + return self._delete_one(box_id, record_ids, api_key=api_key) elif query: - return self._delete_query(box_id, query) + return self._delete_query(box_id, query, api_key=api_key) - def _delete_query(self, box_id, query): + def _delete_query(self, box_id, query, api_key=None): url = self._get_url(box_id, query=query) + headers = self._get_headers(api_key) - response = requests.delete(url) + response = requests.delete(url, headers=headers) return self._check_response(response) - def _delete_one(self, box_id, record_id): + def _delete_one(self, box_id, record_id, api_key=None): url = self._get_url(box_id, record_id) + headers = self._get_headers(api_key) - response = requests.delete(url) + response = requests.delete(url, headers=headers) return self._check_response(response) def _check_response(self, response): From 0a7d94a999d295a24da6c35667dba9cd588b84a9 Mon Sep 17 00:00:00 2001 From: Ron Harlev Date: Fri, 6 Mar 2020 18:00:57 -0800 Subject: [PATCH 2/4] test success path --- tests/test_jsonbin.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/test_jsonbin.py b/tests/test_jsonbin.py index 9cbb947..13eaaf2 100644 --- a/tests/test_jsonbin.py +++ b/tests/test_jsonbin.py @@ -3,6 +3,7 @@ from jsonbox import JsonBox TEST_BOX_ID = str(uuid.uuid4()).replace("-", "_") +TEST_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_") TEST_COLLECTION_ID = "collection_427453" TEST_RECORD_ID = "test_sjdgfygsf2347623564twfgyu" TEST_DATA_KEY_1 = "gjsfdjghdjs" @@ -105,6 +106,35 @@ def test_write_box(self): self.assertIsNotNone(json_data) self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1) + def test_write_box_api_key(self): + data = { + TEST_DATA_KEY_1: TEST_DATA_VALUE_1 + } + api_key = self.jb.get_new_api_key() + json_data = self.jb.write(data, TEST_PRIVATE_BOX_ID, api_key=api_key) + self.assertIsNotNone(json_data) + self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1) + + record_id = self.jb.get_record_id(json_data) + + json_data = self.jb.read(TEST_PRIVATE_BOX_ID, record_id) + self.assertIsNotNone(json_data) + self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1) + + data = { + TEST_DATA_KEY_2: TEST_DATA_VALUE_2 + } + self.jb.update(data, TEST_PRIVATE_BOX_ID, record_id, api_key=api_key) + + json_data = self.jb.read(TEST_PRIVATE_BOX_ID, record_id) + self.assertIsNotNone(json_data) + self.assertEqual(json_data[TEST_DATA_KEY_2], TEST_DATA_VALUE_2) + + json_data = self.jb.delete(TEST_PRIVATE_BOX_ID, record_id, api_key=api_key) + self.assertIsNotNone(json_data) + + self.assertRaises(ValueError, self.jb.read, TEST_PRIVATE_BOX_ID, record_id) + def test_write_box_collection(self): data = { TEST_DATA_KEY_1: TEST_DATA_VALUE_1 From 09e697dfe5f3ba15dae99d5427347297c8ccc796 Mon Sep 17 00:00:00 2001 From: Ron Harlev Date: Fri, 6 Mar 2020 18:16:27 -0800 Subject: [PATCH 3/4] update example and readme --- README.md | 18 ++++++++++++++++++ examples/example.py | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/README.md b/README.md index 87f20c8..c7227d7 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,26 @@ print(jb.delete(MY_BOX_ID, query="age:=23")) # delete records jb.delete(MY_BOX_ID, record_ids[1]) + +# write to a private box +MY_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_") +api_key = jb.get_new_api_key() +result = jb.write(data, MY_PRIVATE_BOX_ID, api_key=api_key) +record_id = jb.get_record_id(result) + +# update a private box +data = {"name": "David", "age": 35} +jb.update(data, MY_PRIVATE_BOX_ID, record_id, api_key=api_key) + +# delete a private box +jb.delete(MY_PRIVATE_BOX_ID, record_id, api_key=api_key) ``` +## Private Box +Add `api_key` to write/update/delete as shown above. +read is always accessible, even with out an `api_key`. +A valid and unique `api_key` can be generated using `get_new_api_key()` + ## Query Params As supported (and documented) by https://github.com/vasanthv/jsonbox diff --git a/examples/example.py b/examples/example.py index 8b80625..f0f297e 100644 --- a/examples/example.py +++ b/examples/example.py @@ -48,4 +48,17 @@ # delete records jb.delete(MY_BOX_ID, record_ids[1]) +# write to a private box +MY_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_") +api_key = jb.get_new_api_key() +result = jb.write(data, MY_PRIVATE_BOX_ID, api_key=api_key) +record_id = jb.get_record_id(result) + +# update a private box +data = {"name": "David", "age": 35} +jb.update(data, MY_PRIVATE_BOX_ID, record_id, api_key=api_key) + +# delete a private box +jb.delete(MY_PRIVATE_BOX_ID, record_id, api_key=api_key) + From 809d9365722ae4c6c1b580afd52690e81879d698 Mon Sep 17 00:00:00 2001 From: Ron Harlev Date: Mon, 9 Mar 2020 07:39:27 -0700 Subject: [PATCH 4/4] added fail test --- tests/test_jsonbin.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_jsonbin.py b/tests/test_jsonbin.py index 13eaaf2..76a747f 100644 --- a/tests/test_jsonbin.py +++ b/tests/test_jsonbin.py @@ -4,6 +4,7 @@ TEST_BOX_ID = str(uuid.uuid4()).replace("-", "_") TEST_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_") +TEST_PRIVATE_BOX_ID_FAIL = str(uuid.uuid4()).replace("-", "_") TEST_COLLECTION_ID = "collection_427453" TEST_RECORD_ID = "test_sjdgfygsf2347623564twfgyu" TEST_DATA_KEY_1 = "gjsfdjghdjs" @@ -135,6 +136,29 @@ def test_write_box_api_key(self): self.assertRaises(ValueError, self.jb.read, TEST_PRIVATE_BOX_ID, record_id) + def test_write_box_api_key_fail(self): + data = { + TEST_DATA_KEY_1: TEST_DATA_VALUE_1 + } + api_key = self.jb.get_new_api_key() + json_data = self.jb.write(data, TEST_PRIVATE_BOX_ID_FAIL, api_key=api_key) + self.assertIsNotNone(json_data) + self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1) + + record_id = self.jb.get_record_id(json_data) + + json_data = self.jb.read(TEST_PRIVATE_BOX_ID_FAIL, record_id) + self.assertIsNotNone(json_data) + self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1) + + data = { + TEST_DATA_KEY_2: TEST_DATA_VALUE_2 + } + self.assertRaises(ValueError, self.jb.update, data, TEST_PRIVATE_BOX_ID_FAIL, record_id) + + self.assertRaises(ValueError, self.jb.delete, TEST_PRIVATE_BOX_ID_FAIL, record_id) + + def test_write_box_collection(self): data = { TEST_DATA_KEY_1: TEST_DATA_VALUE_1