Skip to content

Commit c36e674

Browse files
authored
Merge pull request #2 from harlev/api_key
WIP: Add support for api_key in V2
2 parents 447c72f + 809d936 commit c36e674

File tree

4 files changed

+112
-11
lines changed

4 files changed

+112
-11
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,26 @@ print(jb.delete(MY_BOX_ID, query="age:=23"))
6363

6464
# delete records
6565
jb.delete(MY_BOX_ID, record_ids[1])
66+
67+
# write to a private box
68+
MY_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_")
69+
api_key = jb.get_new_api_key()
70+
result = jb.write(data, MY_PRIVATE_BOX_ID, api_key=api_key)
71+
record_id = jb.get_record_id(result)
72+
73+
# update a private box
74+
data = {"name": "David", "age": 35}
75+
jb.update(data, MY_PRIVATE_BOX_ID, record_id, api_key=api_key)
76+
77+
# delete a private box
78+
jb.delete(MY_PRIVATE_BOX_ID, record_id, api_key=api_key)
6679
```
6780

81+
## Private Box
82+
Add `api_key` to write/update/delete as shown above.
83+
read is always accessible, even with out an `api_key`.
84+
A valid and unique `api_key` can be generated using `get_new_api_key()`
85+
6886
## Query Params
6987
As supported (and documented) by https://github.com/vasanthv/jsonbox
7088

examples/example.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,17 @@
4848
# delete records
4949
jb.delete(MY_BOX_ID, record_ids[1])
5050

51+
# write to a private box
52+
MY_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_")
53+
api_key = jb.get_new_api_key()
54+
result = jb.write(data, MY_PRIVATE_BOX_ID, api_key=api_key)
55+
record_id = jb.get_record_id(result)
56+
57+
# update a private box
58+
data = {"name": "David", "age": 35}
59+
jb.update(data, MY_PRIVATE_BOX_ID, record_id, api_key=api_key)
60+
61+
# delete a private box
62+
jb.delete(MY_PRIVATE_BOX_ID, record_id, api_key=api_key)
63+
5164

jsonbox.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import requests
2+
import uuid
23
from six.moves.urllib import parse
34

45

@@ -45,6 +46,10 @@ def get_record_id(self, data):
4546
else:
4647
return data[self.RECORD_ID_KEY]
4748

49+
@staticmethod
50+
def get_new_api_key():
51+
return str(uuid.uuid4())
52+
4853
def read(self,
4954
box_id,
5055
collection_or_record=None,
@@ -57,40 +62,51 @@ def read(self,
5762
response = requests.get(url)
5863
return self._check_response(response)
5964

60-
def write(self, data, box_id, collection=None):
65+
def write(self, data, box_id, collection=None, api_key=None):
6166
url = self._get_url(box_id, collection)
6267

63-
response = requests.post(url, json=data)
68+
headers = self._get_headers(api_key)
69+
70+
response = requests.post(url, json=data, headers=headers)
6471
return self._check_response(response)
6572

66-
def update(self, data, box_id, record_id):
73+
def _get_headers(self, api_key):
74+
headers = None
75+
if api_key:
76+
headers = {"x-api-key": api_key}
77+
return headers
78+
79+
def update(self, data, box_id, record_id, api_key=None):
6780
url = self._get_url(box_id, record_id)
81+
headers = self._get_headers(api_key)
6882

69-
response = requests.put(url, json=data)
83+
response = requests.put(url, json=data, headers=headers)
7084
return self._check_response(response)
7185

72-
def delete(self, box_id, record_ids=None, query=None):
86+
def delete(self, box_id, record_ids=None, query=None, api_key=None):
7387
if record_ids:
7488
if isinstance(record_ids, list):
7589
result = []
7690
for record_id in record_ids:
7791
result.append(self._delete_one(box_id, record_id))
7892
return result
7993
else:
80-
return self._delete_one(box_id, record_ids)
94+
return self._delete_one(box_id, record_ids, api_key=api_key)
8195
elif query:
82-
return self._delete_query(box_id, query)
96+
return self._delete_query(box_id, query, api_key=api_key)
8397

84-
def _delete_query(self, box_id, query):
98+
def _delete_query(self, box_id, query, api_key=None):
8599
url = self._get_url(box_id, query=query)
100+
headers = self._get_headers(api_key)
86101

87-
response = requests.delete(url)
102+
response = requests.delete(url, headers=headers)
88103
return self._check_response(response)
89104

90-
def _delete_one(self, box_id, record_id):
105+
def _delete_one(self, box_id, record_id, api_key=None):
91106
url = self._get_url(box_id, record_id)
107+
headers = self._get_headers(api_key)
92108

93-
response = requests.delete(url)
109+
response = requests.delete(url, headers=headers)
94110
return self._check_response(response)
95111

96112
def _check_response(self, response):

tests/test_jsonbin.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from jsonbox import JsonBox
44

55
TEST_BOX_ID = str(uuid.uuid4()).replace("-", "_")
6+
TEST_PRIVATE_BOX_ID = str(uuid.uuid4()).replace("-", "_")
7+
TEST_PRIVATE_BOX_ID_FAIL = str(uuid.uuid4()).replace("-", "_")
68
TEST_COLLECTION_ID = "collection_427453"
79
TEST_RECORD_ID = "test_sjdgfygsf2347623564twfgyu"
810
TEST_DATA_KEY_1 = "gjsfdjghdjs"
@@ -105,6 +107,58 @@ def test_write_box(self):
105107
self.assertIsNotNone(json_data)
106108
self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1)
107109

110+
def test_write_box_api_key(self):
111+
data = {
112+
TEST_DATA_KEY_1: TEST_DATA_VALUE_1
113+
}
114+
api_key = self.jb.get_new_api_key()
115+
json_data = self.jb.write(data, TEST_PRIVATE_BOX_ID, api_key=api_key)
116+
self.assertIsNotNone(json_data)
117+
self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1)
118+
119+
record_id = self.jb.get_record_id(json_data)
120+
121+
json_data = self.jb.read(TEST_PRIVATE_BOX_ID, record_id)
122+
self.assertIsNotNone(json_data)
123+
self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1)
124+
125+
data = {
126+
TEST_DATA_KEY_2: TEST_DATA_VALUE_2
127+
}
128+
self.jb.update(data, TEST_PRIVATE_BOX_ID, record_id, api_key=api_key)
129+
130+
json_data = self.jb.read(TEST_PRIVATE_BOX_ID, record_id)
131+
self.assertIsNotNone(json_data)
132+
self.assertEqual(json_data[TEST_DATA_KEY_2], TEST_DATA_VALUE_2)
133+
134+
json_data = self.jb.delete(TEST_PRIVATE_BOX_ID, record_id, api_key=api_key)
135+
self.assertIsNotNone(json_data)
136+
137+
self.assertRaises(ValueError, self.jb.read, TEST_PRIVATE_BOX_ID, record_id)
138+
139+
def test_write_box_api_key_fail(self):
140+
data = {
141+
TEST_DATA_KEY_1: TEST_DATA_VALUE_1
142+
}
143+
api_key = self.jb.get_new_api_key()
144+
json_data = self.jb.write(data, TEST_PRIVATE_BOX_ID_FAIL, api_key=api_key)
145+
self.assertIsNotNone(json_data)
146+
self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1)
147+
148+
record_id = self.jb.get_record_id(json_data)
149+
150+
json_data = self.jb.read(TEST_PRIVATE_BOX_ID_FAIL, record_id)
151+
self.assertIsNotNone(json_data)
152+
self.assertEqual(json_data[TEST_DATA_KEY_1], TEST_DATA_VALUE_1)
153+
154+
data = {
155+
TEST_DATA_KEY_2: TEST_DATA_VALUE_2
156+
}
157+
self.assertRaises(ValueError, self.jb.update, data, TEST_PRIVATE_BOX_ID_FAIL, record_id)
158+
159+
self.assertRaises(ValueError, self.jb.delete, TEST_PRIVATE_BOX_ID_FAIL, record_id)
160+
161+
108162
def test_write_box_collection(self):
109163
data = {
110164
TEST_DATA_KEY_1: TEST_DATA_VALUE_1

0 commit comments

Comments
 (0)