Skip to content

Commit bf548ae

Browse files
authored
Merge pull request #46 from launchdarkly/pk/features-stream-uri
fixed uri building to get features stream
2 parents a77ae25 + d5e53b3 commit bf548ae

File tree

5 files changed

+89
-4
lines changed

5 files changed

+89
-4
lines changed

ldclient/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ def upsert(self, key, feature):
130130
self._lock.lock()
131131
f = self._features.get(key)
132132
if f is None or f['version'] < feature['version']:
133-
self._features[key] = f
133+
self._features[key] = feature
134+
log.debug("Updated feature {} to version {}".format(key, feature['version']))
134135
finally:
135136
self._lock.unlock()
136137

ldclient/requests.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def run(self):
6767
log.debug("Starting stream processor")
6868
self._running = True
6969
hdrs = _stream_headers(self._api_key)
70-
uri = self._config.stream_uri + "/"
70+
uri = self._config.stream_uri + "/features"
7171
messages = SSEClient(uri, verify=self._config.verify, headers=hdrs)
7272
for msg in messages:
7373
if not self._running:
@@ -80,11 +80,13 @@ def stop(self):
8080
@staticmethod
8181
def process_message(store, msg):
8282
payload = json.loads(msg.data)
83+
log.debug("Recieved stream event {}".format(msg.event))
8384
if msg.event == 'put':
8485
store.init(payload)
8586
elif msg.event == 'patch':
8687
key = payload['path'][1:]
8788
feature = payload['data']
89+
log.debug("Updating feature {}".format(key))
8890
store.upsert(key, feature)
8991
elif msg.event == 'delete':
9092
key = payload['path'][1:]

ldclient/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "0.20.2"
1+
VERSION = "0.20.3"

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def run(self):
4040

4141
setup(
4242
name='ldclient-py',
43-
version='0.20.2',
43+
version='0.20.3',
4444
author='Catamorphic Co.',
4545
author_email='[email protected]',
4646
packages=['ldclient'],

testing/test_inmemoryfeaturestore.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from ldclient.client import InMemoryFeatureStore
2+
import pytest
3+
4+
def make_feature(key, ver):
5+
return {
6+
u'key': key,
7+
u'version': ver,
8+
u'salt': u'abc',
9+
u'on': True,
10+
u'variations': [
11+
{
12+
u'value': True,
13+
u'weight': 100,
14+
u'targets': []
15+
},
16+
{
17+
u'value': False,
18+
u'weight': 0,
19+
u'targets': []
20+
}
21+
]
22+
}
23+
24+
def base_initialized_store():
25+
store = InMemoryFeatureStore()
26+
store.init({
27+
'foo': make_feature('foo', 10),
28+
'bar': make_feature('bar', 10),
29+
})
30+
return store
31+
32+
def test_not_initially_initialized():
33+
store = InMemoryFeatureStore()
34+
assert store.initialized == False
35+
36+
def test_initialized():
37+
store = base_initialized_store()
38+
assert store.initialized == True
39+
40+
def test_get_existing_feature():
41+
store = base_initialized_store()
42+
expected = make_feature('foo', 10)
43+
assert store.get('foo') == expected
44+
45+
def test_get_nonexisting_feature():
46+
store = base_initialized_store()
47+
assert store.get('biz') is None
48+
49+
def test_upsert_with_newer_version():
50+
store = base_initialized_store()
51+
new_ver = make_feature('foo', 11)
52+
store.upsert('foo', new_ver)
53+
assert store.get('foo') == new_ver
54+
55+
def test_upsert_with_older_version():
56+
store = base_initialized_store()
57+
new_ver = make_feature('foo', 9)
58+
expected = make_feature('foo', 10)
59+
store.upsert('foo', new_ver)
60+
assert store.get('foo') == expected
61+
62+
def test_upsert_with_new_feature():
63+
store = base_initialized_store()
64+
new_ver = make_feature('biz', 1)
65+
store.upsert('biz', new_ver)
66+
assert store.get('biz') == new_ver
67+
68+
def test_delete_with_newer_version():
69+
store = base_initialized_store()
70+
store.delete('foo', 11)
71+
assert store.get('foo') is None
72+
73+
def test_delete_unknown_feature():
74+
store = base_initialized_store()
75+
store.delete('biz', 11)
76+
assert store.get('biz') is None
77+
78+
def test_delete_with_older_version():
79+
store = base_initialized_store()
80+
store.delete('foo', 9)
81+
expected = make_feature('foo', 10)
82+
assert store.get('foo') == expected

0 commit comments

Comments
 (0)