Skip to content

Commit d0d5814

Browse files
authored
Some improvements (#122)
* better usage of py3 * improve hook * make some parts more idiomatic * handle some error-prone parts
1 parent 0ad5fc3 commit d0d5814

File tree

11 files changed

+135
-151
lines changed

11 files changed

+135
-151
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ LOCAL=true py.test
168168
Install black and flake8
169169

170170
```
171-
pip install .[lint]
171+
pip install .[ci]
172172
```
173173

174174
Install git hooks to avoid pushing invalid code (git commit will run `black` and `flake8`)

dotgit/hooks/pre-commit-format.sh

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
set -e
44

5-
if ! black . --check -q; then
6-
black .
5+
if ! black stream --check -q; then
6+
black stream
7+
echo
78
echo "some files were not formatted correctly (black) commit aborted!"
89
echo "your changes are still staged, you can accept formatting changes with git add or ignore them by adding --no-verify to git commit"
910
exit 1
1011
fi
1112

12-
flake8 --ignore=E501,E225,W293,W503 .
13+
if ! flake8 --ignore=E501,E225,W293,W503 stream; then
14+
echo
15+
echo "commit is aborted because there are some error prone issues in your changes as printed above"
16+
echo "your changes are still staged, you can accept formatting changes with git add or ignore them by adding --no-verify to git commit"
17+
exit 1
18+
fi

stream/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import re
21
import os
2+
import re
33

44
__author__ = "Thierry Schellenbach"
55
__copyright__ = "Copyright 2014, Stream.io, Inc"

stream/client.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44

55
import jwt
66
import requests
7-
from stream.serializer import _datetime_encoder
7+
from requests import Request
88

99
from stream import exceptions, serializer
10-
from stream.users import Users
11-
from stream.utils import validate_feed_slug, validate_user_id, validate_foreign_id_time
12-
from requests import Request
13-
from stream.reactions import Reactions
1410
from stream.collections import Collections
15-
from stream.personalization import Personalization
1611
from stream.feed import Feed
12+
from stream.personalization import Personalization
13+
from stream.reactions import Reactions
14+
from stream.serializer import _datetime_encoder
15+
from stream.users import Users
16+
from stream.utils import validate_feed_slug, validate_foreign_id_time, validate_user_id
1717

1818
try:
1919
from urllib.parse import urlparse
@@ -23,7 +23,7 @@
2323
logger = logging.getLogger(__name__)
2424

2525

26-
class StreamClient(object):
26+
class StreamClient:
2727
def __init__(
2828
self,
2929
api_key,
@@ -377,9 +377,7 @@ def get_activities(
377377
if enrich or reactions is not None:
378378
endpoint = "enrich/" + endpoint
379379

380-
query_params = {}
381-
for key in params:
382-
query_params[key] = params[key]
380+
query_params = {**params}
383381

384382
if ids is not None:
385383
query_params["ids"] = ",".join(ids)
@@ -405,7 +403,7 @@ def get_activities(
405403
return self.get(endpoint, auth_token, params=query_params)
406404

407405
def activity_partial_update(
408-
self, id=None, foreign_id=None, time=None, set={}, unset=[]
406+
self, id=None, foreign_id=None, time=None, set=None, unset=None
409407
):
410408
"""
411409
Partial update activity, via activity ID or Foreign ID + timestamp
@@ -426,7 +424,7 @@ def activity_partial_update(
426424
"Only one of the id or the foreign_id+time parameters can be provided"
427425
)
428426

429-
data = {"set": set, "unset": unset}
427+
data = {"set": set or {}, "unset": unset or []}
430428

431429
if id is not None:
432430
data["id"] = id
@@ -436,7 +434,7 @@ def activity_partial_update(
436434

437435
return self.activities_partial_update(updates=[data])
438436

439-
def activities_partial_update(self, updates=[]):
437+
def activities_partial_update(self, updates=None):
440438
"""
441439
Partial update activity, via activity ID or Foreign ID + timestamp
442440
@@ -460,7 +458,7 @@ def activities_partial_update(self, updates=[]):
460458

461459
auth_token = self.create_jwt_token("activities", "*", feed_id="*")
462460

463-
data = {"changes": updates}
461+
data = {"changes": updates or []}
464462

465463
return self.post("activity/", auth_token, data=data)
466464

stream/collections.py

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class Collections(object):
1+
class Collections:
22
def __init__(self, client, token):
33
"""
44
Used to manipulate data at the 'meta' endpoint
@@ -34,18 +34,17 @@ def upsert(self, collection_name, data):
3434
{"id": '2', "name": "Ruby", "interests": ["Sunbeams", "Surprise Attacks"]}])
3535
"""
3636

37-
if type(data) != list:
37+
if not isinstance(data, list):
3838
data = [data]
3939

4040
data_json = {collection_name: data}
4141

42-
response = self.client.post(
42+
return self.client.post(
4343
"collections/",
4444
service_name="api",
4545
signature=self.token,
4646
data={"data": data_json},
4747
)
48-
return response
4948

5049
def select(self, collection_name, ids):
5150
"""
@@ -60,24 +59,20 @@ def select(self, collection_name, ids):
6059
client.collections.select('user', [1,2,3])
6160
"""
6261

63-
if type(ids) != list:
62+
if not isinstance(ids, list):
6463
ids = [ids]
65-
ids = [str(i) for i in ids]
6664

67-
foreign_ids = []
68-
for i in range(len(ids)):
69-
foreign_ids.append("%s:%s" % (collection_name, ids[i]))
70-
foreign_ids = ",".join(foreign_ids)
65+
foreign_ids = ",".join(
66+
"%s:%s" % (collection_name, k) for i, k in enumerate(ids)
67+
)
7168

72-
response = self.client.get(
69+
return self.client.get(
7370
"collections/",
7471
service_name="api",
7572
params={"foreign_ids": foreign_ids},
7673
signature=self.token,
7774
)
7875

79-
return response
80-
8176
def delete_many(self, collection_name, ids):
8277
"""
8378
Delete data from meta.
@@ -90,18 +85,16 @@ def delete_many(self, collection_name, ids):
9085
client.collections.delete('user', ['1','2','3'])
9186
"""
9287

93-
if type(ids) != list:
88+
if not isinstance(ids, list):
9489
ids = [ids]
9590
ids = [str(i) for i in ids]
9691

9792
params = {"collection_name": collection_name, "ids": ids}
9893

99-
response = self.client.delete(
94+
return self.client.delete(
10095
"collections/", service_name="api", params=params, signature=self.token
10196
)
10297

103-
return response
104-
10598
def add(self, collection_name, data, id=None, user_id=None):
10699
payload = dict(id=id, data=data, user_id=user_id)
107100
return self.client.post(

stream/feed.py

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from stream.utils import validate_feed_id, validate_user_id, validate_feed_slug
1+
from stream.utils import validate_feed_id, validate_feed_slug, validate_user_id
22

33

4-
class Feed(object):
4+
class Feed:
55
def __init__(self, client, feed_slug, user_id, token):
66
"""
77
Initializes the Feed class
@@ -61,8 +61,7 @@ def add_activity(self, activity_data):
6161
activity_data["to"] = self.add_to_signature(activity_data["to"])
6262

6363
token = self.create_scope_token("feed", "write")
64-
result = self.client.post(self.feed_url, data=activity_data, signature=token)
65-
return result
64+
return self.client.post(self.feed_url, data=activity_data, signature=token)
6665

6766
def add_activities(self, activity_list):
6867
"""
@@ -87,8 +86,8 @@ def add_activities(self, activity_list):
8786
token = self.create_scope_token("feed", "write")
8887
data = dict(activities=activities)
8988
if activities:
90-
result = self.client.post(self.feed_url, data=data, signature=token)
91-
return result
89+
return self.client.post(self.feed_url, data=data, signature=token)
90+
return None
9291

9392
def remove_activity(self, activity_id=None, foreign_id=None):
9493
"""
@@ -106,8 +105,7 @@ def remove_activity(self, activity_id=None, foreign_id=None):
106105
token = self.create_scope_token("feed", "delete")
107106
if foreign_id is not None:
108107
params["foreign_id"] = "1"
109-
result = self.client.delete(url, signature=token, params=params)
110-
return result
108+
return self.client.delete(url, signature=token, params=params)
111109

112110
def get(self, enrich=False, reactions=None, **params):
113111
"""
@@ -143,8 +141,7 @@ def get(self, enrich=False, reactions=None, **params):
143141
if reactions.get("counts"):
144142
params["withReactionCounts"] = True
145143

146-
response = self.client.get(feed_url, params=params, signature=token)
147-
return response
144+
return self.client.get(feed_url, params=params, signature=token)
148145

149146
def follow(
150147
self, target_feed_slug, target_user_id, activity_copy_limit=None, **extra_data
@@ -168,8 +165,7 @@ def follow(
168165
data["activity_copy_limit"] = activity_copy_limit
169166
token = self.create_scope_token("follower", "write")
170167
data.update(extra_data)
171-
response = self.client.post(url, data=data, signature=token)
172-
return response
168+
return self.client.post(url, data=data, signature=token)
173169

174170
def unfollow(self, target_feed_slug, target_user_id, keep_history=False):
175171
"""
@@ -183,31 +179,27 @@ def unfollow(self, target_feed_slug, target_user_id, keep_history=False):
183179
params = {}
184180
if keep_history:
185181
params["keep_history"] = True
186-
response = self.client.delete(url, signature=token, params=params)
187-
return response
182+
return self.client.delete(url, signature=token, params=params)
188183

189184
def followers(self, offset=0, limit=25, feeds=None):
190185
"""
191186
Lists the followers for the given feed
192187
"""
193-
feeds = feeds is not None and ",".join(feeds) or ""
188+
feeds = ",".join(feeds) if feeds is not None else ""
194189
params = {"limit": limit, "offset": offset, "filter": feeds}
195190
url = self.feed_url + "followers/"
196191
token = self.create_scope_token("follower", "read")
197-
response = self.client.get(url, params=params, signature=token)
198-
return response
192+
return self.client.get(url, params=params, signature=token)
199193

200194
def following(self, offset=0, limit=25, feeds=None):
201195
"""
202196
List the feeds which this feed is following
203197
"""
204-
if feeds is not None:
205-
feeds = feeds is not None and ",".join(feeds) or ""
198+
feeds = ",".join(feeds) if feeds is not None else ""
206199
params = {"offset": offset, "limit": limit, "filter": feeds}
207200
url = self.feed_url + "follows/"
208201
token = self.create_scope_token("follower", "read")
209-
response = self.client.get(url, params=params, signature=token)
210-
return response
202+
return self.client.get(url, params=params, signature=token)
211203

212204
def add_to_signature(self, recipients):
213205
"""

stream/personalization.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class Personalization(object):
1+
class Personalization:
22
def __init__(self, client, token):
33
"""
44
Methods to interact with personalized feeds.
@@ -20,13 +20,12 @@ def get(self, resource, **params):
2020
personalization.get('follow_recommendations', user_id=123, limit=10, offset=10)
2121
"""
2222

23-
response = self.client.get(
23+
return self.client.get(
2424
resource,
2525
service_name="personalization",
2626
params=params,
2727
signature=self.token,
2828
)
29-
return response
3029

3130
def post(self, resource, **params):
3231
"""
@@ -43,14 +42,13 @@ def post(self, resource, **params):
4342

4443
data = params["data"] or None
4544

46-
response = self.client.post(
45+
return self.client.post(
4746
resource,
4847
service_name="personalization",
4948
params=params,
5049
signature=self.token,
5150
data=data,
5251
)
53-
return response
5452

5553
def delete(self, resource, **params):
5654
"""
@@ -60,11 +58,9 @@ def delete(self, resource, **params):
6058
:return: data that was deleted if successful or not.
6159
"""
6260

63-
response = self.client.delete(
61+
return self.client.delete(
6462
resource,
6563
service_name="personalization",
6664
params=params,
6765
signature=self.token,
6866
)
69-
70-
return response

stream/reactions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class Reactions(object):
1+
class Reactions:
22
def __init__(self, client, token):
33
self.client = client
44
self.token = token

stream/serializer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
import json
3+
34
import pytz
45

56
"""
@@ -13,11 +14,12 @@
1314

1415
def _datetime_encoder(obj):
1516
if isinstance(obj, datetime.datetime):
16-
if obj.utcoffset() is None: # support for <= 3.3
17+
if obj.utcoffset() is None: # 3.5
1718
obj = pytz.utc.localize(obj)
1819
return datetime.datetime.strftime(obj.astimezone(pytz.utc), DATETIME_FORMAT)
1920
if isinstance(obj, datetime.date):
2021
return datetime.datetime.strftime(obj, DATE_FORMAT)
22+
return None
2123

2224

2325
def _datetime_decoder(dict_):

0 commit comments

Comments
 (0)