koala 1.6.0 → 1.7.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -5
- data/Gemfile +1 -2
- data/changelog.md +107 -4
- data/koala.gemspec +5 -5
- data/lib/koala.rb +13 -4
- data/lib/koala/api.rb +28 -3
- data/lib/koala/api/graph_api.rb +33 -3
- data/lib/koala/api/graph_collection.rb +20 -20
- data/lib/koala/api/rest_api.rb +1 -3
- data/lib/koala/http_service.rb +21 -16
- data/lib/koala/oauth.rb +15 -11
- data/lib/koala/version.rb +1 -1
- data/readme.md +34 -7
- data/spec/cases/api_spec.rb +21 -1
- data/spec/cases/graph_api_batch_spec.rb +38 -16
- data/spec/cases/graph_api_spec.rb +13 -20
- data/spec/cases/http_service_spec.rb +39 -9
- data/spec/cases/koala_spec.rb +34 -22
- data/spec/cases/oauth_spec.rb +16 -12
- data/spec/cases/test_users_spec.rb +5 -1
- data/spec/fixtures/mock_facebook_responses.yml +14 -6
- data/spec/spec_helper.rb +19 -35
- data/spec/support/graph_api_shared_examples.rb +34 -17
- data/spec/support/koala_test.rb +10 -1
- data/spec/support/mock_http_service.rb +77 -33
- metadata +27 -32
- data/spec/support/json_testing_fix.rb +0 -42
@@ -20,7 +20,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
20
20
|
# Facebook only allows us 500 test users per app, so we have to clean up
|
21
21
|
# This would be a good place to clean up and accumulate all of them for
|
22
22
|
# later deletion.
|
23
|
-
unless KoalaTest.mock_interface?
|
23
|
+
unless KoalaTest.mock_interface? || @stubbed
|
24
24
|
((@network || []) + [@user1, @user2]).each do |u|
|
25
25
|
puts "Unable to delete test user #{u.inspect}" if u && !(@test_users.delete(u) rescue false)
|
26
26
|
end
|
@@ -149,6 +149,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
149
149
|
end
|
150
150
|
|
151
151
|
it "accepts http options" do
|
152
|
+
@stubbed = true
|
152
153
|
options = {:some_http_option => true}
|
153
154
|
@test_users.api.should_receive(:graph_call).with(anything, anything, anything, options)
|
154
155
|
@test_users.list(options)
|
@@ -178,6 +179,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
178
179
|
it "lets you specify http options that get passed through to the graph call" do
|
179
180
|
options = {:some_http_option => true}
|
180
181
|
# technically this goes through delete_object, but this makes it less brittle
|
182
|
+
@stubbed = true
|
181
183
|
@test_users.graph_api.should_receive(:graph_call).with(anything, anything, anything, options)
|
182
184
|
@test_users.delete("user", options)
|
183
185
|
end
|
@@ -229,6 +231,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
229
231
|
|
230
232
|
it "accepts an options hash" do
|
231
233
|
options = {:some_http_option => true}
|
234
|
+
@stubbed = true
|
232
235
|
@test_users2.graph_api.should_receive(:graph_call).with(anything, anything, anything, options)
|
233
236
|
@test_users2.update("foo", @updates, options)
|
234
237
|
end
|
@@ -269,6 +272,7 @@ describe "Koala::Facebook::TestUsers" do
|
|
269
272
|
it "accepts http options passed to both calls" do
|
270
273
|
options = {:some_http_option => true}
|
271
274
|
# should come twice, once for each user
|
275
|
+
@stubbed = true
|
272
276
|
Koala.http_service.should_receive(:make_request).with(anything, anything, anything, options).twice.and_return(Koala::HTTPService::Response.new(200, "{}", {}))
|
273
277
|
@test_users.befriend(@user1, @user2, options)
|
274
278
|
end
|
@@ -126,9 +126,6 @@ graph_api:
|
|
126
126
|
post:
|
127
127
|
with_token: '[{"code": 200, "body":"{\"id\": \"MOCK_PHOTO\"}"}, {"code": 200, "body":"{\"id\": \"MOCK_PHOTO\"}"}]'
|
128
128
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
129
|
/me:
|
133
130
|
no_args:
|
134
131
|
get:
|
@@ -166,9 +163,9 @@ graph_api:
|
|
166
163
|
link=http://oauth.twoalex.com/&message=Hello, world, from the test suite again!&name=OAuth Playground:
|
167
164
|
post:
|
168
165
|
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=<%= {"
|
166
|
+
link=http://oauth.twoalex.com/&message=body&name=It's a big question&picture=http://oauth.twoalex.com//images/logo.png&properties=<%= MultiJson.encode({"Link1"=>{"text"=>"Left", "href"=>"http://oauth.twoalex.com/"}, "other" => {"text"=>"Straight ahead", "href"=>"http://oauth.twoalex.com/?"}}) %>&type=link:
|
170
167
|
post:
|
171
|
-
with_token: '{"id": "
|
168
|
+
with_token: '{"id": "FEED_ITEM_DICTIONARY"}'
|
172
169
|
|
173
170
|
/me/photos:
|
174
171
|
source=[FILE]:
|
@@ -308,6 +305,11 @@ graph_api:
|
|
308
305
|
post:
|
309
306
|
with_token: "true"
|
310
307
|
|
308
|
+
/debug_token:
|
309
|
+
input_token=<%= APP_ACCESS_TOKEN %>:
|
310
|
+
get:
|
311
|
+
with_token: '{ "data": { "app_id": <%= APP_ID %>, "application": "Social Cafe", "expires_at": 1352419328, "is_valid": true, "issued_at": 1347235328, "metadata": { "sso": "iphone-safari" }, "scopes": [ "email", "publish_actions" ], "user_id": 1207059 } }'
|
312
|
+
|
311
313
|
# -- OAuth responses --
|
312
314
|
/oauth/access_token:
|
313
315
|
client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=<%= OAUTH_CODE %>&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
|
@@ -316,7 +318,7 @@ graph_api:
|
|
316
318
|
client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&code=foo&redirect_uri=<%= OAUTH_DATA["callback_url"] %>:
|
317
319
|
get:
|
318
320
|
<<: *oauth_error
|
319
|
-
client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&
|
321
|
+
client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&grant_type=client_credentials:
|
320
322
|
post:
|
321
323
|
no_token: access_token=<%= APP_ACCESS_TOKEN %>
|
322
324
|
client_id=<%= APP_ID %>&client_secret=<%= SECRET %>&fb_exchange_token=<%= ACCESS_TOKEN %>&grant_type=fb_exchange_token:
|
@@ -407,6 +409,12 @@ graph_api:
|
|
407
409
|
get:
|
408
410
|
with_token: '{"link":"http://oauth.twoalex.com/", "name": "OAuth Playground"}'
|
409
411
|
|
412
|
+
/FEED_ITEM_DICTIONARY:
|
413
|
+
no_args:
|
414
|
+
<<: *item_deleted
|
415
|
+
get:
|
416
|
+
with_token: '{"link":"http://oauth.twoalex.com/", "name": "OAuth Playground", "properties": {}}'
|
417
|
+
|
410
418
|
/FEED_ITEM_CATS:
|
411
419
|
no_args:
|
412
420
|
<<: *item_deleted
|
data/spec/spec_helper.rb
CHANGED
@@ -1,46 +1,30 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
if RUBY_VERSION == '1.9.2' && RUBY_PATCHLEVEL < 290 && RUBY_ENGINE != "macruby"
|
2
|
+
# In Ruby 1.9.2 versions before patchlevel 290, the default Psych
|
3
|
+
# parser has an issue with YAML merge keys, which
|
4
|
+
# fixtures/mock_facebook_responses.yml relies heavily on.
|
5
|
+
#
|
6
|
+
# Anyone using an earlier version will see missing mock response
|
7
|
+
# errors when running the test suite similar to this:
|
8
|
+
#
|
9
|
+
# RuntimeError:
|
10
|
+
# Missing a mock response for graph_api: /me/videos: source=[FILE]: post: with_token
|
11
|
+
# API PATH: /me/videos?source=[FILE]&format=json&access_token=*
|
12
|
+
#
|
13
|
+
# For now, it seems the best fix is to just downgrade to the old syck YAML parser
|
14
|
+
# for these troubled versions.
|
15
|
+
#
|
16
|
+
# See https://github.com/tenderlove/psych/issues/8 for more details
|
17
|
+
YAML::ENGINE.yamler = 'syck'
|
5
18
|
end
|
6
19
|
|
7
|
-
# In Ruby 1.9.2 versions before patchlevel 290, the default Psych
|
8
|
-
# parser has an issue with YAML merge keys, which
|
9
|
-
# fixtures/mock_facebook_responses.yml relies heavily on.
|
10
|
-
#
|
11
|
-
# Anyone using an earlier version will see missing mock response
|
12
|
-
# errors when running the test suite similar to this:
|
13
|
-
#
|
14
|
-
# RuntimeError:
|
15
|
-
# Missing a mock response for graph_api: /me/videos: source=[FILE]: post: with_token
|
16
|
-
# API PATH: /me/videos?source=[FILE]&format=json&access_token=*
|
17
|
-
#
|
18
|
-
# For now, it seems the best fix is to just downgrade to the old syck YAML parser
|
19
|
-
# for these troubled versions.
|
20
|
-
#
|
21
|
-
# See https://github.com/tenderlove/psych/issues/8 for more details
|
22
|
-
YAML::ENGINE.yamler = 'syck' if RUBY_VERSION == '1.9.2' && RUBY_PATCHLEVEL < 290
|
23
|
-
|
24
|
-
# load custom RSpec matchers
|
25
|
-
require 'support/custom_matchers'
|
26
|
-
|
27
20
|
# load the library
|
28
21
|
require 'koala'
|
29
22
|
|
30
|
-
#
|
31
|
-
#
|
32
|
-
require 'support/ordered_hash'
|
33
|
-
require 'support/json_testing_fix'
|
23
|
+
# Support files
|
24
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
34
25
|
|
35
26
|
# set up our testing environment
|
36
|
-
require 'support/mock_http_service'
|
37
|
-
require 'support/koala_test'
|
38
27
|
# load testing data and (if needed) create test users or validate real users
|
39
28
|
KoalaTest.setup_test_environment!
|
40
29
|
|
41
|
-
# load supporting files for our tests
|
42
|
-
require 'support/rest_api_shared_examples'
|
43
|
-
require 'support/graph_api_shared_examples'
|
44
|
-
require 'support/uploadable_io_shared_examples'
|
45
|
-
|
46
30
|
BEACH_BALL_PATH = File.join(File.dirname(__FILE__), "fixtures", "beach.jpg")
|
@@ -85,12 +85,19 @@ shared_examples_for "Koala GraphAPI" do
|
|
85
85
|
results.should have(2).items
|
86
86
|
end
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
describe "#get_picture" do
|
89
|
+
it "can access a user's picture" do
|
90
|
+
@api.get_picture(KoalaTest.user2).should =~ /http[s]*\:\/\//
|
91
|
+
end
|
92
|
+
|
93
|
+
it "can access a user's picture, given a picture type" do
|
94
|
+
@api.get_picture(KoalaTest.user2, {:type => 'large'}).should =~ /^http[s]*\:\/\//
|
95
|
+
end
|
91
96
|
|
92
|
-
|
93
|
-
|
97
|
+
it "works even if Facebook returns nil" do
|
98
|
+
@api.stub(:graph_call).and_return(nil)
|
99
|
+
@api.get_picture(KoalaTest.user2, {:type => 'large'}).should be_nil
|
100
|
+
end
|
94
101
|
end
|
95
102
|
|
96
103
|
it "can access connections from public Pages" do
|
@@ -251,22 +258,25 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
251
258
|
|
252
259
|
it "can post a message whose attachment has a properties dictionary" do
|
253
260
|
url = KoalaTest.oauth_test_data["callback_url"]
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
{"
|
262
|
-
|
261
|
+
args = {
|
262
|
+
"picture" => "#{KoalaTest.oauth_test_data["callback_url"]}/images/logo.png",
|
263
|
+
"name" => "It's a big question",
|
264
|
+
"type" => "link",
|
265
|
+
"link" => KoalaTest.oauth_test_data["callback_url"],
|
266
|
+
"properties" => {
|
267
|
+
"Link1" => {"text" => "Left", "href" => url},
|
268
|
+
"other" => {"text" => "Straight ahead", "href" => url + "?"}
|
269
|
+
}
|
263
270
|
}
|
264
271
|
|
265
|
-
result = @api.put_wall_post("body",
|
272
|
+
result = @api.put_wall_post("body", args)
|
266
273
|
@temporary_object_id = result["id"]
|
267
274
|
@temporary_object_id.should_not be_nil
|
268
|
-
end
|
269
275
|
|
276
|
+
# ensure the properties dictionary is there
|
277
|
+
api_data = @api.get_object(@temporary_object_id)
|
278
|
+
api_data["properties"].should_not be_nil
|
279
|
+
end
|
270
280
|
|
271
281
|
describe "#put_picture" do
|
272
282
|
it "can post photos to the user's wall with an open file object" do
|
@@ -343,7 +353,6 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
343
353
|
@temporary_object_id.should_not be_nil
|
344
354
|
end
|
345
355
|
|
346
|
-
|
347
356
|
it "can post videos to the user's wall without an open file object" do
|
348
357
|
result = @api.put_video(@cat_movie, @content_type)
|
349
358
|
@temporary_object_id = result["id"]
|
@@ -412,6 +421,14 @@ shared_examples_for "Koala GraphAPI with an access token" do
|
|
412
421
|
end
|
413
422
|
end
|
414
423
|
|
424
|
+
it "can get information about an access token" do
|
425
|
+
result = @api.debug_token(KoalaTest.app_access_token)
|
426
|
+
result.should be_kind_of(Hash)
|
427
|
+
result["data"].should be_kind_of(Hash)
|
428
|
+
result["data"]["app_id"].to_s.should == KoalaTest.app_id.to_s
|
429
|
+
result["data"]["application"].should_not be_nil
|
430
|
+
end
|
431
|
+
|
415
432
|
describe "#set_app_restrictions" do
|
416
433
|
before :all do
|
417
434
|
oauth = Koala::Facebook::OAuth.new(KoalaTest.app_id, KoalaTest.secret)
|
data/spec/support/koala_test.rb
CHANGED
@@ -32,6 +32,7 @@ module KoalaTest
|
|
32
32
|
adapter = ENV['ADAPTER'] || "typhoeus" # use Typhoeus by default if available
|
33
33
|
begin
|
34
34
|
require adapter
|
35
|
+
require 'typhoeus/adapters/faraday' if adapter.to_s == "typhoeus"
|
35
36
|
Faraday.default_adapter = adapter.to_sym
|
36
37
|
rescue LoadError
|
37
38
|
puts "Unable to load adapter #{adapter}, using Net::HTTP."
|
@@ -58,6 +59,13 @@ module KoalaTest
|
|
58
59
|
end
|
59
60
|
|
60
61
|
config.after :each do
|
62
|
+
# Clean up Koala config
|
63
|
+
Koala.configure do |config|
|
64
|
+
Koala::HTTPService::DEFAULT_SERVERS.each_pair do |k, v|
|
65
|
+
config.send("#{k}=", v)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
61
69
|
# if we're working with a real user, clean up any objects posted to Facebook
|
62
70
|
# no need to do so for test users, since they get deleted at the end
|
63
71
|
if @temporary_object_id && KoalaTest.real_user?
|
@@ -71,6 +79,7 @@ module KoalaTest
|
|
71
79
|
# if we errored out or Facebook returned false, track that
|
72
80
|
puts "Unable to delete #{@temporary_object_id}: #{result} (probably a photo or video, which can't be deleted through the API)" unless result
|
73
81
|
end
|
82
|
+
|
74
83
|
end
|
75
84
|
end
|
76
85
|
end
|
@@ -80,7 +89,7 @@ module KoalaTest
|
|
80
89
|
self.oauth_test_data = data["oauth_test_data"]
|
81
90
|
self.subscription_test_data = data["subscription_test_data"]
|
82
91
|
self.oauth_token = data["oauth_token"]
|
83
|
-
self.app_id = data["oauth_test_data"]["app_id"]
|
92
|
+
self.app_id = data["oauth_test_data"]["app_id"].to_s
|
84
93
|
self.app_access_token = data["oauth_test_data"]["app_access_token"]
|
85
94
|
self.secret = data["oauth_test_data"]["secret"]
|
86
95
|
self.code = data["oauth_test_data"]["code"]
|
@@ -36,41 +36,22 @@ module Koala
|
|
36
36
|
RESPONSES = YAML.load(ERB.new(IO.read(mock_response_file_path)).result(binding))
|
37
37
|
|
38
38
|
def self.make_request(path, args, verb, options = {})
|
39
|
-
|
40
|
-
verb ||= 'get'
|
41
|
-
server = options[:rest_api] ? 'rest_api' : 'graph_api'
|
42
|
-
token = args.delete('access_token')
|
43
|
-
with_token = (token == ACCESS_TOKEN || token == APP_ACCESS_TOKEN) ? 'with_token' : 'no_token'
|
44
|
-
|
45
|
-
# Assume format is always JSON
|
46
|
-
args.delete('format')
|
47
|
-
|
48
|
-
# Create a hash key for the arguments
|
49
|
-
args = create_params_key(args)
|
50
|
-
|
51
|
-
begin
|
52
|
-
response = RESPONSES[server][path][args][verb][with_token]
|
53
|
-
|
54
|
-
# Raises an error of with_token/no_token key is missing
|
55
|
-
raise NoMethodError unless response
|
56
|
-
|
39
|
+
if response = match_response(path, args, verb, options)
|
57
40
|
# create response class object
|
58
41
|
response_object = if response.is_a? String
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
rescue NoMethodError
|
42
|
+
Koala::HTTPService::Response.new(200, response, {})
|
43
|
+
else
|
44
|
+
Koala::HTTPService::Response.new(response["code"] || 200, response["body"] || "", response["headers"] || {})
|
45
|
+
end
|
46
|
+
else
|
65
47
|
# Raises an error message with the place in the data YML
|
66
48
|
# to place a mock as well as a URL to request from
|
67
49
|
# Facebook's servers for the actual data
|
68
50
|
# (Don't forget to replace ACCESS_TOKEN with a real access token)
|
69
|
-
data_trace = [
|
51
|
+
data_trace = [path, args, verb, options] * ': '
|
70
52
|
|
71
53
|
args = args == 'no_args' ? '' : "#{args}&"
|
72
54
|
args += 'format=json'
|
73
|
-
args += "&access_token=#{ACCESS_TOKEN}" if with_token
|
74
55
|
|
75
56
|
raise "Missing a mock response for #{data_trace}\nAPI PATH: #{[path, args].join('?')}"
|
76
57
|
end
|
@@ -85,15 +66,78 @@ module Koala
|
|
85
66
|
|
86
67
|
protected
|
87
68
|
|
88
|
-
|
89
|
-
|
90
|
-
|
69
|
+
# For a given query, see if our mock responses YAML has a resopnse for it.
|
70
|
+
def self.match_response(path, args, verb, options = {})
|
71
|
+
server = options[:rest_api] ? 'rest_api' : 'graph_api'
|
72
|
+
path = 'root' if path == '' || path == '/'
|
73
|
+
verb = (verb || 'get').to_s
|
74
|
+
token = args.delete('access_token')
|
75
|
+
with_token = (token == ACCESS_TOKEN || token == APP_ACCESS_TOKEN) ? 'with_token' : 'no_token'
|
76
|
+
|
77
|
+
if endpoint = RESPONSES[server][path]
|
78
|
+
# see if we have a match for the arguments
|
79
|
+
if arg_match = endpoint.find {|query, v| decode_query(query) == massage_args(args)}
|
80
|
+
# we have a match for the server/path/arguments
|
81
|
+
# so if it's the right verb and authentication, we're good
|
82
|
+
# arg_match will be [query, hash_response]
|
83
|
+
arg_match.last[verb][with_token]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Since we're comparing the arguments with data in a yaml file, we need to
|
89
|
+
# massage them slightly to get to the format we expect.
|
90
|
+
def self.massage_args(arguments)
|
91
|
+
args = arguments.inject({}) do |hash, (k, v)|
|
92
|
+
# ensure our args are all stringified
|
93
|
+
value = if v.is_a?(String)
|
94
|
+
should_json_decode?(v) ? MultiJson.load(v) : v
|
95
|
+
elsif v.is_a?(Koala::UploadableIO)
|
96
|
+
# obviously there are no files in the yaml
|
97
|
+
"[FILE]"
|
98
|
+
else
|
99
|
+
v
|
100
|
+
end
|
101
|
+
# make sure all keys are strings
|
102
|
+
hash.merge(k.to_s => value)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Assume format is always JSON
|
106
|
+
args.delete('format')
|
107
|
+
|
108
|
+
# if there are no args, return the special keyword no_args
|
109
|
+
args.empty? ? "no_args" : args
|
110
|
+
end
|
111
|
+
|
112
|
+
# Facebook sometimes requires us to encode JSON values in an HTTP query
|
113
|
+
# param. This complicates test matches, since we get into JSON-encoding
|
114
|
+
# issues (what order keys are written into). To avoid string comparisons
|
115
|
+
# and the hacks required to make it work, we decode the query into a
|
116
|
+
# Ruby object.
|
117
|
+
def self.decode_query(string)
|
118
|
+
if string == "no_args"
|
119
|
+
string
|
91
120
|
else
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
121
|
+
# we can't use Faraday's decode_query because that CGI-unencodes, which
|
122
|
+
# will remove +'s in restriction strings
|
123
|
+
string.split("&").reduce({}) do |hash, component|
|
124
|
+
k, v = component.split("=", 2) # we only care about the first =
|
125
|
+
value = should_json_decode?(v) ? MultiJson.decode(v) : v.to_s rescue v.to_s
|
126
|
+
# some special-casing, unfortunate but acceptable in this testing
|
127
|
+
# environment
|
128
|
+
value = nil if value.empty?
|
129
|
+
value = true if value == "true"
|
130
|
+
value = false if value == "false"
|
131
|
+
hash.merge(k => value)
|
132
|
+
end
|
96
133
|
end
|
97
134
|
end
|
135
|
+
|
136
|
+
# We want to decode JSON because it may not be encoded in the same order
|
137
|
+
# all the time -- different Rubies may create a strings with equivalent
|
138
|
+
# content but different order. We want to compare the objects.
|
139
|
+
def self.should_json_decode?(v)
|
140
|
+
v.match(/^[\[\{]/)
|
141
|
+
end
|
98
142
|
end
|
99
143
|
end
|
metadata
CHANGED
@@ -1,96 +1,96 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koala
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.7.0rc1
|
5
|
+
prerelease: 5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alex Koppel
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: faraday
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '0
|
37
|
+
version: '0'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: addressable
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - ! '>='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '0'
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rspec
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '0'
|
70
70
|
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
|
-
- -
|
75
|
+
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: '
|
77
|
+
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: rake
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: '0
|
85
|
+
version: '0'
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: '0
|
93
|
+
version: '0'
|
94
94
|
description: Koala is a lightweight, flexible Ruby SDK for Facebook. It allows read/write
|
95
95
|
access to the social graph via the Graph and REST APIs, as well as support for realtime
|
96
96
|
updates and OAuth and Facebook Connect authentication. Koala is fully tested and
|
@@ -157,7 +157,6 @@ files:
|
|
157
157
|
- spec/spec_helper.rb
|
158
158
|
- spec/support/custom_matchers.rb
|
159
159
|
- spec/support/graph_api_shared_examples.rb
|
160
|
-
- spec/support/json_testing_fix.rb
|
161
160
|
- spec/support/koala_test.rb
|
162
161
|
- spec/support/mock_http_service.rb
|
163
162
|
- spec/support/ordered_hash.rb
|
@@ -181,19 +180,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
180
|
version: '0'
|
182
181
|
segments:
|
183
182
|
- 0
|
184
|
-
hash:
|
183
|
+
hash: 3438610920641769302
|
185
184
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
185
|
none: false
|
187
186
|
requirements:
|
188
|
-
- - ! '
|
187
|
+
- - ! '>'
|
189
188
|
- !ruby/object:Gem::Version
|
190
|
-
version:
|
191
|
-
segments:
|
192
|
-
- 0
|
193
|
-
hash: 4609092032250353184
|
189
|
+
version: 1.3.1
|
194
190
|
requirements: []
|
195
191
|
rubyforge_project:
|
196
|
-
rubygems_version: 1.8.
|
192
|
+
rubygems_version: 1.8.23
|
197
193
|
signing_key:
|
198
194
|
specification_version: 3
|
199
195
|
summary: A lightweight, flexible library for Facebook with support for the Graph API,
|
@@ -221,7 +217,6 @@ test_files:
|
|
221
217
|
- spec/spec_helper.rb
|
222
218
|
- spec/support/custom_matchers.rb
|
223
219
|
- spec/support/graph_api_shared_examples.rb
|
224
|
-
- spec/support/json_testing_fix.rb
|
225
220
|
- spec/support/koala_test.rb
|
226
221
|
- spec/support/mock_http_service.rb
|
227
222
|
- spec/support/ordered_hash.rb
|