simianarmy-facebooker 1.0.40 → 1.0.50

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.
Files changed (42) hide show
  1. data/Manifest.txt +7 -0
  2. data/Rakefile +35 -26
  3. data/facebooker.gemspec +20 -16
  4. data/generators/xd_receiver/templates/xd_receiver_ssl.html +10 -0
  5. data/lib/facebooker/adapters/adapter_base.rb +1 -1
  6. data/lib/facebooker/adapters/facebook_adapter.rb +8 -0
  7. data/lib/facebooker/batch_request.rb +1 -1
  8. data/lib/facebooker/models/group.rb +1 -1
  9. data/lib/facebooker/models/page.rb +17 -1
  10. data/lib/facebooker/models/user.rb +76 -6
  11. data/lib/facebooker/parser.rb +42 -21
  12. data/lib/facebooker/rails/backwards_compatible_param_checks.rb +1 -1
  13. data/lib/facebooker/rails/controller.rb +14 -20
  14. data/lib/facebooker/rails/cucumber/world.rb +25 -31
  15. data/lib/facebooker/rails/helpers/fb_connect.rb +9 -6
  16. data/lib/facebooker/rails/helpers.rb +67 -6
  17. data/lib/facebooker/rails/integration_session.rb +1 -1
  18. data/lib/facebooker/rails/publisher.rb +54 -9
  19. data/lib/facebooker/service/base_service.rb +19 -0
  20. data/lib/facebooker/service/curl_service.rb +44 -0
  21. data/lib/facebooker/service/net_http_service.rb +12 -0
  22. data/lib/facebooker/service/typhoeus_multi_service.rb +27 -0
  23. data/lib/facebooker/service/typhoeus_service.rb +17 -0
  24. data/lib/facebooker/service.rb +62 -62
  25. data/lib/facebooker/session.rb +70 -13
  26. data/lib/facebooker/version.rb +1 -1
  27. data/lib/facebooker.rb +81 -9
  28. data/lib/rack/facebook.rb +22 -15
  29. data/lib/tasks/tunnel.rake +1 -1
  30. data/test/facebooker/adapters_test.rb +17 -0
  31. data/test/facebooker/models/page_test.rb +46 -0
  32. data/test/facebooker/models/user_test.rb +28 -0
  33. data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -2
  34. data/test/facebooker/rails/integration_session_test.rb +13 -0
  35. data/test/facebooker/rails/publisher_test.rb +50 -12
  36. data/test/facebooker/rails_integration_test.rb +110 -50
  37. data/test/facebooker/service_test.rb +58 -0
  38. data/test/facebooker/session_test.rb +78 -24
  39. data/test/rack/facebook_test.rb +21 -9
  40. data/test/rails_test_helper.rb +8 -0
  41. data/test/test_helper.rb +2 -2
  42. metadata +31 -11
data/Manifest.txt CHANGED
@@ -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
@@ -99,6 +100,11 @@ lib/facebooker/rails/test_helpers.rb
99
100
  lib/facebooker/rails/utilities.rb
100
101
  lib/facebooker/server_cache.rb
101
102
  lib/facebooker/service.rb
103
+ lib/facebooker/service/base_service.rb
104
+ lib/facebooker/service/curl_service.rb
105
+ lib/facebooker/service/net_http_service.rb
106
+ lib/facebooker/service/typhoeus_service.rb
107
+ lib/facebooker/service/typhoeus_multi_service.rb
102
108
  lib/facebooker/session.rb
103
109
  lib/facebooker/version.rb
104
110
  lib/net/http_multipart_post.rb
@@ -116,6 +122,7 @@ test/facebooker/logging_test.rb
116
122
  test/facebooker/mobile_test.rb
117
123
  test/facebooker/model_test.rb
118
124
  test/facebooker/models/event_test.rb
125
+ test/facebooker/models/page_test.rb
119
126
  test/facebooker/models/photo_test.rb
120
127
  test/facebooker/models/user_test.rb
121
128
  test/facebooker/rails/publisher_test.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
