net 0.2.1 → 0.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,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