rest-graph 1.8.0 → 1.9.0

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.
@@ -14,7 +14,7 @@ require 'cgi'
14
14
  require 'timeout'
15
15
 
16
16
  # the data structure used in RestGraph
17
- RestGraphStruct = Struct.new(:auto_decode, :strict, :timeout,
17
+ RestGraphStruct = Struct.new(:auto_decode, :timeout,
18
18
  :graph_server, :old_server,
19
19
  :accept, :lang,
20
20
  :app_id, :secret,
@@ -82,7 +82,8 @@ class RestGraph < RestGraphStruct
82
82
  Attributes.each{ |name|
83
83
  module_eval <<-RUBY
84
84
  def #{name}
85
- (r = super).nil? ? (self.#{name} = self.class.default_#{name}) : r
85
+ if (r = super).nil? then self.#{name} = self.class.default_#{name}
86
+ else r end
86
87
  end
87
88
  RUBY
88
89
  }
@@ -211,23 +212,25 @@ class RestGraph < RestGraphStruct
211
212
  "#{app_id}|#{secret}"
212
213
  end
213
214
 
214
- def lighten!
215
+ def lighten! o={}
215
216
  [:cache, :log_method, :log_handler, :error_handler].each{ |obj|
216
- send("#{obj}=", nil) }
217
+ send("#{obj}=", false) }
218
+ send(:initialize, o)
217
219
  self
218
220
  end
219
221
 
220
- def lighten
221
- dup.lighten!
222
+ def lighten o={}
223
+ dup.lighten!(o)
222
224
  end
223
225
 
224
226
  def inspect
225
- super.gsub(/(\w+)=([^,>]+)/){ |match|
226
- value = $2 == 'nil' ? self.class.send("default_#{$1}").inspect : $2
227
- "#{$1}=#{value}"
228
- }
227
+ "#<struct RestGraph #{attributes.map{ |k, v|
228
+ "#{k}=#{v.inspect}" }.join(', ')}>"
229
229
  end
230
230
 
231
+ def attributes
232
+ Hash[each_pair.map{ |k, v| [k, send(k)] }]
233
+ end
231
234
 
232
235
 
233
236
 
@@ -239,17 +242,20 @@ class RestGraph < RestGraphStruct
239
242
  end
240
243
 
241
244
  # extra options:
242
- # auto_decode: Bool # decode with json or not in this method call
245
+ # auto_decode: Bool # decode with json or not in this API request
243
246
  # # default: auto_decode in rest-graph instance
247
+ # timeout: Int # the timeout for this API request
248
+ # # default: timeout in rest-graph instance
244
249
  # secret: Bool # use secret_acccess_token or not
245
250
  # # default: false
246
251
  # cache: Bool # use cache or not; if it's false, update cache, too
247
252
  # # default: true
248
253
  # expires_in: Int # control when would the cache be expired
249
- # # default: nothing
254
+ # # default: nil
250
255
  # async: Bool # use eventmachine for http client or not
251
256
  # # default: false, but true in aget family
252
257
  # headers: Hash # additional hash you want to pass
258
+ # # default: {}
253
259
  def get path, query={}, opts={}, &cb
254
260
  request(opts, [:get , url(path, query, graph_server, opts)], &cb)
255
261
  end
@@ -299,7 +305,7 @@ class RestGraph < RestGraphStruct
299
305
 
300
306
  def next_page hash, opts={}, &cb
301
307
  if hash['paging'].kind_of?(Hash) && hash['paging']['next']
302
- request(opts, [:get, hash['paging']['next']], &cb)
308
+ request(opts, [:get, URI.encode(hash['paging']['next'])], &cb)
303
309
  else
304
310
  yield(nil) if block_given?
305
311
  end
@@ -307,7 +313,7 @@ class RestGraph < RestGraphStruct
307
313
 
308
314
  def prev_page hash, opts={}, &cb
309
315
  if hash['paging'].kind_of?(Hash) && hash['paging']['previous']
310
- request(opts, [:get, hash['paging']['previous']], &cb)
316
+ request(opts, [:get, URI.encode(hash['paging']['previous'])], &cb)
311
317
  else
312
318
  yield(nil) if block_given?
313
319
  end
