Skip to content

Commit 2fea2db

Browse files
committed
more tests & redis
1 parent 1b23d0f commit 2fea2db

9 files changed

Lines changed: 690 additions & 143 deletions

File tree

splitio/client/listener.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import abc
44

5+
from six import add_metaclass
6+
57

68
class ImpressionListenerException(Exception):
79
"""Custom Exception for Impression Listener."""
@@ -51,12 +53,10 @@ def log_impression(self, impression, attributes=None):
5153
raise ImpressionListenerException('Error in log_impression user\'s'
5254
'method is throwing exceptions')
5355

54-
55-
class ImpressionListener(object): #pylint: disable=too-few-public-methods
56+
@add_metaclass(abc.ABCMeta) #pylint: disable=too-few-public-methods
57+
class ImpressionListener(object):
5658
"""Impression listener interface."""
5759

58-
__metaclass__ = abc.ABCMeta
59-
6060
@abc.abstractmethod
6161
def log_impression(self, data):
6262
"""

splitio/models/grammar/matchers/base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
"""Abstract matcher module."""
22
import abc
3+
4+
from six import add_metaclass
5+
36
from splitio.client.key import Key
47

58

9+
@add_metaclass(abc.ABCMeta)
610
class Matcher(object):
711
"""Matcher abstract class."""
812

9-
__metaclass__ = abc.ABCMeta
10-
1113
def __init__(self, raw_matcher):
1214
"""
1315
Initialize generic data and call matcher-specific parser.

splitio/storage/__init__.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
import abc
55

6+
from six import add_metaclass
7+
8+
@add_metaclass(abc.ABCMeta)
69
class SplitStorage(object):
710
"""Split storage interface implemented as an abstract class."""
811

9-
__metaclass__ = abc.ABCMeta
10-
1112
@abc.abstractmethod
1213
def get(self, split_name):
1314
"""
@@ -92,11 +93,10 @@ def get_segment_names(self):
9293
return set([name for spl in self.get_all_splits() for name in spl.get_segment_names()])
9394

9495

96+
@add_metaclass(abc.ABCMeta)
9597
class SegmentStorage(object):
9698
"""Segment storage interface implemented as an abstract class."""
9799

98-
__metaclass__ = abc.ABCMeta
99-
100100
@abc.abstractmethod
101101
def get(self, segment_name):
102102
"""
@@ -173,11 +173,10 @@ def segment_contains(self, segment_name, key):
173173
pass
174174

175175

176+
@add_metaclass(abc.ABCMeta)
176177
class ImpressionStorage(object):
177178
"""Impressions storage interface."""
178179

179-
__metaclass__ = abc.ABCMeta
180-
181180
@abc.abstractmethod
182181
def put(self, impressions):
183182
"""
@@ -199,11 +198,10 @@ def pop_many(self, count):
199198
pass
200199

201200

201+
@add_metaclass(abc.ABCMeta)
202202
class EventStorage(object):
203203
"""Events storage interface."""
204204

205-
__metaclass__ = abc.ABCMeta
206-
207205
@abc.abstractmethod
208206
def put(self, events):
209207
"""
@@ -225,11 +223,10 @@ def pop_many(self, count):
225223
pass
226224

227225

226+
@add_metaclass(abc.ABCMeta)
228227
class TelemetryStorage(object):
229228
"""Telemetry storage interface."""
230229

