koala 2.4.0 → 2.5.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|