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.
- data/Manifest.txt +1 -0
- data/Rakefile +35 -26
- data/facebooker.gemspec +5 -5
- data/generators/xd_receiver/templates/xd_receiver_ssl.html +10 -0
- data/lib/facebooker.rb +30 -10
- data/lib/facebooker/adapters/adapter_base.rb +1 -1
- data/lib/facebooker/adapters/facebook_adapter.rb +4 -0
- data/lib/facebooker/batch_request.rb +1 -1
- data/lib/facebooker/models/page.rb +1 -1
- data/lib/facebooker/models/user.rb +32 -9
- data/lib/facebooker/parser.rb +13 -12
- data/lib/facebooker/rails/backwards_compatible_param_checks.rb +1 -1
- data/lib/facebooker/rails/controller.rb +9 -19
- data/lib/facebooker/rails/helpers.rb +67 -6
- data/lib/facebooker/rails/helpers/fb_connect.rb +5 -3
- data/lib/facebooker/rails/publisher.rb +31 -7
- data/lib/facebooker/service/base_service.rb +2 -1
- data/lib/facebooker/service/curl_service.rb +3 -2
- data/lib/facebooker/session.rb +39 -4
- data/lib/facebooker/version.rb +1 -1
- data/test/facebooker/adapters_test.rb +17 -0
- data/test/facebooker/models/user_test.rb +7 -1
- data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -2
- data/test/facebooker/rails/integration_session_test.rb +4 -1
- data/test/facebooker/rails/publisher_test.rb +19 -12
- data/test/facebooker/rails_integration_test.rb +101 -50
- data/test/facebooker/session_test.rb +37 -0
- data/test/rack/facebook_test.rb +15 -8
- data/test/rails_test_helper.rb +8 -0
- data/test/test_helper.rb +2 -2
- metadata +11 -3
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
|
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
|
-
|
12
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
31
|
+
begin
|
32
|
+
require 'rcov/rcovtask'
|
27
33
|
|
28
|
-
namespace :test do
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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,20 +2,20 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{facebooker}
|
5
|
-
s.version = "1.0.
|
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-
|
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 =
|
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>
|
data/lib/facebooker.rb
CHANGED
@@ -36,14 +36,13 @@ module Facebooker
|
|
36
36
|
class << self
|
37
37
|
|
38
38
|
def load_configuration(facebooker_yaml_file)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
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
|
|
@@ -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, :
|
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, :
|
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
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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 ||=
|
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'
|
387
|
+
session.post('facebook.users.hasAppPermission', {:ext_perm=>ext_perm, :uid => uid}, false) == "1"
|
365
388
|
end
|
366
389
|
|
367
390
|
##
|
data/lib/facebooker/parser.rb
CHANGED
@@ -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)
|
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.
|
417
|
-
|
418
|
-
|
419
|
-
|
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
|
-
|
424
|
-
|
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
|
@@ -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
|
-
|
234
|
-
|
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'
|
248
|
-
'in_canvas' => lambda{|value|
|
249
|
-
'added'
|
250
|
-
'expires'
|
251
|
-
'friends'
|
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
|
-
|
190
|
+
def facebook_form_for( record_or_name_or_array,*args, &proc)
|
191
191
|
|
192
|
-
|
193
|
-
|
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
|
-
|
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)
|