231-
__metaclass__ = abc.ABCMeta
232-
233230
@abc.abstractmethod
234231
def inc_latency(self, name, bucket):
235232
"""

splitio/storage/adapters/redis.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
unicode_literals
44

55
from builtins import str
6-
from six import string_types, binary_type
6+
from six import string_types, binary_type, raise_from
77
from splitio.exceptions import SentinelConfigurationException
88

99
try:
@@ -47,7 +47,7 @@ def original_exception(self):
4747
return self._original_exception
4848

4949

50-
class RedisAdapter(object):
50+
class RedisAdapter(object): #pylint: disable=too-many-public-methods
5151
"""
5252
Instance decorator for Redis clients such as StrictRedis.
5353
@@ -127,11 +127,12 @@ def _remove_prefix(self, k):
127127
def keys(self, pattern):
128128
"""Mimic original redis function but using user custom prefix."""
129129
try:
130-
return _bytes_to_string(self._remove_prefix(
131-
self._decorated.keys(self._add_prefix(pattern))
132-
))
130+
return [
131+
_bytes_to_string(key)
132+
for key in self._remove_prefix(self._decorated.keys(self._add_prefix(pattern)))
133+
]
133134
except RedisError as exc:
134-
raise RedisAdapterException('Failed to execute keys operation', exc)
135+
raise_from(RedisAdapterException('Failed to execute keys operation'), exc)
135136

136137
def set(self, name, value, *args, **kwargs):
137138
"""Mimic original redis function but using user custom prefix."""
@@ -156,26 +157,33 @@ def setex(self, name, time, value):
156157
except RedisError as exc:
157158
raise RedisAdapterException('Error executing setex operation', exc)
158159

159-
def delete(self, names):
160+
def delete(self, *names):
160161
"""Mimic original redis function but using user custom prefix."""
161162
try:
162-
return self._decorated.delete(self._add_prefix(names))
163+
return self._decorated.delete(*self._add_prefix(list(names)))
163164
except RedisError as exc:
164-
raise RedisAdapterException('Error executing delete operation', exc)
165+
raise_from(RedisAdapterException('Error executing delete operation'), exc)
165166

166167
def exists(self, name):
167168
"""Mimic original redis function but using user custom prefix."""
168169
try:
169170
return self._decorated.exists(self._add_prefix(name))
170171
except RedisError as exc:
171-
raise RedisAdapterException('Error executing exists operation', exc)
172+
raise_from(RedisAdapterException('Error executing exists operation'), exc)
173+
174+
def lrange(self, key, start, end):
175+
"""Mimic original redis function but using user custom prefix."""
176+
try:
177+
return self._decorated.lrange(self._add_prefix(key), start, end)
178+
except RedisError as exc:
179+
raise_from(RedisAdapterException('Error executing exists operation'), exc)
172180

173181
def mget(self, names):
174182
"""Mimic original redis function but using user custom prefix."""
175183
try:
176184
return _bytes_to_string(self._decorated.mget(self._add_prefix(names)))
177185
except RedisError as exc:
178-
raise RedisAdapterException('Error executing mget operation', exc)
186+
raise_from(RedisAdapterException('Error executing mget operation'), exc)
179187

180188
def smembers(self, name):
181189
"""Mimic original redis function but using user custom prefix."""
@@ -185,91 +193,91 @@ def smembers(self, name):
185193
for item in self._decorated.smembers(self._add_prefix(name))
186194
]
187195
except RedisError as exc:
188-
raise RedisAdapterException('Error executing smembers operation', exc)
196+
raise_from(RedisAdapterException('Error executing smembers operation'), exc)
189197

190198
def sadd(self, name, *values):
191199
"""Mimic original redis function but using user custom prefix."""
192200
try:
193201
return self._decorated.sadd(self._add_prefix(name), *values)
194202
except RedisError as exc:
195-
raise RedisAdapterException('Error executing sadd operation', exc)
203+
raise_from(RedisAdapterException('Error executing sadd operation'), exc)
196204

197205
def srem(self, name, *values):
198206
"""Mimic original redis function but using user custom prefix."""
199207
try:
200208
return self._decorated.srem(self._add_prefix(name), *values)
201209
except RedisError as exc:
202-
raise RedisAdapterException('Error executing srem operation', exc)
210+
raise_from(RedisAdapterException('Error executing srem operation'), exc)
203211

