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 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