tenderlove-facebooker 1.0.16.20090319151701
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/CHANGELOG.rdoc +17 -0
- data/COPYING.rdoc +19 -0
- data/Manifest.txt +123 -0
- data/README.rdoc +103 -0
- data/Rakefile +86 -0
- data/TODO.rdoc +4 -0
- data/examples/desktop_login.rb +14 -0
- data/facebooker.gemspec +38 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +46 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +99 -0
- data/generators/facebook_controller/USAGE +33 -0
- data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
- data/generators/facebook_controller/templates/controller.rb +7 -0
- data/generators/facebook_controller/templates/functional_test.rb +11 -0
- data/generators/facebook_controller/templates/helper.rb +2 -0
- data/generators/facebook_controller/templates/view.fbml.erb +2 -0
- data/generators/facebook_controller/templates/view.html.erb +2 -0
- data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
- data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
- data/generators/facebook_publisher/templates/publisher.rb +3 -0
- data/generators/facebook_scaffold/USAGE +27 -0
- data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
- data/generators/facebook_scaffold/templates/controller.rb +93 -0
- data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
- data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
- data/generators/facebook_scaffold/templates/helper.rb +2 -0
- data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
- data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
- data/generators/facebook_scaffold/templates/style.css +74 -0
- data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
- data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
- data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
- data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
- data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
- data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
- data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
- data/generators/publisher/publisher_generator.rb +14 -0
- data/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +9 -0
- data/init.rb +72 -0
- data/install.rb +12 -0
- data/lib/facebooker/adapters/adapter_base.rb +87 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +75 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
- data/lib/facebooker/admin.rb +42 -0
- data/lib/facebooker/batch_request.rb +44 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +51 -0
- data/lib/facebooker/mobile.rb +20 -0
- data/lib/facebooker/mock/service.rb +50 -0
- data/lib/facebooker/mock/session.rb +18 -0
- data/lib/facebooker/model.rb +135 -0
- data/lib/facebooker/models/affiliation.rb +10 -0
- data/lib/facebooker/models/album.rb +11 -0
- data/lib/facebooker/models/applicationproperties.rb +39 -0
- data/lib/facebooker/models/applicationrestrictions.rb +10 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +28 -0
- data/lib/facebooker/models/friend_list.rb +16 -0
- data/lib/facebooker/models/group.rb +36 -0
- data/lib/facebooker/models/info_item.rb +10 -0
- data/lib/facebooker/models/info_section.rb +10 -0
- data/lib/facebooker/models/location.rb +8 -0
- data/lib/facebooker/models/notifications.rb +17 -0
- data/lib/facebooker/models/page.rb +27 -0
- data/lib/facebooker/models/photo.rb +12 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +426 -0
- data/lib/facebooker/models/video.rb +9 -0
- data/lib/facebooker/models/work_info.rb +9 -0
- data/lib/facebooker/parser.rb +589 -0
- data/lib/facebooker/rails/controller.rb +304 -0
- data/lib/facebooker/rails/cucumber/world.rb +46 -0
- data/lib/facebooker/rails/cucumber.rb +28 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
- data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
- data/lib/facebooker/rails/helpers/fb_connect.rb +89 -0
- data/lib/facebooker/rails/helpers.rb +762 -0
- data/lib/facebooker/rails/integration_session.rb +38 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +526 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +68 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +94 -0
- data/lib/facebooker/session.rb +584 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/facebooker.rb +174 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/tasks/facebooker.rake +18 -0
- data/lib/tasks/tunnel.rake +46 -0
- data/rails/init.rb +1 -0
- data/setup.rb +1585 -0
- data/templates/layout.erb +24 -0
- data/test/facebooker/adapters_test.rb +96 -0
- data/test/facebooker/admin_test.rb +102 -0
- data/test/facebooker/batch_request_test.rb +83 -0
- data/test/facebooker/data_test.rb +86 -0
- data/test/facebooker/logging_test.rb +43 -0
- data/test/facebooker/mobile_test.rb +45 -0
- data/test/facebooker/model_test.rb +123 -0
- data/test/facebooker/models/event_test.rb +15 -0
- data/test/facebooker/models/user_test.rb +295 -0
- data/test/facebooker/rails/publisher_test.rb +452 -0
- data/test/facebooker/rails_integration_test.rb +1312 -0
- data/test/facebooker/server_cache_test.rb +44 -0
- data/test/facebooker/session_test.rb +614 -0
- data/test/facebooker_test.rb +925 -0
- data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
- data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
- data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
- data/test/net/http_multipart_post_test.rb +52 -0
- data/test/rails_test_helper.rb +11 -0
- data/test/test_helper.rb +66 -0
- metadata +217 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require File.dirname(__FILE__)+'/../../vendor/plugins/facebooker/lib/facebooker/rails/test_helpers.rb'
|
3
|
+
|
4
|
+
class <%= controller_class_name %>ControllerTest < ActionController::TestCase
|
5
|
+
include Facebooker::Rails::TestHelpers
|
6
|
+
def test_should_get_index_for_facebook
|
7
|
+
facebook_get :index
|
8
|
+
assert_response :success
|
9
|
+
assert_not_nil assigns(:<%= table_name %>)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_get_new_for_facebook
|
13
|
+
facebook_get :new
|
14
|
+
assert_response :success
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_create_<%= file_name %>_for_facebook
|
18
|
+
assert_difference('<%= class_name %>.count') do
|
19
|
+
facebook_post :create, :<%= file_name %> => { }
|
20
|
+
end
|
21
|
+
|
22
|
+
assert_facebook_redirect_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_show_<%= file_name %>_for_facebook
|
26
|
+
facebook_get :show, :id => <%= table_name %>(:one).id
|
27
|
+
assert_response :success
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_get_edit_for_facebook
|
31
|
+
facebook_get :edit, :id => <%= table_name %>(:one).id
|
32
|
+
assert_response :success
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_update_<%= file_name %>_for_facebook
|
36
|
+
facebook_put :update, :id => <%= table_name %>(:one).id, :<%= file_name %> => { }
|
37
|
+
assert_facebook_redirect_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_destroy_<%= file_name %>_for_facebook
|
41
|
+
assert_difference('<%= class_name %>.count', -1) do
|
42
|
+
facebook_delete :destroy, :id => <%= table_name %>(:one).id
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_facebook_redirect_to <%= table_name %>_path
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_should_get_index
|
49
|
+
get :index
|
50
|
+
assert_response :success
|
51
|
+
assert_not_nil assigns(:<%= table_name %>)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_should_get_new
|
55
|
+
get :new
|
56
|
+
assert_response :success
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_should_create_<%= file_name %>
|
60
|
+
assert_difference('<%= class_name %>.count') do
|
61
|
+
post :create, :<%= file_name %> => { }
|
62
|
+
end
|
63
|
+
|
64
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_show_<%= file_name %>
|
68
|
+
get :show, :id => <%= table_name %>(:one).id
|
69
|
+
assert_response :success
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_should_get_edit
|
73
|
+
get :edit, :id => <%= table_name %>(:one).id
|
74
|
+
assert_response :success
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_should_update_<%= file_name %>
|
78
|
+
put :update, :id => <%= table_name %>(:one).id, :<%= file_name %> => { }
|
79
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_should_destroy_<%= file_name %>
|
83
|
+
assert_difference('<%= class_name %>.count', -1) do
|
84
|
+
delete :destroy, :id => <%= table_name %>(:one).id
|
85
|
+
end
|
86
|
+
|
87
|
+
assert_redirected_to <%= table_name %>_path
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
|
7
|
+
<title><%= controller_class_name %>: <%%= controller.action_name %></title>
|
8
|
+
<%%= stylesheet_link_tag 'scaffold' %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
|
12
|
+
<p style="color: green"><%%= flash[:notice] %></p>
|
13
|
+
|
14
|
+
<%%= yield %>
|
15
|
+
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,74 @@
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
2
|
+
|
3
|
+
body, p, ol, ul, td {
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
pre {
|
10
|
+
background-color: #eee;
|
11
|
+
padding: 10px;
|
12
|
+
font-size: 11px;
|
13
|
+
}
|
14
|
+
|
15
|
+
a { color: #000; }
|
16
|
+
a:visited { color: #666; }
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
18
|
+
|
19
|
+
.fieldWithErrors {
|
20
|
+
padding: 2px;
|
21
|
+
background-color: red;
|
22
|
+
display: table;
|
23
|
+
}
|
24
|
+
|
25
|
+
#errorExplanation {
|
26
|
+
width: 400px;
|
27
|
+
border: 2px solid red;
|
28
|
+
padding: 7px;
|
29
|
+
padding-bottom: 12px;
|
30
|
+
margin-bottom: 20px;
|
31
|
+
background-color: #f0f0f0;
|
32
|
+
}
|
33
|
+
|
34
|
+
#errorExplanation h2 {
|
35
|
+
text-align: left;
|
36
|
+
font-weight: bold;
|
37
|
+
padding: 5px 5px 5px 15px;
|
38
|
+
font-size: 12px;
|
39
|
+
margin: -7px;
|
40
|
+
background-color: #c00;
|
41
|
+
color: #fff;
|
42
|
+
}
|
43
|
+
|
44
|
+
#errorExplanation p {
|
45
|
+
color: #333;
|
46
|
+
margin-bottom: 0;
|
47
|
+
padding: 5px;
|
48
|
+
}
|
49
|
+
|
50
|
+
#errorExplanation ul li {
|
51
|
+
font-size: 12px;
|
52
|
+
list-style: square;
|
53
|
+
}
|
54
|
+
|
55
|
+
div.uploadStatus {
|
56
|
+
margin: 5px;
|
57
|
+
}
|
58
|
+
|
59
|
+
div.progressBar {
|
60
|
+
margin: 5px;
|
61
|
+
}
|
62
|
+
|
63
|
+
div.progressBar div.border {
|
64
|
+
background-color: #fff;
|
65
|
+
border: 1px solid gray;
|
66
|
+
width: 100%;
|
67
|
+
}
|
68
|
+
|
69
|
+
div.progressBar div.background {
|
70
|
+
background-color: #333;
|
71
|
+
height: 18px;
|
72
|
+
width: 0%;
|
73
|
+
}
|
74
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<h1>Editing <%= singular_name %></h1>
|
2
|
+
|
3
|
+
<%% facebook_form_for(@<%= singular_name %>) do |f| %>
|
4
|
+
<%%= f.error_messages %>
|
5
|
+
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
8
|
+
<% end -%>
|
9
|
+
<%%= f.buttons "Update" %>
|
10
|
+
<%% end %>
|
11
|
+
|
12
|
+
<%%= link_to 'Show', @<%= singular_name %> %> |
|
13
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<h1>Editing <%= singular_name %></h1>
|
2
|
+
|
3
|
+
<%% form_for(@<%= singular_name %>) do |f| %>
|
4
|
+
<%%= f.error_messages %>
|
5
|
+
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
<p>
|
8
|
+
<%%= f.label :<%= attribute.name %> %><br />
|
9
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
10
|
+
</p>
|
11
|
+
<% end -%>
|
12
|
+
<p>
|
13
|
+
<%%= f.submit "Update" %>
|
14
|
+
</p>
|
15
|
+
<%% end %>
|
16
|
+
|
17
|
+
<%%= link_to 'Show', @<%= singular_name %> %> |
|
18
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<h1>Listing <%= plural_name %></h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<% for attribute in attributes -%>
|
6
|
+
<th><%= attribute.column.human_name %></th>
|
7
|
+
<% end -%>
|
8
|
+
</tr>
|
9
|
+
|
10
|
+
<%% for <%= singular_name %> in @<%= plural_name %> %>
|
11
|
+
<tr>
|
12
|
+
<% for attribute in attributes -%>
|
13
|
+
<td><%%=h <%= singular_name %>.<%= attribute.name %> %></td>
|
14
|
+
<% end -%>
|
15
|
+
<td><%%= link_to 'Show', <%= singular_name %> %></td>
|
16
|
+
<td><%%= link_to 'Edit', edit_<%= singular_name %>_path(<%= singular_name %>) %></td>
|
17
|
+
<td><%%= button_to 'Destroy', <%= singular_name %>, :method => :delete %></td>
|
18
|
+
</tr>
|
19
|
+
<%% end %>
|
20
|
+
</table>
|
21
|
+
|
22
|
+
<br />
|
23
|
+
|
24
|
+
<%%= link_to 'New <%= singular_name %>', new_<%= singular_name %>_path %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<h1>Listing <%= plural_name %></h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<% for attribute in attributes -%>
|
6
|
+
<th><%= attribute.column.human_name %></th>
|
7
|
+
<% end -%>
|
8
|
+
</tr>
|
9
|
+
|
10
|
+
<%% for <%= singular_name %> in @<%= plural_name %> %>
|
11
|
+
<tr>
|
12
|
+
<% for attribute in attributes -%>
|
13
|
+
<td><%%=h <%= singular_name %>.<%= attribute.name %> %></td>
|
14
|
+
<% end -%>
|
15
|
+
<td><%%= link_to 'Show', <%= singular_name %> %></td>
|
16
|
+
<td><%%= link_to 'Edit', edit_<%= singular_name %>_path(<%= singular_name %>) %></td>
|
17
|
+
<td><%%= link_to 'Destroy', <%= singular_name %>, :confirm => 'Are you sure?', :method => :delete %></td>
|
18
|
+
</tr>
|
19
|
+
<%% end %>
|
20
|
+
</table>
|
21
|
+
|
22
|
+
<br />
|
23
|
+
|
24
|
+
<%%= link_to 'New <%= singular_name %>', new_<%= singular_name %>_path %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h1>New <%= singular_name %></h1>
|
2
|
+
|
3
|
+
<%% facebook_form_for(@<%= singular_name %>) do |f| %>
|
4
|
+
<%%= f.error_messages %>
|
5
|
+
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
8
|
+
<% end -%>
|
9
|
+
<%%= f.buttons "Create" %>
|
10
|
+
<%% end %>
|
11
|
+
|
12
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<h1>New <%= singular_name %></h1>
|
2
|
+
|
3
|
+
<%% form_for(@<%= singular_name %>) do |f| %>
|
4
|
+
<%%= f.error_messages %>
|
5
|
+
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
<p>
|
8
|
+
<%%= f.label :<%= attribute.name %> %><br />
|
9
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
10
|
+
</p>
|
11
|
+
<% end -%>
|
12
|
+
<p>
|
13
|
+
<%%= f.submit "Create" %>
|
14
|
+
</p>
|
15
|
+
<%% end %>
|
16
|
+
|
17
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% for attribute in attributes -%>
|
2
|
+
<p>
|
3
|
+
<b><%= attribute.column.human_name %>:</b>
|
4
|
+
<%%=h @<%= singular_name %>.<%= attribute.name %> %>
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<% end -%>
|
8
|
+
|
9
|
+
<%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
|
10
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% for attribute in attributes -%>
|
2
|
+
<p>
|
3
|
+
<b><%= attribute.column.human_name %>:</b>
|
4
|
+
<%%=h @<%= singular_name %>.<%= attribute.name %> %>
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<% end -%>
|
8
|
+
|
9
|
+
<%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
|
10
|
+
<%%= link_to 'Back', <%= plural_name %>_path %>
|
@@ -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="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.debug.js" type="text/javascript"></script>
|
9
|
+
</body>
|
10
|
+
</html>
|
data/init.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Added support to the Facebooker.yml file for switching to the new profile design..
|
2
|
+
# Config parsing needs to happen before files are required.
|
3
|
+
facebook_config = "#{RAILS_ROOT}/config/facebooker.yml"
|
4
|
+
|
5
|
+
require 'facebooker'
|
6
|
+
FACEBOOKER = Facebooker.load_configuration(facebook_config)
|
7
|
+
|
8
|
+
# enable logger before including everything else, in case we ever want to log initialization
|
9
|
+
Facebooker.logger = RAILS_DEFAULT_LOGGER if Object.const_defined? :RAILS_DEFAULT_LOGGER
|
10
|
+
|
11
|
+
require 'net/http_multipart_post'
|
12
|
+
require 'facebooker/rails/controller'
|
13
|
+
require 'facebooker/rails/facebook_url_rewriting'
|
14
|
+
require 'facebooker/rails/facebook_session_handling'
|
15
|
+
require 'facebooker/rails/facebook_request_fix'
|
16
|
+
require 'facebooker/rails/routing'
|
17
|
+
require 'facebooker/rails/facebook_pretty_errors' rescue nil
|
18
|
+
require 'facebooker/rails/facebook_url_helper'
|
19
|
+
module ::ActionController
|
20
|
+
class Base
|
21
|
+
def self.inherited_with_facebooker(subclass)
|
22
|
+
inherited_without_facebooker(subclass)
|
23
|
+
if subclass.to_s == "ApplicationController"
|
24
|
+
subclass.send(:include,Facebooker::Rails::Controller)
|
25
|
+
subclass.helper Facebooker::Rails::Helpers
|
26
|
+
end
|
27
|
+
end
|
28
|
+
class << self
|
29
|
+
alias_method_chain :inherited, :facebooker
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class ActionController::Routing::Route
|
35
|
+
def recognition_conditions_with_facebooker
|
36
|
+
defaults = recognition_conditions_without_facebooker
|
37
|
+
defaults << " env[:canvas] == conditions[:canvas] " if conditions[:canvas]
|
38
|
+
defaults
|
39
|
+
end
|
40
|
+
alias_method_chain :recognition_conditions, :facebooker
|
41
|
+
end
|
42
|
+
|
43
|
+
# When making get requests, Facebook sends fb_sig parameters both in the query string
|
44
|
+
# and also in the post body. We want to ignore the query string ones because they are one
|
45
|
+
# request out of date
|
46
|
+
# We only do thise when there are POST parameters so that IFrame linkage still works
|
47
|
+
class ActionController::AbstractRequest
|
48
|
+
def query_parameters_with_facebooker
|
49
|
+
if request_parameters.blank?
|
50
|
+
query_parameters_without_facebooker
|
51
|
+
else
|
52
|
+
(query_parameters_without_facebooker||{}).reject {|key,value| key.to_s =~ /^fb_sig/}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
alias_method_chain :query_parameters, :facebooker
|
57
|
+
end
|
58
|
+
|
59
|
+
# We turn off route optimization to make named routes use our code for figuring out if they should go to the session
|
60
|
+
# If this fails, it means we're on rails 1.2, we can ignore it
|
61
|
+
begin
|
62
|
+
ActionController::Base::optimise_named_routes = false
|
63
|
+
rescue NoMethodError=>e
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
# pull :canvas=> into env in routing to allow for conditions
|
68
|
+
ActionController::Routing::RouteSet.send :include, Facebooker::Rails::Routing::RouteSetExtensions
|
69
|
+
ActionController::Routing::RouteSet::Mapper.send :include, Facebooker::Rails::Routing::MapperExtensions
|
70
|
+
|
71
|
+
Mime::Type.register_alias "text/html", :fbml
|
72
|
+
Mime::Type.register_alias "text/javascript", :fbjs
|
data/install.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
dir = File.dirname(__FILE__)
|
5
|
+
templates = File.join(dir, 'generators', 'facebook', 'templates')
|
6
|
+
config = File.join('config', 'facebooker.yml')
|
7
|
+
script = File.join('public', 'javascripts', 'facebooker.js')
|
8
|
+
|
9
|
+
[config, script].each do |path|
|
10
|
+
FileUtils.cp File.join(templates, path), File.join(RAILS_ROOT, path) unless File.exist?(File.join(RAILS_ROOT, path))
|
11
|
+
end
|
12
|
+
puts IO.read(File.join(dir, 'README'))
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Facebooker
|
2
|
+
|
3
|
+
class AdapterBase
|
4
|
+
class UnableToLoadAdapter < Exception; end
|
5
|
+
require 'active_support/inflector'
|
6
|
+
include ActiveSupport::CoreExtensions::String::Inflections
|
7
|
+
def facebook_path_prefix
|
8
|
+
"/" + (@facebook_path_prefix || canvas_page_name || ENV['FACEBOOK_CANVAS_PATH'] || ENV['FACEBOOKER_RELATIVE_URL_ROOT'])
|
9
|
+
end
|
10
|
+
|
11
|
+
def facebook_path_prefix=(prefix)
|
12
|
+
@facebook_path_prefix = prefix
|
13
|
+
end
|
14
|
+
|
15
|
+
def facebooker_config
|
16
|
+
@config
|
17
|
+
end
|
18
|
+
|
19
|
+
def api_server_base_url
|
20
|
+
"http://" + api_server_base
|
21
|
+
end
|
22
|
+
|
23
|
+
def is_for?(application_context)
|
24
|
+
raise "SubClassShouldDefine"
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(config)
|
28
|
+
@config = config
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.facebooker_config
|
32
|
+
Facebooker.facebooker_config
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def self.load_adapter(params)
|
37
|
+
|
38
|
+
config_key_base = params[:config_key_base] # This allows for loading of a aspecific adapter
|
39
|
+
config_key_base += "_" unless config_key_base.blank?
|
40
|
+
|
41
|
+
unless api_key = (params[:fb_sig_api_key] || facebooker_config["#{config_key_base}api_key"])
|
42
|
+
raise Facebooker::AdapterBase::UnableToLoadAdapter
|
43
|
+
end
|
44
|
+
|
45
|
+
unless facebooker_config
|
46
|
+
return self.default_adapter(params)
|
47
|
+
end
|
48
|
+
|
49
|
+
facebooker_config.each do |key,value|
|
50
|
+
next unless value == api_key
|
51
|
+
|
52
|
+
key_base = key.match(/(.*)[_]?api_key/)[1]
|
53
|
+
|
54
|
+
adapter_class_name = if key_base.blank?
|
55
|
+
"FacebookAdapter"
|
56
|
+
else
|
57
|
+
facebooker_config[key_base + "adapter"]
|
58
|
+
end
|
59
|
+
|
60
|
+
adapter_class = "Facebooker::#{adapter_class_name}".constantize
|
61
|
+
|
62
|
+
# Collect the rest of the configuration
|
63
|
+
adapter_config = {}
|
64
|
+
facebooker_config.each do |key,value|
|
65
|
+
if (match = key.match(/#{key_base}[_]?(.*)/))
|
66
|
+
adapter_config[match[1]] = value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
return adapter_class.new(adapter_config)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.default_adapter(params = {})
|
74
|
+
if facebooker_config.nil? || (facebooker_config.blank? rescue nil)
|
75
|
+
config = { "api_key" => ENV['FACEBOOK_API_KEY'], "secret_key" => ENV['FACEBOOK_SECRET_KEY']}
|
76
|
+
else
|
77
|
+
config = facebooker_config
|
78
|
+
end
|
79
|
+
FacebookAdapter.new(config)
|
80
|
+
end
|
81
|
+
|
82
|
+
[:canvas_page_name, :api_key,:secret_key].each do |key_method|
|
83
|
+
define_method(key_method){ return facebooker_config[key_method.to_s]}
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Facebooker
|
2
|
+
class BeboAdapter < AdapterBase
|
3
|
+
|
4
|
+
def canvas_server_base
|
5
|
+
"apps.bebo.com"
|
6
|
+
end
|
7
|
+
|
8
|
+
def api_server_base
|
9
|
+
'apps.bebo.com'
|
10
|
+
end
|
11
|
+
|
12
|
+
def api_rest_path
|
13
|
+
"/restserver.php"
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_for?(application_context)
|
17
|
+
application_context == :bebo
|
18
|
+
end
|
19
|
+
|
20
|
+
def www_server_base_url
|
21
|
+
"www.bebo.com"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def login_url_base
|
26
|
+
"http://#{www_server_base_url}/SignIn.jsp?ApiKey=#{api_key}&v=1.0"
|
27
|
+
end
|
28
|
+
|
29
|
+
def install_url_base
|
30
|
+
"http://#{www_server_base_url}/c/apps/add?ApiKey=#{api_key}&v=1.0"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Things that don't actually work as expected in BEBO
|
36
|
+
Facebooker::PublishTemplatizedAction
|
37
|
+
module Facebooker
|
38
|
+
class User
|
39
|
+
def set_profile_fbml_with_bebo_adapter(profile_fbml, mobile_fbml, profile_action_fbml, profile_main = nil)
|
40
|
+
if(Facebooker.is_for?(:bebo))
|
41
|
+
self.session.post('facebook.profile.setFBML', :uid => @id, :markup => profile_fbml)
|
42
|
+
else
|
43
|
+
set_profile_fbml_without_bebo_adapter(profile_fbml,mobile_fbml, profile_action_fbml, profile_main)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
alias_method :set_profile_fbml_without_bebo_adapter, :set_profile_fbml
|
47
|
+
alias_method :set_profile_fbml, :set_profile_fbml_with_bebo_adapter
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
BEBO_FIELDS = FIELDS - [:meeting_sex, :wall_count, :meeting_for]
|
52
|
+
def collect(fields)
|
53
|
+
if(Facebooker.is_for?(:bebo) )
|
54
|
+
BEBO_FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
|
55
|
+
else
|
56
|
+
FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
class PublishTemplatizedAction < Parser#:nodoc:
|
63
|
+
class <<self
|
64
|
+
def process_with_bebo_adapter(data)
|
65
|
+
if(Facebooker.is_for?(:bebo))
|
66
|
+
element('feed_publishTemplatizedAction_response', data).text_value
|
67
|
+
else
|
68
|
+
process_without_bebo_adapter(data)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
alias_method :process_without_bebo_adapter, :process
|
72
|
+
alias_method :process, :process_with_bebo_adapter
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Facebooker
|
2
|
+
|
3
|
+
|
4
|
+
class FacebookAdapter < AdapterBase
|
5
|
+
|
6
|
+
def canvas_server_base
|
7
|
+
"apps.facebook.com"
|
8
|
+
end
|
9
|
+
|
10
|
+
def api_server_base
|
11
|
+
"api.facebook.com"
|
12
|
+
end
|
13
|
+
|
14
|
+
def video_server_base
|
15
|
+
"api-video.facebook.com"
|
16
|
+
end
|
17
|
+
|
18
|
+
def www_server_base_url
|
19
|
+
"www.facebook.com"
|
20
|
+
end
|
21
|
+
|
22
|
+
def api_rest_path
|
23
|
+
"/restserver.php"
|
24
|
+
end
|
25
|
+
|
26
|
+
def api_key
|
27
|
+
ENV['FACEBOOK_API_KEY'] || super
|
28
|
+
end
|
29
|
+
|
30
|
+
def secret_key
|
31
|
+
ENV['FACEBOOK_SECRET_KEY'] || super
|
32
|
+
end
|
33
|
+
|
34
|
+
def is_for?(application_context)
|
35
|
+
application_context == :facebook
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def login_url_base
|
41
|
+
"http://#{www_server_base_url}/login.php?api_key=#{api_key}&v=1.0"
|
42
|
+
end
|
43
|
+
|
44
|
+
def install_url_base
|
45
|
+
"http://#{www_server_base_url}/install.php?api_key=#{api_key}&v=1.0"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
|