204212
def sismember(self, name, value):
205213
"""Mimic original redis function but using user custom prefix."""
206214
try:
207215
return self._decorated.sismember(self._add_prefix(name), value)
208216
except RedisError as exc:
209-
raise RedisAdapterException('Error executing sismember operation', exc)
217+
raise_from(RedisAdapterException('Error executing sismember operation'), exc)
210218

211219
def eval(self, script, number_of_keys, *keys):
212220
"""Mimic original redis function but using user custom prefix."""
213221
try:
214222
return self._decorated.eval(script, number_of_keys, *self._add_prefix(list(keys)))
215223
except RedisError as exc:
216-
raise RedisAdapterException('Error executing eval operation', exc)
224+
raise_from(RedisAdapterException('Error executing eval operation'), exc)
217225

218226
def hset(self, name, key, value):
219227
"""Mimic original redis function but using user custom prefix."""
220228
try:
221229
return self._decorated.hset(self._add_prefix(name), key, value)
222230
except RedisError as exc:
223-
raise RedisAdapterException('Error executing hset operation', exc)
231+
raise_from(RedisAdapterException('Error executing hset operation'), exc)
224232

225233
def hget(self, name, key):
226234
"""Mimic original redis function but using user custom prefix."""
227235
try:
228236
return _bytes_to_string(self._decorated.hget(self._add_prefix(name), key))
229237
except RedisError as exc:
230-
raise RedisAdapterException('Error executing hget operation', exc)
238+
raise_from(RedisAdapterException('Error executing hget operation'), exc)
231239

232240
def incr(self, name, amount=1):
233241
"""Mimic original redis function but using user custom prefix."""
234242
try:
235243
return self._decorated.incr(self._add_prefix(name), amount)
236244
except RedisError as exc:
237-
raise RedisAdapterException('Error executing incr operation', exc)
245+
raise_from(RedisAdapterException('Error executing incr operation'), exc)
238246

239247
def getset(self, name, value):
240248
"""Mimic original redis function but using user custom prefix."""
241249
try:
242250
return _bytes_to_string(self._decorated.getset(self._add_prefix(name), value))
243251
except RedisError as exc:
244-
raise RedisAdapterException('Error executing getset operation', exc)
252+
raise_from(RedisAdapterException('Error executing getset operation'), exc)
245253

246254
def rpush(self, key, *values):
247255
"""Mimic original redis function but using user custom prefix."""
248256
try:
249257
return self._decorated.rpush(self._add_prefix(key), *values)
250258
except RedisError as exc:
251-
raise RedisAdapterException('Error executing rpush operation', exc)
259+
raise_from(RedisAdapterException('Error executing rpush operation'), exc)
252260

253261
def expire(self, key, value):
254262
"""Mimic original redis function but using user custom prefix."""
255263
try:
256264
return self._decorated.expire(self._add_prefix(key), value)
257265
except RedisError as exc:
258-
raise RedisAdapterException('Error executing expire operation', exc)
266+
raise_from(RedisAdapterException('Error executing expire operation'), exc)
259267

260268
def rpop(self, key):
261269
"""Mimic original redis function but using user custom prefix."""
262270
try:
263271
return _bytes_to_string(self._decorated.rpop(self._add_prefix(key)))
264272
except RedisError as exc:
265-
raise RedisAdapterException('Error executing rpop operation', exc)
273+
raise_from(RedisAdapterException('Error executing rpop operation'), exc)
266274

267275
def ttl(self, key):
268276
"""Mimic original redis function but using user custom prefix."""
269277
try:
270278
return self._decorated.ttl(self._add_prefix(key))
271279
except RedisError as exc:
272-
raise RedisAdapterException('Error executing ttl operation', exc)
280+
raise_from(RedisAdapterException('Error executing ttl operation'), exc)
273281

274282

275283
def _build_default_client(config): #pylint: disable=too-many-locals

0 commit comments

Comments
 (0)