stream-ruby 2.1.4 → 2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|