Skip to content
This repository was archived by the owner on Dec 19, 2024. It is now read-only.

Commit 51f308a

Browse files
committed
Add fixes, cleanup, id & cached property, inc, val, peers methods
1 parent e084615 commit 51f308a

File tree

2 files changed

+172
-5
lines changed

2 files changed

+172
-5
lines changed

orbitdbapi/db.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ def cache_remove(self, item):
3737
if item in self.__cache:
3838
del self.__cache[item]
3939

40+
@property
41+
def cached(self):
42+
return self.__use_cache
43+
4044
@property
4145
def index_by(self):
4246
return self.__index_by
@@ -53,6 +57,10 @@ def params(self):
5357
def dbname(self):
5458
return self.__dbname
5559

60+
@property
61+
def id(self):
62+
return self.__id
63+
5664
@property
5765
def dbtype(self):
5866
return self.__type
@@ -128,8 +136,8 @@ def get_raw(self, item):
128136
def put(self, item, cache=None):
129137
if self.__enforce_caps and not self.putable:
130138
raise CapabilityError(f'Db {self.__dbname} does not have put capability')
131-
if self.indexed and (not hasattr(item, self.__index_by)) and self.__enforce_indexby:
132-
raise MissingIndexError("The provided document doesn't contain field '{}'".format(self.__index_by))
139+
if self.indexed and (not self.__index_by in item) and self.__enforce_indexby:
140+
raise MissingIndexError(f"The provided document {item} doesn't contain field '{self.__index_by}'")
133141

134142
if cache is None: cache = self.__use_cache
135143
if cache:
@@ -140,7 +148,7 @@ def put(self, item, cache=None):
140148
if index_val:
141149
self.__cache[index_val] = item
142150
endpoint = '/'.join(['db', self.__id_safe, 'put'])
143-
entry_hash = self.__client._call('POST', endpoint, item).get('hash')
151+
entry_hash = self.__client._call('POST', endpoint, json=item).get('hash')
144152
if cache and entry_hash: self.__cache[entry_hash] = item
145153
return entry_hash
146154

@@ -149,10 +157,19 @@ def add(self, item, cache=None):
149157
raise CapabilityError(f'Db {self.__dbname} does not have add capability')
150158
if cache is None: cache = self.__use_cache
151159
endpoint = '/'.join(['db', self.__id_safe, 'add'])
152-
entry_hash = self.__client._call('POST', endpoint, item).get('hash')
160+
entry_hash = self.__client._call('POST', endpoint, json=item).get('hash')
153161
if cache and entry_hash: self.__cache[entry_hash] = item
154162
return entry_hash
155163

164+
def inc(self, val):
165+
val = int(val)
166+
endpoint = '/'.join(['db', self.__id_safe, 'inc'])
167+
return self.__client._call('POST', endpoint, json={'val':val})
168+
169+
def value(self):
170+
endpoint = '/'.join(['db', self.__id_safe, 'value'])
171+
return self.__client._call('GET', endpoint)
172+
156173
def iterator_raw(self, **kwargs):
157174
if self.__enforce_caps and not self.iterable:
158175
raise CapabilityError(f'Db {self.__dbname} does not have iterator capability')
@@ -190,11 +207,19 @@ def unload(self):
190207

191208
def events(self, eventname):
192209
endpoint = '/'.join(['db', self.__id_safe, 'events', urlquote(eventname, safe='')])
193-
#return SSEClient('{}/{}'.format(self.__client.base_url, endpoint), session=self.__client.session)
194210
res = self.__client._call_raw('GET', endpoint, stream=True)
195211
res.raise_for_status()
196212
return SSEClient(res.stream()).events()
197213

214+
def findPeers(self, **kwargs):
215+
endpoint = '/'.join(['peers','searches','db', self.__id_safe])
216+
return self.__client._call('POST', endpoint, json=kwargs)
217+
218+
def getPeers(self):
219+
endpoint = '/'.join(['db', self.__id_safe, 'peers'])
220+
return self.__client._call('GET', endpoint)
221+
222+
198223
class CapabilityError(Exception):
199224
pass
200225

