koala 1.6.0 → 1.7.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.
- 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
|