facebooker 1.0.44 → 1.0.48

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.
@@ -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)