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 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.52"
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-09-30}
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
- if (typeof element == "string") {
4
- element=document.getElementById(element);
5
- }
6
- if (element)
7
- extend_instance(element,Element);
8
- return element;
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 extend_instance(instance,hash) {
12
- for (var name in hash) {
13
- instance[name] = hash[name];
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
- "hide": function () {
19
- this.setStyle("display","none")
20
- },
21
- "show": function () {
22
- this.setStyle("display","block")
23
- },
24
- "visible": function () {
25
- return (this.getStyle("display") != "none");
26
- },
27
- "toggle": function () {
28
- if (this.visible) {
29
- this.hide();
30
- } else {
31
- this.show();
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
- if (typeof(str) == "string") {
38
- return str.replace(/=/g,'%3D').replace(/&/g,'%26');
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
- var Form = {};
50
- Form.serialize = function(form_element) {
51
- return $(form_element).serialize();
52
- };
53
-
54
- Ajax.Updater = function (container,url,options) {
55
- this.container = container;
56
- this.url=url;
57
- this.ajax = new Ajax();
58
- this.ajax.requireLogin = 1;
59
- if (options["onSuccess"]) {
60
- this.ajax.responseType = Ajax.JSON;
61
- this.ajax.ondone = options["onSuccess"];
62
- } else {
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
- if (options["onFailure"]) {
69
- this.ajax.onerror = options["onFailure"];
70
- }
71
-
72
- if (!options['parameters']) {
73
- options['parameters'] = {}
74
- }
75
-
76
- // simulate other verbs over post
77
- if (options['method']) {
78
- options['parameters']['_method'] = options['method'];
79
- }
80
-
81
- this.ajax.post(url,options['parameters']);
82
- if (options["onLoading"]) {
83
- options["onLoading"].call()
84
- }
85
- };
86
- Ajax.Request = function(url,options) {
87
- Ajax.Updater('unused',url,options);
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
@@ -5,7 +5,7 @@ module Facebooker
5
5
  class Album
6
6
  include Model
7
7
  attr_accessor :aid, :cover_pid, :owner, :name, :created,
8
- :modified, :description, :location, :link, :size
8
+ :modified, :description, :location, :link, :size, :visible
9
9
 
10
10
  end
11
11
  end
@@ -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
@@ -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 ||= post('facebook.events.get', options) do |response|
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 ||= post('facebook.events.getMembers', :eid => eid) do |response|
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)
@@ -2,7 +2,7 @@ module Facebooker #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 52
5
+ TINY = 53
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -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.52
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-09-30 00:00:00 -04:00
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