net 0.2.1 → 0.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,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94f5c2590964e1f1ab8a22cb873744d0e89aa89d
4
- data.tar.gz: b466aa24c5a794d03d23e04a5ebb52c9940d7f4c
3
+ metadata.gz: ef9c01ac982b2c9fbec6e80f15cea501d3064d64
4
+ data.tar.gz: 7be28d7fc0c74b4e93116e5d1e190c240f138f29
5
5
  SHA512:
6
- metadata.gz: 62bf9f26740bba555471c6764fb169609ab1ede908bab4b91d9bd7d4a2a2b708177f0dc841942d38d322e2690926e5575027df4bd5707ca31aa25e3dfba222c2
7
- data.tar.gz: cc36f803012a6d46d62153745e947a4158348abd0945c74c1be585e9d7d5c84ee0d70e0f654930122bff86d2b7c0aeee6994a3f85f1b62fed7cee199d51cfd96
6
+ metadata.gz: e24a7eeac08430f4c8ae2362ecfbffd5901b70e8b956e102f712cae4662d310ac76d3ea59796b499c6c7fc2a7c62beb0cb18f9ecabf0700afd3419576a88bc92
7
+ data.tar.gz: 6d218d97f9d5f6bdb6716f829c2532cd876d5aa5bb43bbbf7e3609b2064f05cefcd8f79c03491ae40b66f76f662f85c1112a13673e415f9e6c54b8c6ee1fb72a
@@ -26,3 +26,7 @@ If it does, then replace your calls to `followers_count` with `follower_count` (
26
26
  ## 0.2.1 - 2014-10-20
27
27
 
28
28
  * [ENHANCEMENT] Requiring 'net' auto-loads Net::Twitter and Net::Instagram
29
+
30
+ ## 0.2.2 - 2015-08-04
31
+
32
+ * [FEATURE] Add `Facebook::Page` supporting `find_by` and `find_by!`.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Net - a Ruby client for social networks API
2
2
  ===========================================
3
3
 
4
- Net helps you write apps that need to interact with Twitter and Instagram.
4
+ Net helps you write apps that need to interact with Twitter, Instagram and Facebook.
5
5
 
6
6
 
7
7
  After [configuring your Twitter app](#configuring-your-twitter-app), you can run commands like:
@@ -19,6 +19,14 @@ user.username #=> "fullscreen_inc"
19
19
  user.follower_count #=> 7025
20
20
  ```
21
21
 
22
+ After [configuring your Facebook app](#configuring-your-facebook-app), you can run commands like:
23
+
24
+ ```ruby
25
+ page = Net::Facebook::Page.find_by username: 'fullscreeninc'
26
+ page.username #=> "fullscreeninc"
27
+ page.likes #=> 30094
28
+ ```
29
+
22
30
  How to install
23
31
  ==============
24
32
 
@@ -28,7 +36,7 @@ To install on your system, run
28
36
 
29
37
  To use inside a bundled Ruby project, add this line to the Gemfile:
30
38
 
31
- gem 'net', '~> 0.1.1'
39
+ gem 'net', '~> 0.2.1'
32
40
 
33
41
  Since the gem follows [Semantic Versioning](http://semver.org),
34
42
  indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
@@ -73,6 +81,21 @@ user.follower_count #=> 7025
73
81
 
74
82
  *The methods above require a configured Instagram app (see below).*
75
83
 
84
+ Net::Facebook::Page
85
+ --------------------
86
+
87
+ Use [Net::Facebook::Page]() to:
88
+
89
+ * retrieve a Facebook page by username
90
+ * access the number of likes of a Facebook user
91
+
92
+ ```ruby
93
+ page = Net::Facebook::Page.find_by username: 'fullscreeninc'
94
+ page.likes #=> 7025
95
+ ```
96
+
97
+ *The methods above require a configured Facebook app (see below).*
98
+
76
99
  Configuring your Twitter app
77
100
  ============================
78
101
 
@@ -147,6 +170,45 @@ end
147
170
  so use the approach that you prefer.
148
171
  If a variable is set in both places, then `Net::Instagram.configure` takes precedence.
149
172
 
173
+ Configuring your Facebook app
174
+ ============================
175
+
176
+ In order to use Net you must create an app in the [Facebook Application Manager](https://developers.facebook.com/apps/).
177
+
178
+ Once the app is created, copy the API key and secret and add them to your
179
+ code with the following snippet of code (replacing with your own key and secret)
180
+ :
181
+
182
+ ```ruby
183
+ Net::Facebook.configure do |config|
184
+ config.client_id = 'abcdefg'
185
+ config.client_secret = 'abcdefg'
186
+ end
187
+ ```
188
+
189
+ Configuring with environment variables
190
+ --------------------------------------
191
+
192
+ As an alternative to the approach above, you can configure your app with
193
+ variables. Setting the following environment variables:
194
+
195
+ ```bash
196
+ export FACEBOOK_CLIENT_ID='abcd'
197
+ export FACEBOOK_CLIENT_SECRET='efgh'
198
+ ```
199
+
200
+ is equivalent to configuring your app with the initializer:
201
+
202
+ ```ruby
203
+ Net::Facebook.configure do |config|
204
+ config.client_id = 'abcd'
205
+ config.client_secret = 'efgh'
206
+ end
207
+ ```
208
+
209
+ so use the approach that you prefer.
210
+ If a variable is set in both places, then `Net::Facebook.configure` takes precedence.
211
+
150
212
  How to test
151
213
  ===========
152
214
 
data/lib/net.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "net/version"
2
2
  require "net/twitter"
3
3
  require "net/instagram"
4
+ require "net/facebook"
4
5
 
5
6
  module Net
6
7
  end
@@ -0,0 +1,11 @@
1
+ require 'net/facebook/config'
2
+ require 'net/facebook/models'
3
+ require 'net/facebook/errors'
4
+
5
+ module Net
6
+ module Facebook
7
+ extend Config
8
+ include Errors
9
+ include Models
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Net
2
+ module Facebook
3
+ module Api
4
+ class Configuration
5
+ attr_accessor :client_id, :client_secret
6
+
7
+ def initialize
8
+ @client_id = ENV['FACEBOOK_CLIENT_ID']
9
+ @client_secret = ENV['FACEBOOK_CLIENT_SECRET']
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,60 @@
1
+ require 'net/facebook/errors/response_error'
2
+ require 'active_support'
3
+ require 'active_support/core_ext'
4
+
5
+ module Net
6
+ module Facebook
7
+ module Api
8
+ class Request
9
+ def initialize(attrs = {})
10
+ @host = 'graph.facebook.com'
11
+ @query = attrs[:params] if attrs[:params]
12
+ @path = attrs.fetch :path, "/v2.3/#{@query}"
13
+ @method = attrs.fetch :method, :get
14
+ end
15
+
16
+ def run
17
+ case response = run_http_request
18
+ when Net::HTTPOK
19
+ JSON.parse(response.body)
20
+ else
21
+ raise Errors::ResponseError, response
22
+ end
23
+ end
24
+
25
+ private
26
+ def run_http_request
27
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
28
+ http.request http_request
29
+ end
30
+ end
31
+
32
+ def http_request
33
+ http_class = "Net::HTTP::#{@method.capitalize}".constantize
34
+ @http_request ||= http_class.new(uri.request_uri)
35
+ end
36
+
37
+ def uri
38
+ @uri ||= URI::HTTPS.build host: @host, path: @path, query: query
39
+ end
40
+
41
+ def query
42
+ {}.tap do |query|
43
+ query.merge! access_token: "#{Net::Facebook.configuration.client_id}|#{Net::Facebook.configuration.client_secret}"
44
+ end.to_param
45
+ end
46
+
47
+ def as_curl
48
+ 'curl'.tap do |curl|
49
+ curl << " -X #{http_request.method}"
50
+ http_request.each_header do |name, value|
51
+ curl << %Q{ -H "#{name}: #{value}"}
52
+ end
53
+ curl << %Q{ -d '#{http_request.body}'} if http_request.body
54
+ curl << %Q{ "#{@uri.to_s}"}
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,16 @@
1
+ require 'net/facebook/api/configuration'
2
+
3
+ module Net
4
+ module Facebook
5
+ module Config
6
+ def configure
7
+ yield configuration if block_given?
8
+ end
9
+
10
+ def configuration
11
+ @configuration ||= Api::Configuration.new
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,2 @@
1
+ require 'net/facebook/errors/response_error'
2
+ require 'net/facebook/errors/unknown_user'
@@ -0,0 +1,14 @@
1
+ module Net
2
+ module Facebook
3
+ module Errors
4
+ class ResponseError < StandardError
5
+ attr_reader :response
6
+
7
+ def initialize(response = {})
8
+ @response = response
9
+ super response
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Net
2
+ module Facebook
3
+ module Errors
4
+ class UnknownUser < StandardError
5
+ def message
6
+ 'Unknown user'
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'net/facebook/models/page'
@@ -0,0 +1,55 @@
1
+ require 'net/facebook/api/request'
2
+ require 'net/facebook/errors'
3
+
4
+ module Net
5
+ module Facebook
6
+ module Models
7
+ class Page
8
+ attr_reader :username, :likes
9
+
10
+ def initialize(attrs = {})
11
+ @username = attrs['username']
12
+ @likes = attrs['likes']
13
+ end
14
+
15
+
16
+ # Returns the existing Facebook page matching the provided attributes or
17
+ # nil when the page is not found.
18
+ #
19
+ # @return [Net::Facebook::Models::Page] the Facebook page.
20
+ # @ return [nil] when the page cannot be found.
21
+ # @param [Hash] params the attributes to find a page by.
22
+ # @option params [String] :username The Facebook page’s username
23
+ # (case-insensitive).
24
+ def self.find_by(params = {})
25
+ find_by! params
26
+ rescue Errors::UnknownUser
27
+ nil
28
+ end
29
+
30
+ # Returns the existing Facebook page matching the provided attributes or
31
+ # raises an error when the page is not found.
32
+ #
33
+ # @return [Net::Facebook::Models::Page] the Facebook page.
34
+ # @param [Hash] params the attributes to find a page by.
35
+ # @option params [String] :username The Facebook page’s username
36
+ # (case-insensitive).
37
+ # @raise [Net::Errors::UnknownUser] if the page cannot be found.
38
+ def self.find_by!(params = {})
39
+ find_by_username! params[:username]
40
+ end
41
+
42
+ private
43
+
44
+ def self.find_by_username!(username)
45
+ request = Api::Request.new params: username
46
+ new request.run
47
+ rescue Errors::ResponseError => error
48
+ case error.response
49
+ when Net::HTTPNotFound then raise Errors::UnknownUser
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,3 @@
1
1
  module Net
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Net::Facebook::Page do
4
+ let(:unknown_username) { 'qeqwe09qlkmhkjh' }
5
+ let(:existing_username) { 'Fullscreeninc' }
6
+
7
+ describe '.find_by' do
8
+ subject(:page) { Net::Facebook::Page.find_by username: username }
9
+
10
+ context 'given an existing (case-insensitive) username' do
11
+ let (:username) { existing_username }
12
+
13
+ it 'returns an object representing the page for that user' do
14
+ expect(page.username).to eq 'fullscreeninc'
15
+ expect(page.likes).to be_an Integer
16
+ end
17
+ end
18
+
19
+ context 'given an unknown username' do
20
+ let(:username) { unknown_username }
21
+ it { expect(page).to be_nil }
22
+ end
23
+ end
24
+
25
+ describe '.find_by!' do
26
+ subject(:page) { Net::Facebook::Page.find_by! username: username }
27
+
28
+ context 'given an existing (case-insensitive) username' do
29
+ let(:username) { existing_username }
30
+
31
+ it 'returns an object representing the page for that user' do
32
+ expect(page.username).to eq 'fullscreeninc'
33
+ expect(page.likes).to be_an Integer
34
+ end
35
+ end
36
+
37
+ context 'given an unknown username' do
38
+ let(:username) { unknown_username }
39
+ it { expect{page}.to raise_error Net::Facebook::UnknownUser }
40
+ end
41
+ end
42
+ end
@@ -20,4 +20,5 @@ VCR.configure do |c|
20
20
  interaction.response.headers['X-Rate-Limit-Reset'].first
21
21
  end
22
22
  end
23
+ c.ignore_hosts 'graph.facebook.com'
23
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Cohen Hoffing
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-20 00:00:00.000000000 Z
12
+ date: 2015-08-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -139,6 +139,15 @@ files:
139
139
  - README.md
140
140
  - Rakefile
141
141
  - lib/net.rb
142
+ - lib/net/facebook.rb
143
+ - lib/net/facebook/api/configuration.rb
144
+ - lib/net/facebook/api/request.rb
145
+ - lib/net/facebook/config.rb
146
+ - lib/net/facebook/errors.rb
147
+ - lib/net/facebook/errors/response_error.rb
148
+ - lib/net/facebook/errors/unknown_user.rb
149
+ - lib/net/facebook/models.rb
150
+ - lib/net/facebook/models/page.rb
142
151
  - lib/net/instagram.rb
143
152
  - lib/net/instagram/api/configuration.rb
144
153
  - lib/net/instagram/api/request.rb
@@ -162,6 +171,7 @@ files:
162
171
  - lib/net/twitter/models/user.rb
163
172
  - lib/net/version.rb
164
173
  - net.gemspec
174
+ - spec/net/facebook/models/pages_spec.rb
165
175
  - spec/net/instagram/models/user_spec.rb
166
176
  - spec/net/twitter/models/user_spec.rb
167
177
  - spec/spec_helper.rb
@@ -207,6 +217,7 @@ signing_key:
207
217
  specification_version: 4
208
218
  summary: An API Client for social networks
209
219
  test_files:
220
+ - spec/net/facebook/models/pages_spec.rb
210
221
  - spec/net/instagram/models/user_spec.rb
211
222
  - spec/net/twitter/models/user_spec.rb
212
223
  - spec/spec_helper.rb