stream-ruby 1.0.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -8
- data/lib/stream/base.rb +1 -1
- data/lib/stream/client.rb +52 -12
- data/lib/stream/feed.rb +32 -73
- data/lib/stream/signer.rb +5 -3
- data/lib/stream/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98bb84c852a5f3ecd8ae404c9253c03ebd876596
|
4
|
+
data.tar.gz: f218d9d8f3a8a2d776c307a0a8c6b0c375787bb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65aaf626783bcb8bce5bb8041dd4dae9ace6d78bb0337f51e630ef7b0fe343d4c0110794ca5d1114f9394095f4b13f30c01a01954078a5a51ee397f7d67e17e5
|
7
|
+
data.tar.gz: 91c658f7c1fce6d50f5dc9c882c591bf6cf66405652be0b161bffd4345e0c8f610b3ec6b33ab57fa4a0168d16fc4bdda85b457aa3a7efe7f61b8375a3e059dea
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ client = Stream::Client.new('YOUR_API_KEY', 'API_KEY_SECRET')
|
|
20
20
|
# Find your API keys here https://getstream.io/dashboard/
|
21
21
|
|
22
22
|
# Instantiate a feed object
|
23
|
-
user_feed_1 = client.feed('user
|
23
|
+
user_feed_1 = client.feed('user', '1')
|
24
24
|
|
25
25
|
# Get activities from 5 to 10 (slow pagination)
|
26
26
|
result = user_feed_1.get(:limit=>5, :offset=>5)
|
@@ -45,10 +45,10 @@ user_feed_1.remove('e561de8f-00f1-11e4-b400-0cc47a024be0')
|
|
45
45
|
user_feed_1.remove('tweet:1', foreign_id=true)
|
46
46
|
|
47
47
|
# Follow another feed
|
48
|
-
user_feed_1.follow('flat
|
48
|
+
user_feed_1.follow('flat', '42')
|
49
49
|
|
50
50
|
# Stop following another feed
|
51
|
-
user_feed_1.unfollow('flat
|
51
|
+
user_feed_1.unfollow('flat', '42')
|
52
52
|
|
53
53
|
# Batch adding activities
|
54
54
|
activities = [
|
@@ -76,19 +76,19 @@ token = user_feed_1.token
|
|
76
76
|
# user1 = client.feed('user:1', '{{ token }}');
|
77
77
|
|
78
78
|
# Retrieve first 10 followers of a feed
|
79
|
-
user_feed_1.followers(0, 10)
|
79
|
+
user_feed_1.followers(0, 10)
|
80
80
|
|
81
81
|
# Retrieve followers from 10 to 20
|
82
|
-
user_feed_1.followers(10, 10)
|
82
|
+
user_feed_1.followers(10, 10)
|
83
83
|
|
84
84
|
# Retrieve 10 feeds followed by user_feed_1
|
85
|
-
user_feed_1.following(10)
|
85
|
+
user_feed_1.following(10)
|
86
86
|
|
87
87
|
# Retrieve 10 feeds followed by user_feed_1 starting from the 11th
|
88
|
-
user_feed_1.following(10, 10)
|
88
|
+
user_feed_1.following(10, 10)
|
89
89
|
|
90
90
|
# Check if user_feed_1 follows specific feeds
|
91
|
-
user_feed_1.following(0, 2, filter=['user:42', 'user:43'])
|
91
|
+
user_feed_1.following(0, 2, filter=['user:42', 'user:43'])
|
92
92
|
|
93
93
|
```
|
94
94
|
|
data/lib/stream/base.rb
CHANGED
data/lib/stream/client.rb
CHANGED
@@ -1,21 +1,25 @@
|
|
1
|
-
require '
|
1
|
+
require 'httparty'
|
2
|
+
require 'stream/exceptions'
|
2
3
|
require 'stream/feed'
|
4
|
+
require 'stream/signer'
|
5
|
+
|
3
6
|
|
4
7
|
module Stream
|
5
|
-
STREAM_URL_RE = /https\:\/\/(?<key>\w+)\:(?<secret>\w+).*
|
8
|
+
STREAM_URL_RE = /https\:\/\/(?<key>\w+)\:(?<secret>\w+).*app_id=(?<app_id>\d+)/i
|
6
9
|
|
7
10
|
class Client
|
11
|
+
@@http_client = nil
|
8
12
|
attr_reader :api_key
|
9
13
|
attr_reader :api_secret
|
10
|
-
attr_reader :
|
14
|
+
attr_reader :app_id
|
15
|
+
attr_reader :api_version
|
11
16
|
|
12
|
-
def initialize(api_key='', api_secret='',
|
13
|
-
|
17
|
+
def initialize(api_key='', api_secret='', app_id=nil)
|
14
18
|
if ENV['STREAM_URL'] =~ Stream::STREAM_URL_RE and (api_key.nil? || api_key.empty?)
|
15
19
|
matches = Stream::STREAM_URL_RE.match(ENV['STREAM_URL'])
|
16
20
|
api_key = matches['key']
|
17
21
|
api_secret = matches['secret']
|
18
|
-
|
22
|
+
app_id = matches['app_id']
|
19
23
|
end
|
20
24
|
|
21
25
|
if api_key.nil? || api_key.empty?
|
@@ -24,15 +28,51 @@ module Stream
|
|
24
28
|
|
25
29
|
@api_key = api_key
|
26
30
|
@api_secret = api_secret
|
27
|
-
@
|
31
|
+
@app_id = app_id
|
28
32
|
@signer = Stream::Signer.new(api_secret)
|
29
33
|
end
|
30
34
|
|
31
|
-
def feed(
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
+
def feed(feed_slug, user_id)
|
36
|
+
token = @signer.sign(feed_slug, user_id)
|
37
|
+
Stream::Feed.new(self, feed_slug, user_id, token)
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_default_params
|
41
|
+
{:api_key => @api_key}
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_http_client
|
45
|
+
@@http_client ||= StreamHTTPClient.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def make_request(method, relative_url, signature, params=nil, data=nil)
|
49
|
+
auth_headers = {'Authorization' => signature}
|
50
|
+
params = params.nil? ? {} : params
|
51
|
+
data = data.nil? ? {} : data
|
52
|
+
default_params = self.get_default_params
|
53
|
+
default_params.merge!(params)
|
54
|
+
response = self.get_http_client.make_http_request(method, relative_url, default_params, data, auth_headers)
|
35
55
|
end
|
36
56
|
|
37
57
|
end
|
38
|
-
|
58
|
+
|
59
|
+
class StreamHTTPClient
|
60
|
+
|
61
|
+
include HTTParty
|
62
|
+
base_uri 'https://getstream.io/api/v1.0'
|
63
|
+
default_timeout 3
|
64
|
+
|
65
|
+
def make_http_request(method, relative_url, params=nil, data=nil, headers=nil)
|
66
|
+
headers['Content-Type'] = 'application/json'
|
67
|
+
headers['User-Agent'] = "stream-ruby-#{Stream::VERSION}"
|
68
|
+
response = self.class.send(method, relative_url, :headers => headers, :query => params, :body => data.to_json )
|
69
|
+
case response.code
|
70
|
+
when 200..203
|
71
|
+
return response
|
72
|
+
when 204...600
|
73
|
+
raise StreamApiResponseException, "#{response['exception']} details: #{response['detail']}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/stream/feed.rb
CHANGED
@@ -1,61 +1,24 @@
|
|
1
|
-
require 'httparty'
|
2
1
|
require 'stream/signer'
|
3
|
-
require 'stream/exceptions'
|
4
2
|
|
5
|
-
module Stream
|
6
|
-
|
7
|
-
class StreamHTTPClient
|
8
|
-
|
9
|
-
include HTTParty
|
10
|
-
base_uri 'https://getstream.io/api'
|
11
|
-
|
12
|
-
def make_http_request(method, relative_url, params=nil, data=nil, headers=nil)
|
13
|
-
headers['Content-Type'] = 'application/json'
|
14
|
-
headers['User-Agent'] = "stream-ruby-#{Stream::VERSION}"
|
15
|
-
response = self.class.send(method, relative_url, :headers => headers, :query => params, :body => data.to_json )
|
16
|
-
case response.code
|
17
|
-
when 200..203
|
18
|
-
return response
|
19
|
-
when 204...600
|
20
|
-
raise StreamApiResponseException, response
|
21
|
-
end
|
22
|
-
end
|
23
3
|
|
24
|
-
|
4
|
+
module Stream
|
25
5
|
|
26
6
|
class Feed
|
27
|
-
@@http_client = nil
|
28
7
|
|
29
|
-
attr_reader :
|
8
|
+
attr_reader :id
|
9
|
+
attr_reader :slug
|
10
|
+
attr_reader :user_id
|
30
11
|
attr_reader :token
|
12
|
+
attr_reader :signature
|
31
13
|
|
32
|
-
def initialize(client,
|
14
|
+
def initialize(client, feed_slug, user_id, token)
|
15
|
+
@id = "#{feed_slug}:#{user_id}"
|
33
16
|
@client = client
|
34
|
-
@
|
35
|
-
@
|
36
|
-
@
|
37
|
-
@token =
|
38
|
-
|
39
|
-
@auth_headers = {'Authorization' => "#{cleaned_feed_id} #{signature}"}
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_http_client
|
43
|
-
if @@http_client.nil?
|
44
|
-
@@http_client = StreamHTTPClient.new
|
45
|
-
end
|
46
|
-
@@http_client
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_default_params
|
50
|
-
{:api_key => @api_key}
|
51
|
-
end
|
52
|
-
|
53
|
-
def make_request(method, relative_url, params=nil, data=nil)
|
54
|
-
params = params.nil? ? {} : params
|
55
|
-
data = data.nil? ? {} : data
|
56
|
-
default_params = self.get_default_params
|
57
|
-
default_params.merge!(params)
|
58
|
-
response = self.get_http_client.make_http_request(method, relative_url, default_params, data, @auth_headers)
|
17
|
+
@user_id = user_id
|
18
|
+
@slug = feed_slug
|
19
|
+
@feed_url = "#{feed_slug}/#{user_id}"
|
20
|
+
@token = token
|
21
|
+
@signature = "#{feed_slug}#{user_id} #{token}"
|
59
22
|
end
|
60
23
|
|
61
24
|
def get(params = {})
|
@@ -66,34 +29,30 @@ module Stream
|
|
66
29
|
if params[:mark_seen] and params[:mark_seen].kind_of?(Array)
|
67
30
|
params[:mark_seen] = params[:mark_seen].join(",")
|
68
31
|
end
|
69
|
-
|
32
|
+
@client.make_request(:get, uri, @signature, params)
|
70
33
|
end
|
71
34
|
|
72
35
|
def sign_to_field(to)
|
73
|
-
to.map do |
|
74
|
-
|
75
|
-
|
76
|
-
"#{feed} #{token}"
|
36
|
+
to.map do |feed_id|
|
37
|
+
feed_slug, user_id = feed_id.split(':')
|
38
|
+
feed = @client.feed(feed_slug, user_id)
|
39
|
+
"#{feed.id} #{feed.token}"
|
77
40
|
end
|
78
41
|
end
|
79
42
|
|
80
43
|
def add_activity(activity_data)
|
81
44
|
uri = "/feed/#{@feed_url}/"
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
self.make_request(:post, uri, nil, activity_data)
|
45
|
+
activity_data[:to] &&= self.sign_to_field(activity_data[:to])
|
46
|
+
@client.make_request(:post, uri, @signature, nil, activity_data)
|
86
47
|
end
|
87
48
|
|
88
49
|
def add_activities(activities)
|
89
50
|
uri = "/feed/#{@feed_url}/"
|
90
51
|
activities.each do |activity|
|
91
|
-
|
92
|
-
activity[:to] = self.sign_to_field(activity[:to])
|
93
|
-
end
|
52
|
+
activity[:to] &&= self.sign_to_field(activity[:to])
|
94
53
|
end
|
95
54
|
data = {:activities => activities}
|
96
|
-
|
55
|
+
@client.make_request(:post, uri, @signature, nil, data)
|
97
56
|
end
|
98
57
|
|
99
58
|
def remove(activity_id, foreign_id=false)
|
@@ -102,21 +61,21 @@ module Stream
|
|
102
61
|
if foreign_id
|
103
62
|
params = {'foreign_id' => 1}
|
104
63
|
end
|
105
|
-
|
64
|
+
@client.make_request(:delete, uri, @signature, params)
|
106
65
|
end
|
107
66
|
|
108
67
|
def delete()
|
109
68
|
uri = "/feed/#{@feed_url}/"
|
110
|
-
|
69
|
+
@client.make_request(:delete, uri, @signature)
|
111
70
|
end
|
112
71
|
|
113
|
-
def follow(
|
72
|
+
def follow(target_feed_slug, target_user_id)
|
114
73
|
uri = "/feed/#{@feed_url}/follows/"
|
115
74
|
follow_data = {
|
116
|
-
:target =>
|
117
|
-
:target_token => @client.feed(
|
75
|
+
:target => "#{target_feed_slug}:#{target_user_id}",
|
76
|
+
:target_token => @client.feed(target_feed_slug, target_user_id).token
|
118
77
|
}
|
119
|
-
|
78
|
+
@client.make_request(:post, uri, @signature, nil, follow_data)
|
120
79
|
end
|
121
80
|
|
122
81
|
def followers(offset=0, limit=25)
|
@@ -125,7 +84,7 @@ module Stream
|
|
125
84
|
'offset' => offset,
|
126
85
|
'limit' => limit
|
127
86
|
}
|
128
|
-
|
87
|
+
@client.make_request(:get, uri, @signature, params)
|
129
88
|
end
|
130
89
|
|
131
90
|
def following(offset=0, limit=25, filter=[])
|
@@ -135,12 +94,12 @@ module Stream
|
|
135
94
|
'offset' => offset,
|
136
95
|
'filter' => filter.join(",")
|
137
96
|
}
|
138
|
-
|
97
|
+
@client.make_request(:get, uri, @signature, params)
|
139
98
|
end
|
140
99
|
|
141
|
-
def unfollow(
|
142
|
-
uri = "/feed/#{@feed_url}/follows/#{
|
143
|
-
|
100
|
+
def unfollow(target_feed_slug, target_user_id)
|
101
|
+
uri = "/feed/#{@feed_url}/follows/#{target_feed_slug}:#{target_user_id}/"
|
102
|
+
@client.make_request(:delete, uri, @signature)
|
144
103
|
end
|
145
104
|
|
146
105
|
end
|
data/lib/stream/signer.rb
CHANGED
@@ -14,10 +14,12 @@ module Stream
|
|
14
14
|
value.gsub('+', '-').gsub('/', '_').gsub(/^=+/, '').gsub(/=+$/, '')
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def sign(feed_slug, user_id)
|
18
|
+
message = "#{feed_slug}#{user_id}"
|
18
19
|
key = Digest::SHA1.digest @key.to_s
|
19
|
-
|
20
|
-
self.urlSafeB64encode(
|
20
|
+
token = Base64.strict_encode64(OpenSSL::HMAC.digest(@sha1, key, message))
|
21
|
+
self.urlSafeB64encode(token)
|
21
22
|
end
|
23
|
+
|
22
24
|
end
|
23
25
|
end
|
data/lib/stream/version.rb
CHANGED
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stream-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommaso Barbugli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10
|
11
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -58,15 +58,15 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.7
|
61
|
+
version: '0.7'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.7
|
69
|
-
description:
|
68
|
+
version: '0.7'
|
69
|
+
description: Ruby client for getstream.io service
|
70
70
|
email: tbarbugli@gmail.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|