data/facebooker.gemspec CHANGED
@@ -2,37 +2,41 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{facebooker}
5
- s.version = "1.0.40"
5
+ s.version = "1.0.50"
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-01}
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: * Idiomatic Ruby * No dependencies outside of the Ruby standard library (This is true with Rails 2.1. Previous Rails versions require the JSON gem) * Concrete classes and methods modeling the Facebook data, so it's easy for a Rubyist to understand what's available * Well tested}
11
- s.email = %q{mmangino@elevatedrails.com}
8
+ s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis", "Mike Mangino"]
9
+ s.date = %q{2009-09-08}
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
+
12
+ * Idiomatic Ruby
13
+ * No dependencies outside of the Ruby standard library (This is true with Rails 2.1. Previous Rails versions require the JSON gem)
14
+ * Concrete classes and methods modeling the Facebook data, so it's easy for a Rubyist to understand what's available
15
+ * Well tested}
16
+ s.email = ["chad@chadfowlwer.com", "", "", "", "", "mmangino@elevatedrails.com"]
12
17
  s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "COPYING.rdoc", "README.rdoc", "TODO.rdoc"]
13
- 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/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/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"]
14
- s.has_rdoc = true
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"]
15
19
  s.homepage = %q{http://facebooker.rubyforge.org}
16
20
  s.rdoc_options = ["--main", "README.rdoc"]
17
21
  s.require_paths = ["lib"]
18
22
  s.rubyforge_project = %q{facebooker}
19
- s.rubygems_version = %q{1.3.1}
23
+ s.rubygems_version = %q{1.3.4}
20
24
  s.summary = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]}
