facebooker 1.0.44 → 1.0.48

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,6 +38,7 @@ generators/facebook_scaffold/templates/view_new.html.erb
38
38
  generators/facebook_scaffold/templates/view_show.fbml.erb
39
39
  generators/facebook_scaffold/templates/view_show.html.erb
40
40
  generators/publisher/publisher_generator.rb
41
+ generators/xd_receiver/templates/xd_receiver_ssl.html
41
42
  generators/xd_receiver/templates/xd_receiver.html
42
43
  generators/xd_receiver/xd_receiver_generator.rb
43
44
  init.rb
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- ruby -*-
2
- #
2
+ #
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
5
  begin
@@ -8,36 +8,45 @@ rescue LoadError
8
8
  $stderr.puts "Install the multi_rails gem to run tests against multiple versions of Rails"
9
9
  end
10
10
 
11
- $: << File.dirname(__FILE__) + '/lib'
12
- require './lib/facebooker.rb'
11
+ require 'lib/facebooker/version'
12
+
13
+ HOE = Hoe.spec('facebooker') do
14
+ self.version = Facebooker::VERSION::STRING
15
+ self.rubyforge_name = 'facebooker'
16
+ developer 'Chad Fowler', 'chad@chadfowlwer.com'
17
+ developer 'Patrick Ewing', ''
18
+ developer 'Mike Mangino', ''
19
+ developer 'Shane Vitarana', ''
20
+ developer 'Corey Innis', ''
21
+ developer 'Mike Mangino', 'mmangino@elevatedrails.com'
13
22
 
14
- HOE = Hoe.new('facebooker', Facebooker::VERSION::STRING) do |p|
15
- p.rubyforge_name = 'facebooker'
16
- p.author = ['Chad Fowler', 'Patrick Ewing', 'Mike Mangino', 'Shane Vitarana', 'Corey Innis']
17
- p.email = 'mmangino@elevatedrails.com'
18
- p.readme_file = 'README.rdoc'
19
- p.history_file = 'CHANGELOG.rdoc'
20
- p.remote_rdoc_dir = '' # Release to root
21
- p.test_globs = 'test/**/*_test.rb'
22
- p.extra_deps << ['json', '>= 1.0.0']
23
- p.extra_rdoc_files = FileList['*.rdoc']
23
+ self.readme_file = 'README.rdoc'
24
+ self.history_file = 'CHANGELOG.rdoc'
25
+ self.remote_rdoc_dir = '' # Release to root
26
+ self.test_globs = 'test/**/*_test.rb'
27
+ extra_deps << ['json', '>= 1.0.0']
28
+ self.extra_rdoc_files = FileList['*.rdoc']
24
29
  end
25
30
 
26
- require 'rcov/rcovtask'
31
+ begin
32
+ require 'rcov/rcovtask'
27
33
 
28
- namespace :test do
29
- namespace :coverage do
30
- desc "Delete aggregate coverage data."
31
- task(:clean) { rm_f "coverage.data" }
32
- end
33
- desc 'Aggregate code coverage for unit, functional and integration tests'
34
- Rcov::RcovTask.new(:coverage) do |t|
35
- t.libs << "test"
36
- t.test_files = FileList["test/**/*_test.rb"]
37
- t.output_dir = "coverage/"
38
- t.verbose = true
39
- t.rcov_opts = ['--exclude', 'test,/usr/lib/ruby,/Library/Ruby,/System/Library', '--sort', 'coverage']
34
+ namespace :test do
35
+ namespace :coverage do
36
+ desc "Delete aggregate coverage data."
37
+ task(:clean) { rm_f "coverage.data" }
38
+ end
39
+ desc 'Aggregate code coverage for unit, functional and integration tests'
40
+ Rcov::RcovTask.new(:coverage) do |t|
41
+ t.libs << "test"
42
+ t.test_files = FileList["test/**/*_test.rb"]
43
+ t.output_dir = "coverage/"
44
+ t.verbose = true
45
+ t.rcov_opts = ['--exclude', 'test,/usr/lib/ruby,/Library/Ruby,/System/Library', '--sort', 'coverage']
46
+ end
40
47
  end
