facebooker 1.0.52 → 1.0.53
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +2 -0
- data/facebooker.gemspec +4 -4
- data/generators/facebook/templates/public/javascripts/facebooker.js +317 -78
- data/lib/facebooker.rb +1 -0
- data/lib/facebooker/application.rb +13 -0
- data/lib/facebooker/models/album.rb +1 -1
- data/lib/facebooker/parser.rb +7 -0
- data/lib/facebooker/rails/controller.rb +3 -0
- data/lib/facebooker/rails/helpers.rb +5 -0
- data/lib/facebooker/session.rb +12 -2
- data/lib/facebooker/version.rb +1 -1
- data/test/facebooker/application_test.rb +41 -0
- data/test/facebooker/rails_integration_test.rb +15 -4
- data/test/facebooker/session_test.rb +90 -1
- metadata +5 -2
data/Manifest.txt
CHANGED
@@ -48,6 +48,7 @@ lib/facebooker/adapters/adapter_base.rb
|
|
48
48
|
lib/facebooker/adapters/bebo_adapter.rb
|
49
49
|
lib/facebooker/adapters/facebook_adapter.rb
|
50
50
|
lib/facebooker/admin.rb
|
51
|
+
lib/facebooker/application.rb
|
51
52
|
lib/facebooker/batch_request.rb
|
52
53
|
lib/facebooker/data.rb
|
53
54
|
lib/facebooker/feed.rb
|
@@ -117,6 +118,7 @@ setup.rb
|
|
117
118
|
templates/layout.erb
|
118
119
|
test/facebooker/adapters_test.rb
|
119
120
|
test/facebooker/admin_test.rb
|
121
|
+
test/facebooker/application_test.rb
|
120
122
|
test/facebooker/batch_request_test.rb
|
121
123
|
test/facebooker/data_test.rb
|
122
124
|
test/facebooker/logging_test.rb
|
data/facebooker.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
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.53"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis", "Mike Mangino"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-10-02}
|
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
|
@@ -15,14 +15,14 @@ Gem::Specification.new do |s|
|
|
15
15
|
* Well tested}
|
16
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_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/family_relative_info.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/application.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/family_relative_info.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/application.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/application_test.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"]
|
22
22
|
s.rubyforge_project = %q{facebooker}
|
23
23
|
s.rubygems_version = %q{1.3.4}
|
24
24
|
s.summary = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]}
|
25
|
-
s.test_files = ["test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/service_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
|
25
|
+
s.test_files = ["test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/application_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/page_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/integration_session_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/service_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
|
26
26
|
|
27
27
|
if s.respond_to? :specification_version then
|
28
28
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -1,93 +1,332 @@
|
|
1
|
-
|
2
1
|
function $(element) {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
if (typeof element == "string") {
|
3
|
+
element=document.getElementById(element);
|
4
|
+
}
|
5
|
+
if (element)
|
6
|
+
extendInstance(element,Element);
|
7
|
+
return element;
|
9
8
|
}
|
10
9
|
|
11
|
-
function
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
function getElementsByName(elementName) {
|
11
|
+
var matcher = function(element) {
|
12
|
+
return (element.getName() === elementName);
|
13
|
+
};
|
14
|
+
return domCollect(document.getRootElement(), matcher);
|
15
|
+
}
|
16
|
+
function getElementsByClass(classname) {
|
17
|
+
var matcher = function(element) {
|
18
|
+
return (element.getClassName() === classname);
|
19
|
+
};
|
20
|
+
return domCollect(document.getRootElement(), matcher);
|
21
|
+
}
|
22
|
+
//function getElementsByTagName(tagName) -> native to FJBS
|
23
|
+
|
24
|
+
extendInstance(Ajax, { //Extends the native Facebook Ajax object
|
25
|
+
/*
|
26
|
+
* Make a request to a remote server. Call the 'success' callback with the result.
|
27
|
+
* Ex: Ajax.Load('JSON','http://...',{ success: function(result){console.log(result.toSource())} }, {'json':test_content})
|
28
|
+
*/
|
29
|
+
Load: function(response_type, action_path, callbacks, post_parameters) {
|
30
|
+
callbacks = Ajax.checkCallbacks(callbacks);
|
31
|
+
var ajax = new Ajax();
|
32
|
+
switch(response_type) {
|
33
|
+
case 'FBML':
|
34
|
+
ajax.responseType = Ajax.FBML;
|
35
|
+
break;
|
36
|
+
case 'JSON':
|
37
|
+
ajax.responseType = Ajax.JSON;
|
38
|
+
break;
|
39
|
+
case 'RAW':
|
40
|
+
ajax.responseType = Ajax.RAW;
|
41
|
+
break;
|
42
|
+
default:
|
43
|
+
console.error("Unknow respons format requested. You supplied %s. Supported: 'FBML', 'RAW'", response_type);
|
44
|
+
return;
|
45
|
+
}
|
46
|
+
ajax.ondone = function(result){
|
47
|
+
callbacks.success(result);
|
48
|
+
callbacks.complete();
|
49
|
+
}
|
50
|
+
ajax.onerror = function(error_string) {
|
51
|
+
callbacks.failure(error_string);
|
52
|
+
callbacks.complete();
|
53
|
+
}
|
54
|
+
|
55
|
+
post_parameters = post_parameters || {}
|
56
|
+
post_parameters['authenticity_token'] = _token;
|
57
|
+
|
58
|
+
if(action_path.indexOf('http') == -1) {
|
59
|
+
action_path = _hostname + action_path;
|
60
|
+
}
|
61
|
+
|
62
|
+
callbacks.begin();
|
63
|
+
ajax.post(action_path,post_parameters);
|
64
|
+
},
|
65
|
+
/*
|
66
|
+
* Make a request to a remote server. Update target_element with result. Calls the 'success' callback with the result
|
67
|
+
* Ex: Ajax.Update('test1', 'FBML', 'http://...',{ success: function(result){console.log(result)} })
|
68
|
+
*/
|
69
|
+
Update: function(target_element, response_type, action_path, callbacks, post_parameters) {
|
70
|
+
callbacks = Ajax.checkCallbacks(callbacks);
|
71
|
+
var update_element = function(content) {
|
72
|
+
switch(response_type) {
|
73
|
+
case 'FBML':
|
74
|
+
$(target_element).setInnerFBML(content);
|
75
|
+
break;
|
76
|
+
case 'RAW':
|
77
|
+
$(target_element).setTextValue(content);
|
78
|
+
break;
|
79
|
+
default:
|
80
|
+
console.log("Unsupported response type "+response_type);
|
81
|
+
break;
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
var onsuccess = (callbacks.success == null)?
|
86
|
+
update_element :
|
87
|
+
chainMethods([update_element,callbacks.success]);
|
88
|
+
|
89
|
+
callbacks.success = onsuccess;
|
90
|
+
Ajax.Load(response_type, action_path, callbacks, post_parameters);
|
91
|
+
},
|
92
|
+
|
93
|
+
|
94
|
+
InPlaceInputEditor: function(target_element, action_path, post_parameters) {
|
95
|
+
var classname = $(target_element).getClassName() || "";
|
96
|
+
|
97
|
+
this.edit = function() {
|
98
|
+
var target = $(target_element);
|
99
|
+
var wrapper = target.getParentNode();
|
100
|
+
var dimensions = $(target_element).getDimensions();
|
101
|
+
var value = $(target_element+'__value').getValue();
|
102
|
+
|
103
|
+
var editArea = document.createElement('input');
|
104
|
+
editArea.setType($(target_element+'__value').getType());
|
105
|
+
editArea.setId(target_element+"__editor");
|
106
|
+
editArea.setValue(value);
|
107
|
+
//editArea.focus();
|
108
|
+
//editArea.setStyle("width",dimensions.width+"px");
|
109
|
+
//editArea.setStyle("height", dimensions.height+'px');
|
110
|
+
|
111
|
+
$(target_element+'__value').remove();
|
112
|
+
wrapper.removeChild(target);
|
113
|
+
wrapper.appendChild(editArea);
|
114
|
+
}
|
115
|
+
this.save = function(callbacks){
|
116
|
+
var newValue = $(target_element + "__editor").getValue();
|
117
|
+
var wrapper = $(target_element + "__editor").getParentNode();
|
118
|
+
callbacks = Ajax.checkCallbacks(callbacks);
|
119
|
+
Ajax.Load("RAW", action_path + "?raw=" + escape(newValue), {
|
120
|
+
success: chainMethods([
|
121
|
+
callbacks.success,
|
122
|
+
function(result){
|
123
|
+
wrapper.setInnerXHTML('<span>'+
|
124
|
+
'<input id="'+target_element+'__value" name="'+target_element+'__value" style="display:none;" type="text" value="'+unescape(result)+'" />'+
|
125
|
+
'<span><span id="'+target_element+'" class="'+classname+'" type="text">'+unescape(result)+'</span></span></span>');
|
126
|
+
}
|
127
|
+
])
|
128
|
+
}, post_parameters)
|
129
|
+
};
|
130
|
+
},
|
131
|
+
InPlaceTextAreaEditor: function(target_element, action_path, post_parameters) {
|
132
|
+
var classname = $(target_element).getClassName() || "";
|
133
|
+
|
134
|
+
this.edit = function() {
|
135
|
+
var target = $(target_element);
|
136
|
+
var wrapper = target.getParentNode();
|
137
|
+
var dimensions = $(target_element).getDimensions();
|
138
|
+
var value = $(target_element+'__value').getValue();
|
139
|
+
|
140
|
+
var editArea = document.createElement('textarea');
|
141
|
+
editArea.setId(target_element+"__editor");
|
142
|
+
editArea.setValue(value.replace(/<br \/>|<br\/>/g,'\n').replace(/<p>|<\/p>/g,''));
|
143
|
+
editArea.addEventListener('keyup', function() {
|
144
|
+
autoExpandTextarea(editArea);
|
145
|
+
});
|
146
|
+
//editArea.focus();
|
147
|
+
editArea.setStyle("width",dimensions.width+"px");
|
148
|
+
//editArea.setStyle("height", dimensions.height+'px');
|
149
|
+
|
150
|
+
$(target_element+'__value').remove();
|
151
|
+
wrapper.removeChild(target);
|
152
|
+
wrapper.appendChild(editArea);
|
153
|
+
autoExpandTextarea(editArea);
|
154
|
+
}
|
155
|
+
this.save = function(callbacks){
|
156
|
+
var newValue = $(target_element + "__editor").getValue();
|
157
|
+
var wrapper = $(target_element + "__editor").getParentNode();
|
158
|
+
callbacks = Ajax.checkCallbacks(callbacks);
|
159
|
+
Ajax.Load("RAW", action_path + "?raw=" + escape(newValue), {
|
160
|
+
success: chainMethods([
|
161
|
+
callbacks.success,
|
162
|
+
function(result){
|
163
|
+
wrapper.setInnerXHTML('<span>'+
|
164
|
+
'<textarea id="'+target_element+'__value" name="'+target_element+'__value" style="display:none;">'+unescape(result.replace(/<br \/>|<br\/>/g,'\n').replace(/<p>|<\/p>/g,''))+'</textarea>'+
|
165
|
+
'<div><div id="'+target_element+'" class="'+classname+'" type="text">'+unescape(result)+'</div></div></span>');
|
166
|
+
}
|
167
|
+
])
|
168
|
+
}, post_parameters)
|
169
|
+
};
|
170
|
+
},
|
171
|
+
/*
|
172
|
+
* Pass the data inside of a form to a target url and place the result inside target_element.
|
173
|
+
* Calls the 'success' callback with the result
|
174
|
+
*/
|
175
|
+
UpdateRemoteForm: function(form_element, target_element, response_type, target_action, callbacks) {
|
176
|
+
callbacks = callbacks || {};
|
177
|
+
Ajax.Update(target_element, response_type, target_action, callbacks, $(form_element).serialize());
|
178
|
+
},
|
179
|
+
checkCallbacks:function(callbacks) {
|
180
|
+
callbacks = callbacks || {};
|
181
|
+
var donothing = function(){};
|
182
|
+
return callbacks = {
|
183
|
+
success: callbacks.success || donothing,
|
184
|
+
failure: callbacks.failure || donothing,
|
185
|
+
begin: callbacks.begin || donothing,
|
186
|
+
complete: callbacks.complete || donothing
|
187
|
+
};
|
188
|
+
}
|
189
|
+
});
|
190
|
+
|
191
|
+
/*
|
192
|
+
* Displays a confirmation dialog. If the user clicks "continue" then callback will be evaluated.
|
193
|
+
* title and message can be strings or fb:js-string objects
|
194
|
+
*/
|
195
|
+
function confirm(title,message,callback) {
|
196
|
+
dialog = new Dialog(Dialog.DIALOG_POP);
|
197
|
+
|
198
|
+
dialog.showChoice(
|
199
|
+
title,
|
200
|
+
message, // Content
|
201
|
+
'Continue',
|
202
|
+
'Cancel');
|
203
|
+
|
204
|
+
dialog.onconfirm = function() {
|
205
|
+
callback();
|
206
|
+
};
|
207
|
+
}
|
208
|
+
|
209
|
+
function chainMethods(callbacks) {
|
210
|
+
return function(par1,par2,par3,par4,par5,par6) {
|
211
|
+
for (var i = 0, l = callbacks.length; i < l; i++) {
|
212
|
+
callbacks[i](par1, par2, par3, par4, par5, par6);
|
213
|
+
}
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
function extendInstance(instance,hash) {
|
218
|
+
for (var name in hash) {
|
219
|
+
instance[name] = hash[name];
|
220
|
+
}
|
15
221
|
}
|
16
222
|
|
17
223
|
var Element = {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
224
|
+
visible: function() {
|
225
|
+
return (this.getStyle('display') != 'none');
|
226
|
+
},
|
227
|
+
toggle: function() {
|
228
|
+
if (this.visible()) {
|
229
|
+
this.hide();
|
230
|
+
} else {
|
231
|
+
this.show();
|
232
|
+
}
|
233
|
+
},
|
234
|
+
hide: function() {
|
235
|
+
this.setStyle({
|
236
|
+
display:'none'
|
237
|
+
});
|
238
|
+
return this;
|
239
|
+
},
|
240
|
+
show: function(element) {
|
241
|
+
this.setStyle({
|
242
|
+
display:''
|
243
|
+
});
|
244
|
+
return this;
|
245
|
+
},
|
246
|
+
remove: function() {
|
247
|
+
this.getParentNode().removeChild(this);
|
248
|
+
return null;
|
249
|
+
},
|
250
|
+
/*
|
251
|
+
* Returns calculated element size
|
252
|
+
*/
|
253
|
+
getDimensions: function() {
|
254
|
+
var display = this.getStyle('display');
|
255
|
+
if (display != 'none' && display != null) // Safari bug
|
256
|
+
return {
|
257
|
+
width: this.getOffsetWidth(),
|
258
|
+
height: this.getOffsetHeight()
|
259
|
+
};
|
260
|
+
|
261
|
+
// All *Width and *Height properties give 0 on elements with display none,
|
262
|
+
// so enable the element temporarily
|
263
|
+
var originalVisibility = this.getStyle("visibility");
|
264
|
+
var originalDisplay = this.getStyle("display");
|
265
|
+
var originalPosition = this.getStyle("position");
|
266
|
+
this.setStyle('visibility','none');
|
267
|
+
this.setStyle('display','block');
|
268
|
+
this.setStyle('position','absolute');
|
269
|
+
var originalWidth = this.getClientWidth();
|
270
|
+
var originalHeight = this.getClientHeight();
|
271
|
+
this.setStyle('visibility',originalVisibility);
|
272
|
+
this.setStyle('display',originalDisplay);
|
273
|
+
this.setStyle('position',originalPosition);
|
274
|
+
|
275
|
+
return {
|
276
|
+
width: originalWidth,
|
277
|
+
height: originalHeight
|
278
|
+
};
|
32
279
|
}
|
33
|
-
|
34
|
-
};
|
280
|
+
}
|
35
281
|
|
36
282
|
function encodeURIComponent(str) {
|
37
|
-
|
38
|
-
|
39
|
-
}
|
40
|
-
//checkboxes and radio buttons return objects instead of a string
|
41
|
-
else if(typeof(str) == "object"){
|
42
|
-
for (prop in str)
|
43
|
-
{
|
44
|
-
return str[prop].replace(/=/g,'%3D').replace(/&/g,'%26');
|
283
|
+
if (typeof(str) == "string") {
|
284
|
+
return str.replace(/=/g,'%3D').replace(/&/g,'%26');
|
45
285
|
}
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
}
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
this.ajax.responseType = Ajax.FBML;
|
64
|
-
this.ajax.ondone = function(data) {
|
65
|
-
$(container).setInnerFBML(data);
|
286
|
+
//checkboxes and radio buttons return objects instead of a string
|
287
|
+
else if(typeof(str) == "object"){
|
288
|
+
for (prop in str)
|
289
|
+
{
|
290
|
+
return str[prop].replace(/=/g,'%3D').replace(/&/g,'%26');
|
291
|
+
}
|
292
|
+
}
|
293
|
+
return "";
|
294
|
+
}
|
295
|
+
|
296
|
+
/*
|
297
|
+
* Applies block to all elements of an array. Return the array itself.
|
298
|
+
*/
|
299
|
+
function map(array, block){
|
300
|
+
results = [];
|
301
|
+
for (var i=0,l=array.length;i<l;i++){
|
302
|
+
results.push(block(array[i]));
|
66
303
|
}
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
}
|
86
|
-
|
87
|
-
|
88
|
-
|
304
|
+
return results;
|
305
|
+
}
|
306
|
+
|
307
|
+
/*
|
308
|
+
* Collects all elements within the 'element' tree that 'matcher' returns true for
|
309
|
+
* For an example, see selectElementsByClass
|
310
|
+
*/
|
311
|
+
function domCollect(element, matcher) {
|
312
|
+
collection = [];
|
313
|
+
var recurse = function(subelement){
|
314
|
+
var nodes = subelement.getChildNodes();
|
315
|
+
map(nodes, function(node){
|
316
|
+
if (matcher(node)) {
|
317
|
+
extendInstance(node,Element)
|
318
|
+
collection.push(node);
|
319
|
+
}
|
320
|
+
if (node.getFirstChild()) {
|
321
|
+
recurse(node);
|
322
|
+
}
|
323
|
+
});
|
324
|
+
};
|
325
|
+
recurse(element);
|
326
|
+
return collection;
|
327
|
+
}
|
89
328
|
|
90
329
|
PeriodicalExecuter = function (callback, frequency) {
|
91
330
|
setTimeout(callback, frequency *1000);
|
92
331
|
setTimeout(function() { new PeriodicalExecuter(callback,frequency); }, frequency*1000);
|
93
|
-
};
|
332
|
+
};
|
data/lib/facebooker.rb
CHANGED
@@ -224,6 +224,7 @@ require 'facebooker/service/net_http_service'
|
|
224
224
|
require 'facebooker/server_cache'
|
225
225
|
require 'facebooker/data'
|
226
226
|
require 'facebooker/admin'
|
227
|
+
require 'facebooker/application'
|
227
228
|
require 'facebooker/mobile'
|
228
229
|
require 'facebooker/session'
|
229
230
|
require 'facebooker/version'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Facebooker
|
2
|
+
class Application
|
3
|
+
def initialize(session)
|
4
|
+
@session = session
|
5
|
+
end
|
6
|
+
|
7
|
+
# +properties+: Hash of properties of the desired application. Specify exactly one of: application_id, application_api_key or application_canvas_name
|
8
|
+
def get_public_info(properties)
|
9
|
+
properties = properties.respond_to?(:to_json) ? properties.to_json : properties
|
10
|
+
(@session.post 'facebook.application.getPublicInfo', :properties => properties)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/facebooker/parser.rb
CHANGED
@@ -282,6 +282,12 @@ module Facebooker
|
|
282
282
|
element('admin_getAllocation_response', data).content.strip
|
283
283
|
end
|
284
284
|
end
|
285
|
+
|
286
|
+
class GetPublicInfo < Parser#:nodoc:
|
287
|
+
def self.process(data)
|
288
|
+
hashinate(element('application_getPublicInfo_response', data))
|
289
|
+
end
|
290
|
+
end
|
285
291
|
|
286
292
|
class BatchRun < Parser #:nodoc:
|
287
293
|
class << self
|
@@ -668,6 +674,7 @@ module Facebooker
|
|
668
674
|
'facebook.admin.setRestrictionInfo' => SetRestrictionInfo,
|
669
675
|
'facebook.admin.getRestrictionInfo' => GetRestrictionInfo,
|
670
676
|
'facebook.admin.getAllocation' => GetAllocation,
|
677
|
+
'facebook.application.getPublicInfo' => GetPublicInfo,
|
671
678
|
'facebook.batch.run' => BatchRun,
|
672
679
|
'facebook.fql.query' => FqlQuery,
|
673
680
|
'facebook.fql.multiquery' => FqlMultiquery,
|
@@ -294,6 +294,9 @@ module Facebooker
|
|
294
294
|
def ensure_has_create_listing
|
295
295
|
has_extended_permission?("create_listing") || application_needs_permission("create_listing")
|
296
296
|
end
|
297
|
+
def ensure_has_create_event
|
298
|
+
has_extended_permission?("create_event") || application_needs_permission("create_event")
|
299
|
+
end
|
297
300
|
|
298
301
|
def application_needs_permission(perm)
|
299
302
|
top_redirect_to(facebook_session.permission_url(perm))
|
@@ -24,6 +24,11 @@ module Facebooker
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
def fbjs_library
|
28
|
+
"<script>var _token = '#{form_authenticity_token}';var _hostname = '#{ActionController::Base.asset_host}'</script>"+
|
29
|
+
"#{javascript_include_tag 'facebooker'}"
|
30
|
+
end
|
31
|
+
|
27
32
|
def fb_iframe(src, options = {})
|
28
33
|
content_tag "fb:iframe", '', options.merge({ :src => src })
|
29
34
|
end
|
data/lib/facebooker/session.rb
CHANGED
@@ -219,12 +219,16 @@ module Facebooker
|
|
219
219
|
user
|
220
220
|
when 'photo'
|
221
221
|
Photo.from_hash(hash)
|
222
|
+
when 'album'
|
223
|
+
Album.from_hash(hash)
|
222
224
|
when 'page'
|
223
225
|
Page.from_hash(hash)
|
224
226
|
when 'page_admin'
|
225
227
|
Page.from_hash(hash)
|
226
228
|
when 'group'
|
227
229
|
Group.from_hash(hash)
|
230
|
+
when 'event'
|
231
|
+
Event.from_hash(hash)
|
228
232
|
when 'event_member'
|
229
233
|
Event::Attendance.from_hash(hash)
|
230
234
|
else
|
@@ -273,7 +277,8 @@ module Facebooker
|
|
273
277
|
# :end_time => Filter with this UTC as upper bound. A missing or zero parameter indicates no upper bound. (Time or Integer)
|
274
278
|
# :rsvp_status => Filter by this RSVP status.
|
275
279
|
def events(options = {})
|
276
|
-
@events ||=
|
280
|
+
@events ||= {}
|
281
|
+
@events[options.to_s] ||= post('facebook.events.get', options) do |response|
|
277
282
|
response.map do |hash|
|
278
283
|
Event.from_hash(hash)
|
279
284
|
end
|
@@ -298,7 +303,8 @@ module Facebooker
|
|
298
303
|
end
|
299
304
|
|
300
305
|
def event_members(eid)
|
301
|
-
@members ||=
|
306
|
+
@members ||= {}
|
307
|
+
@members[eid] ||= post('facebook.events.getMembers', :eid => eid) do |response|
|
302
308
|
response.map do |attendee_hash|
|
303
309
|
Event::Attendance.from_hash(attendee_hash)
|
304
310
|
end
|
@@ -350,6 +356,10 @@ module Facebooker
|
|
350
356
|
def admin
|
351
357
|
Facebooker::Admin.new(self)
|
352
358
|
end
|
359
|
+
|
360
|
+
def application
|
361
|
+
Facebooker::Application.new(self)
|
362
|
+
end
|
353
363
|
|
354
364
|
def mobile
|
355
365
|
Facebooker::Mobile.new(self)
|
data/lib/facebooker/version.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class Facebooker::ApplicationTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@session = Facebooker::Session.create('apikey', 'secretkey')
|
6
|
+
Facebooker.use_curl=false
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_can_get_public_info
|
10
|
+
mock_http = establish_session
|
11
|
+
mock_http.should_receive(:post_form).and_return(example_get_public_info_xml).once.ordered(:posts)
|
12
|
+
info = @session.application.get_public_info(:app_id => 2413267546)
|
13
|
+
assert_equal '2413267546', info["app_id"]
|
14
|
+
assert_equal 'ilike', info["canvas_name"]
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def example_get_public_info_xml
|
20
|
+
<<-XML
|
21
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
22
|
+
<application_getPublicInfo_response
|
23
|
+
xmlns="http://api.facebook.com/1.0/"
|
24
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
25
|
+
xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd">
|
26
|
+
<app_id>2413267546</app_id>
|
27
|
+
<api_key>c756401cb800e295f21d723b7842ea83</api_key>
|
28
|
+
<canvas_name>ilike</canvas_name>
|
29
|
+
<display_name>iLike</display_name>
|
30
|
+
<icon_url>http://photos-c.ak.facebook.com/photos-ak-sctm/v43/130/2413267546/app_2_2413267546_6706.gif</icon_url>
|
31
|
+
<logo_url>http://photos-c.ak.facebook.com/photos-ak-sctm/v43/130/2413267546/app_1_2413267546_2324.gif</logo_url>
|
32
|
+
<developers list="true"/>
|
33
|
+
<company_name>iLike, inc</company_name>
|
34
|
+
<description>iLike lets you add music to your profile and find your favorite concerts (not to mention see who else is going!). Bonus: Use it to get free mp3’s that match your tastes and try to beat your friends at the Music Challenge.</description>
|
35
|
+
<daily_active_users>392008</daily_active_users>
|
36
|
+
<weekly_active_users>1341749</weekly_active_users>
|
37
|
+
<monthly_active_users>3922784</monthly_active_users>
|
38
|
+
</application_getPublicInfo_response>
|
39
|
+
XML
|
40
|
+
end
|
41
|
+
end
|
@@ -25,6 +25,7 @@ class ControllerWhichRequiresExtendedPermissions< NoisyController
|
|
25
25
|
before_filter :ensure_has_photo_upload
|
26
26
|
before_filter :ensure_has_video_upload
|
27
27
|
before_filter :ensure_has_create_listing
|
28
|
+
before_filter :ensure_has_create_event
|
28
29
|
def index
|
29
30
|
render :text => 'score!'
|
30
31
|
end
|
@@ -229,23 +230,28 @@ class RailsIntegrationTestForExtendedPermissions < Test::Unit::TestCase
|
|
229
230
|
assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=status_update\" />", @response.body)
|
230
231
|
end
|
231
232
|
def test_redirects_without_photo_upload
|
232
|
-
post :index, facebook_params(:fb_sig_ext_perms=>"status_update")
|
233
|
+
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,create_event")
|
233
234
|
assert_response :success
|
234
235
|
assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=photo_upload\" />", @response.body)
|
235
236
|
end
|
236
237
|
def test_redirects_without_video_upload
|
237
|
-
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload")
|
238
|
+
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_event")
|
238
239
|
assert_response :success
|
239
240
|
assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=video_upload\" />", @response.body)
|
240
241
|
end
|
241
242
|
def test_redirects_without_create_listing
|
242
|
-
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,video_upload")
|
243
|
+
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,video_upload,create_event")
|
243
244
|
assert_response :success
|
244
245
|
assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_listing\" />", @response.body)
|
245
246
|
end
|
247
|
+
def test_redirects_without_create_event
|
248
|
+
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload")
|
249
|
+
assert_response :success
|
250
|
+
assert_equal("<fb:redirect url=\"http://www.facebook.com/authorize.php?api_key=1234567&v=1.0&ext_perm=create_event\" />", @response.body)
|
251
|
+
end
|
246
252
|
|
247
253
|
def test_renders_with_permission
|
248
|
-
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload")
|
254
|
+
post :index, facebook_params(:fb_sig_ext_perms=>"status_update,photo_upload,create_listing,video_upload,create_event")
|
249
255
|
assert_response :success
|
250
256
|
assert_equal("score!", @response.body)
|
251
257
|
|
@@ -864,6 +870,11 @@ class RailsHelperTest < Test::Unit::TestCase
|
|
864
870
|
(@h.fb_multi_friend_request("invite","ignored","action") {})
|
865
871
|
end
|
866
872
|
|
873
|
+
def test_fbjs_library
|
874
|
+
@h.expects(:form_authenticity_token).returns('form_token')
|
875
|
+
assert_equal "<script>var _token = 'form_token';var _hostname = 'http://facebook.host.com'</script><script src=\"http://facebook.host.com/javascripts/facebooker.js\" type=\"text/javascript\"></script>", @h.fbjs_library
|
876
|
+
end
|
877
|
+
|
867
878
|
def test_fb_dialog
|
868
879
|
@h.expects(:capture).returns("dialog content")
|
869
880
|
@h.fb_dialog( "my_dialog", "1" ) do
|
@@ -148,6 +148,22 @@ class Facebooker::SessionTest < Test::Unit::TestCase
|
|
148
148
|
assert_kind_of(Facebooker::Event::Attendance, response.first)
|
149
149
|
assert_equal('attending', response.first.rsvp_status)
|
150
150
|
end
|
151
|
+
|
152
|
+
def test_can_fql_query_for_events
|
153
|
+
@session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
|
154
|
+
expect_http_posts_with_responses(example_fql_query_events_xml)
|
155
|
+
response = @session.fql_query("DOES NOT REALLY MATTER FOR TEST")
|
156
|
+
assert_kind_of(Facebooker::Event, response.first)
|
157
|
+
assert_equal('Technology Tasting', response.first.name)
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_can_fql_query_for_albums
|
161
|
+
@session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY'])
|
162
|
+
expect_http_posts_with_responses(example_fql_query_albums_xml)
|
163
|
+
response = @session.fql_query("DOES NOT REALLY MATTER FOR TEST")
|
164
|
+
assert_kind_of(Facebooker::Album, response.first)
|
165
|
+
assert_equal('Films you will never see', response.first.name)
|
166
|
+
end
|
151
167
|
|
152
168
|
def test_can_query_for_event_members
|
153
169
|
expect_http_posts_with_responses(example_event_members_xml)
|
@@ -158,6 +174,15 @@ class Facebooker::SessionTest < Test::Unit::TestCase
|
|
158
174
|
assert_equal 5, event_attendances.size
|
159
175
|
end
|
160
176
|
|
177
|
+
def test_query_for_event_members_caching_honors_params
|
178
|
+
@session.expects(:post).returns(["1"])
|
179
|
+
assert_equal ["1"], @session.event_members(100)
|
180
|
+
@session.expects(:post).returns(["2"])
|
181
|
+
assert_equal ["2"],@session.event_members(200)
|
182
|
+
@session.expects(:post).never
|
183
|
+
assert_equal ["1"],@session.event_members(100)
|
184
|
+
end
|
185
|
+
|
161
186
|
def test_can_create_events
|
162
187
|
mock_http = establish_session
|
163
188
|
mock_http.should_receive(:post_multipart_form).and_return(example_event_create_xml).once
|
@@ -175,6 +200,15 @@ class Facebooker::SessionTest < Test::Unit::TestCase
|
|
175
200
|
events = @session.events
|
176
201
|
assert_equal 'Technology Tasting', events.first.name
|
177
202
|
end
|
203
|
+
|
204
|
+
def test_query_for_events_caching_honors_params
|
205
|
+
@session.expects(:post).returns([{:eid=>1}])
|
206
|
+
assert_equal 1, @session.events.first[:eid]
|
207
|
+
@session.expects(:post).returns([{:eid=>2}])
|
208
|
+
assert_equal 2,@session.events(:start_time=>1.day.ago).first[:eid]
|
209
|
+
@session.expects(:post).never
|
210
|
+
assert_equal 1,@session.events.first[:eid]
|
211
|
+
end
|
178
212
|
|
179
213
|
def test_can_query_for_groups
|
180
214
|
expect_http_posts_with_responses(example_groups_get_xml)
|
@@ -510,6 +544,61 @@ XML
|
|
510
544
|
</fql_query_response>
|
511
545
|
XML
|
512
546
|
end
|
547
|
+
|
548
|
+
def example_fql_query_events_xml
|
549
|
+
<<-XML
|
550
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
551
|
+
<fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true">
|
552
|
+
<event>
|
553
|
+
<eid>1037629024</eid>
|
554
|
+
<name>Technology Tasting</name>
|
555
|
+
<tagline>Who said Engineering can't be delicious?</tagline>
|
556
|
+
<nid>12409987</nid>
|
557
|
+
<pic>http://photos-628.facebook.com/ip006/object/1345/48/s1037629024_30775.jpg</pic>
|
558
|
+
<pic_big>http://photos-628.facebook.com/ip006/object/1345/48/n1037629024_30775.jpg</pic_big>
|
559
|
+
<pic_small>http://photos-628.facebook.com/ip006/object/1345/48/t1037629024_30775.jpg</pic_small>
|
560
|
+
<host>Facebook</host>
|
561
|
+
<description>Facebook will be hosting technology thought leaders and avid software engineers for a social evening of technology tasting. We invite you to connect with some of our newest technologies and innovative people over hors d'oeuvres and wine. Come share ideas, ask questions, and challenge existing technology paradigms in the spirit of the open source community.</description>
|
562
|
+
<event_type>Party</event_type>
|
563
|
+
<event_subtype>Cocktail Party</event_subtype>
|
564
|
+
<start_time>1172107800</start_time>
|
565
|
+
<end_time>1172115000</end_time>
|
566
|
+
<creator>1078</creator>
|
567
|
+
<update_time>1170096157</update_time>
|
568
|
+
<location>Facebook's New Office</location>
|
569
|
+
<venue>
|
570
|
+
<street>156 University Ave.</street>
|
571
|
+
<city>Palo Alto</city>
|
572
|
+
<state>CA</state>
|
573
|
+
<country>United States</country>
|
574
|
+
</venue>
|
575
|
+
</event>
|
576
|
+
</fql_query_response>
|
577
|
+
XML
|
578
|
+
end
|
579
|
+
|
580
|
+
def example_fql_query_albums_xml
|
581
|
+
<<-XML
|
582
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
583
|
+
<fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true">
|
584
|
+
<album>
|
585
|
+
<aid>34595963571485</aid>
|
586
|
+
<cover_pid>34595991612812</cover_pid>
|
587
|
+
<owner>8055</owner>
|
588
|
+
<name>Films you will never see</name>
|
589
|
+
<created>1132553109</created>
|
590
|
+
<modified>1132553363</modified>
|
591
|
+
<description>No I will not make out with you</description>
|
592
|
+
<location>York, PA</location>
|
593
|
+
<link>http://www.facebook.com/album.php?aid=2002205&id=8055</link>
|
594
|
+
<size>30</size>
|
595
|
+
<visible>friends</visible>
|
596
|
+
<modified_major>1241834423</modified_major>
|
597
|
+
</album>
|
598
|
+
</fql_query_response>
|
599
|
+
XML
|
600
|
+
end
|
601
|
+
|
513
602
|
def example_check_friendship_xml
|
514
603
|
<<-XML
|
515
604
|
<?xml version="1.0" encoding="UTF-8"?>
|
@@ -579,7 +668,7 @@ XML
|
|
579
668
|
</fql_query_response>
|
580
669
|
XML
|
581
670
|
end
|
582
|
-
|
671
|
+
|
583
672
|
def example_fql_for_multiple_photos_with_anon_xml
|
584
673
|
<<-XML
|
585
674
|
<?xml version="1.0" encoding="UTF-8"?>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facebooker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.53
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chad Fowler
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2009-
|
17
|
+
date: 2009-10-02 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/facebooker/adapters/bebo_adapter.rb
|
113
113
|
- lib/facebooker/adapters/facebook_adapter.rb
|
114
114
|
- lib/facebooker/admin.rb
|
115
|
+
- lib/facebooker/application.rb
|
115
116
|
- lib/facebooker/batch_request.rb
|
116
117
|
- lib/facebooker/data.rb
|
117
118
|
- lib/facebooker/feed.rb
|
@@ -181,6 +182,7 @@ files:
|
|
181
182
|
- templates/layout.erb
|
182
183
|
- test/facebooker/adapters_test.rb
|
183
184
|
- test/facebooker/admin_test.rb
|
185
|
+
- test/facebooker/application_test.rb
|
184
186
|
- test/facebooker/batch_request_test.rb
|
185
187
|
- test/facebooker/data_test.rb
|
186
188
|
- test/facebooker/logging_test.rb
|
@@ -235,6 +237,7 @@ summary: Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {RE
|
|
235
237
|
test_files:
|
236
238
|
- test/facebooker/adapters_test.rb
|
237
239
|
- test/facebooker/admin_test.rb
|
240
|
+
- test/facebooker/application_test.rb
|
238
241
|
- test/facebooker/batch_request_test.rb
|
239
242
|
- test/facebooker/data_test.rb
|
240
243
|
- test/facebooker/logging_test.rb
|