koala 3.0.0.beta2 → 3.0.0.beta3
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 +4 -4
- data/ISSUE_TEMPLATE +23 -0
- data/PULL_REQUEST_TEMPLATE +9 -0
- data/changelog.md +21 -5
- data/lib/koala.rb +4 -7
- data/lib/koala/api.rb +2 -2
- data/lib/koala/api/graph_batch_api.rb +29 -37
- data/lib/koala/api/graph_collection.rb +18 -7
- data/lib/koala/configuration.rb +49 -0
- data/lib/koala/http_service.rb +2 -8
- data/lib/koala/oauth.rb +4 -4
- data/lib/koala/realtime_updates.rb +3 -3
- data/lib/koala/test_users.rb +4 -4
- data/lib/koala/version.rb +1 -1
- data/readme.md +51 -85
- data/spec/cases/api_spec.rb +21 -13
- data/spec/cases/configuration_spec.rb +11 -0
- data/spec/cases/graph_collection_spec.rb +33 -20
- data/spec/cases/http_service/request_spec.rb +5 -3
- data/spec/cases/koala_spec.rb +1 -4
- data/spec/cases/oauth_spec.rb +39 -0
- data/spec/cases/realtime_updates_spec.rb +39 -0
- data/spec/cases/test_users_spec.rb +41 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ed893e5254cc1e5b3007301dc847bd025b592c1
|
4
|
+
data.tar.gz: 3ad942cb33ac7e7a36304250dd3cc7c6b36712f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d4cac2752f9b72f7c1c1cf4632dfaf10b7ba9b72753699540587e3b636b35fde33ca2035b47e468d51d59c490ce9dcbc624618d5eb10e1da3b5fc4c2a11f034
|
7
|
+
data.tar.gz: 4728dfc6777f3e1b29d2dcab6608c9a40f24e8ee8a2136940ed2b463846ddcffa9c0f0afd96a1ab8d21b2d2c0203bdde5ddfe0c4a8ee1d250650921361343c90
|
data/ISSUE_TEMPLATE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Thanks for using Koala! Sorry you've run into an issue 😓 Here are some questions to help get things figured out as quickly as possible.
|
2
|
+
|
3
|
+
You don't have to fill this all out -- it's more of a guide. If in doubt, delete any sections that aren't relevant and open the issue. I want to help.
|
4
|
+
|
5
|
+
[ ] This is a Koala bug/issue/documentation problem.
|
6
|
+
|
7
|
+
Koala is a labor of love both from me and from the awesome community members who answer questions here. Much as we'd love to be able to help with everything, I have to focus my time on issues with the gem itself and can't help with questions on how to _use_ Facebook. (Plus, Facebook is huge!)
|
8
|
+
|
9
|
+
If you have questions about using the Facebook API, [facebook.stackoverflow.com](http://facebook.stackoverflow.com) is a great resource.
|
10
|
+
|
11
|
+
For code issues:
|
12
|
+
|
13
|
+
[ ] What I'm doing works on the [Graph API explorer](https://developers.facebook.com/tools/explorer/)/curl/another tool.
|
14
|
+
|
15
|
+
Seeing an example of what works helps diagnose what doesn't work.
|
16
|
+
|
17
|
+
[ ] I'm using the newest version
|
18
|
+
|
19
|
+
[ ] Here's code to replicate the issue:
|
20
|
+
|
21
|
+
Obviously not all code can be shared -- feel free to put variables in place of any sensitive information and describe what should be used to replicate it.
|
22
|
+
|
23
|
+
Thanks for submitting an issue! Looking forward to working with you to figure it out.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Thanks for submitting a pull request to Koala! A huge portion of the gem has been built by awesome people (like you) from the Ruby community.
|
2
|
+
|
3
|
+
Here are a few things that will help get your pull request merged in quickly. None of this is required -- you can delete anything not relevant. If in doubt, open the PR! I want to help.
|
4
|
+
|
5
|
+
[ ] My PR has tests and they pass!
|
6
|
+
[ ] The live tests pass for my changes (`LIVE=true rspec` -- unrelated failures are okay).
|
7
|
+
[ ] The PR is based on the most recent master commit and has no merge conflicts.
|
8
|
+
|
9
|
+
If you have any questions, feel free to open an issue or comment on your PR!
|
data/changelog.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
v3.0.0
|
1
|
+
v3.0.0 (not released yet)
|
2
2
|
======
|
3
3
|
|
4
|
+
Most users should not see any difference upgrading from 2.x to 3.0. Most of the changes are
|
5
|
+
internal to how requests go from a graph method (like `get_connections`) through the API to the
|
6
|
+
HTTP layer and back. If you're not using API#api or HTTPService.make_request directly, upgrading
|
7
|
+
should (in theory) require no code changes. (Let me know if you run into any issues.)
|
8
|
+
|
4
9
|
**Key breaking changes:**
|
5
10
|
|
6
11
|
* Koala now requires Ruby 2.1+ (or equivalent for JRuby, etc.)
|
@@ -13,8 +18,15 @@ v3.0.0
|
|
13
18
|
* API#search now requires a "type"/:type argument, matching Facebook's behavior (improving their
|
14
19
|
cryptic error message)
|
15
20
|
|
21
|
+
New features:
|
22
|
+
|
23
|
+
* Koala now supports global configuration for tokens, secrets, etc! See the readme.
|
24
|
+
* GraphCollection now exposes #headers, allowing access to etag/rate limiting/etc. info (thanks,
|
25
|
+
pawandubey and jessieay!) (#589)
|
26
|
+
|
16
27
|
Updated features:
|
17
28
|
|
29
|
+
* Koala.config now uses a dedicated Koala::Configuration object
|
18
30
|
* TestUser#befriend will provide the appsecret_proof if a secret is set (thanks, kwasimensah!)
|
19
31
|
* API#search now requires an object type parameter to be included, matching Facebook's API (#575)
|
20
32
|
|
@@ -40,7 +52,11 @@ Testing improvements:
|
|
40
52
|
|
41
53
|
* Fixed a bunch of failing mocked specs
|
42
54
|
|
43
|
-
|
55
|
+
Others:
|
56
|
+
|
57
|
+
* Added an issue and pull request template
|
58
|
+
|
59
|
+
v2.5.0 (2017-02-17)
|
44
60
|
======
|
45
61
|
|
46
62
|
New features:
|
@@ -55,7 +71,7 @@ Internal improvements:
|
|
55
71
|
|
56
72
|
* Remove MultiJson dependency (thanks, sakuro!)
|
57
73
|
|
58
|
-
v2.4.0
|
74
|
+
v2.4.0 (2016-07-08)
|
59
75
|
======
|
60
76
|
|
61
77
|
**Note:** Koala is no longer officially supported on Ruby 1.9.3 (which was [end-of-lifed back in
|
@@ -78,7 +94,7 @@ Testing improvements:
|
|
78
94
|
* Test Koala against Ruby 2.3.0 (thanks, thedrow!)
|
79
95
|
|
80
96
|
|
81
|
-
v2.3.0
|
97
|
+
v2.3.0 (2016-04-10)
|
82
98
|
======
|
83
99
|
|
84
100
|
Updated features:
|
@@ -99,7 +115,7 @@ Testing improvements:
|
|
99
115
|
* Removed pended specs that were no longer relevant
|
100
116
|
* Improved https regex in test suite (thanks, lucaskds!)
|
101
117
|
|
102
|
-
v2.2.0
|
118
|
+
v2.2.0 (2015-08-11)
|
103
119
|
======
|
104
120
|
|
105
121
|
Updated features:
|
data/lib/koala.rb
CHANGED
@@ -14,6 +14,7 @@ require 'koala/test_users'
|
|
14
14
|
require 'koala/http_service'
|
15
15
|
|
16
16
|
# miscellaneous
|
17
|
+
require 'koala/configuration'
|
17
18
|
require 'koala/utils'
|
18
19
|
require 'koala/version'
|
19
20
|
require 'ostruct'
|
@@ -37,14 +38,10 @@ module Koala
|
|
37
38
|
end
|
38
39
|
|
39
40
|
# Allows you to control various Koala configuration options.
|
40
|
-
#
|
41
|
-
#
|
42
|
-
# (see HTTPService::DEFAULT_SERVERS) if you want to run requests through
|
43
|
-
# other servers.
|
44
|
-
# * api_version: controls which Facebook API version to use (v1.0, v2.0,
|
45
|
-
# etc)
|
41
|
+
# NOTE: this is not currently threadsafe.
|
42
|
+
# See Koala::Configuration.
|
46
43
|
def config
|
47
|
-
@config ||=
|
44
|
+
@config ||= Configuration.new
|
48
45
|
end
|
49
46
|
|
50
47
|
# Used for testing.
|
data/lib/koala/api.rb
CHANGED
@@ -15,7 +15,7 @@ module Koala
|
|
15
15
|
# https://developers.facebook.com/docs/graph-api/securing-requests/)
|
16
16
|
# @note If no access token is provided, you can only access some public information.
|
17
17
|
# @return [Koala::Facebook::API] the API client
|
18
|
-
def initialize(access_token =
|
18
|
+
def initialize(access_token = Koala.config.access_token, app_secret = Koala.config.app_secret)
|
19
19
|
@access_token = access_token
|
20
20
|
@app_secret = app_secret
|
21
21
|
end
|
@@ -55,7 +55,7 @@ module Koala
|
|
55
55
|
http_component == :response ? response : response.send(http_component)
|
56
56
|
else
|
57
57
|
# turn this into a GraphCollection if it's pageable
|
58
|
-
API::GraphCollection.evaluate(response
|
58
|
+
API::GraphCollection.evaluate(response, self)
|
59
59
|
end
|
60
60
|
|
61
61
|
# now process as appropriate for the given call (get picture header, etc.)
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "koala/api"
|
2
|
+
require "koala/api/batch_operation"
|
3
3
|
|
4
4
|
module Koala
|
5
5
|
module Facebook
|
@@ -19,7 +19,7 @@ module Koala
|
|
19
19
|
|
20
20
|
# Enqueue a call into the batch for later processing.
|
21
21
|
# See API#graph_call
|
22
|
-
def graph_call(path, args = {}, verb =
|
22
|
+
def graph_call(path, args = {}, verb = "get", options = {}, &post_processing)
|
23
23
|
# normalize options for consistency
|
24
24
|
options = Koala::Utils.symbolize_hash(options)
|
25
25
|
|
@@ -40,32 +40,26 @@ module Koala
|
|
40
40
|
return [] if batch_calls.empty?
|
41
41
|
|
42
42
|
# Turn the call args collected into what facebook expects
|
43
|
-
args = {
|
43
|
+
args = {"batch" => batch_args}
|
44
44
|
batch_calls.each do |call|
|
45
45
|
args.merge! call.files || {}
|
46
46
|
end
|
47
47
|
|
48
|
-
original_api.graph_call(
|
49
|
-
end
|
50
|
-
|
51
|
-
def handle_response
|
52
|
-
lambda do |response|
|
48
|
+
original_api.graph_call("/", args, "post", http_options) do |response|
|
53
49
|
raise bad_response if response.nil?
|
54
|
-
response
|
50
|
+
generate_results(response)
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
58
|
-
def generate_results
|
54
|
+
def generate_results(response)
|
59
55
|
index = 0
|
60
|
-
|
61
|
-
batch_op
|
56
|
+
response.map do |call_result|
|
57
|
+
batch_op = batch_calls[index]
|
58
|
+
index += 1
|
62
59
|
post_process = batch_op.post_processing
|
63
60
|
|
64
61
|
# turn any results that are pageable into GraphCollections
|
65
|
-
result =
|
66
|
-
result_from_response(call_result, batch_op),
|
67
|
-
original_api
|
68
|
-
)
|
62
|
+
result = result_from_response(call_result, batch_op)
|
69
63
|
|
70
64
|
# and pass to post-processing callback if given
|
71
65
|
if post_process
|
@@ -78,34 +72,34 @@ module Koala
|
|
78
72
|
|
79
73
|
def bad_response
|
80
74
|
# Facebook sometimes reportedly returns an empty body at times
|
81
|
-
BadFacebookResponse.new(200,
|
75
|
+
BadFacebookResponse.new(200, "", "Facebook returned an empty body")
|
82
76
|
end
|
83
77
|
|
84
78
|
def result_from_response(response, options)
|
85
79
|
return nil if response.nil?
|
86
80
|
|
87
|
-
headers =
|
81
|
+
headers = headers_from_response(response)
|
88
82
|
error = error_from_response(response, headers)
|
89
83
|
component = options.http_options[:http_component]
|
90
84
|
|
91
|
-
error ||
|
92
|
-
:
|
93
|
-
:
|
94
|
-
:
|
95
|
-
|
85
|
+
error || desired_component(
|
86
|
+
component: component,
|
87
|
+
response: response,
|
88
|
+
headers: headers
|
89
|
+
)
|
96
90
|
end
|
97
91
|
|
98
|
-
def
|
99
|
-
headers = response.fetch(
|
92
|
+
def headers_from_response(response)
|
93
|
+
headers = response.fetch("headers", [])
|
100
94
|
|
101
|
-
headers.
|
102
|
-
|
95
|
+
headers.inject({}) do |compiled_headers, header|
|
96
|
+
compiled_headers.merge(header.fetch("name") => header.fetch("value"))
|
103
97
|
end
|
104
98
|
end
|
105
99
|
|
106
100
|
def error_from_response(response, headers)
|
107
|
-
code = response[
|
108
|
-
body = response[
|
101
|
+
code = response["code"]
|
102
|
+
body = response["body"].to_s
|
109
103
|
|
110
104
|
GraphErrorChecker.new(code, body, headers).error_if_appropriate
|
111
105
|
end
|
@@ -121,21 +115,19 @@ module Koala
|
|
121
115
|
def json_body(response)
|
122
116
|
# quirks_mode is needed because Facebook sometimes returns a raw true or false value --
|
123
117
|
# in Ruby 2.4 we can drop that.
|
124
|
-
JSON.parse(response.fetch(
|
118
|
+
JSON.parse(response.fetch("body"), quirks_mode: true)
|
125
119
|
end
|
126
120
|
|
127
|
-
def
|
128
|
-
|
129
|
-
response = options.fetch(:response)
|
130
|
-
headers = options.fetch(:headers)
|
121
|
+
def desired_component(component:, response:, headers:)
|
122
|
+
result = Koala::HTTPService::Response.new(response['status'], response['body'], headers)
|
131
123
|
|
132
124
|
# Get the HTTP component they want
|
133
125
|
case component
|
134
|
-
when :status then response[
|
126
|
+
when :status then response["code"].to_i
|
135
127
|
# facebook returns the headers as an array of k/v pairs, but we want a regular hash
|
136
128
|
when :headers then headers
|
137
129
|
# (see note in regular api method about JSON parsing)
|
138
|
-
else
|
130
|
+
else GraphCollection.evaluate(result, original_api)
|
139
131
|
end
|
140
132
|
end
|
141
133
|
|
@@ -16,30 +16,41 @@ module Koala
|
|
16
16
|
attr_reader :api
|
17
17
|
# The entire raw response from Facebook.
|
18
18
|
attr_reader :raw_response
|
19
|
+
# The headers from the Facebook response
|
20
|
+
attr_reader :headers
|
19
21
|
|
20
22
|
# Initialize the array of results and store various additional paging-related information.
|
21
23
|
#
|
22
|
-
# @param
|
24
|
+
# @param [Koala::HTTPService::Response] response object wrapping the raw Facebook response
|
23
25
|
# @param api the Graph {Koala::Facebook::API API} instance to use to make calls
|
24
26
|
# (usually the API that made the original call).
|
25
27
|
#
|
26
28
|
# @return [Koala::Facebook::API::GraphCollection] an initialized GraphCollection
|
27
29
|
# whose paging, summary, raw_response, and api attributes are populated.
|
28
30
|
def initialize(response, api)
|
29
|
-
super response["data"]
|
30
|
-
@paging = response["paging"]
|
31
|
-
@summary = response["summary"]
|
32
|
-
@raw_response = response
|
31
|
+
super response.data["data"]
|
32
|
+
@paging = response.data["paging"]
|
33
|
+
@summary = response.data["summary"]
|
34
|
+
@raw_response = response.data
|
33
35
|
@api = api
|
36
|
+
@headers = response.headers
|
34
37
|
end
|
35
38
|
|
36
39
|
# @private
|
37
40
|
# Turn the response into a GraphCollection if they're pageable;
|
38
|
-
# if not, return the original response.
|
41
|
+
# if not, return the data of the original response.
|
39
42
|
# The Ads API (uniquely so far) returns a hash rather than an array when queried
|
40
43
|
# with get_connections.
|
41
44
|
def self.evaluate(response, api)
|
42
|
-
|
45
|
+
return nil if response.nil?
|
46
|
+
|
47
|
+
is_pageable?(response) ? self.new(response, api) : response.data
|
48
|
+
end
|
49
|
+
|
50
|
+
# response will always be an instance of Koala::HTTPService::Response
|
51
|
+
# since that is what we get from Koala::Facebook::API#api
|
52
|
+
def self.is_pageable?(response)
|
53
|
+
response.data.is_a?(Hash) && response.data["data"].is_a?(Array)
|
43
54
|
end
|
44
55
|
|
45
56
|
# Retrieve the next page of results.
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Global configuration for Koala.
|
2
|
+
class Koala::Configuration
|
3
|
+
# The default access token to be used if none is otherwise supplied.
|
4
|
+
attr_accessor :access_token
|
5
|
+
|
6
|
+
# The default app secret value to be used if none is otherwise supplied.
|
7
|
+
attr_accessor :app_secret
|
8
|
+
|
9
|
+
# The default application ID to use if none is otherwise supplied.
|
10
|
+
attr_accessor :app_id
|
11
|
+
|
12
|
+
# The default app access token to be used if none is otherwise supplied.
|
13
|
+
attr_accessor :app_access_token
|
14
|
+
|
15
|
+
# The default API version to use if none is otherwise specified.
|
16
|
+
attr_accessor :api_version
|
17
|
+
|
18
|
+
# The default value to use for the oauth_callback_url if no other is provided.
|
19
|
+
attr_accessor :oauth_callback_url
|
20
|
+
|
21
|
+
# Whether to preserve arrays in arguments, which are expected by certain FB APIs (see the ads API
|
22
|
+
# in particular, https://developers.facebook.com/docs/marketing-api/adgroup/v2.4)
|
23
|
+
attr_accessor :preserve_form_arguments
|
24
|
+
|
25
|
+
# The server to use for Graph API requests
|
26
|
+
attr_accessor :graph_server
|
27
|
+
|
28
|
+
# The server to use when constructing dialog URLs.
|
29
|
+
attr_accessor :dialog_host
|
30
|
+
|
31
|
+
# Certain Facebook services (beta, video) require you to access different
|
32
|
+
# servers. If you're using your own servers, for instance, for a proxy,
|
33
|
+
# you can change both the matcher (what value to change when updating the URL) and the
|
34
|
+
# replacement values (what to add).
|
35
|
+
#
|
36
|
+
# So, for instance, to use the beta stack, we match on .facebook and change it to .beta.facebook.
|
37
|
+
# If you're talking to fbproxy.mycompany.com, you could set up beta.fbproxy.mycompany.com for
|
38
|
+
# FB's beta tier, and set the matcher to /\.fbproxy/ and the beta_replace to '.beta.fbproxy'.
|
39
|
+
attr_accessor :host_path_matcher
|
40
|
+
attr_accessor :video_replace
|
41
|
+
attr_accessor :beta_replace
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
# Default to our default values.
|
45
|
+
Koala::HTTPService::DEFAULT_SERVERS.each_pair do |key, value|
|
46
|
+
self.public_send("#{key}=", value)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/koala/http_service.rb
CHANGED
@@ -24,17 +24,11 @@ module Koala
|
|
24
24
|
builder.adapter Faraday.default_adapter
|
25
25
|
end
|
26
26
|
|
27
|
-
# Default
|
28
|
-
#
|
27
|
+
# Default server information for Facebook. These can be overridden by setting config values.
|
28
|
+
# See Koala.config.
|
29
29
|
DEFAULT_SERVERS = {
|
30
30
|
:graph_server => 'graph.facebook.com',
|
31
31
|
:dialog_host => 'www.facebook.com',
|
32
|
-
# certain Facebook services (beta, video) require you to access different
|
33
|
-
# servers. If you're using your own servers, for instance, for a proxy,
|
34
|
-
# you can change both the matcher and the replacement values.
|
35
|
-
# So for instance, if you're talking to fbproxy.mycompany.com, you could
|
36
|
-
# set up beta.fbproxy.mycompany.com for FB's beta tier, and set the
|
37
|
-
# matcher to /\.fbproxy/ and the beta_replace to '.beta.fbproxy'.
|
38
32
|
:host_path_matcher => /\.facebook/,
|
39
33
|
:video_replace => '-video.facebook',
|
40
34
|
:beta_replace => '.beta.facebook'
|
data/lib/koala/oauth.rb
CHANGED
@@ -12,10 +12,10 @@ module Koala
|
|
12
12
|
# @param app_id [String, Integer] a Facebook application ID
|
13
13
|
# @param app_secret a Facebook application secret
|
14
14
|
# @param oauth_callback_url the URL in your app to which users authenticating with OAuth will be sent
|
15
|
-
def initialize(app_id, app_secret, oauth_callback_url = nil)
|
16
|
-
@app_id = app_id
|
17
|
-
@app_secret = app_secret
|
18
|
-
@oauth_callback_url = oauth_callback_url
|
15
|
+
def initialize(app_id = nil, app_secret = nil, oauth_callback_url = nil)
|
16
|
+
@app_id = app_id || Koala.config.app_id
|
17
|
+
@app_secret = app_secret || Koala.config.app_secret
|
18
|
+
@oauth_callback_url = oauth_callback_url || Koala.config.oauth_callback_url
|
19
19
|
end
|
20
20
|
|
21
21
|
# Parses the cookie set Facebook's JavaScript SDK.
|
@@ -23,9 +23,9 @@ module Koala
|
|
23
23
|
#
|
24
24
|
# @raise ArgumentError if the application ID and one of the app access token or the secret are not provided.
|
25
25
|
def initialize(options = {})
|
26
|
-
@app_id = options[:app_id]
|
27
|
-
@app_access_token = options[:app_access_token]
|
28
|
-
@secret = options[:secret]
|
26
|
+
@app_id = options[:app_id] || Koala.config.app_id
|
27
|
+
@app_access_token = options[:app_access_token] || Koala.config.app_access_token
|
28
|
+
@secret = options[:secret] || Koala.config.app_secret
|
29
29
|
unless @app_id && (@app_access_token || @secret) # make sure we have what we need
|
30
30
|
raise ArgumentError, "Initialize must receive a hash with :app_id and either :app_access_token or :secret! (received #{options.inspect})"
|
31
31
|
end
|
data/lib/koala/test_users.rb
CHANGED
@@ -14,7 +14,6 @@ module Koala
|
|
14
14
|
#
|
15
15
|
# See http://developers.facebook.com/docs/test_users/.
|
16
16
|
class TestUsers
|
17
|
-
|
18
17
|
# The application API interface used to communicate with Facebook.
|
19
18
|
# @return [Koala::Facebook::API]
|
20
19
|
attr_reader :api
|
@@ -31,9 +30,10 @@ module Koala
|
|
31
30
|
#
|
32
31
|
# @raise ArgumentError if the application ID and one of the app access token or the secret are not provided.
|
33
32
|
def initialize(options = {})
|
34
|
-
@app_id = options[:app_id]
|
35
|
-
@app_access_token = options[:app_access_token]
|
36
|
-
@secret = options[:secret]
|
33
|
+
@app_id = options[:app_id] || Koala.config.app_id
|
34
|
+
@app_access_token = options[:app_access_token] || Koala.config.app_access_token
|
35
|
+
@secret = options[:secret] || Koala.config.app_secret
|
36
|
+
|
37
37
|
unless @app_id && (@app_access_token || @secret) # make sure we have what we need
|
38
38
|
raise ArgumentError, "Initialize must receive a hash with :app_id and either :app_access_token or :secret! (received #{options.inspect})"
|
39
39
|
end
|
data/lib/koala/version.rb
CHANGED
data/readme.md
CHANGED
@@ -4,7 +4,7 @@ Koala [](https://rubygems.org/
|
|
4
4
|
|
5
5
|
* Lightweight: Koala should be as light and simple as Facebook’s own libraries, providing API accessors and returning simple JSON.
|
6
6
|
* Fast: Koala should, out of the box, be quick. Out of the box, we use Facebook's faster read-only servers when possible and if available, the Typhoeus gem to make snappy Facebook requests. Of course, that brings us to our next topic:
|
7
|
-
* Flexible: Koala should be useful to everyone, regardless of their current configuration. We support
|
7
|
+
* Flexible: Koala should be useful to everyone, regardless of their current configuration. We support all currently-supported Ruby versions (MRI 2.1-2.4) and Koala should work on JRuby and Rubinius.
|
8
8
|
* Tested: Koala should have complete test coverage, so you can rely on it. Our test coverage is complete and can be run against either mocked responses or the live Facebook servers; we're also on [Travis CI](http://travis-ci.org/arsduo/koala/).
|
9
9
|
|
10
10
|
**Found a bug? Interested in contributing?** Check out the Maintenance section below!
|
@@ -12,35 +12,58 @@ Koala [](https://rubygems.org/
|
|
12
12
|
Installation
|
13
13
|
------------
|
14
14
|
|
15
|
+
**Koala 3.0 is in beta! There should be no significant changes** for most users -- please check it
|
16
|
+
out!
|
17
|
+
|
15
18
|
In Bundler:
|
16
19
|
```ruby
|
17
|
-
gem "koala", "~>
|
20
|
+
gem "koala", "~> 3.0.0.beta2"
|
21
|
+
# if you need the previous release
|
22
|
+
gem "koala", "~> 2.4"
|
18
23
|
```
|
19
24
|
|
20
25
|
Otherwise:
|
21
26
|
```bash
|
27
|
+
[sudo|rvm] gem install koala --pre
|
28
|
+
# if you need the previous release
|
22
29
|
[sudo|rvm] gem install koala
|
23
30
|
```
|
24
31
|
|
25
|
-
|
26
|
-
|
32
|
+
Configuration
|
33
|
+
-------------
|
27
34
|
|
28
|
-
|
29
|
-
|
30
|
-
|
35
|
+
Most applications will only use one application configuration. Rather than having toprovide that
|
36
|
+
value every time, you can configure Koala to use global settings:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
# In Rails, you could put this in config/initializers/koala.rb
|
40
|
+
Koala.configure do |config|
|
41
|
+
config.access_token = MY_TOKEN
|
42
|
+
config.app_access_token = MY_APP_ACCESS_TOKEN
|
43
|
+
config.app_id = MY_APP_ID
|
44
|
+
config.app_secret = MY_APP_SECRET
|
45
|
+
# See Koala::Configuration for more options, including details on how to send requests through
|
46
|
+
# your own proxy servers.
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
**Note**: this is not currently threadsafe. (PRs welcome as long as they support both threaded and
|
51
|
+
non-threaded configuration.)
|
31
52
|
|
32
53
|
Graph API
|
33
54
|
---------
|
34
55
|
|
35
|
-
The Graph API is the
|
36
|
-
|
37
|
-
|
56
|
+
The Graph API is the interface to Facebook's data. Using it with Koala is quite straightforward.
|
57
|
+
First, you'll need an access token, which you can get through Facebook's [Graph API
|
58
|
+
Explorer](https://developers.facebook.com/tools/explorer) (click on 'Get Access Token').
|
59
|
+
|
38
60
|
Then, go exploring:
|
39
61
|
|
40
62
|
```ruby
|
41
63
|
require 'koala'
|
42
64
|
|
43
|
-
|
65
|
+
# access_token and other values aren't required if you set the defaults as described above
|
66
|
+
@graph = Koala::Facebook::API.new(access_token)
|
44
67
|
|
45
68
|
profile = @graph.get_object("me")
|
46
69
|
friends = @graph.get_connections("me", "friends")
|
@@ -56,14 +79,14 @@ friends = @graph.get_connections("me", "friends")
|
|
56
79
|
# For extra security (recommended), you can provide an appsecret parameter,
|
57
80
|
# tying your access tokens to your app secret.
|
58
81
|
# (See https://developers.facebook.com/docs/reference/api/securing-graph-api/
|
59
|
-
|
82
|
+
|
83
|
+
# You may need to turn on 'Require proof on all calls' in the advanced section
|
60
84
|
# of your app's settings when doing this.
|
61
|
-
@graph = Koala::Facebook::API.new(
|
85
|
+
@graph = Koala::Facebook::API.new(access_token, app_secret)
|
62
86
|
|
63
87
|
# Facebook is now versioning their API. # If you don't specify a version, Facebook
|
64
|
-
# will default to the oldest version your app is allowed to use.
|
65
|
-
#
|
66
|
-
# https://developers.facebook.com/docs/apps/versions for more information.
|
88
|
+
# will default to the oldest version your app is allowed to use.
|
89
|
+
# See https://developers.facebook.com/docs/apps/versions for more information.
|
67
90
|
#
|
68
91
|
# You can specify version either globally:
|
69
92
|
Koala.config.api_version = "v2.0"
|
@@ -115,64 +138,20 @@ the results apart from a long list of array entries:
|
|
115
138
|
|
116
139
|
Check out the wiki for more details and examples.
|
117
140
|
|
118
|
-
|
119
|
-
-------------
|
120
|
-
|
121
|
-
You can change the host that koala makes requests to (point to a mock server, apigee, runscope etc..)
|
122
|
-
```ruby
|
123
|
-
# config/initializers/koala.rb
|
124
|
-
require 'koala'
|
125
|
-
|
126
|
-
Koala.configure do |config|
|
127
|
-
config.graph_server = 'my-graph-mock.mysite.com'
|
128
|
-
# another common option: `dialog_host`
|
129
|
-
# see lib/koala/http_service.rb
|
130
|
-
end
|
131
|
-
```
|
132
|
-
|
133
|
-
Of course the defaults are the facebook endpoints and you can additionally configure the beta
|
134
|
-
tier and video upload matching and replacement strings.
|
135
|
-
|
136
|
-
OAuth
|
141
|
+
App Access Tokens
|
137
142
|
-----
|
138
143
|
|
139
|
-
You
|
144
|
+
You get your application's own access token, which can be used without a user session for subscriptions and certain other requests:
|
140
145
|
```ruby
|
141
146
|
@oauth = Koala::Facebook::OAuth.new(app_id, app_secret, callback_url)
|
142
|
-
```
|
143
|
-
|
144
|
-
If your application uses Koala and the Facebook [JavaScript SDK](http://github.com/facebook/facebook-js-sdk) (formerly Facebook Connect), you can use the OAuth class to parse the cookies:
|
145
|
-
```ruby
|
146
|
-
# parses and returns a hash including the token and the user id
|
147
|
-
# NOTE: this method can only be called once per session, as the OAuth code
|
148
|
-
# Facebook supplies can only be redeemed once. Your application must handle
|
149
|
-
# cross-request storage of this information; you can no longer call this method
|
150
|
-
# multiple times.
|
151
|
-
@oauth.get_user_info_from_cookies(cookies)
|
152
|
-
```
|
153
|
-
And if you have to use the more complicated [redirect-based OAuth process](http://developers.facebook.com/docs/authentication/), Koala helps out there, too:
|
154
|
-
|
155
|
-
```ruby
|
156
|
-
# generate authenticating URL
|
157
|
-
@oauth.url_for_oauth_code
|
158
|
-
# fetch the access token once you have the code
|
159
|
-
@oauth.get_access_token(code)
|
160
|
-
```
|
161
|
-
|
162
|
-
You can also get your application's own access token, which can be used without a user session for subscriptions and certain other requests:
|
163
|
-
```ruby
|
164
147
|
@oauth.get_app_access_token
|
165
148
|
```
|
166
149
|
For those building apps on Facebook, parsing signed requests is simple:
|
167
150
|
```ruby
|
168
151
|
@oauth.parse_signed_request(signed_request_string)
|
169
152
|
```
|
170
|
-
|
171
|
-
|
172
|
-
@oauth.get_token_from_session_key(session_key)
|
173
|
-
@oauth.get_tokens_from_session_keys(array_of_session_keys)
|
174
|
-
```
|
175
|
-
That's it! It's pretty simple once you get the hang of it. If you're new to OAuth, though, check out the wiki and the OAuth Playground example site (see below).
|
153
|
+
|
154
|
+
The OAuth class has additional methods that may occasionally be useful.
|
176
155
|
|
177
156
|
Real-time Updates
|
178
157
|
-----------------
|
@@ -181,6 +160,7 @@ Sometimes, reaching out to Facebook is a pain -- let it reach out to you instead
|
|
181
160
|
|
182
161
|
Koala makes it easy to interact with your applications using the RealtimeUpdates class:
|
183
162
|
```ruby
|
163
|
+
# This class also supports the defaults as described above
|
184
164
|
@updates = Koala::Facebook::RealtimeUpdates.new(app_id: app_id, secret: secret)
|
185
165
|
```
|
186
166
|
You can do just about anything with your real-time update subscriptions using the RealtimeUpdates class:
|
@@ -206,12 +186,14 @@ Test Users
|
|
206
186
|
|
207
187
|
We also support the test users API, allowing you to conjure up fake users and command them to do your bidding using the Graph API:
|
208
188
|
```ruby
|
189
|
+
# This class also supports the defaults as described above
|
209
190
|
@test_users = Koala::Facebook::TestUsers.new(app_id: id, secret: secret)
|
210
191
|
user = @test_users.create(is_app_installed, desired_permissions)
|
211
192
|
user_graph_api = Koala::Facebook::API.new(user["access_token"])
|
212
193
|
# or, if you want to make a whole community:
|
213
194
|
@test_users.create_network(network_size, is_app_installed, common_permissions)
|
214
195
|
```
|
196
|
+
|
215
197
|
Talking to Facebook
|
216
198
|
-------------------
|
217
199
|
|
@@ -234,14 +216,6 @@ Some resources to help you as you play with Koala and the Graph API:
|
|
234
216
|
* Complete Koala documentation <a href="https://github.com/arsduo/koala/wiki">on the wiki</a>
|
235
217
|
* Facebook's <a href="http://facebook.stackoverflow.com/">Stack Overflow site</a> is a stupendous place to ask questions, filled with people who will help you figure out what's up with the Facebook API.
|
236
218
|
* Facebook's <a href="http://developers.facebook.com/tools/explorer/">Graph API Explorer</a>, where you can play with the Graph API in your browser
|
237
|
-
* The Koala-powered <a href="http://oauth.twoalex.com" target="_blank">OAuth Playground</a>, where you can easily generate OAuth access tokens and any other data needed to test out the APIs or OAuth
|
238
|
-
* Follow Koala on <a href="http://www.facebook.com/pages/Koala/315368291823667">Facebook</a> and <a href="https://twitter.com/#!/koala_fb">Twitter</a> for SDK updates and occasional news about Facebook API changes.
|
239
|
-
|
240
|
-
*Note*: I use the Koala issues tracker on Github to triage and address issues
|
241
|
-
with the gem itself; if you need help using the Facebook API, the above
|
242
|
-
resources will be far more effective. Depending on how much time I have, Github
|
243
|
-
issues filed about how to use the Facebook API may be closed with a reference
|
244
|
-
to the Facebook Stack Overflow page.
|
245
219
|
|
246
220
|
Testing
|
247
221
|
-------
|
@@ -259,26 +233,18 @@ LIVE=true bundle exec rake spec
|
|
259
233
|
# you can also test against Facebook's beta tier
|
260
234
|
LIVE=true BETA=true bundle exec rake spec
|
261
235
|
```
|
236
|
+
|
262
237
|
By default, the live tests are run against test users, so you can run them as frequently as you want. If you want to run them against a real user, however, you can fill in the OAuth token, code, and access\_token values in spec/fixtures/facebook_data.yml. See the wiki for more details.
|
263
238
|
|
264
239
|
Maintenance
|
265
240
|
-----------
|
266
241
|
|
267
242
|
_Pull requests_: Koala exists as it does thanks to the amazing support and work of community members of all
|
268
|
-
backgrounds and levels of experience. Pull requests are very welcome!
|
269
|
-
|
243
|
+
backgrounds and levels of experience. Pull requests are very welcome!
|
244
|
+
|
245
|
+
_Issues_: If you have any questions about the gem, found an issue in the Ruby code or
|
246
|
+
documentation, or have another question that isn't right for StackOverflow, just open an issue and fill out the template.
|
270
247
|
|
271
248
|
Please note that this project is released with a Contributor Code of Conduct. By participating in
|
272
249
|
this project you agree to abide by its terms. See
|
273
250
|
[code_of_conduct.md](https://github.com/arsduo/koala/blob/master/code_of_conduct.md) for more information.
|
274
|
-
|
275
|
-
_Schedule_: In order to keep Koala moving forward on a regular and predictable schedule, I will
|
276
|
-
address issues and pull requests at least three times a year: late July/early August, late
|
277
|
-
December/early January, and late March/early April. I may respond to issues in between maintenance
|
278
|
-
periods, but it'll depend on other life/work goings-on.
|
279
|
-
|
280
|
-
Breaking/new Facebook changes and other urgent issues obviously will get addressed much more
|
281
|
-
quickly. (We've never had a security issue, but obviously that would be priority 0.)
|
282
|
-
|
283
|
-
Have questions? Found a breaking bug or urgent issue? [Tweet at me](http://twitter.com/arsduo) --
|
284
|
-
I'm always happy to respond.
|
data/spec/cases/api_spec.rb
CHANGED
@@ -6,6 +6,26 @@ describe "Koala::Facebook::API" do
|
|
6
6
|
end
|
7
7
|
let(:dummy_response) { double("fake response", data: {}, status: 200, body: "", headers: {}) }
|
8
8
|
|
9
|
+
it "defaults to the globally configured token if one's provided" do
|
10
|
+
token = "Foo"
|
11
|
+
|
12
|
+
Koala.configure do |config|
|
13
|
+
config.access_token = token
|
14
|
+
end
|
15
|
+
|
16
|
+
expect(Koala::Facebook::API.new.access_token).to eq(token)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "defaults to the globally configured app_secret if one's provided" do
|
20
|
+
app_secret = "Foo"
|
21
|
+
|
22
|
+
Koala.configure do |config|
|
23
|
+
config.app_secret = app_secret
|
24
|
+
end
|
25
|
+
|
26
|
+
expect(Koala::Facebook::API.new.app_secret).to eq(app_secret)
|
27
|
+
end
|
28
|
+
|
9
29
|
it "doesn't include an access token if none was given" do
|
10
30
|
expect(Koala).to receive(:make_request).with(
|
11
31
|
anything,
|
@@ -46,18 +66,6 @@ describe "Koala::Facebook::API" do
|
|
46
66
|
service.api('anything', args)
|
47
67
|
end
|
48
68
|
|
49
|
-
it "has an attr_reader for access token" do
|
50
|
-
token = 'adfadf'
|
51
|
-
service = Koala::Facebook::API.new token
|
52
|
-
expect(service.access_token).to eq(token)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "has an attr_reader for app_secret" do
|
56
|
-
secret = double
|
57
|
-
service = Koala::Facebook::API.new(@token, secret)
|
58
|
-
expect(service.app_secret).to eq(secret)
|
59
|
-
end
|
60
|
-
|
61
69
|
it "turns arrays of non-enumerables into comma-separated arguments by default" do
|
62
70
|
args = [12345, {:foo => [1, 2, "3", :four]}]
|
63
71
|
expected = ["/12345", {:foo => "1,2,3,four"}, "get", {}]
|
@@ -218,7 +226,7 @@ describe "Koala::Facebook::API" do
|
|
218
226
|
|
219
227
|
it "passes the results through GraphCollection.evaluate" do
|
220
228
|
allow(@service).to receive(:api).and_return(dummy_response)
|
221
|
-
expect(Koala::Facebook::API::GraphCollection).to receive(:evaluate).with(dummy_response
|
229
|
+
expect(Koala::Facebook::API::GraphCollection).to receive(:evaluate).with(dummy_response, @service)
|
222
230
|
@service.graph_call("/me")
|
223
231
|
end
|
224
232
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Koala::Configuration do
|
4
|
+
let(:config) { Koala::Configuration.new }
|
5
|
+
|
6
|
+
it "defaults the HTTPService's DEFAULT_SERVERS" do
|
7
|
+
Koala::HTTPService::DEFAULT_SERVERS.each_pair do |key, value|
|
8
|
+
expect(config.public_send(key)).to eq(value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Koala::Facebook::API::GraphCollection do
|
4
|
-
let(:paging){ {
|
4
|
+
let(:paging){ {"paging" => true} }
|
5
5
|
|
6
6
|
before(:each) do
|
7
|
-
@
|
8
|
-
|
7
|
+
@headers = {'Content-Type' => 'application/json'}
|
8
|
+
@data = {
|
9
|
+
"data" => [1, 2, 'three'],
|
9
10
|
"paging" => paging,
|
10
11
|
"summary" => [3]
|
11
12
|
}
|
13
|
+
@result = Koala::HTTPService::Response.new(200, @data.to_json, @headers)
|
12
14
|
@api = Koala::Facebook::API.new("123")
|
13
15
|
@collection = Koala::Facebook::API::GraphCollection.new(@result, @api)
|
14
16
|
end
|
@@ -22,7 +24,7 @@ describe Koala::Facebook::API::GraphCollection do
|
|
22
24
|
end
|
23
25
|
|
24
26
|
it "contains the result data" do
|
25
|
-
@
|
27
|
+
@data["data"].each_with_index {|r, i| expect(@collection[i]).to eq(r)}
|
26
28
|
end
|
27
29
|
|
28
30
|
it "has a read-only paging attribute" do
|
@@ -31,21 +33,25 @@ describe Koala::Facebook::API::GraphCollection do
|
|
31
33
|
end
|
32
34
|
|
33
35
|
it "sets paging to results['paging']" do
|
34
|
-
expect(@collection.paging).to eq(@
|
36
|
+
expect(@collection.paging).to eq(@data["paging"])
|
35
37
|
end
|
36
38
|
|
37
39
|
it "sets summary to results['summary']" do
|
38
|
-
expect(@collection.summary).to eq(@
|
40
|
+
expect(@collection.summary).to eq(@data["summary"])
|
39
41
|
end
|
40
42
|
|
41
43
|
it "sets raw_response to the original results" do
|
42
|
-
expect(@collection.raw_response).to eq(@result)
|
44
|
+
expect(@collection.raw_response).to eq(@result.data)
|
43
45
|
end
|
44
46
|
|
45
47
|
it "sets the API to the provided API" do
|
46
48
|
expect(@collection.api).to eq(@api)
|
47
49
|
end
|
48
50
|
|
51
|
+
it "sets the headers correctly" do
|
52
|
+
expect(@collection.headers).to eq(@headers)
|
53
|
+
end
|
54
|
+
|
49
55
|
describe "when getting a whole page" do
|
50
56
|
before(:each) do
|
51
57
|
@second_page = {
|
@@ -55,19 +61,21 @@ describe Koala::Facebook::API::GraphCollection do
|
|
55
61
|
@base = double("base")
|
56
62
|
@args = {"a" => 1}
|
57
63
|
@page_of_results = double("page of results")
|
64
|
+
@result = Koala::HTTPService::Response.new(200, @second_page.to_json, {})
|
65
|
+
@result.data
|
58
66
|
end
|
59
67
|
|
60
68
|
it "should return the previous page of results" do
|
61
69
|
expect(@collection).to receive(:previous_page_params).and_return([@base, @args])
|
62
|
-
expect(@api).to receive(:api).with(@base, @args, anything, anything).and_return(
|
63
|
-
expect(Koala::Facebook::API::GraphCollection).to receive(:new).with(@
|
70
|
+
expect(@api).to receive(:api).with(@base, @args, anything, anything).and_return(@result)
|
71
|
+
expect(Koala::Facebook::API::GraphCollection).to receive(:new).with(@result, @api).and_return(@page_of_results)
|
64
72
|
expect(@collection.previous_page).to eq(@page_of_results)
|
65
73
|
end
|
66
74
|
|
67
75
|
it "should return the next page of results" do
|
68
76
|
expect(@collection).to receive(:next_page_params).and_return([@base, @args])
|
69
|
-
expect(@api).to receive(:api).with(@base, @args, anything, anything).and_return(
|
70
|
-
expect(Koala::Facebook::API::GraphCollection).to receive(:new).with(@
|
77
|
+
expect(@api).to receive(:api).with(@base, @args, anything, anything).and_return(@result)
|
78
|
+
expect(Koala::Facebook::API::GraphCollection).to receive(:new).with(@result, @api).and_return(@page_of_results)
|
71
79
|
|
72
80
|
expect(@collection.next_page).to eq(@page_of_results)
|
73
81
|
end
|
@@ -121,9 +129,11 @@ describe Koala::Facebook::API::GraphCollection do
|
|
121
129
|
end
|
122
130
|
|
123
131
|
describe ".evaluate" do
|
124
|
-
it "returns the original
|
125
|
-
result =
|
126
|
-
|
132
|
+
it "returns the body of the original response if it's provided a Response with a non-hash data key" do
|
133
|
+
result = double('fake response')
|
134
|
+
allow(result).to receive(:is_a?).with(Hash).and_return(false)
|
135
|
+
allow(result).to receive(:data).and_return([])
|
136
|
+
expect(Koala::Facebook::API::GraphCollection.evaluate(result, @api)).to eq([])
|
127
137
|
end
|
128
138
|
|
129
139
|
it "returns the original result if it's provided a nil result" do
|
@@ -131,18 +141,21 @@ describe Koala::Facebook::API::GraphCollection do
|
|
131
141
|
expect(Koala::Facebook::API::GraphCollection.evaluate(result, @api)).to eq(result)
|
132
142
|
end
|
133
143
|
|
134
|
-
it "returns the original result if the result doesn't have a data key" do
|
135
|
-
|
136
|
-
|
144
|
+
it "returns the original result body if the result doesn't have a data key" do
|
145
|
+
paging = {"paging" => {}}
|
146
|
+
result = Koala::HTTPService::Response.new(200, paging.to_json, {})
|
147
|
+
expect(Koala::Facebook::API::GraphCollection.evaluate(result, @api)).to eq(paging)
|
137
148
|
end
|
138
149
|
|
139
150
|
it "returns the original result if the result's data key isn't an array" do
|
140
|
-
|
141
|
-
|
151
|
+
body = {"data" => {}, "paging" => {}}
|
152
|
+
result = Koala::HTTPService::Response.new(200, body.to_json, {})
|
153
|
+
expect(Koala::Facebook::API::GraphCollection.evaluate(result, @api)).to eq(body)
|
142
154
|
end
|
143
155
|
|
144
156
|
it "returns a new GraphCollection of the result if it has an array data key and a paging key" do
|
145
|
-
|
157
|
+
body = {"data" => [], "paging" => {}}
|
158
|
+
result = Koala::HTTPService::Response.new(200, body.to_json, {})
|
146
159
|
expected = :foo
|
147
160
|
expect(Koala::Facebook::API::GraphCollection).to receive(:new).with(result, @api).and_return(expected)
|
148
161
|
expect(Koala::Facebook::API::GraphCollection.evaluate(result, @api)).to eq(expected)
|
@@ -66,17 +66,19 @@ module Koala
|
|
66
66
|
end
|
67
67
|
|
68
68
|
context "set by Koala.config" do
|
69
|
-
let(:version) { "v2.
|
69
|
+
let(:version) { "v2.7" }
|
70
70
|
|
71
71
|
before :each do
|
72
|
-
|
72
|
+
Koala.configure do |config|
|
73
|
+
config.api_version = version
|
74
|
+
end
|
73
75
|
end
|
74
76
|
|
75
77
|
it_should_behave_like :including_the_version
|
76
78
|
end
|
77
79
|
|
78
80
|
context "set in options" do
|
79
|
-
let(:version) { "v2.
|
81
|
+
let(:version) { "v2.8" }
|
80
82
|
|
81
83
|
let(:options) { {api_version: version} }
|
82
84
|
|
data/spec/cases/koala_spec.rb
CHANGED
@@ -31,9 +31,7 @@ describe Koala do
|
|
31
31
|
|
32
32
|
describe ".configure" do
|
33
33
|
it "yields a configurable object" do
|
34
|
-
expect
|
35
|
-
Koala.configure {|c| c.foo = "bar"}
|
36
|
-
}.not_to raise_exception
|
34
|
+
Koala.configure {|c| expect(c).to be_a(Koala::Configuration)}
|
37
35
|
end
|
38
36
|
|
39
37
|
it "caches the config (singleton)" do
|
@@ -56,5 +54,4 @@ describe Koala do
|
|
56
54
|
expect(Koala.config.graph_server).to eq("some-new.graph_server.com")
|
57
55
|
end
|
58
56
|
end
|
59
|
-
|
60
57
|
end
|
data/spec/cases/oauth_spec.rb
CHANGED
@@ -53,6 +53,45 @@ describe "Koala::Facebook::OAuth" do
|
|
53
53
|
@oauth.app_secret == @secret &&
|
54
54
|
@oauth.oauth_callback_url == nil).to be_truthy
|
55
55
|
end
|
56
|
+
|
57
|
+
context "with global defaults" do
|
58
|
+
let(:app_id) { :app_id }
|
59
|
+
let(:app_secret) { :app_secret }
|
60
|
+
let(:oauth_callback_url) { :oauth_callback_url }
|
61
|
+
|
62
|
+
before :each do
|
63
|
+
Koala.configure do |config|
|
64
|
+
config.app_id = app_id
|
65
|
+
config.app_secret = app_secret
|
66
|
+
config.oauth_callback_url = oauth_callback_url
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "defaults to the configured data if not otherwise provided" do
|
71
|
+
oauth = Koala::Facebook::OAuth.new
|
72
|
+
expect(oauth.app_id).to eq(app_id)
|
73
|
+
expect(oauth.app_secret).to eq(app_secret)
|
74
|
+
expect(oauth.oauth_callback_url).to eq(oauth_callback_url)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "lets you override app_id" do
|
78
|
+
other_value = :another_id
|
79
|
+
oauth = Koala::Facebook::OAuth.new(other_value)
|
80
|
+
expect(oauth.app_id).to eq(other_value)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "lets you override secret" do
|
84
|
+
other_value = :another_secret
|
85
|
+
oauth = Koala::Facebook::OAuth.new(nil, other_value)
|
86
|
+
expect(oauth.app_secret).to eq(other_value)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "lets you override app_id" do
|
90
|
+
other_value = :another_token
|
91
|
+
oauth = Koala::Facebook::OAuth.new(nil, nil, other_value)
|
92
|
+
expect(oauth.oauth_callback_url).to eq(other_value)
|
93
|
+
end
|
94
|
+
end
|
56
95
|
end
|
57
96
|
|
58
97
|
describe "for cookie parsing" do
|
@@ -36,6 +36,45 @@ describe "Koala::Facebook::RealtimeUpdates" do
|
|
36
36
|
expect(updates).to be_a(Koala::Facebook::RealtimeUpdates)
|
37
37
|
end
|
38
38
|
|
39
|
+
context "with global defaults" do
|
40
|
+
let(:app_id) { :app_id }
|
41
|
+
let(:app_secret) { :app_secret }
|
42
|
+
let(:app_access_token) { :app_access_token }
|
43
|
+
|
44
|
+
before :each do
|
45
|
+
Koala.configure do |config|
|
46
|
+
config.app_id = app_id
|
47
|
+
config.app_secret = app_secret
|
48
|
+
config.app_access_token = app_access_token
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "defaults to the configured data if not otherwise provided" do
|
53
|
+
rtu = Koala::Facebook::RealtimeUpdates.new
|
54
|
+
expect(rtu.app_id).to eq(app_id)
|
55
|
+
expect(rtu.secret).to eq(app_secret)
|
56
|
+
expect(rtu.app_access_token).to eq(app_access_token)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "lets you override app_id" do
|
60
|
+
other_value = :another_id
|
61
|
+
rtu = Koala::Facebook::RealtimeUpdates.new(app_id: other_value)
|
62
|
+
expect(rtu.app_id).to eq(other_value)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "lets you override secret" do
|
66
|
+
other_value = :another_secret
|
67
|
+
rtu = Koala::Facebook::RealtimeUpdates.new(secret: other_value)
|
68
|
+
expect(rtu.secret).to eq(other_value)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "lets you override app_id" do
|
72
|
+
other_value = :another_token
|
73
|
+
rtu = Koala::Facebook::RealtimeUpdates.new(app_access_token: other_value)
|
74
|
+
expect(rtu.app_access_token).to eq(other_value)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
39
78
|
# attributes
|
40
79
|
it "allows read access to app_id" do
|
41
80
|
# in Ruby 1.9, .method returns symbols
|
@@ -40,12 +40,52 @@ describe "Koala::Facebook::TestUsers" do
|
|
40
40
|
expect(test_users).to be_a(Koala::Facebook::TestUsers)
|
41
41
|
end
|
42
42
|
|
43
|
+
context "with global defaults" do
|
44
|
+
let(:app_id) { :app_id }
|
45
|
+
let(:app_secret) { :app_secret }
|
46
|
+
let(:app_access_token) { :app_access_token }
|
47
|
+
|
48
|
+
before :each do
|
49
|
+
Koala.configure do |config|
|
50
|
+
config.app_id = app_id
|
51
|
+
config.app_secret = app_secret
|
52
|
+
config.app_access_token = app_access_token
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "defaults to the configured data if not otherwise provided" do
|
57
|
+
test_users = Koala::Facebook::TestUsers.new
|
58
|
+
expect(test_users.app_id).to eq(app_id)
|
59
|
+
expect(test_users.secret).to eq(app_secret)
|
60
|
+
expect(test_users.app_access_token).to eq(app_access_token)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "lets you override app_id" do
|
64
|
+
other_value = :another_id
|
65
|
+
test_users = Koala::Facebook::TestUsers.new(app_id: other_value)
|
66
|
+
expect(test_users.app_id).to eq(other_value)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "lets you override secret" do
|
70
|
+
other_value = :another_secret
|
71
|
+
test_users = Koala::Facebook::TestUsers.new(secret: other_value)
|
72
|
+
expect(test_users.secret).to eq(other_value)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "lets you override app_id" do
|
76
|
+
other_value = :another_token
|
77
|
+
test_users = Koala::Facebook::TestUsers.new(app_access_token: other_value)
|
78
|
+
expect(test_users.app_access_token).to eq(other_value)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
43
83
|
it "uses the OAuth class to fetch a token when provided an app_id and a secret" do
|
44
84
|
oauth = Koala::Facebook::OAuth.new(@app_id, @secret)
|
45
85
|
token = oauth.get_app_access_token
|
46
86
|
expect(oauth).to receive(:get_app_access_token).and_return(token)
|
47
87
|
expect(Koala::Facebook::OAuth).to receive(:new).with(@app_id, @secret).and_return(oauth)
|
48
|
-
|
88
|
+
Koala::Facebook::TestUsers.new(:app_id => @app_id, :secret => @secret)
|
49
89
|
end
|
50
90
|
|
51
91
|
# attributes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koala
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Koppel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -71,8 +71,10 @@ files:
|
|
71
71
|
- ".yardopts"
|
72
72
|
- Gemfile
|
73
73
|
- Guardfile
|
74
|
+
- ISSUE_TEMPLATE
|
74
75
|
- LICENSE
|
75
76
|
- Manifest
|
77
|
+
- PULL_REQUEST_TEMPLATE
|
76
78
|
- Rakefile
|
77
79
|
- autotest/discover.rb
|
78
80
|
- changelog.md
|
@@ -85,6 +87,7 @@ files:
|
|
85
87
|
- lib/koala/api/graph_batch_api.rb
|
86
88
|
- lib/koala/api/graph_collection.rb
|
87
89
|
- lib/koala/api/graph_error_checker.rb
|
90
|
+
- lib/koala/configuration.rb
|
88
91
|
- lib/koala/errors.rb
|
89
92
|
- lib/koala/http_service.rb
|
90
93
|
- lib/koala/http_service/multipart_request.rb
|
@@ -98,6 +101,7 @@ files:
|
|
98
101
|
- lib/koala/version.rb
|
99
102
|
- readme.md
|
100
103
|
- spec/cases/api_spec.rb
|
104
|
+
- spec/cases/configuration_spec.rb
|
101
105
|
- spec/cases/error_spec.rb
|
102
106
|
- spec/cases/graph_api_batch_spec.rb
|
103
107
|
- spec/cases/graph_api_spec.rb
|
@@ -158,6 +162,7 @@ summary: A lightweight, flexible library for Facebook with support for the Graph
|
|
158
162
|
the REST API, realtime updates, and OAuth authentication.
|
159
163
|
test_files:
|
160
164
|
- spec/cases/api_spec.rb
|
165
|
+
- spec/cases/configuration_spec.rb
|
161
166
|
- spec/cases/error_spec.rb
|
162
167
|
- spec/cases/graph_api_batch_spec.rb
|
163
168
|
- spec/cases/graph_api_spec.rb
|