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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5b6e6a3468fc1757df4b358a7f521fe32d94e455
4
- data.tar.gz: 856c8f50608e8084528344fc89c37e5277cc8e11
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzdlMDc4MGY1MDM0MmE3Y2UwYWMyMGIzODNkMDM4YjRiZTQ0NTY5Mw==
5
+ data.tar.gz: !binary |-
6
+ MjhhZjVhOTRmM2I5YTBiZWYxNDIwNDZjY2IyNThjOTViY2JlNDBhYQ==
5
7
  SHA512:
6
- metadata.gz: 63268718ab521073158953dcf4625913544e224df1ec71c4be95f795b6b6f21df9ead1f611ed66d7ac994b5b5a0244c552603c73aae3fd9cba53735067087d0d
7
- data.tar.gz: 33ab5d87d4016bc853549be59dce853d530723345bfeb4acd4f9b382716fd4daf712c87be82fe986d7051dbd10e287d4b1463991d0be51e22fa68bd7a112a0d1
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
@@ -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 make_request(method, relative_url, signature, params=nil, data=nil)
53
- auth_headers = {'Authorization' => signature}
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)
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
- self.class.base_uri "https://#{location_name}.getstream.io/api/#{api_version}"
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, nil, activity_data)
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, nil, data)
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 = nil
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, nil, follow_data)
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 sign(feed_slug, user_id)
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
@@ -1,3 +1,3 @@
1
1
  module Stream
2
- VERSION = "2.1.4"
2
+ VERSION = "2.2"
3
3
  end
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.1.4
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-16 00:00:00.000000000 Z
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