koala 2.4.0 → 2.5.0rc1
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/changelog.md +16 -1
- data/koala.gemspec +0 -1
- data/lib/koala.rb +1 -1
- data/lib/koala/api.rb +4 -3
- data/lib/koala/api/graph_api.rb +17 -3
- data/lib/koala/api/graph_batch_api.rb +2 -2
- data/lib/koala/api/graph_error_checker.rb +2 -2
- data/lib/koala/api/rest_api.rb +3 -3
- data/lib/koala/errors.rb +1 -1
- data/lib/koala/http_service.rb +1 -1
- data/lib/koala/oauth.rb +4 -4
- data/lib/koala/version.rb +1 -1
- data/readme.md +2 -0
- data/spec/cases/api_spec.rb +1 -1
- data/spec/cases/graph_api_batch_spec.rb +1 -1
- data/spec/cases/http_service_spec.rb +1 -1
- data/spec/cases/oauth_spec.rb +2 -2
- data/spec/fixtures/mock_facebook_responses.yml +23 -20
- data/spec/support/graph_api_shared_examples.rb +10 -2
- data/spec/support/koala_test.rb +1 -1
- data/spec/support/mock_http_service.rb +2 -5
- data/spec/support/rest_api_shared_examples.rb +1 -1
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f88dda2979fd111e38bc82c0736c3445859e267b
|
4
|
+
data.tar.gz: 4fce57cdb6eae0086e9262c5034e21e8bf5a92f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26968b19aa310ef775d82d05b3a544353465048eea17601a8864d87532287eb743751f5094b94cff58a75f5312c317255fb06f1fa2c161dfa7aea0db655d50d3
|
7
|
+
data.tar.gz: a3335869322f904f144e57fd6dfa96e31e32a238b0bcdb0d01b52538dbdfda2e2a5022aac748a63c3341707993d1b5868d56cb1b864dd8c2df97f6df451200c7
|
data/changelog.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
v2.5.0
|
2
|
+
======
|
3
|
+
|
4
|
+
New features:
|
5
|
+
|
6
|
+
* API#get_object_metadata provides a convenient accessor to an object's graph metadata (thanks, sancopanco!)
|
7
|
+
|
8
|
+
Documentation improvements:
|
9
|
+
|
10
|
+
* Add explicit require to examples in readme.md (thanks, dwkns!)
|
11
|
+
|
12
|
+
Internal improvements:
|
13
|
+
|
14
|
+
* Remove MultiJson dependency (thanks, sakuro!)
|
15
|
+
|
1
16
|
v2.4.0
|
2
17
|
======
|
3
18
|
|
@@ -18,7 +33,7 @@ Internal improvements:
|
|
18
33
|
|
19
34
|
Testing improvements:
|
20
35
|
|
21
|
-
* Test Koala against Ruby 2.3.0
|
36
|
+
* Test Koala against Ruby 2.3.0 (thanks, thedrow!)
|
22
37
|
|
23
38
|
|
24
39
|
v2.3.0
|
data/koala.gemspec
CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.extra_rdoc_files = ["readme.md", "changelog.md"]
|
22
22
|
gem.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Koala"]
|
23
23
|
|
24
|
-
gem.add_runtime_dependency("multi_json", ">= 1.3.0")
|
25
24
|
gem.add_runtime_dependency("faraday")
|
26
25
|
gem.add_runtime_dependency("addressable")
|
27
26
|
end
|
data/lib/koala.rb
CHANGED
data/lib/koala/api.rb
CHANGED
@@ -84,9 +84,10 @@ module Koala
|
|
84
84
|
component == :response ? result : result.send(options[:http_component])
|
85
85
|
else
|
86
86
|
# parse the body as JSON and run it through the error checker (if provided)
|
87
|
-
# Note: Facebook sometimes sends results like "true" and "false", which
|
88
|
-
# and cause
|
89
|
-
|
87
|
+
# Note: Facebook sometimes sends results like "true" and "false", which are valid[RFC7159]
|
88
|
+
# but unsupported by Ruby's stdlib[RFC4627] and cause JSON.load to fail -- so we account for
|
89
|
+
# that by wrapping the result in []
|
90
|
+
JSON.load("[#{result.body.to_s}]")[0]
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
data/lib/koala/api/graph_api.rb
CHANGED
@@ -57,6 +57,20 @@ module Koala
|
|
57
57
|
graph_call(id, args, "get", options, &block)
|
58
58
|
end
|
59
59
|
|
60
|
+
# Get the metadata of a Facebook object, including its type.
|
61
|
+
#
|
62
|
+
# @param id the object ID (string or number)
|
63
|
+
#
|
64
|
+
# @raise [Koala::Facebook::ClientError] if the ID is invalid
|
65
|
+
# @example
|
66
|
+
# get_object_metadata("442575165800306")=>{"metadata" => "page", ...}
|
67
|
+
# get_object_metadata("190822584430113")=>{"metadata" => "status", ...}
|
68
|
+
# @return a string of Facebook object type
|
69
|
+
def get_object_metadata(id, &block)
|
70
|
+
result = graph_call(id, {"metadata" => "1"}, "get", {}, &block)
|
71
|
+
result["metadata"]
|
72
|
+
end
|
73
|
+
|
60
74
|
# Get information about multiple Facebook objects in one call.
|
61
75
|
#
|
62
76
|
# @param ids an array or comma-separated string of object IDs
|
@@ -274,7 +288,7 @@ module Koala
|
|
274
288
|
# @return (see #put_connections)
|
275
289
|
def put_wall_post(message, attachment = {}, target_id = "me", options = {}, &block)
|
276
290
|
if properties = attachment.delete(:properties) || attachment.delete("properties")
|
277
|
-
properties =
|
291
|
+
properties = JSON.dump(properties) if properties.is_a?(Hash) || properties.is_a?(Array)
|
278
292
|
attachment["properties"] = properties
|
279
293
|
end
|
280
294
|
put_connections(target_id, "feed", attachment.merge({:message => message}), options, &block)
|
@@ -376,7 +390,7 @@ module Koala
|
|
376
390
|
#
|
377
391
|
# @return a hash of FQL results keyed to the appropriate query
|
378
392
|
def fql_multiquery(queries = {}, args = {}, options = {}, &block)
|
379
|
-
resolved_results = if results = get_object("fql", args.merge(:q =>
|
393
|
+
resolved_results = if results = get_object("fql", args.merge(:q => JSON.dump(queries)), options)
|
380
394
|
# simplify the multiquery result format
|
381
395
|
results.inject({}) {|outcome, data| outcome[data["name"]] = data["fql_result_set"]; outcome}
|
382
396
|
end
|
@@ -441,7 +455,7 @@ module Koala
|
|
441
455
|
# @param options (see #get_object)
|
442
456
|
# @param block (see Koala::Facebook::API#api)
|
443
457
|
def set_app_restrictions(app_id, restrictions_hash, args = {}, options = {}, &block)
|
444
|
-
graph_call(app_id, args.merge(:restrictions =>
|
458
|
+
graph_call(app_id, args.merge(:restrictions => JSON.dump(restrictions_hash)), "post", options, &block)
|
445
459
|
end
|
446
460
|
|
447
461
|
# Certain calls such as {#get_connections} return an array of results which you can page through
|
@@ -44,7 +44,7 @@ module Koala
|
|
44
44
|
return [] unless batch_calls.length > 0
|
45
45
|
# Turn the call args collected into what facebook expects
|
46
46
|
args = {}
|
47
|
-
args["batch"] =
|
47
|
+
args["batch"] = JSON.dump(batch_calls.map { |batch_op|
|
48
48
|
args.merge!(batch_op.files) if batch_op.files
|
49
49
|
batch_op.to_batch_params(access_token, app_secret)
|
50
50
|
})
|
@@ -75,7 +75,7 @@ module Koala
|
|
75
75
|
raw_result = error
|
76
76
|
else
|
77
77
|
# (see note in regular api method about JSON parsing)
|
78
|
-
body =
|
78
|
+
body = JSON.load("[#{call_result['body'].to_s}]")[0]
|
79
79
|
|
80
80
|
# Get the HTTP component they want
|
81
81
|
raw_result = case batch_op.http_options[:http_component]
|
@@ -61,8 +61,8 @@ module Koala
|
|
61
61
|
# Normally, we start with the response body. If it isn't valid JSON, we start with an empty
|
62
62
|
# hash and fill it with error data.
|
63
63
|
@response_hash ||= begin
|
64
|
-
|
65
|
-
rescue
|
64
|
+
JSON.load(body)
|
65
|
+
rescue JSON::ParserError
|
66
66
|
{}
|
67
67
|
end
|
68
68
|
end
|
data/lib/koala/api/rest_api.rb
CHANGED
@@ -20,7 +20,7 @@ module Koala
|
|
20
20
|
# @return true if successful, false if not. (This call currently doesn't give useful feedback on failure.)
|
21
21
|
def set_app_properties(properties, args = {}, options = {})
|
22
22
|
raise AuthenticationError.new(nil, nil, "setAppProperties requires an access token") unless @access_token
|
23
|
-
rest_call("admin.setAppProperties", args.merge(:properties =>
|
23
|
+
rest_call("admin.setAppProperties", args.merge(:properties => JSON.dump(properties)), options, "post")
|
24
24
|
end
|
25
25
|
|
26
26
|
# Make a call to the REST API.
|
@@ -44,8 +44,8 @@ module Koala
|
|
44
44
|
# check for REST API-specific errors
|
45
45
|
if response.status >= 400
|
46
46
|
begin
|
47
|
-
response_hash =
|
48
|
-
rescue
|
47
|
+
response_hash = JSON.load(response.body)
|
48
|
+
rescue JSON::ParserError
|
49
49
|
response_hash = {}
|
50
50
|
end
|
51
51
|
|
data/lib/koala/errors.rb
CHANGED
data/lib/koala/http_service.rb
CHANGED
@@ -130,7 +130,7 @@ module Koala
|
|
130
130
|
# @return the appropriately-encoded string
|
131
131
|
def self.encode_params(param_hash)
|
132
132
|
((param_hash || {}).sort_by{|k, v| k.to_s}.collect do |key_and_value|
|
133
|
-
key_and_value[1] =
|
133
|
+
key_and_value[1] = JSON.dump(key_and_value[1]) unless key_and_value[1].is_a? String
|
134
134
|
"#{key_and_value[0].to_s}=#{CGI.escape key_and_value[1]}"
|
135
135
|
end).join("&")
|
136
136
|
end
|
data/lib/koala/oauth.rb
CHANGED
@@ -134,7 +134,7 @@ module Koala
|
|
134
134
|
if response == ''
|
135
135
|
raise BadFacebookResponse.new(200, '', 'generate_client_code received an error: empty response body')
|
136
136
|
else
|
137
|
-
result =
|
137
|
+
result = JSON.load(response)
|
138
138
|
end
|
139
139
|
|
140
140
|
result.has_key?('code') ? result['code'] : raise(Koala::KoalaError.new("Facebook returned a valid response without the expected 'code' in the body (response = #{response})"))
|
@@ -240,7 +240,7 @@ module Koala
|
|
240
240
|
raise OAuthSignatureError, 'Invalid (incomplete) signature data' unless encoded_sig && encoded_envelope
|
241
241
|
|
242
242
|
signature = base64_url_decode(encoded_sig).unpack("H*").first
|
243
|
-
envelope =
|
243
|
+
envelope = JSON.load(base64_url_decode(encoded_envelope))
|
244
244
|
|
245
245
|
raise OAuthSignatureError, "Unsupported algorithm #{envelope['algorithm']}" if envelope['algorithm'] != 'HMAC-SHA256'
|
246
246
|
|
@@ -260,8 +260,8 @@ module Koala
|
|
260
260
|
end
|
261
261
|
|
262
262
|
def parse_access_token(response_text)
|
263
|
-
|
264
|
-
rescue
|
263
|
+
JSON.load(response_text)
|
264
|
+
rescue JSON::ParserError
|
265
265
|
response_text.split("&").inject({}) do |hash, bit|
|
266
266
|
key, value = bit.split("=")
|
267
267
|
hash.merge!(key => value)
|
data/lib/koala/version.rb
CHANGED
data/readme.md
CHANGED
data/spec/cases/api_spec.rb
CHANGED
@@ -128,7 +128,7 @@ describe "Koala::Facebook::API" do
|
|
128
128
|
allow(Koala).to receive(:make_request).and_return(response)
|
129
129
|
|
130
130
|
json_body = double('JSON body')
|
131
|
-
allow(
|
131
|
+
allow(JSON).to receive(:load).and_return([json_body])
|
132
132
|
|
133
133
|
expect(@service.api('anything')).to eq(json_body)
|
134
134
|
end
|
@@ -322,7 +322,7 @@ describe "Koala::Facebook::GraphAPI in batch mode" do
|
|
322
322
|
allow(Koala::Facebook::GraphBatchAPI::BatchOperation).to receive(:new).and_return(op)
|
323
323
|
|
324
324
|
# two requests should generate two batch operations
|
325
|
-
expected =
|
325
|
+
expected = JSON.dump([op.to_batch_params(access_token, nil), op.to_batch_params(access_token, nil)])
|
326
326
|
expect(Koala).to receive(:make_request).with(anything, hash_including("batch" => expected), anything, anything).and_return(@fake_response)
|
327
327
|
Koala::Facebook::API.new(access_token).batch do |batch_api|
|
328
328
|
batch_api.get_object('me')
|
@@ -141,7 +141,7 @@ describe Koala::HTTPService do
|
|
141
141
|
val = 'json_value'
|
142
142
|
not_a_string = 'not_a_string'
|
143
143
|
allow(not_a_string).to receive(:is_a?).and_return(false)
|
144
|
-
expect(
|
144
|
+
expect(JSON).to receive(:dump).with(not_a_string).and_return(val)
|
145
145
|
|
146
146
|
string = "hi"
|
147
147
|
|
data/spec/cases/oauth_spec.rb
CHANGED
@@ -401,7 +401,7 @@ describe "Koala::Facebook::OAuth" do
|
|
401
401
|
allow(Koala).to receive(:make_request).and_return(
|
402
402
|
Koala::HTTPService::Response.new(
|
403
403
|
200,
|
404
|
-
|
404
|
+
JSON.dump(result),
|
405
405
|
{}
|
406
406
|
)
|
407
407
|
)
|
@@ -584,7 +584,7 @@ describe "Koala::Facebook::OAuth" do
|
|
584
584
|
# the signed request code is ported directly from Facebook
|
585
585
|
# so we only need to test at a high level that it works
|
586
586
|
it "throws an error if the algorithm is unsupported" do
|
587
|
-
allow(
|
587
|
+
allow(JSON).to receive(:load).and_return("algorithm" => "my fun algorithm")
|
588
588
|
expect { @oauth.parse_signed_request(@signed_params) }.to raise_error(Koala::Facebook::OAuthSignatureError)
|
589
589
|
end
|
590
590
|
|
@@ -74,58 +74,58 @@ graph_api:
|
|
74
74
|
no_token: '{"facebook":"{}","koppel":"{}"}'
|
75
75
|
|
76
76
|
# Ruby 1.8.7 and 1.9.2 generate JSON with different key ordering, hence we have to dynamically generate it here
|
77
|
-
batch=<%=
|
77
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me"},{"method" => "get", "relative_url" => "koppel"}]) %>:
|
78
78
|
post:
|
79
79
|
with_token: '[{"code": 200, "body":"{\"id\":\"123\"}"}, {"code": 200, "body":"{\"id\":\"456\"}"}]'
|
80
|
-
batch=<%=
|
80
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me/picture"}]) %>:
|
81
81
|
post:
|
82
82
|
with_token: '[{"code": 302, "headers":[{"name":"Location","value":"http://google.com"}]}]'
|
83
|
-
batch=<%=
|
83
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me/picture?redirect=false"}]) %>:
|
84
84
|
post:
|
85
85
|
with_token: '[{"code": 200, "body":"{\"data\":{\"is_silhouette\":false,\"url\":\"http:\/\/google.com\"}}"}]'
|
86
|
-
batch=<%=
|
86
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me"},{"method" => "get", "relative_url" => "me/friends"}]) %>:
|
87
87
|
post:
|
88
88
|
with_token: '[{"code": 200, "body":"{\"id\":\"koppel\"}"}, {"code": 200, "body":"{\"data\":[{\"id\":\"lukeshepard\"}],\"paging\":{}}"}]'
|
89
|
-
batch=<%=
|
89
|
+
batch=<%= JSON.dump([{"method"=>"get", "relative_url"=>"me"}, {"method"=>"get", "relative_url"=>"#{OAUTH_DATA["app_id"]}/insights?access_token=#{CGI.escape APP_ACCESS_TOKEN}"}]) %>:
|
90
90
|
post:
|
91
91
|
with_token: '[{"code": 200, "body":"{\"id\":\"123\"}"}, {"code": 200, "body":"{\"data\":[],\"paging\":{}}"}]'
|
92
|
-
batch=<%=
|
92
|
+
batch=<%= JSON.dump([{"method"=>"get", "relative_url"=>"2/invalidconnection"}, {"method"=>"get", "relative_url"=>"koppel?access_token=#{CGI.escape APP_ACCESS_TOKEN}"}]) %>:
|
93
93
|
post:
|
94
94
|
with_token: '[{"code": 400, "body": "{\"error\":{\"type\":\"AnError\", \"message\":\"An error occurred!.\"}}"},{"code": 200, "body":"{\"id\":\"123\"}"}]'
|
95
|
-
batch=<%=
|
95
|
+
batch=<%= JSON.dump([{"method"=>"post", "relative_url"=>"FEED_ITEM_BATCH/likes"}, {"method"=>"delete", "relative_url"=> "FEED_ITEM_BATCH"}]) %>:
|
96
96
|
post:
|
97
97
|
with_token: '[{"code": 200, "body": "{\"id\": \"MOCK_LIKE\"}"},{"code": 200, "body":true}]'
|
98
|
-
batch=<%=
|
98
|
+
batch=<%= JSON.dump([{"method" => "post", "relative_url" => "method/fql.query", "body" => "query=select+first_name+from+user+where+uid%3D2905623"}]) %>:
|
99
99
|
post:
|
100
100
|
with_token: '[{"code": 200, "body":"[{\"first_name\":\"Alex\"}]"}]'
|
101
101
|
|
102
102
|
# dependencies
|
103
|
-
batch=<%=
|
103
|
+
batch=<%= JSON.dump([{"method"=>"get", "relative_url"=>"me", "name" => "getme"}, {"method"=>"get", "relative_url"=>"koppel", "depends_on" => "getme"}]) %>:
|
104
104
|
post:
|
105
105
|
with_token: '[null,{"code": 200, "body":"{\"id\":\"123\"}"}]'
|
106
|
-
batch=<%=
|
106
|
+
batch=<%= JSON.dump([{"method"=>"get", "relative_url"=>"2/invalidconnection", "name" => "getdata"}, {"method"=>"get", "relative_url"=>"koppel", "depends_on" => "getdata"}]) %>:
|
107
107
|
post:
|
108
108
|
with_token: '[{"code": 400, "body": "{\"error\":{\"type\":\"AnError\", \"message\":\"An error occurred!.\"}}"},null]'
|
109
|
-
batch=<%=
|
109
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me/friends?limit=5", "name" => "get-friends"}, {"method" => "get", "relative_url" => "?ids=#{CGI.escape "{result=get-friends:$.data.*.id}"}"}]) %>:
|
110
110
|
post:
|
111
111
|
with_token: '[null,{"code": 200, "body":"{}"}]'
|
112
|
-
batch=<%=
|
112
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me/friends?limit=5", "name" => "get-friends", "omit_response_on_success" => false}, {"method" => "get", "relative_url" => "?ids=#{CGI.escape "{result=get-friends:$.data.*.id}"}"}]) %>:
|
113
113
|
post:
|
114
114
|
with_token: '[{"code": 200, "body":"{\"data\":[],\"paging\":{}}"},{"code": 200, "body":"{}"}]'
|
115
|
-
batch=<%=
|
115
|
+
batch=<%= JSON.dump([{"method" => "get", "relative_url" => "me/friends?limit=5"}, {"method" => "get", "relative_url" => "?ids=#{CGI.escape "{result=i-dont-exist:$.data.*.id}"}"}]) %>:
|
116
116
|
post:
|
117
117
|
with_token:
|
118
118
|
code: 400
|
119
119
|
body: '{"error_code":190,"error_description":"Error validating access token."}'
|
120
120
|
|
121
121
|
# attached files tests
|
122
|
-
batch=<%=
|
122
|
+
batch=<%= JSON.dump([{"method"=>"post", "relative_url"=>"me/photos", "attached_files" => "op1_file0"}]) %>&op1_file0=[FILE]:
|
123
123
|
post:
|
124
124
|
with_token: '[{"code": 400, body": "{\"error\":{\"type\":\"AnError\", \"message\":\"An error occurred!.\"}}"},null]'
|
125
|
-
batch=<%=
|
125
|
+
batch=<%= JSON.dump([{"method"=>"post", "relative_url"=>"me/photos", "attached_files" => "op1_file0"}]) %>&op1_file0=[FILE]:
|
126
126
|
post:
|
127
127
|
with_token: '[{"code": 200, "body":"{\"id\": \"MOCK_PHOTO\"}"}]'
|
128
|
-
batch=<%=
|
128
|
+
batch=<%= JSON.dump([{"method"=>"post", "relative_url"=>"me/photos", "attached_files" => "op1_file0"}, {"method"=>"post", "relative_url"=>"koppel/photos", "attached_files" => "op2_file0"}]) %>&op1_file0=[FILE]&op2_file0=[FILE]:
|
129
129
|
post:
|
130
130
|
with_token: '[{"code": 200, "body":"{\"id\": \"MOCK_PHOTO\"}"}, {"code": 200, "body":"{\"id\": \"MOCK_PHOTO\"}"}]'
|
131
131
|
|
@@ -166,7 +166,7 @@ graph_api:
|
|
166
166
|
link=http://oauth.twoalex.com/&message=Hello, world, from the test suite again!&name=OAuth Playground:
|
167
167
|
post:
|
168
168
|
with_token: '{"id": "FEED_ITEM_CONTEXT"}'
|
169
|
-
link=http://oauth.twoalex.com/&message=body&name=It's a big question&picture=http://oauth.twoalex.com//images/logo.png&properties=<%=
|
169
|
+
link=http://oauth.twoalex.com/&message=body&name=It's a big question&picture=http://oauth.twoalex.com//images/logo.png&properties=<%= JSON.dump({"Link1"=>{"text"=>"Left", "href"=>"http://oauth.twoalex.com/"}, "other" => {"text"=>"Straight ahead", "href"=>"http://oauth.twoalex.com/?"}}) %>&type=link:
|
170
170
|
post:
|
171
171
|
with_token: '{"id": "FEED_ITEM_DICTIONARY"}'
|
172
172
|
|
@@ -216,6 +216,9 @@ graph_api:
|
|
216
216
|
get:
|
217
217
|
with_token: '{"id": 1, "name": 1, "updated_time": 1}'
|
218
218
|
no_token: '{"id": 1, "name": 1}'
|
219
|
+
metadata=1:
|
220
|
+
get:
|
221
|
+
with_token: '{"name": "Alex Koppel","metadata": {"fields": [{"name": "id"}],"type": "user","connections": {}},"id": "2905623"}'
|
219
222
|
|
220
223
|
/facebook:
|
221
224
|
no_args:
|
@@ -302,11 +305,11 @@ graph_api:
|
|
302
305
|
get:
|
303
306
|
<<: *token_required
|
304
307
|
with_token: '[{"read_stream":1}]'
|
305
|
-
'q=<%=
|
308
|
+
'q=<%= JSON.dump({"query1" => "select post_id from stream where source_id = me()", "query2" => "select fromid from comment where post_id in (select post_id from #query1)", "query3" => "select uid, name from user where uid in (select fromid from #query2)"}) %>':
|
306
309
|
get:
|
307
310
|
<<: *token_required
|
308
311
|
with_token: '[{"name":"query1", "fql_result_set":[]},{"name":"query2", "fql_result_set":[]},{"name":"query3", "fql_result_set":[]}]'
|
309
|
-
'q=<%=
|
312
|
+
'q=<%= JSON.dump({"query1" => "select uid, first_name from user where uid = 2901279", "query2" => "select uid, first_name from user where uid = 2905623"}) %>':
|
310
313
|
get:
|
311
314
|
with_token: '[{"name":"query1", "fql_result_set":[{"uid":2901279,"first_name":"Luke"}]},{"name":"query2", "fql_result_set":[{"uid":"2905623","first_name":"Alex"}]}]'
|
312
315
|
no_token: '[{"name":"query1", "fql_result_set":[{"uid":2901279,"first_name":"Luke"}]},{"name":"query2", "fql_result_set":[{"uid":"2905623","first_name":"Alex"}]}]'
|
@@ -325,7 +328,7 @@ graph_api:
|
|
325
328
|
|
326
329
|
|
327
330
|
'/<%= APP_ID %>':
|
328
|
-
restrictions=<%=
|
331
|
+
restrictions=<%= JSON.dump({"age_distr" => "13+"}) %>:
|
329
332
|
post:
|
330
333
|
with_token: "true"
|
331
334
|
|
@@ -188,7 +188,7 @@ shared_examples_for "Koala GraphAPI" do
|
|
188
188
|
it "passes a queries argument" do
|
189
189
|
queries = double('query string')
|
190
190
|
queries_json = "some JSON"
|
191
|
-
allow(
|
191
|
+
allow(JSON).to receive(:dump).with(queries).and_return(queries_json)
|
192
192
|
|
193
193
|
expect(@api).to receive(:get_object).with(anything, hash_including(:q => queries_json), anything)
|
194
194
|
@api.fql_multiquery(queries)
|
@@ -234,6 +234,14 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
234
234
|
result = @api.get_objects([KoalaTest.page, KoalaTest.user1])
|
235
235
|
expect(result.length).to eq(2)
|
236
236
|
end
|
237
|
+
|
238
|
+
describe "#get_object_metadata" do
|
239
|
+
it "can access an object's metadata" do
|
240
|
+
result = @api.get_object_metadata(KoalaTest.user1)
|
241
|
+
expect(result["type"]).to eq("user")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
237
245
|
it "can access connections from users" do
|
238
246
|
result = @api.get_connections(KoalaTest.user2, "friends")
|
239
247
|
expect(result.length).to be > 0
|
@@ -485,7 +493,7 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
485
493
|
end
|
486
494
|
|
487
495
|
it "JSON-encodes the restrictions" do
|
488
|
-
expect(@app_api).to receive(:graph_call).with(anything, hash_including(:restrictions =>
|
496
|
+
expect(@app_api).to receive(:graph_call).with(anything, hash_including(:restrictions => JSON.dump(@restrictions)), anything, anything)
|
489
497
|
@app_api.set_app_restrictions(KoalaTest.app_id, @restrictions)
|
490
498
|
end
|
491
499
|
|
data/spec/support/koala_test.rb
CHANGED
@@ -243,7 +243,7 @@ module KoalaTest
|
|
243
243
|
require 'typhoeus/adapters/faraday' if adapter.to_s == "typhoeus"
|
244
244
|
Faraday.default_adapter = adapter.to_sym
|
245
245
|
end
|
246
|
-
rescue
|
246
|
+
rescue ParserError
|
247
247
|
puts "Unable to load adapter #{adapter}, using Net::HTTP."
|
248
248
|
ensure
|
249
249
|
@adapter_activation_attempted = true
|
@@ -5,9 +5,6 @@ module Koala
|
|
5
5
|
module MockHTTPService
|
6
6
|
include Koala::HTTPService
|
7
7
|
|
8
|
-
# fix our specs to use ok_json, so we always get the same results from to_json
|
9
|
-
MultiJson.use :ok_json
|
10
|
-
|
11
8
|
# Mocks all HTTP requests for with koala_spec_with_mocks.rb
|
12
9
|
# Mocked values to be included in TEST_DATA used in specs
|
13
10
|
ACCESS_TOKEN = '*'
|
@@ -91,7 +88,7 @@ module Koala
|
|
91
88
|
args = arguments.inject({}) do |hash, (k, v)|
|
92
89
|
# ensure our args are all stringified
|
93
90
|
value = if v.is_a?(String)
|
94
|
-
should_json_decode?(v) ?
|
91
|
+
should_json_decode?(v) ? JSON.load(v) : v
|
95
92
|
elsif v.is_a?(Koala::UploadableIO)
|
96
93
|
# obviously there are no files in the yaml
|
97
94
|
"[FILE]"
|
@@ -122,7 +119,7 @@ module Koala
|
|
122
119
|
# will remove +'s in restriction strings
|
123
120
|
string.split("&").reduce({}) do |hash, component|
|
124
121
|
k, v = component.split("=", 2) # we only care about the first =
|
125
|
-
value = should_json_decode?(v) ?
|
122
|
+
value = should_json_decode?(v) ? JSON.load(v) : v.to_s rescue v.to_s
|
126
123
|
# some special-casing, unfortunate but acceptable in this testing
|
127
124
|
# environment
|
128
125
|
value = nil if value.empty?
|
@@ -126,7 +126,7 @@ shared_examples_for "Koala RestAPI with an access token" do
|
|
126
126
|
describe "#set_app_properties" do
|
127
127
|
it "sends Facebook the properties JSON-encoded as :properties" do
|
128
128
|
props = {:a => 2, :c => [1, 2, "d"]}
|
129
|
-
expect(@api).to receive(:rest_call).with(anything, hash_including(:properties =>
|
129
|
+
expect(@api).to receive(:rest_call).with(anything, hash_including(:properties => JSON.dump(props)), anything, anything)
|
130
130
|
@api.set_app_properties(props)
|
131
131
|
end
|
132
132
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koala
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Koppel
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: multi_json
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.3.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 1.3.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: faraday
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,9 +130,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
130
|
version: '0'
|
145
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
132
|
requirements:
|
147
|
-
- - "
|
133
|
+
- - ">"
|
148
134
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
135
|
+
version: 1.3.1
|
150
136
|
requirements: []
|
151
137
|
rubyforge_project:
|
152
138
|
rubygems_version: 2.4.6
|