stream-ruby 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5c1225f2fbc4300a3dc90c9798396eec25fc1b46
4
+ data.tar.gz: 31c0a060ab08e8c6ef5dcdb5d42ef47d1cc2437d
5
+ SHA512:
6
+ metadata.gz: c07f32235abbff7cd5883eabbb1583064fc7f4c7768ae3ade4df2472909fe20f61d979e12b309683fa7a2be06ae573cc321e3e6c3a3a057a0c72f07ece4abba8
7
+ data.tar.gz: 6fa48a3b8a86450a376c9e830670596946811df1feff3906cca9bb28909d173561fa61cd657b33453e22af5ce3f653f6c8a5b421f75631f3ce7340761edb389c
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2014, Tommaso Barbugli
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of the {organization} nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,49 @@
1
+ stream-ruby
2
+ =========
3
+
4
+ .. image:: https://circleci.com/gh/tbarbugli/stream-ruby.png
5
+ :target: https://circleci.com/gh/tbarbugli/stream-ruby.png/tree/master
6
+
7
+
8
+ stream-ruby is a Ruby client for `Stream <https://getstream.io/>`_.
9
+
10
+ .. code-block:: ruby
11
+
12
+ # Instantiate a new client
13
+ require 'stream'
14
+ client = Stream::Client.new('YOUR_API_KEY', 'API_KEY_SECRET')
15
+
16
+ # Instantiate a feed object
17
+ user_feed_1 = client.feed('user:1')
18
+
19
+ # Get activities from 5 to 10 (slow pagination)
20
+ result = user_feed_1.get(:limit=>5, :offset=>5)
21
+ # (Recommended & faster) Filter on an id less than 112334
22
+ result = user_feed_1.get(:limit=>5, :id_lt=>112334)
23
+
24
+ # Create a new activity
25
+ activity_data = {:actor => 1, :verb => 'tweet', :object => 1}
26
+ activity_response = user_feed_1.add_activity(activity_data)
27
+
28
+ # Remove an activity by its id
29
+ user_feed_1.remove('12345678910')
30
+
31
+ # Follow another feed
32
+ user_feed_1.follow('flat:42')
33
+
34
+ # Stop following another feed
35
+ user_feed_1.unfollow('flat:42')
36
+
37
+
38
+ Docs are available on `GetStream.io`_.
39
+
40
+ .. _GetStream.io: http://getstream.io/docs/
41
+
42
+
43
+ Installation
44
+ ------------
45
+
46
+ .. code-block:: bash
47
+
48
+ gem "stream"
49
+
@@ -0,0 +1 @@
1
+ require 'stream/base'
@@ -0,0 +1,15 @@
1
+ require 'stream/client'
2
+ require 'stream/version'
3
+ require 'stream/signer'
4
+
5
+ module Stream
6
+ class << self
7
+ def connect(api_key, api_secret)
8
+ Stream::Client.new(api_key, api_secret)
9
+ end
10
+
11
+ def clean_feed_id(feed_id)
12
+ feed_id.sub(':', '')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ require 'stream/signer'
2
+ require 'stream/feed'
3
+
4
+ module Stream
5
+ class Client
6
+
7
+ def initialize(api_key, api_secret)
8
+ @api_key = api_key
9
+ @api_secret = api_secret
10
+ @signer = Stream::Signer.new(api_secret)
11
+ end
12
+
13
+ def feed(feed_id)
14
+ cleaned_feed_id = Stream::clean_feed_id(feed_id)
15
+ signature = @signer.signature(cleaned_feed_id)
16
+ Stream::Feed.new(feed_id, @api_key, signature)
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ require 'httparty'
2
+ require 'stream/signer'
3
+
4
+
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
+ response = self.class.send(method, relative_url, headers: headers, query: params, body: data)
14
+ end
15
+
16
+ end
17
+
18
+ class Feed
19
+ @@http_client = nil
20
+
21
+ attr_reader :feed_id
22
+
23
+ def initialize(feed_id, api_key, signature)
24
+ @feed_id = Stream::clean_feed_id(feed_id)
25
+ @feed_url = feed_id.sub(':', '/')
26
+ @api_key = api_key
27
+ @auth_headers = {'Authorization' => "#{@feed_id} #{signature}"}
28
+ end
29
+
30
+ def get_http_client
31
+ if @@http_client.nil?
32
+ @@http_client = StreamHTTPClient.new
33
+ end
34
+ @@http_client
35
+ end
36
+
37
+ def get_default_params
38
+ {:api_key => @api_key}
39
+ end
40
+
41
+ def make_request(method, relative_url, params=nil, data=nil)
42
+ params = params.nil? ? {} : params
43
+ data = data.nil? ? {} : data
44
+ default_params = self.get_default_params
45
+ default_params.merge!(params)
46
+ self.get_http_client.make_http_request(method, relative_url, default_params, data, @auth_headers)
47
+ end
48
+
49
+ def get(params = {})
50
+ uri = "/feed/#{@feed_url}/"
51
+ self.make_request(:get, uri, params)
52
+ end
53
+
54
+ def add_activity(activity_data)
55
+ uri = "/feed/#{@feed_url}/"
56
+ self.make_request(:post, uri, nil, activity_data)
57
+ end
58
+
59
+ def remove(activity_id)
60
+ uri = "/feed/#{@feed_url}/#{activity_id}/"
61
+ self.make_request(:delete, uri)
62
+ end
63
+
64
+ def follow(target_feed_id)
65
+ uri = "/feed/#{@feed_url}/follows/"
66
+ follow_data = {:target => target_feed_id}
67
+ self.make_request(:post, uri, nil, follow_data)
68
+ end
69
+
70
+ def unfollow(target_feed_id)
71
+ uri = "/feed/#{@feed_url}/follows/#{target_feed_id}/"
72
+ self.make_request(:delete, uri)
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,23 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+
4
+ module Stream
5
+ class Signer
6
+ @key = nil
7
+
8
+ def initialize(key)
9
+ @key = key.to_s
10
+ @sha1 = OpenSSL::Digest::Digest.new('sha1')
11
+ end
12
+
13
+ def urlSafeB64encode(value)
14
+ value.gsub('+', '-').gsub('/', '_').gsub(/^=+/, '').gsub(/=+$/, '')
15
+ end
16
+
17
+ def signature(message)
18
+ key = Digest::SHA1.digest @key.to_s
19
+ signature = Base64.strict_encode64(OpenSSL::HMAC.digest(@sha1, key, message.to_s))
20
+ self.urlSafeB64encode(signature)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Stream
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stream-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tommaso Barbugli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.10'
55
+ description:
56
+ email: tbarbugli@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - README.md
61
+ - LICENSE
62
+ files:
63
+ - LICENSE
64
+ - README.md
65
+ - lib/stream.rb
66
+ - lib/stream/base.rb
67
+ - lib/stream/client.rb
68
+ - lib/stream/feed.rb
69
+ - lib/stream/signer.rb
70
+ - lib/stream/version.rb
71
+ homepage: http://github.com/tbarbugli/stream-ruby
72
+ licenses:
73
+ - Apache-2.0
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.2.2
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: A gem that provides a client interface for getstream.io
95
+ test_files: []