tests/test.py

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#!/usr/bin/env python
2+
import json
3+
import logging
4+
import os
5+
import random
6+
import string
7+
import sys
8+
import unittest
9+
from time import sleep
10+
11+
from orbitdbapi.client import OrbitDbAPI
12+
13+
base_url=os.environ.get('ORBIT_DB_HTTP_API_URL')
14+
15+
def randString(k=5, lowercase=False, both=False):
16+
if both:
17+
return ''.join(random.choices(string.ascii_letters + string.digits, k=k))
18+
if lowercase:
19+
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=k))
20+
return ''.join(random.choices(string.ascii_uppercase + string.digits, k=k))
21+
22+
class CapabilitiesTestCase(unittest.TestCase):
23+
def setUp(self):
24+
client = OrbitDbAPI(base_url=base_url)
25+
self.kevalue_test = client.db('keyvalue_test', json={'create':True, 'type': 'keyvalue'})
26+
self.feed_test = client.db('feed_test', json={'create':True, 'type': 'feed'})
27+
self.event_test = client.db('event_test', json={'create':True, 'type': 'eventlog'})
28+
self.docstore_test = client.db('docstore_test', json={'create':True, 'type': 'docstore'})
29+
self.counter_test = client.db('counter_test', json={'create':True, 'type': 'counter'})
30+
31+
def runTest(self):
32+
self.assertEqual(set(['get', 'put', 'remove']), set(self.kevalue_test.capabilities))
33+
self.assertEqual(set(['add', 'get', 'iterator', 'remove']), set(self.feed_test.capabilities))
34+
self.assertEqual(set(['add', 'get', 'iterator']), set(self.event_test.capabilities))
35+
self.assertEqual(set(['get', 'put', 'query', 'remove']), set(self.docstore_test.capabilities))
36+
self.assertEqual(set(['inc', 'value']), set(self.counter_test.capabilities))
37+
38+
def tearDown(self):
39+
self.kevalue_test.unload()
40+
self.feed_test.unload()
41+
self.event_test.unload()
42+
self.docstore_test.unload()
43+
self.counter_test.unload()
44+
45+
class CounterIncrementTestCase(unittest.TestCase):
46+
def setUp(self):
47+
client = OrbitDbAPI(base_url=base_url)
48+
self.counter_test = client.db('counter_test', json={'create':True, 'type': 'counter'})
49+
50+
def runTest(self):
51+
localVal = self.counter_test.value()
52+
self.assertEqual(localVal, self.counter_test.value())
53+
for _c in range(1,100):
54+
incVal = random.randrange(1,100)
55+
localVal += incVal
56+
self.counter_test.inc(incVal)
57+
self.assertEqual(localVal, self.counter_test.value())
58+
59+
def tearDown(self):
60+
self.counter_test.unload()
61+
62+
63+
class KVStoreGetPutTestCase(unittest.TestCase):
64+
def setUp(self):
65+
client = OrbitDbAPI(base_url=base_url, use_db_cache=False)
66+
self.kevalue_test = client.db('keyvalue_test', json={'create':True, 'type': 'keyvalue'})
67+
68+
def runTest(self):
69+
self.assertFalse(self.kevalue_test.cached)
70+
localKV = {}
71+
for _c in range(1,100):
72+
k = randString()
73+
v = randString(k=100, both=True)
74+
localKV[k] = v
75+
self.kevalue_test.put({'key':k, 'value':v})
76+
self.assertEqual(localKV.get(k), self.kevalue_test.get(k))
77+
self.assertDictContainsSubset(localKV, self.kevalue_test.all())
78+
79+
def tearDown(self):
80+
self.kevalue_test.unload()
81+
82+
class DocStoreGetPutTestCase(unittest.TestCase):
83+
def setUp(self):
84+
client = OrbitDbAPI(base_url=base_url, use_db_cache=False)
85+
self.docstore_test = client.db('docstore_test', json={'create':True, 'type': 'docstore'})
86+
87+
def runTest(self):
88+
self.assertFalse(self.docstore_test.cached)
89+
localDocs = []
90+
for _c in range(1,100):
91+
k = randString()
92+
v = randString(k=100, both=True)
93+
item = {'_id':k, 'value':v}
94+
localDocs.append(item)
95+
self.docstore_test.put(item)
96+
self.assertDictContainsSubset(item, self.docstore_test.get(k)[0])
97+
self.assertTrue(all(item in self.docstore_test.all() for item in localDocs))
98+
99+
def tearDown(self):
100+
self.docstore_test.unload()
101+
102+
103+
class SearchesTestCase(unittest.TestCase):
104+
def setUp(self):
105+
self.client = OrbitDbAPI(base_url=base_url)
106+
self.kevalue_test = self.client.db('keyvalue_test', json={'create':True, 'type': 'keyvalue'})
107+
108+
109+
def runTest(self):
110+
self.kevalue_test.findPeers()
111+
searches = self.client.searches()
112+
self.assertGreater(len(searches), 0)
113+
self.assertGreater(len([s for s in searches if s.get('searchID') == self.kevalue_test.id]), 0)
114+
115+
def tearDown(self):
116+
self.kevalue_test.unload()
117+
118+
class SearchPeersTestCase(unittest.TestCase):
119+
def setUp(self):
120+
self.client = OrbitDbAPI(base_url=base_url)
121+
self.kevalue_test = self.client.db('keyvalue_test', json={'create':True, 'type': 'keyvalue'})
122+
123+
def runTest(self):
124+
self.kevalue_test.findPeers(useCustomFindProvs=True)
125+
dbPeers = []
126+
count = 0
127+
while len(dbPeers) < 1:
128+
sleep(5)
129+
dbPeers = self.kevalue_test.getPeers()
130+
if count > 60: break
131+
self.assertGreater(len(dbPeers), 0)
132+
133+
134+
# def tearDown(self):
135+
# self.kevalue_test.unload()
136+
137+
138+
139+
if __name__ == '__main__':
140+
logfmt = '%(asctime)s - %(levelname)s - %(message)s'
141+
logging.basicConfig(format=logfmt, stream=sys.stdout, level=15)
142+
unittest.main()

0 commit comments

Comments
 (0)