stream-ruby 2.1.4 → 2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/README.md +13 -5
- data/lib/stream/batch.rb +36 -0
- data/lib/stream/client.rb +37 -8
- data/lib/stream/feed.rb +4 -4
- data/lib/stream/signedrequest.rb +36 -0
- data/lib/stream/signer.rb +5 -2
- data/lib/stream/version.rb +1 -1
- metadata +29 -12
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzdlMDc4MGY1MDM0MmE3Y2UwYWMyMGIzODNkMDM4YjRiZTQ0NTY5Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjhhZjVhOTRmM2I5YTBiZWYxNDIwNDZjY2IyNThjOTViY2JlNDBhYQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjMyYzY2M2ZjZjgxMTJiMmQwY2U5YTI3OTJkZDE5MjdmOGIwNjAyYzY1Yzg1
|
10
|
+
ZTMyMmY0MDUyZWE0ZmRmYjlkZTc3MTYzZDc1NzFjNWRjZWZhMDc4NTc5MTdk
|
11
|
+
MzU1MGFjM2YwODc1ZDE5NWM2YzgxM2JhYmVhNDliNDAzZTNkMzI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODZlZDlhYTBiMzBjNzU5MDg4OTU0NTJkNDA5NmQzY2IyZWQwNzExYmQ3ZThi
|
14
|
+
NTFiMWQzNmFlYTMyMmI5NzE3MDlmODRmMmZkYzJlNzAwZmM0NzdkMjZkNzQ4
|
15
|
+
NjNjMTljNWQ2YjZjODE5MDExMzA1NmE1OTIwM2I5YTNhMmM3NDk=
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ activity_data = {:actor => 1, :verb => 'tweet', :object => 1, :foreign_id => 'tw
|
|
41
41
|
:course => {:name => 'Golden Gate park', :distance => 10},
|
42
42
|
:participants => ['Thierry', 'Tommaso'],
|
43
43
|
:started_at => DateTime.now()
|
44
|
-
}
|
44
|
+
}
|
45
45
|
activity_response = user_feed_1.add_activity(activity_data)
|
46
46
|
|
47
47
|
# Remove an activity by its id
|
@@ -60,8 +60,16 @@ user_feed_1.unfollow('flat', '42')
|
|
60
60
|
activities = [
|
61
61
|
[:actor => '1', :verb => 'tweet', :object => '1'],
|
62
62
|
[:actor => '2', :verb => 'like', :object => '3']
|
63
|
-
]
|
64
|
-
user_feed_1.addActivities(activities)
|
63
|
+
]
|
64
|
+
user_feed_1.addActivities(activities)
|
65
|
+
|
66
|
+
# Batch following many feeds
|
67
|
+
follows = {
|
68
|
+
:source => 'flat:1', :target => 'user:1',
|
69
|
+
:source => 'flat:1', :target => 'user:2',
|
70
|
+
:source => 'flat:1', :target => 'user:3'
|
71
|
+
}
|
72
|
+
client.follow_many(follows)
|
65
73
|
|
66
74
|
# Add an activity and push it to other feeds too using the `to` field
|
67
75
|
data = [
|
@@ -69,8 +77,8 @@ data = [
|
|
69
77
|
:verb => "like",
|
70
78
|
:object_id => "3",
|
71
79
|
:to => ["user:44", "user:45"]
|
72
|
-
]
|
73
|
-
user_feed_1.add_activity(data)
|
80
|
+
]
|
81
|
+
user_feed_1.add_activity(data)
|
74
82
|
|
75
83
|
# Remove a feed and its content
|
76
84
|
user_feed_1.delete
|
data/lib/stream/batch.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Stream
|
2
|
+
|
3
|
+
module Batch
|
4
|
+
#
|
5
|
+
# Follows many feeds in one single request
|
6
|
+
#
|
7
|
+
# @param [Array<Hash<:source, :target>>] follows the list of follows
|
8
|
+
#
|
9
|
+
# @return [nil]
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
#
|
13
|
+
# client.follow_many([['flat:4', 'user:1'], ['flat:4', 'user:2']])
|
14
|
+
#
|
15
|
+
def follow_many(follows)
|
16
|
+
self.make_signed_request(:post, '/follow_many/', {}, follows)
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Adds an activity to many feeds in one single request
|
21
|
+
#
|
22
|
+
# @param [Hash] activity_data the activity do add
|
23
|
+
# @param [Array<string>] feeds list of feeds (eg. 'user:1', 'flat:2')
|
24
|
+
#
|
25
|
+
# @return [nil]
|
26
|
+
#
|
27
|
+
def add_to_many(activity_data, feeds)
|
28
|
+
data = {
|
29
|
+
:feeds => feeds,
|
30
|
+
:activity => activity_data
|
31
|
+
}
|
32
|
+
self.make_signed_request(:post, '/feed/add_to_many/', {}, data)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/stream/client.rb
CHANGED
@@ -3,6 +3,7 @@ require 'stream/exceptions'
|
|
3
3
|
require 'stream/feed'
|
4
4
|
require 'stream/signer'
|
5
5
|
|
6
|
+
|
6
7
|
module Stream
|
7
8
|
STREAM_URL_RE = /https\:\/\/(?<key>\w+)\:(?<secret>\w+)@((api\.)|((?<location>[-\w]+)\.))?getstream\.io\/[\w=-\?%&]+app_id=(?<app_id>\d+)/i
|
8
9
|
|
@@ -14,6 +15,24 @@ module Stream
|
|
14
15
|
attr_reader :location
|
15
16
|
attr_reader :default_timeout
|
16
17
|
|
18
|
+
if RUBY_VERSION >= "2.0"
|
19
|
+
require 'stream/batch'
|
20
|
+
require 'stream/signedrequest'
|
21
|
+
include Stream::SignedRequest
|
22
|
+
include Stream::Batch
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# initializes a Stream API Client
|
27
|
+
#
|
28
|
+
# @param [string] api_key your application api_key
|
29
|
+
# @param [string] api_secret your application secret
|
30
|
+
# @param [string] app_id the id of your application (optional)
|
31
|
+
# @param [hash] opts extra options
|
32
|
+
#
|
33
|
+
# @example initialise the client to connect to EU-West location
|
34
|
+
# Stream::Client.new('my_key', 'my_secret', 'my_app_id', :location => 'us-east')
|
35
|
+
#
|
17
36
|
def initialize(api_key='', api_secret='', app_id=nil, opts={})
|
18
37
|
if ENV['STREAM_URL'] =~ Stream::STREAM_URL_RE and (api_key.nil? || api_key.empty?)
|
19
38
|
matches = Stream::STREAM_URL_RE.match(ENV['STREAM_URL'])
|
@@ -36,6 +55,14 @@ module Stream
|
|
36
55
|
@signer = Stream::Signer.new(api_secret)
|
37
56
|
end
|
38
57
|
|
58
|
+
#
|
59
|
+
# Creates a feed instance
|
60
|
+
#
|
61
|
+
# @param [string] feed_slug the feed slug (eg. flat, aggregated...)
|
62
|
+
# @param [user_id] user_id the user_id of this feed (eg. User42)
|
63
|
+
#
|
64
|
+
# @return [Stream::Feed]
|
65
|
+
#
|
39
66
|
def feed(feed_slug, user_id)
|
40
67
|
token = @signer.sign(feed_slug, user_id)
|
41
68
|
Stream::Feed.new(self, feed_slug, user_id, token)
|
@@ -49,13 +76,13 @@ module Stream
|
|
49
76
|
StreamHTTPClient.new(@api_version, @location, @default_timeout)
|
50
77
|
end
|
51
78
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
79
|
+
def make_query_params(params)
|
80
|
+
self.get_default_params.merge(params)
|
81
|
+
end
|
82
|
+
|
83
|
+
def make_request(method, relative_url, signature, params={}, data={}, headers={})
|
84
|
+
headers['Authorization'] = signature
|
85
|
+
self.get_http_client.make_http_request(method, relative_url, self.make_query_params(params), data, headers)
|
59
86
|
end
|
60
87
|
|
61
88
|
end
|
@@ -63,6 +90,7 @@ module Stream
|
|
63
90
|
class StreamHTTPClient
|
64
91
|
|
65
92
|
include HTTParty
|
93
|
+
attr_reader :base_path
|
66
94
|
|
67
95
|
def initialize(api_version='v1.0', location=nil, default_timeout=3)
|
68
96
|
if location.nil?
|
@@ -70,7 +98,8 @@ module Stream
|
|
70
98
|
else
|
71
99
|
location_name = "#{location}-api"
|
72
100
|
end
|
73
|
-
|
101
|
+
@base_path = "/api/#{api_version}"
|
102
|
+
self.class.base_uri "https://#{location_name}.getstream.io#{@base_path}"
|
74
103
|
self.class.default_timeout default_timeout
|
75
104
|
end
|
76
105
|
|
data/lib/stream/feed.rb
CHANGED
@@ -60,7 +60,7 @@ module Stream
|
|
60
60
|
def add_activity(activity_data)
|
61
61
|
uri = "/feed/#{@feed_url}/"
|
62
62
|
activity_data[:to] &&= self.sign_to_field(activity_data[:to])
|
63
|
-
@client.make_request(:post, uri, @signature,
|
63
|
+
@client.make_request(:post, uri, @signature, {}, activity_data)
|
64
64
|
end
|
65
65
|
|
66
66
|
def add_activities(activities)
|
@@ -69,7 +69,7 @@ module Stream
|
|
69
69
|
activity[:to] &&= self.sign_to_field(activity[:to])
|
70
70
|
end
|
71
71
|
data = {:activities => activities}
|
72
|
-
@client.make_request(:post, uri, @signature,
|
72
|
+
@client.make_request(:post, uri, @signature, {}, data)
|
73
73
|
end
|
74
74
|
|
75
75
|
def remove(activity_id, foreign_id=false)
|
@@ -78,7 +78,7 @@ module Stream
|
|
78
78
|
|
79
79
|
def remove_activity(activity_id, foreign_id=false)
|
80
80
|
uri = "/feed/#{@feed_url}/#{activity_id}/"
|
81
|
-
params =
|
81
|
+
params = {}
|
82
82
|
if foreign_id
|
83
83
|
params = {'foreign_id' => 1}
|
84
84
|
end
|
@@ -96,7 +96,7 @@ module Stream
|
|
96
96
|
:target => "#{target_feed_slug}:#{target_user_id}",
|
97
97
|
:target_token => @client.feed(target_feed_slug, target_user_id).token
|
98
98
|
}
|
99
|
-
@client.make_request(:post, uri, @signature,
|
99
|
+
@client.make_request(:post, uri, @signature, {}, follow_data)
|
100
100
|
end
|
101
101
|
|
102
102
|
def followers(offset=0, limit=25)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "http_signatures"
|
2
|
+
require "net/http"
|
3
|
+
require "time"
|
4
|
+
|
5
|
+
module Stream
|
6
|
+
|
7
|
+
module SignedRequest
|
8
|
+
def make_signed_request(method, relative_url, params={}, data={})
|
9
|
+
query_params = self.make_query_params(params)
|
10
|
+
context = HttpSignatures::Context.new(
|
11
|
+
keys: {@api_key => @api_secret},
|
12
|
+
algorithm: "hmac-sha256",
|
13
|
+
headers: ["(request-target)", "Date"],
|
14
|
+
)
|
15
|
+
method_map = {
|
16
|
+
:get => Net::HTTP::Get,
|
17
|
+
:delete => Net::HTTP::Delete,
|
18
|
+
:put => Net::HTTP::Put,
|
19
|
+
:post => Net::HTTP::Post,
|
20
|
+
}
|
21
|
+
request_date = Time.now.rfc822
|
22
|
+
message = method_map[method].new(
|
23
|
+
"#{self.get_http_client.base_path}#{relative_url}?#{URI.encode_www_form(query_params)}",
|
24
|
+
'Date' => request_date,
|
25
|
+
)
|
26
|
+
context.signer.sign(message)
|
27
|
+
headers = {
|
28
|
+
'Authorization' => message["Signature"],
|
29
|
+
'Date' => request_date,
|
30
|
+
'X-Api-Key' => self.api_key
|
31
|
+
}
|
32
|
+
self.get_http_client.make_http_request(method, relative_url, query_params, data, headers)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/stream/signer.rb
CHANGED
@@ -14,12 +14,15 @@ module Stream
|
|
14
14
|
value.gsub('+', '-').gsub('/', '_').gsub(/^=+/, '').gsub(/=+$/, '')
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
message = "#{feed_slug}#{user_id}"
|
17
|
+
def sign_message(message)
|
19
18
|
key = Digest::SHA1.digest @key.to_s
|
20
19
|
token = Base64.strict_encode64(OpenSSL::HMAC.digest(@sha1, key, message))
|
21
20
|
self.urlSafeB64encode(token)
|
22
21
|
end
|
23
22
|
|
23
|
+
def sign(feed_slug, user_id)
|
24
|
+
self.sign_message("#{feed_slug}#{user_id}")
|
25
|
+
end
|
26
|
+
|
24
27
|
end
|
25
28
|
end
|
data/lib/stream/version.rb
CHANGED
metadata
CHANGED
@@ -1,69 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stream-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: '2.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommaso Barbugli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-25 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
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: http_signatures
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ~>
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ~>
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ~>
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '2.10'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ~>
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '2.10'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: simplecov
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ~>
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0.7'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ~>
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0.7'
|
69
83
|
description: Ruby client for getstream.io service
|
@@ -103,9 +117,11 @@ files:
|
|
103
117
|
- lib/coverage/index.html
|
104
118
|
- lib/stream.rb
|
105
119
|
- lib/stream/base.rb
|
120
|
+
- lib/stream/batch.rb
|
106
121
|
- lib/stream/client.rb
|
107
122
|
- lib/stream/exceptions.rb
|
108
123
|
- lib/stream/feed.rb
|
124
|
+
- lib/stream/signedrequest.rb
|
109
125
|
- lib/stream/signer.rb
|
110
126
|
- lib/stream/version.rb
|
111
127
|
homepage: http://github.com/GetStream/stream-ruby
|
@@ -118,12 +134,12 @@ require_paths:
|
|
118
134
|
- lib
|
119
135
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
136
|
requirements:
|
121
|
-
- -
|
137
|
+
- - ! '>='
|
122
138
|
- !ruby/object:Gem::Version
|
123
139
|
version: '0'
|
124
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
141
|
requirements:
|
126
|
-
- -
|
142
|
+
- - ! '>='
|
127
143
|
- !ruby/object:Gem::Version
|
128
144
|
version: '0'
|
129
145
|
requirements: []
|
@@ -133,3 +149,4 @@ signing_key:
|
|
133
149
|
specification_version: 4
|
134
150
|
summary: A gem that provides a client interface for getstream.io
|
135
151
|
test_files: []
|
152
|
+
has_rdoc: true
|