1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
from bson.objectid import ObjectId
from concurrent.futures import ThreadPoolExecutor
__author__ = 'serena'
class MemCursor(object):
def __init__(self, collection):
self.collection = collection
self.count = len(self.collection)
def _is_next_exist(self):
return self.count != 0
@property
def fetch_next(self):
with ThreadPoolExecutor(max_workers=2) as executor:
result = executor.submit(self._is_next_exist)
return result
def next_object(self):
self.count -= 1
return self.collection.pop()
class MemDb(object):
def __init__(self):
self.contents = []
pass
def _find_one(self, spec_or_id=None, *args):
if spec_or_id is not None and not isinstance(spec_or_id, dict):
spec_or_id = {"_id": spec_or_id}
cursor = self._find(spec_or_id, *args)
for result in cursor:
return result
return None
def find_one(self, spec_or_id=None, *args):
with ThreadPoolExecutor(max_workers=2) as executor:
result = executor.submit(self._find_one, spec_or_id, *args)
return result
def _insert(self, doc_or_docs):
docs = doc_or_docs
return_one = False
if isinstance(docs, dict):
return_one = True
docs = [docs]
ids = []
for doc in docs:
if '_id' not in doc:
doc['_id'] = ObjectId()
if not self._find_one(doc['_id']):
ids.append(doc['_id'])
self.contents.append(doc_or_docs)
if len(ids) == 0:
return None
if return_one:
return ids[0]
else:
return ids
def insert(self, doc_or_docs):
with ThreadPoolExecutor(max_workers=2) as executor:
result = executor.submit(self._insert, doc_or_docs)
return result
@staticmethod
def _in(content, *args):
for arg in args:
for k, v in arg.iteritems():
if content.get(k, None) != v:
return False
return True
def _find(self, *args):
res = []
for content in self.contents:
if self._in(content, *args):
res.append(content)
return res
def find(self, *args):
return MemCursor(self._find(*args))
def _update(self, spec, document):
updated = False
for index in range(len(self.contents)):
content = self.contents[index]
if self._in(content, spec):
for k, v in document.iteritems():
updated = True
content[k] = v
self.contents[index] = content
return updated
def update(self, spec, document):
with ThreadPoolExecutor(max_workers=2) as executor:
result = executor.submit(self._update, spec, document)
return result
def _remove(self, spec_or_id=None):
if spec_or_id is None:
self.contents = []
if not isinstance(spec_or_id, dict):
spec_or_id = {'_id': spec_or_id}
for index in range(len(self.contents)):
content = self.contents[index]
if self._in(content, spec_or_id):
del self.contents[index]
return True
return False
def remove(self, spec_or_id=None):
with ThreadPoolExecutor(max_workers=2) as executor:
result = executor.submit(self._remove, spec_or_id)
return result
pod = MemDb()
test_projects = MemDb()
test_cases = MemDb()
test_results = MemDb()
|