21
- s.test_files = ["test/facebooker_test.rb", "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/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/publisher_test.rb", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
25
+ s.test_files = ["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/facebook_request_fix_2-3_test.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/service_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
22
26
 
23
27
  if s.respond_to? :specification_version then
24
28
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
- s.specification_version = 2
29
+ s.specification_version = 3
26
30
 
27
31
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
- # s.add_runtime_dependency(%q<json>, [">= 1.0.0"])
29
- s.add_development_dependency(%q<hoe>, [">= 1.11.0"])
32
+ #s.add_runtime_dependency(%q<json>, [">= 1.0.0"])
33
+ s.add_development_dependency(%q<hoe>, [">= 2.3.2"])
30
34
  else
31
- # s.add_dependency(%q<json>, [">= 1.0.0"])
32
- s.add_dependency(%q<hoe>, [">= 1.11.0"])
35
+ #s.add_dependency(%q<json>, [">= 1.0.0"])
36
+ s.add_dependency(%q<hoe>, [">= 2.3.2"])
33
37
  end
34
38
  else
35
- # s.add_dependency(%q<json>, [">= 1.0.0"])
36
- s.add_dependency(%q<hoe>, [">= 1.11.0"])
39
+ #s.add_dependency(%q<json>, [">= 1.0.0"])
40
+ s.add_dependency(%q<hoe>, [">= 2.3.2"])
37
41
  end
38
42
  end
@@ -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>
@@ -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,14 @@ 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 connect_permission_url_base
49
+ "http://#{www_server_base_url}/connect/prompt_permissions.php?api_key=#{api_key}&v=1.0"
50
+ end
51
+
52
+ def permission_url_base
53
+ "http://#{www_server_base_url}/authorize.php?api_key=#{api_key}&v=1.0"
54
+ end
47
55
 
48
56
  end
49
57
 
@@ -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
@@ -8,7 +8,7 @@ module Facebooker
8
8
  attr_accessor :position, :gid, :uid
9
9
  end
10
10
  include Model
11
- attr_accessor :pic, :pic_small, :pic_big, :name, :creator, :recent_news, :update_time, :group_subtype, :group_type, :website, :office, :description, :venue, :nid
11
+ attr_accessor :pic, :pic_small, :pic_big, :name, :creator, :recent_news, :update_time, :group_subtype, :group_type, :website, :office, :description, :venue, :nid, :privacy
12
12
 
13
13
  id_is :gid
14
14
 
@@ -1,6 +1,14 @@
1
1
  require 'facebooker/model'
2
2
  module Facebooker
3
3
  class Page
4
+
5
+ def initialize(*args)
6
+ if args.size == 1 and (args.first.is_a?(Integer) or args.first.is_a?(String))
7
+ self.page_id=args.first
8
+ else
9
+ super
10
+ end
11
+ end
4
12
 
5
13
  class Genre
6
14
  include Model
@@ -18,11 +26,19 @@ module Facebooker
18
26
  end
19
27
 
20
28
  include Model
21
- 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
22
30
  attr_reader :genre
23
31
 
24
32
  def genre=(value)
25
33
  @genre = value.kind_of?(Hash) ? Genre.from_hash(value) : value
26
34
  end
35
+
36
+ def user_is_admin?(user)
37
+ Session.current.post('facebook.pages.isAdmin', :page_id=>self.page_id, :uid=>Facebooker::User.cast_to_facebook_id(user))
38
+ end
39
+
40
+ def user_is_fan?(user)
41
+ Session.current.post('facebook.pages.isFan', :page_id=>self.page_id, :uid=>Facebooker::User.cast_to_facebook_id(user))
42
+ end
27
43
  end
28
44
  end
@@ -10,8 +10,10 @@ module Facebooker
10
10
  include Model
11
11
  attr_accessor :message, :time, :status_id
12
12
  end
13
- FIELDS = [: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, :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]
13
+
14
+ 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]
15
+ STANDARD_FIELDS = [:uid, :first_name, :last_name, :name, :timezone, :birthday, :sex, :affiliations, :locale, :profile_url, :proxied_email]
16
+
15
17
  populating_attr_accessor(*FIELDS)
16
18
  attr_reader :affiliations
17
19
  populating_hash_settable_accessor :current_location, Location
@@ -63,7 +65,17 @@ module Facebooker
63
65
  @events[params.to_s] ||= @session.post('facebook.events.get', {:uid => self.id}.merge(params)).map do |event|
64
66
  Event.from_hash(event)
65
67
  end
66
- end
68
+ end
69
+
70
+ # Rsvp to an event with the eid and rsvp_status which can be 'attending', 'unsure', or 'declined'.
71
+ # http://wiki.developers.facebook.com/index.php/Events.rsvp
72
+ # E.g:
73
+ # @user.rsvp_event('100321123', 'attending')
74
+ # # => Returns true if all went well
75
+ def rsvp_event(eid, rsvp_status, options = {})
76
+ result = @session.post('facebook.events.rsvp', options.merge(:eid => eid, :rsvp_status => rsvp_status))
77
+ result == '1' ? true : false
78
+ end
67
79
 
68
80
  #
69
81
  # Set the list of friends, given an array of User objects. If the list has been retrieved previously, will not set
@@ -103,8 +115,62 @@ module Facebooker
103
115
  end
104
116
  @friends_hash[cache_key]
105
117
  end
118
+
119
+ def friend_ids
120
+ options = {:uid => self.id}
121
+ @session.post('facebook.friends.get', options, false)
122
+ end
123
+
124
+ ###
125
+ # Publish a post into the stream on the user's Wall and News Feed. This
126
+ # post also appears in the user's friend's streams. The +publish_stream+
127
+ # extended permission must be granted in order to use this method.
128
+ #
129
+ # See: http://wiki.developers.facebook.com/index.php/Stream.publish
130
+ #
131
+ # +target+ can be the current user or some other user.
132
+ #
133
+ # Example:
134
+ # # Publish a message to my own wall:
135
+ # me.publish_to(me, :message => 'hello world')
136
+ #
137
+ # # Publish to a friend's wall with an action link:
138
+ # me.publish_to(my_friend, :message => 'how are you?', :action_links => [
139
+ # :text => 'my website',
140
+ # :href => 'http://tenderlovemaking.com/'
141
+ # ])
142
+ def publish_to(target, options = {})
143
+ @session.post('facebook.stream.publish', prepare_publish_to_options(target, options), false)
144
+ end
145
+
146
+ # Prepares options for the stream.publish
147
+ def prepare_publish_to_options(target, options)
148
+ opts = {:uid => self.id,
149
+ :target_id => target.id,
150
+ :message => options[:message]}
151
+
152
+ if(attachment = options[:attachment] && Facebooker.json_encode(options[:attachment]))
153
+ opts[:attachment] = attachment
154
+ end
155
+ if (links = options[:action_links] && Facebooker.json_encode(options[:action_links]))
156
+ opts[:action_links] = links
157
+ end
158
+ opts
159
+ end
106
160
 
107
- def friend_lists
161
+ ###
162
+ # Publish a comment on a post
163
+ #
164
+ # See: http://wiki.developers.facebook.com/index.php/Stream.addComment
165
+ #
166
+ # +post_id+ the post_id for the post that is being commented on
167
+ # +comment+ the text of the comment
168
+ def comment_on(post_id, comment)
169
+ @session.post('facebook.stream.addComment', {:post_id=>post_id, :comment=>comment})
170
+ end
171
+
172
+
173
+ def friend_lists
108
174
  @friend_lists ||= @session.post('facebook.friends.getLists').map do |hash|
109
175
  friend_list = FriendList.from_hash(hash)
110
176
  friend_list.session = session
@@ -135,10 +201,14 @@ module Facebooker
135
201
  end
136
202
 
137
203
  def friends_with_this_app
138
- @friends_with_this_app ||= session.post('facebook.friends.getAppUsers').map do |uid|
204
+ @friends_with_this_app ||= friend_ids_with_this_app.map do |uid|
139
205
  User.new(uid, session)
140
206
  end
141
207
  end
208
+
209
+ def friend_ids_with_this_app
210
+ @friend_ids_with_this_app ||= session.post('facebook.friends.getAppUsers')
211
+ end
142
212
 
143
213
  def groups(gids = [])
144
214
  args = gids.empty? ? {} : {:gids => gids}
@@ -320,7 +390,7 @@ module Facebooker
320
390
  ##
321
391
  # Checks to see if the user has enabled the given extended permission
322
392
  def has_permission?(ext_perm) # ext_perm = email, offline_access, status_update, photo_upload, create_listing, create_event, rsvp_event, sms
323
- session.post('facebook.users.hasAppPermission',:ext_perm=>ext_perm) == "1"
393
+ session.post('facebook.users.hasAppPermission', {:ext_perm=>ext_perm, :uid => uid}, false) == "1"
324
394
  end
325
395
 
326
396
  ##
@@ -41,9 +41,20 @@ module Facebooker
41
41
 
42
42
  def self.element(name, data)
43
43
  data = data.body rescue data # either data or an HTTP response
44
- doc = REXML::Document.new(data)
45
- doc.elements.each(name) do |element|
46
- return element
44
+
45
+ begin
46
+ xml = Nokogiri::XML(data.strip)
47
+ if node = xml.at(name)
48
+ return node
49
+ end
50
+ if xml.root.name == name
51
+ return xml.root
52
+ end
53
+ rescue NameError # Can't parse with Nokogiri
54
+ doc = REXML::Document.new(data)
55
+ doc.elements.each(name) do |element|
56
+ return element
57
+ end
47
58
  end
48
59
  raise "Element #{name} not found in #{data}"
49
60
  end
@@ -377,24 +388,26 @@ module Facebooker
377
388
  end
378
389
 
379
390
  class FqlMultiquery < Parser#nodoc
380
- def self.process(data)
381
- root = element('fql_multiquery_response', data)
382
- root.elements.collect do |elm|
383
- [
384
- elm.elements[1].text,
385
- if elm.elements[2].elements[1].nil?
386
- []
387
- else
388
- [
389
- elm.elements[2].elements[1].name,
390
- array_of_hashes(elm.elements[2], elm.elements[2].elements[1].name)
391
- ]
392
- end
393
- ]
394
- end
395
- end
396
- end
397
-
391
+ def self.process(data)
392
+ root = element('fql_multiquery_response', data)
393
+ root.children.reject { |child| child.text? }.map do |elm|
394
+ elm.children.reject { |child| child.text? }.map do |query|
395
+ if 'name' == query.name
396
+ query.text
397
+ else
398
+ list = query.children.reject { |child| child.text? }
399
+ if list.length == 0
400
+ []
401
+ else
402
+ [list.first.name, array_of_hashes(query, list.first.name)]
403
+ end
404
+ end
405
+ end
406
+ end
407
+ end
408
+ end
409
+
410
+
398
411
  class SetRefHandle < Parser#:nodoc:
399
412
  def self.process(data)
400
413
  element('fbml_setRefHandle_response', data).text_value
@@ -425,6 +438,12 @@ module Facebooker
425
438
  end
426
439
  end
427
440
 
441
+ class EventsRsvp < Parser#:nodoc:
442
+ def self.process(data)
443
+ element('events_rsvp_response', data).content.strip
444
+ end
445
+ end
446
+
428
447
  class EventsGet < Parser#:nodoc:
429
448
  def self.process(data)
430
449
  array_of_hashes(element('events_get_response', data), 'event')
@@ -541,6 +560,7 @@ module Facebooker
541
560
  103 => Facebooker::Session::CallOutOfOrder,
542
561
  104 => Facebooker::Session::IncorrectSignature,
543
562
  120 => Facebooker::Session::InvalidAlbumId,
563
+ 200 => Facebooker::Session::PermissionError,
544
564
  250 => Facebooker::Session::ExtendedPermissionRequired,
545
565
  321 => Facebooker::Session::AlbumIsFull,
546
566
  324 => Facebooker::Session::MissingOrInvalidImageFile,
@@ -634,6 +654,7 @@ module Facebooker
634
654
  'facebook.photos.addTag' => AddTags,
635
655
  'facebook.photos.upload' => UploadPhoto,
636
656
  'facebook.events.get' => EventsGet,
657
+ 'facebook.events.rsvp' => EventsRsvp,
637
658
  'facebook.groups.get' => GroupsGet,
638
659
  'facebook.events.getMembers' => EventMembersGet,
639
660
  'facebook.groups.getMembers' => GroupGetMembers,
@@ -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?
@@ -180,7 +179,11 @@ module Facebooker
180
179
  end
181
180
 
182
181
  def default_after_facebook_login_url
183
- url_for(:only_path => false, :overwrite_params => {})
182
+ omit_keys = ["_method", "format"]
183
+ options = (params||{}).clone
184
+ options = options.reject{|k,v| k.to_s.match(/^fb_sig/) or omit_keys.include?(k.to_s)}
185
+ options = options.merge({:only_path => false})
186
+ url_for(options)
184
187
  end
185
188
 
186
189
  def create_new_facebook_session_and_redirect!
@@ -202,10 +205,6 @@ module Facebooker
202
205
  end
203
206
  end
204
207
  end
205
-
206
- def blank?(value)
207
- (value == '0' || value.nil? || value == '')
208
- end
209
208
 
210
209
  def verified_facebook_params
211
210
  facebook_sig_params = params.inject({}) do |collection, pair|
@@ -226,12 +225,11 @@ module Facebooker
226
225
 
227
226
  def verify_signature(facebook_sig_params,expected_signature)
228
227
  # Don't verify the signature if rack has already done so.
229
- if ::Rails.version >= "2.3"
230
- 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
231
232
  end
232
- raw_string = facebook_sig_params.map{ |*args| args.join('=') }.sort.join
233
- actual_sig = Digest::MD5.hexdigest([raw_string, Facebooker::Session.secret_key].join)
234
- raise Facebooker::Session::IncorrectSignature if actual_sig != expected_signature
235
233
  raise Facebooker::Session::SignatureTooOld if facebook_sig_params['time'] && Time.at(facebook_sig_params['time'].to_f) < earliest_valid_session
236
234
  true
237
235
  end
@@ -240,11 +238,11 @@ module Facebooker
240
238
  @facebook_parameter_conversions ||= Hash.new do |hash, key|
241
239
  lambda{|value| value}
242
240
  end.merge(
243
- 'time' => lambda{|value| Time.at(value.to_f)},
244
- 'in_canvas' => lambda{|value| !blank?(value)},
245
- 'added' => lambda{|value| !blank?(value)},
246
- 'expires' => lambda{|value| blank?(value) ? nil : Time.at(value.to_f)},
247
- '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(/,/)}
248
246
  )
249
247
  end
250
248
 
@@ -329,10 +327,6 @@ module Facebooker
329
327
  end
330
328
  end
331
329
 
332
- def set_adapter
333
- Facebooker.load_adapter(params) if(params[:fb_sig_api_key])
334
- end
335
-
336
330
 
337
331
  module ClassMethods
338
332
  #