facebooker 1.0.44 → 1.0.48
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|