@@ -398,24 +404,23 @@ class RestGraph < RestGraphStruct
398
404
  # old rest facebook api, i will definitely love to remove them someday
399
405
 
400
406
  def old_rest path, query={}, opts={}, &cb
401
- request(
402
- opts,
403
- [:get,
404
- url("method/#{path}", {:format => 'json'}.merge(query),
405
- old_server, opts)],
406
- &cb)
407
+ uri = url("method/#{path}", {:format => 'json'}.merge(query),
408
+ old_server, opts)
409
+ if opts[:post]
410
+ request(
411
+ opts.merge(:uri => uri),
412
+ [:post,
413
+ url("method/#{path}", {:format => 'json'}, old_server, opts),
414
+ query],
415
+ &cb)
416
+ else
417
+ request(opts, [:get, uri], &cb)
418
+ end
407
419
  end
408
420
 
409
421
  def secret_old_rest path, query={}, opts={}, &cb
410
422
  old_rest(path, query, {:secret => true}.merge(opts), &cb)
411
423
  end
412
- alias_method :broken_old_rest, :secret_old_rest
413
-
414
- def exchange_sessions query={}, opts={}, &cb
415
- q = {:client_id => app_id, :client_secret => secret,
416
- :type => 'client_cred'}.merge(query)
417
- request(opts, [:post, url('oauth/exchange_sessions', q)], &cb)
418
- end
419
424
 
420
425
  def fql code, query={}, opts={}, &cb
421
426
  old_rest('fql.query', {:query => code}.merge(query), opts, &cb)
@@ -426,16 +431,22 @@ class RestGraph < RestGraphStruct
426
431
  {:queries => self.class.json_encode(codes)}.merge(query), opts, &cb)
427
432
  end
428
433
 
434
+ def exchange_sessions query={}, opts={}, &cb
435
+ q = {:client_id => app_id, :client_secret => secret,
436
+ :type => 'client_cred'}.merge(query)
437
+ request(opts, [:post, url('oauth/exchange_sessions', q)], &cb)
438
+ end
439
+
429
440
 
430
441
 
431
442
 
432
443
 
433
444
  def request opts, *reqs, &cb