48
+ rescue LoadError
49
+ $stderr.puts "Install the rcov gem to enable test coverage analysis"
41
50
  end
42
51
 
43
52
  namespace :gem do
@@ -2,20 +2,20 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{facebooker}
5
- s.version = "1.0.44"
5
+ s.version = "1.0.48"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis"]
9
- s.date = %q{2009-07-23}
8
+ s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis", "Mike Mangino"]
9
+ s.date = %q{2009-08-26}
10
10
  s.description = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]. Its goals are:
11
11
 
12
12
  * Idiomatic Ruby
13
13
  * No dependencies outside of the Ruby standard library (This is true with Rails 2.1. Previous Rails versions require the JSON gem)
14
14
  * Concrete classes and methods modeling the Facebook data, so it's easy for a Rubyist to understand what's available
15
15
  * Well tested}
16
- s.email = %q{mmangino@elevatedrails.com}
16
+ s.email = ["chad@chadfowlwer.com", "", "", "", "", "mmangino@elevatedrails.com"]
17
17
  s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "COPYING.rdoc", "README.rdoc", "TODO.rdoc"]
18
- s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/admin.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/service/base_service.rb", "lib/facebooker/service/curl_service.rb", "lib/facebooker/service/net_http_service.rb", "lib/facebooker/service/typhoeus_service.rb", "lib/facebooker/service/typhoeus_multi_service.rb", "lib/facebooker/session.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/tasks/facebooker.rake", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/service_test.rb"]
18
+ s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver_ssl.html", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/admin.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/service/base_service.rb", "lib/facebooker/service/curl_service.rb", "lib/facebooker/service/net_http_service.rb", "lib/facebooker/service/typhoeus_service.rb", "lib/facebooker/service/typhoeus_multi_service.rb", "lib/facebooker/session.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/tasks/facebooker.rake", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/service_test.rb"]
19
19
  s.homepage = %q{http://facebooker.rubyforge.org}
20
20
  s.rdoc_options = ["--main", "README.rdoc"]
21
21
  s.require_paths = ["lib"]
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" >
4
+ <head>
5
+ <title>Cross-Domain Receiver Page</title>
6
+ </head>
7
+ <body>
8
+ <script src="https://www.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script>
9
+ </body>
10
+ </html>
@@ -36,14 +36,13 @@ module Facebooker
36
36
  class << self
37
37
 
38
38
  def load_configuration(facebooker_yaml_file)
39
- if File.exist?(facebooker_yaml_file)
40
- @raw_facebooker_configuration = YAML.load(ERB.new(File.read(facebooker_yaml_file)).result)
41
- if defined? RAILS_ENV
42
- @raw_facebooker_configuration = @raw_facebooker_configuration[RAILS_ENV]
43
- end
44
- Thread.current[:fb_api_config] = @raw_facebooker_configuration unless Thread.current[:fb_api_config]
45
- apply_configuration(@raw_facebooker_configuration)
39
+ return false unless File.exist?(facebooker_yaml_file)
40
+ @raw_facebooker_configuration = YAML.load(ERB.new(File.read(facebooker_yaml_file)).result)
41
+ if defined? RAILS_ENV
42
+ @raw_facebooker_configuration = @raw_facebooker_configuration[RAILS_ENV]
46
43
  end
44
+ Thread.current[:fb_api_config] = @raw_facebooker_configuration unless Thread.current[:fb_api_config]
45
+ apply_configuration(@raw_facebooker_configuration)
47
46
  end
48
47
 
49
48
  # Sets the Facebook environment based on a hash of options.
@@ -61,7 +60,10 @@ module Facebooker
61
60
  ActionController::Base.asset_host = config['callback_url']
62
61
  end
63
62
  Facebooker.timeout = config['timeout']
64
- @facebooker_configuration = config
63
+
64
+ @facebooker_configuration = config # must be set before adapter loaded
65
+ load_adapter(:fb_sig_api_key => config['api_key'])
66
+ facebooker_config
65
67
  end
66
68
 
67
69
  def facebooker_config
@@ -87,12 +89,30 @@ module Facebooker
87
89
  Thread.current[:fb_api_config] = apply_configuration(config)
88
90
  yield
89
91
  ensure
90
- Thread.current[:fb_api_config] = old if old
92
+ Thread.current[:fb_api_config] = old if old && !old.empty?
91
93
  apply_configuration(Thread.current[:fb_api_config])
92
94
  end
93
95
  end
94
96
  end
95
97
 
98
+ def all_api_keys
99
+ [
100
+ @raw_facebooker_configuration['api_key']
101
+ ] + (
102
+ @raw_facebooker_configuration['alternative_keys'] ?
103
+ @raw_facebooker_configuration['alternative_keys'].keys :
104
+ []
105
+ )
106
+ end
107
+
108
+ def with_all_applications(&block)
109
+ all_api_keys.each do |current_api_key|
110
+ with_application(current_api_key) do
111
+ block.call
112
+ end
113
+ end
114
+ end
115
+
96
116
  def fetch_config_for(api_key)
97
117
  if @raw_facebooker_configuration['api_key'] == api_key
98
118
  return @raw_facebooker_configuration
@@ -144,7 +164,7 @@ module Facebooker
144
164
  @timeout
145
165
  end
146
166
 
147
- [:api_key,:secret_key, :www_server_base_url,:login_url_base,:install_url_base,:api_rest_path,:api_server_base,:api_server_base_url,:canvas_server_base, :video_server_base].each do |delegated_method|
167
+ [:api_key,:secret_key, :www_server_base_url,:login_url_base,:install_url_base,:permission_url_base,:api_rest_path,:api_server_base,:api_server_base_url,:canvas_server_base, :video_server_base].each do |delegated_method|
148
168
  define_method(delegated_method){ return current_adapter.send(delegated_method)}
149
169
  end
150
170
 
@@ -12,7 +12,7 @@ module Facebooker
12
12
  @facebook_path_prefix = prefix
13
13
  end
14
14
 
15
- def facebooker_config
15
+ def facebooker_config
16
16
  @config
17
17
  end
18
18
 
@@ -44,6 +44,10 @@ module Facebooker
44
44
  def install_url_base
45
45
  "http://#{www_server_base_url}/install.php?api_key=#{api_key}&v=1.0"
46
46
  end
47
+
48
+ def permission_url_base
49
+ "http://#{www_server_base_url}/connect/prompt_permissions.php?api_key=#{api_key}&v=1.0"
50
+ end
47
51
 
48
52
  end
49
53
 
@@ -1,6 +1,6 @@
1
1
  module Facebooker
2
2
  class BatchRequest
3
- instance_methods.each { |m| undef_method m unless m =~ /(^__|^nil\?$|^send$|proxy_|^respond_to\?$|^new$)/ }
3
+ instance_methods.each { |m| undef_method m unless m =~ /(^__|^nil\?$|^send$|proxy_|^respond_to\?$|^new|object_id$)/ }
4
4
  attr_reader :uri
5
5
  attr_reader :method
6
6
  class UnexecutedRequest < StandardError; end
@@ -26,7 +26,7 @@ module Facebooker
26
26
  end
27
27
 
28
28
  include Model
29
- attr_accessor :page_id, :name, :pic_small, :pic_big, :pic_square, :pic_large, :type, :type, :website, :location, :hours, :band_members, :bio, :hometown, :record_label, :influences, :has_added_app, :founded, :company_overview, :mission, :products, :release_date, :starring, :written_by, :directed_by, :produced_by, :studio, :awards, :plot_outline, :network, :season, :schedule
29
+ attr_accessor :page_id, :name, :pic_small, :pic_big, :pic_square, :pic_large, :page_url, :type, :website, :location, :hours, :band_members, :bio, :hometown, :record_label, :influences, :has_added_app, :founded, :company_overview, :mission, :products, :release_date, :starring, :written_by, :directed_by, :produced_by, :studio, :awards, :plot_outline, :network, :season, :schedule
30
30
  attr_reader :genre
31
31
 
32
32
  def genre=(value)
@@ -11,7 +11,7 @@ module Facebooker
11
11
  attr_accessor :message, :time, :status_id
12
12
  end
13
13
  FIELDS = [:status, :political, :pic_small, :name, :quotes, :is_app_user, :tv, :profile_update_time, :meeting_sex, :hs_info, :timezone, :relationship_status, :hometown_location, :about_me, :wall_count, :significant_other_id, :pic_big, :music, :work_history, :sex, :religion, :notes_count, :activities, :pic_square, :movies, :has_added_app, :education_history, :birthday, :birthday_date, :first_name, :meeting_for, :last_name, :interests, :current_location, :pic, :books, :affiliations, :locale, :profile_url, :proxied_email, :email_hashes, :allowed_restrictions, :pic_with_logo, :pic_big_with_logo, :pic_small_with_logo, :pic_square_with_logo]
14
- STANDARD_FIELDS = [:uid, :first_name, :last_name, :name, :timezone, :birthday, :sex, :affiliations, :locale, :profile_url, :pic_square]
14
+ STANDARD_FIELDS = [:uid, :first_name, :last_name, :name, :timezone, :birthday, :sex, :affiliations, :locale, :profile_url, :proxied_email]
15
15
  populating_attr_accessor(*FIELDS)
16
16
  attr_reader :affiliations
17
17
  populating_hash_settable_accessor :current_location, Location
@@ -63,7 +63,17 @@ module Facebooker
63
63
  @events[params.to_s] ||= @session.post('facebook.events.get', {:uid => self.id}.merge(params)).map do |event|
64
64
  Event.from_hash(event)
65
65
  end
66
- end
66
+ end
67
+
68
+ # Rsvp to an event with the eid and rsvp_status which can be 'attending', 'unsure', or 'declined'.
69
+ # http://wiki.developers.facebook.com/index.php/Events.rsvp
70
+ # E.g:
71
+ # @user.rsvp_event('100321123', 'attending')
72
+ # # => Returns true if all went well
73
+ def rsvp_event(eid, rsvp_status, options = {})
74
+ result = @session.post('facebook.events.rsvp', options.merge(:eid => eid, :rsvp_status => rsvp_status))
75
+ result == '1' ? true : false
76
+ end
67
77
 
68
78
  #
69
79
  # Set the list of friends, given an array of User objects. If the list has been retrieved previously, will not set
@@ -104,6 +114,11 @@ module Facebooker
104
114
  @friends_hash[cache_key]
105
115
  end
106
116
 
117
+ def friend_ids
118
+ options = {:uid => self.id}
119
+ @session.post('facebook.friends.get', options, false)
120
+ end
121
+
107
122
  ###
108
123
  # Publish a post into the stream on the user's Wall and News Feed. This
109
124
  # post also appears in the user's friend's streams. The +publish_stream+
@@ -123,12 +138,16 @@ module Facebooker
123
138
  # :href => 'http://tenderlovemaking.com/'
124
139
  # ])
125
140
  def publish_to target, options = {}
141
+
142
+ attachment = options[:attachment]
143
+ links = options[:action_links]
126
144
  @session.post('facebook.stream.publish',
127
- :uid => self.id,
128
- :target_id => target.id,
129
- :message => options[:message],
130
- :attachment => Facebooker.json_encode(options[:attachment]),
131
- :action_links => Facebooker.json_encode(options[:action_links])
145
+ { :uid => self.id,
146
+ :target_id => target.id,
147
+ :message => options[:message],
148
+ :attachment => attachment && Facebooker.json_encode(attachment),
149
+ :action_links => links && Facebooker.json_encode(links) },
150
+ false
132
151
  )
133
152
  end
134
153
 
@@ -176,10 +195,14 @@ module Facebooker
176
195
  end
177
196
 
178
197
  def friends_with_this_app
179
- @friends_with_this_app ||= session.post('facebook.friends.getAppUsers').map do |uid|
198
+ @friends_with_this_app ||= friend_ids_with_this_app.map do |uid|
180
199
  User.new(uid, session)
181
200
  end
182
201
  end
202
+
203
+ def friend_ids_with_this_app
204
+ @friend_ids_with_this_app ||= session.post('facebook.friends.getAppUsers')
205
+ end
183
206
 
184
207
  def groups(gids = [])
185
208
  args = gids.empty? ? {} : {:gids => gids}
@@ -361,7 +384,7 @@ module Facebooker
361
384
  ##
362
385
  # Checks to see if the user has enabled the given extended permission
363
386
  def has_permission?(ext_perm) # ext_perm = email, offline_access, status_update, photo_upload, create_listing, create_event, rsvp_event, sms
364
- session.post('facebook.users.hasAppPermission',:ext_perm=>ext_perm) == "1"
387
+ session.post('facebook.users.hasAppPermission', {:ext_perm=>ext_perm, :uid => uid}, false) == "1"
365
388
  end
366
389
 
367
390
  ##
@@ -58,14 +58,14 @@ module Facebooker
58
58
  def self.element(name, data)
59
59
  data = data.body rescue data # either data or an HTTP response
60
60
  begin
61
- xml = Nokogiri::XML(data.strip).at(name)
61
+ xml = Nokogiri::XML(data.strip)
62
62
  if node = xml.at(name)
63
63
  return node
64
64
  end
65
65
  if xml.root.name == name
66
66
  return xml.root
67
67
  end
68
- rescue # Can't parse with Nokogiri
68
+ rescue NameError # Can't parse with Nokogiri
69
69
  doc = REXML::Document.new(data)
70
70
  doc.elements.each(name) do |element|
71
71
  return element
@@ -413,18 +413,19 @@ module Facebooker
413
413
  class FqlMultiquery < Parser#nodoc
414
414
  def self.process(data)
415
415
  root = element('fql_multiquery_response', data)
416
- root.elements.collect do |elm|
417
- [
418
- elm.elements[1].text,
419
- if elm.elements[2].elements[1].nil?
420
- []
416
+ root.children.reject { |child| child.text? }.map do |elm|
417
+ elm.children.reject { |child| child.text? }.map do |query|
418
+ if 'name' == query.name
419
+ query.text
421
420
  else
422
- [
423
- elm.elements[2].elements[1].name,
424
- array_of_hashes(elm.elements[2], elm.elements[2].elements[1].name)
425
- ]
421
+ list = query.children.reject { |child| child.text? }
422
+ if list.length == 0
423
+ []
424
+ else
425
+ [list.first.name, array_of_hashes(query, list.first.name)]
426
+ end
426
427
  end
427
- ]
428
+ end
428
429
  end
429
430
  end
430
431
  end
@@ -16,7 +16,7 @@ module Facebooker::Rails::BackwardsCompatibleParamChecks
16
16
  def zero_or_false( value )
17
17
  case value
18
18
  when String then
19
- value == "0"
19
+ value.empty? || value == "0"
20
20
  when Numeric then
21
21
  value.to_f == 0.0
22
22
  when FalseClass then
@@ -7,7 +7,6 @@ module Facebooker
7
7
  include Facebooker::Rails::ProfilePublisherExtensions
8
8
  def self.included(controller)
9
9
  controller.extend(ClassMethods)
10
- controller.before_filter :set_adapter
11
10
  controller.before_filter :set_facebook_request_format
12
11
  controller.helper_attr :facebook_session_parameters
13
12
  controller.helper_method :request_comes_from_facebook?
@@ -206,10 +205,6 @@ module Facebooker
206
205
  end
207
206
  end
208
207
  end
209
-
210
- def blank?(value)
211
- (value == '0' || value.nil? || value == '')
212
- end
213
208
 
214
209
  def verified_facebook_params
215
210
  facebook_sig_params = params.inject({}) do |collection, pair|
@@ -230,12 +225,11 @@ module Facebooker
230
225
 
231
226
  def verify_signature(facebook_sig_params,expected_signature)
232
227
  # Don't verify the signature if rack has already done so.
233
- if ::Rails.version >= "2.3"
234
- return if ActionController::Dispatcher.middleware.include? Rack::Facebook
228
+ unless ::Rails.version >= "2.3" and ActionController::Dispatcher.middleware.include? Rack::Facebook
229
+ raw_string = facebook_sig_params.map{ |*args| args.join('=') }.sort.join
230
+ actual_sig = Digest::MD5.hexdigest([raw_string, Facebooker::Session.secret_key].join)
231
+ raise Facebooker::Session::IncorrectSignature if actual_sig != expected_signature
235
232
  end
236
- raw_string = facebook_sig_params.map{ |*args| args.join('=') }.sort.join
237
- actual_sig = Digest::MD5.hexdigest([raw_string, Facebooker::Session.secret_key].join)
238
- raise Facebooker::Session::IncorrectSignature if actual_sig != expected_signature
239
233
  raise Facebooker::Session::SignatureTooOld if facebook_sig_params['time'] && Time.at(facebook_sig_params['time'].to_f) < earliest_valid_session
240
234
  true
241
235
  end
@@ -244,11 +238,11 @@ module Facebooker
244
238
  @facebook_parameter_conversions ||= Hash.new do |hash, key|
245
239
  lambda{|value| value}
246
240
  end.merge(
247
- 'time' => lambda{|value| Time.at(value.to_f)},
248
- 'in_canvas' => lambda{|value| !blank?(value)},
249
- 'added' => lambda{|value| !blank?(value)},
250
- 'expires' => lambda{|value| blank?(value) ? nil : Time.at(value.to_f)},
251
- 'friends' => lambda{|value| value.split(/,/)}
241
+ 'time' => lambda{|value| Time.at(value.to_f)},
242
+ 'in_canvas' => lambda{|value| one_or_true(value)},
243
+ 'added' => lambda{|value| one_or_true(value)},
244
+ 'expires' => lambda{|value| zero_or_false(value) ? nil : Time.at(value.to_f)},
245
+ 'friends' => lambda{|value| value.split(/,/)}
252
246
  )
253
247
  end
254
248
 
@@ -333,10 +327,6 @@ module Facebooker
333
327
  end
334
328
  end
335
329
 
336
- def set_adapter
337
- Facebooker.load_adapter(params) if(params[:fb_sig_api_key])
338
- end
339
-
340
330
 
341
331
  module ClassMethods
342
332
  #
@@ -187,10 +187,10 @@ module Facebooker
187
187
  # <fb:editor-button label="Save Poke"
188
188
  # </fb:editor-buttonset>
189
189
  # </fb:editor>
190
- def facebook_form_for( record_or_name_or_array,*args, &proc)
190
+ def facebook_form_for( record_or_name_or_array,*args, &proc)
191
191
 
192
- raise ArgumentError, "Missing block" unless block_given?
193
- options = args.last.is_a?(Hash) ? args.pop : {}
192
+ raise ArgumentError, "Missing block" unless block_given?
193
+ options = args.last.is_a?(Hash) ? args.pop : {}
194
194
 
195
195
  case record_or_name_or_array
196
196
  when String, Symbol
@@ -230,8 +230,18 @@ module Facebooker
230
230
  fields_for( object_name,*(args << options), &proc)
231
231
  concat("</fb:editor>",proc.binding)
232
232
  end
233
- end
233
+ end
234
234
 
235
+ # Render an fb:application-name tag
236
+ #
237
+ # This renders the current application name via fbml. See
238
+ # http://wiki.developers.facebook.com/index.php/Fb:application-name
239
+ # for a full description.
240
+ #
241
+ def fb_application_name(options={})
242
+ tag "fb:application-name", stringify_vals(options)
243
+ end
244
+
235
245
  # Render an fb:name tag for the given user
236
246
  # This renders the name of the user specified. You can use this tag as both subject and object of
237
247
  # a sentence. <em> See </em> http://wiki.developers.facebook.com/index.php/Fb:name for full description.
@@ -441,10 +451,10 @@ module Facebooker
441
451
  def facebook_messages
442
452
  message=""
443
453
  unless flash[:notice].blank?
444
- message += fb_success(flash[:notice])
454
+ message += fb_success(*flash[:notice])
445
455
  end
446
456
  unless flash[:error].blank?
447
- message += fb_error(flash[:error])
457
+ message += fb_error(*flash[:error])
448
458
  end
449
459
  message
450
460
  end
@@ -729,6 +739,57 @@ module Facebooker
729
739
  tag "fb:time",stringify_vals({:t => time.to_i}.merge(options))
730
740
  end
731
741
 
742
+ # Renders a fb:intl element
743
+ #
744
+ # Example:
745
+ # <%= fb_intl('Age', :desc => 'Label for the age form field', :delimiters => '[]') %>
746
+ #
747
+ # See http://wiki.developers.facebook.com/index.php/Fb:intl for
748
+ # more details
749
+ def fb_intl(text=nil, options={}, &proc)
750
+ raise ArgumentError, "Missing block or text" unless block_given? or text
751
+ content = block_given? ? capture(&proc) : text
752
+ content_tag("fb:intl", content, stringify_vals(options))
753
+ end
754
+
755
+ # Renders a fb:intl-token element
756
+ #
757
+ # Example:
758
+ # <%= fb_intl-token('number', 5) %>
759
+ #
760
+ # See http://wiki.developers.facebook.com/index.php/Fb:intl-token for
761
+ # more details
762
+ def fb_intl_token(name, text=nil, &proc)
763
+ raise ArgumentError, "Missing block or text" unless block_given? or text
764
+ content = block_given? ? capture(&proc) : text
765
+ content_tag("fb:intl-token", content, stringify_vals({:name => name}))
766
+ end
767
+
768
+ # Renders a fb:date element
769
+ #
770
+ # Example:
771
+ # <%= fb_date(Time.now, :format => 'verbose', :tz => 'America/New York') %>
772
+ #
773
+ # See http://wiki.developers.facebook.com/index.php/Fb:date for
774
+ # more details
775
+ def fb_date(time, options={})
776
+ tag "fb:date", stringify_vals({:t => time.to_i}.merge(options))
777
+ end
778
+
779
+ # Renders a fb:fbml-attribute element
780
+ #
781
+ # Example:
782
+ # <%= fb_fbml_attribute('title', Education) %>
783
+ #
784
+ # The options hash is passed to the fb:intl element that is generated inside this element
785
+ # and can have the keys available for the fb:intl element.
786
+ #
787
+ # See http://wiki.developers.facebook.com/index.php/Fb:fbml-attribute for
788
+ # more details
789
+ def fb_fbml_attribute(name, text, options={})
790
+ content_tag("fb:fbml-attribute", fb_intl(text, options), stringify_vals({:name => name}))
791
+ end
792
+
732
793
  protected
733
794
 
734
795
  def cast_to_facebook_id(object)