434
- Timeout.timeout(timeout){
445
+ Timeout.timeout(opts[:timeout] || timeout){
435
446
  reqs.each{ |(meth, uri, payload)|
436
- next if meth != :get
437
- cache_assign(uri, nil)
438
- } if opts[:cache] == false
447
+ next if meth != :get # only get result would get cached
448
+ cache_assign(opts, uri, nil)
449
+ } if opts[:cache] == false # remove cache if we don't want it
439
450
 
440
451
  if opts[:async]
441
452
  request_em(opts, reqs, &cb)
@@ -449,8 +460,9 @@ class RestGraph < RestGraphStruct
449
460
  def request_em opts, reqs
450
461
  start_time = Time.now
451
462
  rs = reqs.map{ |(meth, uri, payload)|
452
- r = EM::HttpRequest.new(uri).send(meth, :body => payload)
453
- if cached = cache_get(uri)
463
+ r = EM::HttpRequest.new(uri).send(meth, :body => payload,
464
+ :head => build_headers(opts))
465
+ if cached = cache_get(opts, uri)
454
466
  # TODO: this is hack!!
455
467
  r.instance_variable_set('@response', cached)
456
468
  r.instance_variable_set('@state' , :finish)
@@ -458,7 +470,7 @@ class RestGraph < RestGraphStruct
458
470
  r.succeed(r)
459
471
  else
460
472
  r.callback{
461
- cache_for(uri, r.response, meth, opts)
473
+ cache_for(opts, uri, meth, r.response)
462
474
  log(Event::Requested.new(Time.now - start_time, uri))
463
475
  }
464
476
  r.error{
@@ -471,7 +483,7 @@ class RestGraph < RestGraphStruct
471
483
  # TODO: how to deal with the failed?
472
484
  clients = m.responses[:succeeded]
473
485
  results = clients.map{ |client|
474
- post_request(client.response, client.uri, opts)
486
+ post_request(opts, client.uri, client.response)
475
487
  }
476
488
 
477
489
  if reqs.size == 1
@@ -486,10 +498,11 @@ class RestGraph < RestGraphStruct
486
498
 
487
499
  def request_rc opts, meth, uri, payload=nil, &cb
488
500
  start_time = Time.now
489
- post_request(cache_get(uri) || fetch(meth, uri, payload, opts),
490
- uri, opts, &cb)
501
+ post_request(opts, uri,
502
+ cache_get(opts, uri) || fetch(opts, uri, meth, payload),
503
+ &cb)
491
504
  rescue RestClient::Exception => e
492
- post_request(e.http_body, uri, opts, &cb)
505
+ post_request(opts, uri, e.http_body, &cb)
493
506
  ensure
494
507
  log(Event::Requested.new(Time.now - start_time, uri))
495
508
  end
@@ -509,11 +522,11 @@ class RestGraph < RestGraphStruct
509
522
  headers.merge(opts[:headers] || {})
510
523
  end
511
524
 
512
- def post_request result, uri, opts, &cb
525
+ def post_request opts, uri, result, &cb
513
526
  if decode?(opts)
514
527
  # [this].first is not needed for yajl-ruby
515
528
  decoded = self.class.json_decode("[#{result}]").first
516
- check_error(decoded, uri, &cb)
529
+ check_error(opts, uri, decoded, &cb)
517
530
  else
518
531
  block_given? ? yield(result) : result
519
532
  end
@@ -524,8 +537,6 @@ class RestGraph < RestGraphStruct
524
537
  def decode? opts
525
538
  if opts.has_key?(:auto_decode)
526
539
  opts[:auto_decode]
527
- elsif opts.has_key?(:suppress_decode)
528
- !opts[:suppress_decode]
529
540
  else
530
541
  auto_decode
531
542
  end
@@ -539,11 +550,11 @@ class RestGraph < RestGraphStruct
539
550
  end == cookies['sig']
540
551
  end
541
552
 
542
- def check_error hash, uri
553
+ def check_error opts, uri, hash
543
554
  if error_handler && hash.kind_of?(Hash) &&
544
555
  (hash['error'] || # from graph api
545
556
  hash['error_code']) # from fql
546
- cache_assign(uri, nil)
557
+ cache_assign(opts, uri, nil)
547
558
  error_handler.call(hash, uri)
548
559
  else
549
560
  block_given? ? yield(hash) : hash
@@ -558,38 +569,41 @@ class RestGraph < RestGraphStruct
558
569
  cookies.reject{ |(k, v)| k == 'sig' }.sort.map{ |a| a.join('=') }
559
570
  end
560
571
 
561
- def cache_assign uri, value
562
- return unless cache
563
- cache[cache_key(uri)] = value
572
+ def cache_key opts, uri
573
+ Digest::MD5.hexdigest(opts[:uri] || uri)
564
574
  end
565
575
 
566
- def cache_key uri
567
- Digest::MD5.hexdigest(uri)
576
+ def cache_assign opts, uri, value
577
+ return unless cache
578
+ cache[cache_key(opts, uri)] = value
568
579
  end
569
580
 
570
- def cache_get uri
581
+ def cache_get opts, uri
571
582
  return unless cache
572
583
  start_time = Time.now
573
- cache[cache_key(uri)].tap{ |result|
584
+ cache[cache_key(opts, uri)].tap{ |result|
574
585
  log(Event::CacheHit.new(Time.now - start_time, uri)) if result
575
586
  }
576
587
  end
577
588
 
578
- def cache_for uri, result, meth, opts
579
- return if !cache || meth != :get
589
+ def cache_for opts, uri, meth, value
590
+ return unless cache
591
+ # fake post (opts[:post] => true) is considered get and need cache
592
+ return if meth != :get unless opts[:post]
580
593
 
581
594
  if opts[:expires_in].kind_of?(Fixnum) && cache.method(:store).arity == -3
582
- cache.store(cache_key(uri), result, :expires_in => opts[:expires_in])
595
+ cache.store(cache_key(opts, uri), value,
596
+ :expires_in => opts[:expires_in])
583
597
  else
584
- cache_assign(uri, result)
598
+ cache_assign(opts, uri, value)
585
599
  end
586
600
  end
587
601
 
588
- def fetch meth, uri, payload, opts
602
+ def fetch opts, uri, meth, payload
589
603
  RestClient::Request.execute(:method => meth, :url => uri,
590
604
  :headers => build_headers(opts),
591
605
  :payload => payload).body.
592
- tap{ |result| cache_for(uri, result, meth, opts) }
606
+ tap{ |result| cache_for(opts, uri, meth, result) }
593
607
  end
594
608
 
595
609
  def merge_data lhs, rhs
@@ -59,7 +59,7 @@ module RestGraph::RailsUtil
59
59
  return if controller.respond_to?(:rest_graph, true)
60
60
 
61
61
  controller.rescue_from(RestGraph::Error::AccessToken,
62
- :with => :rest_graph_on_error)
62
+ :with => :rest_graph_on_access_token_error)
63
63
  controller.helper(RestGraph::RailsUtil::Helper)
64
64
  controller.instance_methods.select{ |method|
65
65
  method.to_s =~ /^rest_graph/
@@ -103,9 +103,11 @@ module RestGraph::RailsUtil
103
103
  @rest_graph ||= RestGraph.new(rest_graph_options_new)
104
104
  end
105
105
 
106
- def rest_graph_on_error error=nil
106
+ def rest_graph_on_access_token_error error=nil
107
107
  rest_graph_authorize(error, false)
108
108
  end
109
+ alias_method :rest_graph_on_error, # backward compatibility
110
+ :rest_graph_on_access_token_error
109
111
 
110
112
  def rest_graph_authorize error=nil, force_redirect=true
111
113
  logger.warn("WARN: RestGraph: #{error.inspect}")
@@ -14,19 +14,25 @@ module RestGraph::TestUtil
14
14
  any_instance_of(RestGraph){ |rg|
15
15
  stub(rg).data{default_data}
16
16
 
17
- stub(rg).fetch{ |meth, uri, payload|
17
+ stub(rg).fetch{ |opts, uri, meth, payload|
18
18
  history << [meth, uri, payload]
19
19
  http = 'https?://[\w\d]+(\.[\w\d]+)+/'
20
20
  response = case uri
21
21
  when %r{#{http}method/fql.multiquery}
22
22
  RestGraph.json_decode(
23
23
  Rack::Utils.parse_query(
24
- URI.parse(uri).query)['queries']).keys.map{ |q|
25
- {'name' => q,
26
- 'fql_result_set' => [default_response]}
27
- }
28
- when %r{#{http}method/\w+\.\w+}
29
- [default_response]
24
+ URI.parse(opts[:uri] || uri).query)['queries']).
25
+ keys.map{ |q|
26
+ {'name' => q,
27
+ 'fql_result_set' => [default_response]}
28
+ }
29
+ when %r{#{http}method/(\w+\.\w+)}
30
+ case $2
31
+ when 'friends.getAppUsers'
32
+ [5678]
33
+ else
34
+ [default_response]
35
+ end
30
36
  else
31
37
  default_response
32
38
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  require 'rest-graph/core'
3
3
 
4
- RestGraph::VERSION = '1.8.0'
4
+ RestGraph::VERSION = '1.9.0'
data/rest-graph.gemspec CHANGED
@@ -2,21 +2,132 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rest-graph}
5
- s.version = "1.8.0"
5
+ s.version = "1.9.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Cardinal Blue", "Lin Jen-Shin (godfat)"]
9
- s.date = %q{2011-03-08}
8
+ s.authors = [
9
+ %q{Cardinal Blue},
10
+ %q{Lin Jen-Shin (godfat)}]
11
+ s.date = %q{2011-05-26}
10
12
  s.description = %q{A lightweight Facebook Graph API client}
11
- s.email = ["dev (XD) cardinalblue.com"]
12
- s.extra_rdoc_files = ["CHANGES", "CONTRIBUTORS", "LICENSE", "TODO"]
13
- s.files = [".gitignore", "CHANGES", "CONTRIBUTORS", "Gemfile", "LICENSE", "README", "README.md", "Rakefile", "TODO", "doc/ToC.md", "doc/dependency.md", "doc/design.md", "doc/rails.md", "doc/test.md", "doc/tutorial.md", "example/multi/config.ru", "example/multi/rainbows.rb", "example/rails2/Gemfile", "example/rails2/Gemfile.lock", "example/rails2/README", "example/rails2/Rakefile", "example/rails2/app/controllers/application_controller.rb", "example/rails2/app/views/application/helper.html.erb", "example/rails2/config/boot.rb", "example/rails2/config/environment.rb", "example/rails2/config/environments/development.rb", "example/rails2/config/environments/production.rb", "example/rails2/config/environments/test.rb", "example/rails2/config/initializers/cookie_verification_secret.rb", "example/rails2/config/initializers/new_rails_defaults.rb", "example/rails2/config/initializers/session_store.rb", "example/rails2/config/preinitializer.rb", "example/rails2/config/rest-graph.yaml", "example/rails2/config/routes.rb", "example/rails2/log", "example/rails2/test/functional/application_controller_test.rb", "example/rails2/test/test_helper.rb", "example/rails2/test/unit/rails_util_test.rb", "example/rails3/Gemfile", "example/rails3/Gemfile.lock", "example/rails3/Rakefile", "example/rails3/app/controllers/application_controller.rb", "example/rails3/app/views/application/helper.html.erb", "example/rails3/config.ru", "example/rails3/config/application.rb", "example/rails3/config/environment.rb", "example/rails3/config/environments/development.rb", "example/rails3/config/environments/production.rb", "example/rails3/config/environments/test.rb", "example/rails3/config/initializers/secret_token.rb", "example/rails3/config/initializers/session_store.rb", "example/rails3/config/rest-graph.yaml", "example/rails3/config/routes.rb", "example/rails3/test/functional/application_controller_test.rb", "example/rails3/test/test_helper.rb", "example/rails3/test/unit/rails_util_test.rb", "init.rb", "lib/rest-graph.rb", "lib/rest-graph/auto_load.rb", "lib/rest-graph/autoload.rb", "lib/rest-graph/config_util.rb", "lib/rest-graph/core.rb", "lib/rest-graph/facebook_util.rb", "lib/rest-graph/rails_util.rb", "lib/rest-graph/test_util.rb", "lib/rest-graph/version.rb", "rest-graph.gemspec", "task/gemgem.rb", "test/common.rb", "test/config/rest-graph.yaml", "test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_facebook.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
14
- s.homepage = %q{http://github.com/godfat/}
15
- s.rdoc_options = ["--main", "README"]
16
- s.require_paths = ["lib"]
17
- s.rubygems_version = %q{1.6.1}
13
+ s.email = [%q{dev (XD) cardinalblue.com}]
14
+ s.extra_rdoc_files = [
15
+ %q{CHANGES},
16
+ %q{CONTRIBUTORS},
17
+ %q{LICENSE},
18
+ %q{TODO}]
19
+ s.files = [
20
+ %q{.gitignore},
21
+ %q{.gitmodules},
22
+ %q{CHANGES},
23
+ %q{CONTRIBUTORS},
24
+ %q{Gemfile},
25
+ %q{LICENSE},
26
+ %q{README},
27
+ %q{README.md},
28
+ %q{Rakefile},
29
+ %q{TODO},
30
+ %q{doc/ToC.md},
31
+ %q{doc/dependency.md},
32
+ %q{doc/design.md},
33
+ %q{doc/heroku-facebook.md},
34
+ %q{doc/rails.md},
35
+ %q{doc/test.md},
36
+ %q{doc/tutorial.md},
37
+ %q{example/multi/config.ru},
38
+ %q{example/multi/rainbows.rb},
39
+ %q{example/rails2/Gemfile},
40
+ %q{example/rails2/README},
41
+ %q{example/rails2/Rakefile},
42
+ %q{example/rails2/app/controllers/application_controller.rb},
43
+ %q{example/rails2/app/views/application/helper.html.erb},
44
+ %q{example/rails2/config/boot.rb},
45
+ %q{example/rails2/config/environment.rb},
46
+ %q{example/rails2/config/environments/development.rb},
47
+ %q{example/rails2/config/environments/production.rb},
48
+ %q{example/rails2/config/environments/test.rb},
49
+ %q{example/rails2/config/initializers/cookie_verification_secret.rb},
50
+ %q{example/rails2/config/initializers/new_rails_defaults.rb},
51
+ %q{example/rails2/config/initializers/session_store.rb},
52
+ %q{example/rails2/config/preinitializer.rb},
53
+ %q{example/rails2/config/rest-graph.yaml},
54
+ %q{example/rails2/config/routes.rb},
55
+ %q{example/rails2/log},
56
+ %q{example/rails2/test/functional/application_controller_test.rb},
57
+ %q{example/rails2/test/test_helper.rb},
58
+ %q{example/rails2/test/unit/rails_util_test.rb},
59
+ %q{example/rails3/Gemfile},
60
+ %q{example/rails3/Rakefile},
61
+ %q{example/rails3/app/controllers/application_controller.rb},
62
+ %q{example/rails3/app/views/application/helper.html.erb},
63
+ %q{example/rails3/config.ru},
64
+ %q{example/rails3/config/application.rb},
65
+ %q{example/rails3/config/environment.rb},
66
+ %q{example/rails3/config/environments/development.rb},
67
+ %q{example/rails3/config/environments/production.rb},
68
+ %q{example/rails3/config/environments/test.rb},
69
+ %q{example/rails3/config/initializers/secret_token.rb},
70
+ %q{example/rails3/config/initializers/session_store.rb},
71
+ %q{example/rails3/config/rest-graph.yaml},
72
+ %q{example/rails3/config/routes.rb},
73
+ %q{example/rails3/test/functional/application_controller_test.rb},
74
+ %q{example/rails3/test/test_helper.rb},
75
+ %q{example/rails3/test/unit/rails_util_test.rb},
76
+ %q{example/sinatra/config.ru},
77
+ %q{init.rb},
78
+ %q{lib/rest-graph.rb},
79
+ %q{lib/rest-graph/config_util.rb},
80
+ %q{lib/rest-graph/core.rb},
81
+ %q{lib/rest-graph/facebook_util.rb},
82
+ %q{lib/rest-graph/rails_util.rb},
83
+ %q{lib/rest-graph/test_util.rb},
84
+ %q{lib/rest-graph/version.rb},
85
+ %q{rest-graph.gemspec},
86
+ %q{task/gemgem.rb},
87
+ %q{test/common.rb},
88
+ %q{test/config/rest-graph.yaml},
89
+ %q{test/test_api.rb},
90
+ %q{test/test_cache.rb},
91
+ %q{test/test_default.rb},
92
+ %q{test/test_error.rb},
93
+ %q{test/test_facebook.rb},
94
+ %q{test/test_handler.rb},
95
+ %q{test/test_load_config.rb},
96
+ %q{test/test_misc.rb},
97
+ %q{test/test_multi.rb},
98
+ %q{test/test_oauth.rb},
99
+ %q{test/test_old.rb},
100
+ %q{test/test_page.rb},
101
+ %q{test/test_parse.rb},
102
+ %q{test/test_rest-graph.rb},
103
+ %q{test/test_serialize.rb},
104
+ %q{test/test_test_util.rb},
105
+ %q{test/test_timeout.rb}]
106
+ s.homepage = %q{https://github.com/godfat/}
107
+ s.rdoc_options = [
108
+ %q{--main},
109
+ %q{README}]
110
+ s.require_paths = [%q{lib}]
111
+ s.rubygems_version = %q{1.8.4}
18
112
  s.summary = %q{A lightweight Facebook Graph API client}
19
- s.test_files = ["test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_facebook.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
113
+ s.test_files = [
114
+ %q{test/test_api.rb},
115
+ %q{test/test_cache.rb},
116
+ %q{test/test_default.rb},
117
+ %q{test/test_error.rb},
118
+ %q{test/test_facebook.rb},
119
+ %q{test/test_handler.rb},
120
+ %q{test/test_load_config.rb},
121
+ %q{test/test_misc.rb},
122
+ %q{test/test_multi.rb},
123
+ %q{test/test_oauth.rb},
124
+ %q{test/test_old.rb},
125
+ %q{test/test_page.rb},
126
+ %q{test/test_parse.rb},
127
+ %q{test/test_rest-graph.rb},
128
+ %q{test/test_serialize.rb},
129
+ %q{test/test_test_util.rb},
130
+ %q{test/test_timeout.rb}]
20
131
 
21
132
  if s.respond_to? :specification_version then
22
133
  s.specification_version = 3