facebooker 1.0.65 → 1.0.66
Sign up to get free protection for your applications and to get access to all the features.
- data/facebooker.gemspec +2 -2
- data/generators/xd_receiver/templates/xd_receiver.html +2 -2
- data/lib/facebooker/models/user.rb +6 -0
- data/lib/facebooker/parser.rb +24 -34
- data/lib/facebooker/rails/helpers/fb_connect.rb +6 -3
- data/lib/facebooker/version.rb +1 -1
- data/test/facebooker/application_test.rb +1 -1
- data/test/facebooker/models/user_test.rb +6 -7
- data/test/facebooker_test.rb +11 -2
- metadata +2 -2
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.66"
|
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{2010-03-
|
9
|
+
s.date = %q{2010-03-24}
|
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
|
@@ -5,6 +5,6 @@
|
|
5
5
|
<title>Cross-Domain Receiver Page</title>
|
6
6
|
</head>
|
7
7
|
<body>
|
8
|
-
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.
|
8
|
+
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script>
|
9
9
|
</body>
|
10
|
-
</html>
|
10
|
+
</html>
|
@@ -477,6 +477,12 @@ module Facebooker
|
|
477
477
|
ext_perms.all?{|p| has_permission?(p)}
|
478
478
|
end
|
479
479
|
|
480
|
+
##
|
481
|
+
## Revoke any extended permission given by a user
|
482
|
+
def revoke_permission(ext_perm)
|
483
|
+
session.post('facebook.auth.revokeExtendedPermission', { :perm => ext_perm, :uid => uid }, false)
|
484
|
+
end
|
485
|
+
|
480
486
|
##
|
481
487
|
# Convenience method to send email to the current user
|
482
488
|
def send_email(subject, text=nil, fbml=nil)
|
data/lib/facebooker/parser.rb
CHANGED
@@ -109,34 +109,35 @@ module Facebooker
|
|
109
109
|
end #do |hash, child|
|
110
110
|
end
|
111
111
|
|
112
|
-
def self.hash_by_key_or_value_for(element)
|
112
|
+
def self.hash_by_key_or_value_for(element, convert_1_to_true=false)
|
113
113
|
if element.children.size == 0
|
114
114
|
{ element['key'] => nil }
|
115
115
|
elsif element.children.size == 1 && element.children.first.text?
|
116
|
-
{ element['key'] => element.content.strip }
|
116
|
+
{ element['key'] => (convert_1_to_true ? element.content.strip == '1' : element.content.strip) }
|
117
117
|
else
|
118
|
-
hashinate_by_key(element)
|
118
|
+
hashinate_by_key(element, convert_1_to_true)
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
122
|
# A modification to hashinate. The new dashboard API returns XML in a different format than
|
123
123
|
# the other calls. What used to be the element name has become an attribute called "key".
|
124
|
-
def self.hashinate_by_key(response_element)
|
124
|
+
def self.hashinate_by_key(response_element, convert_1_to_true=false)
|
125
125
|
response_element.children.reject{|c| c.text? }.inject({}) do |hash, child|
|
126
|
+
|
126
127
|
# If the node hasn't any child, and is not a list, we want empty strings, not empty hashes,
|
127
128
|
# except if attributes['nil'] == true
|
128
129
|
hash[child['key']] =
|
129
130
|
if (child['nil'] == 'true')
|
130
131
|
nil
|
131
132
|
elsif (child.children.size == 1 && child.children.first.text?) || (child.children.size == 0 && child['list'] != 'true')
|
132
|
-
anonymous_field_from(child, hash) || child.content.strip
|
133
|
-
elsif child['list'] == 'true' && child.children.all? { |subchild| subchild['key'].nil? }
|
134
|
-
child.children.reject{|c| c.text? }.map { |subchild| hash_by_key_or_value_for(subchild)}
|
133
|
+
anonymous_field_from(child, hash) || (convert_1_to_true ? child.content.strip == '1' : child.content.strip)
|
134
|
+
elsif child['list'] == 'true' && child.children.reject {|subchild| subchild.text?}.all? { |subchild| !subchild.text? && subchild['key'].nil? }
|
135
|
+
child.children.reject{|c| c.text? }.map { |subchild| hash_by_key_or_value_for(subchild, convert_1_to_true)}
|
135
136
|
elsif child['list'] == 'true'
|
136
|
-
hash_by_key_or_value_for(child)
|
137
|
+
hash_by_key_or_value_for(child, convert_1_to_true)
|
137
138
|
else
|
138
139
|
child.children.reject{|c| c.text? }.inject({}) do |subhash, subchild|
|
139
|
-
subhash[subchild['key']] = hash_by_key_or_value_for(subchild)
|
140
|
+
subhash[subchild['key']] = hash_by_key_or_value_for(subchild, convert_1_to_true)
|
140
141
|
subhash
|
141
142
|
end
|
142
143
|
end
|
@@ -164,6 +165,12 @@ module Facebooker
|
|
164
165
|
end
|
165
166
|
end
|
166
167
|
|
168
|
+
class RevokeExtendedPermission < Parser#:nodoc:
|
169
|
+
def self.process(data)
|
170
|
+
booleanize(element('auth_revokeExtendedPermission_response', data).content.strip)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
167
174
|
class CreateToken < Parser#:nodoc:
|
168
175
|
def self.process(data)
|
169
176
|
element('auth_createToken_response', data).content.strip
|
@@ -711,40 +718,22 @@ module Facebooker
|
|
711
718
|
|
712
719
|
class DashboardMultiSetCount < Parser
|
713
720
|
def self.process(data)
|
714
|
-
hashinate_by_key(element('dashboard_multiSetCount_response', data))
|
721
|
+
hashinate_by_key(element('dashboard_multiSetCount_response', data), true)
|
715
722
|
end
|
716
723
|
end
|
717
724
|
|
718
725
|
class DashboardMultiIncrementCount < Parser
|
719
726
|
def self.process(data)
|
720
|
-
hashinate_by_key(element('dashboard_multiIncrementCount_response', data))
|
727
|
+
hashinate_by_key(element('dashboard_multiIncrementCount_response', data), true)
|
721
728
|
end
|
722
729
|
end
|
723
730
|
|
724
731
|
class DashboardMultiDecrementCount < Parser
|
725
732
|
def self.process(data)
|
726
|
-
hashinate_by_key(element('dashboard_multiDecrementCount_response', data))
|
733
|
+
hashinate_by_key(element('dashboard_multiDecrementCount_response', data), true)
|
727
734
|
end
|
728
735
|
end
|
729
736
|
|
730
|
-
class DashboardMultiSetCount < Parser
|
731
|
-
def self.process(data)
|
732
|
-
hashinate_by_key(element('dashboard_multiSetCount_response', data))
|
733
|
-
end
|
734
|
-
end
|
735
|
-
|
736
|
-
class DashboardMultiIncrementCount < Parser
|
737
|
-
def self.process(data)
|
738
|
-
hashinate_by_key(element('dashboard_multiIncrementCount_response', data))
|
739
|
-
end
|
740
|
-
end
|
741
|
-
|
742
|
-
class DashboardMultiDecrementCount < Parser
|
743
|
-
def self.process(data)
|
744
|
-
hashinate_by_key(element('dashboard_multiDecrementCount_response', data))
|
745
|
-
end
|
746
|
-
end
|
747
|
-
|
748
737
|
class DashboardAddGlobalNews < Parser
|
749
738
|
def self.process(data)
|
750
739
|
element('dashboard_addGlobalNews_response', data).content.strip
|
@@ -760,7 +749,7 @@ module Facebooker
|
|
760
749
|
|
761
750
|
class DashboardClearGlobalNews < Parser
|
762
751
|
def self.process(data)
|
763
|
-
hashinate_by_key(element('dashboard_clearGlobalNews_response', data))
|
752
|
+
hashinate_by_key(element('dashboard_clearGlobalNews_response', data), true)
|
764
753
|
end
|
765
754
|
end
|
766
755
|
|
@@ -778,7 +767,7 @@ module Facebooker
|
|
778
767
|
|
779
768
|
class DashboardClearNews < Parser
|
780
769
|
def self.process(data)
|
781
|
-
hashinate_by_key(element('dashboard_clearNews_response', data))
|
770
|
+
hashinate_by_key(element('dashboard_clearNews_response', data), true)
|
782
771
|
end
|
783
772
|
end
|
784
773
|
|
@@ -790,7 +779,7 @@ module Facebooker
|
|
790
779
|
|
791
780
|
class DashboardMultiClearNews < Parser
|
792
781
|
def self.process(data)
|
793
|
-
hashinate_by_key(element('dashboard_multiClearNews_response', data))
|
782
|
+
hashinate_by_key(element('dashboard_multiClearNews_response', data), true)
|
794
783
|
end
|
795
784
|
end
|
796
785
|
|
@@ -808,7 +797,7 @@ module Facebooker
|
|
808
797
|
|
809
798
|
class DashboardRemoveActivity < Parser
|
810
799
|
def self.process(data)
|
811
|
-
hashinate_by_key(element('dashboard_removeActivity_response', data))
|
800
|
+
hashinate_by_key(element('dashboard_removeActivity_response', data), true)
|
812
801
|
end
|
813
802
|
end
|
814
803
|
|
@@ -875,6 +864,7 @@ module Facebooker
|
|
875
864
|
class Parser
|
876
865
|
PARSERS = {
|
877
866
|
'facebook.auth.revokeAuthorization' => RevokeAuthorization,
|
867
|
+
'facebook.auth.revokeExtendedPermission' => RevokeExtendedPermission,
|
878
868
|
'facebook.auth.createToken' => CreateToken,
|
879
869
|
'facebook.auth.getSession' => GetSession,
|
880
870
|
'facebook.connect.registerUsers' => RegisterUsers,
|
@@ -20,14 +20,18 @@ module Facebooker
|
|
20
20
|
# and Rails' Hash#to_json always quotes strings so there is no way to indicate when the value should be a javascript function.
|
21
21
|
# For this reason :app_settings needs to be a string that is valid JSON (including the {}'s).
|
22
22
|
#
|
23
|
-
def init_fb_connect(*required_features
|
23
|
+
def init_fb_connect(*required_features, &proc)
|
24
|
+
init_fb_connect_with_options({},*required_features, &proc)
|
25
|
+
end
|
26
|
+
|
27
|
+
def init_fb_connect_with_options(options = {},*required_features, &proc)
|
24
28
|
additions = ""
|
25
29
|
if block_given?
|
26
30
|
additions = capture(&proc)
|
27
31
|
end
|
28
32
|
|
29
33
|
# Yes, app_settings is set to a string of an empty JSON element. That's intentional.
|
30
|
-
options = {:
|
34
|
+
options = options.merge({:app_settings => '{}'})
|
31
35
|
|
32
36
|
if required_features.last.is_a?(Hash)
|
33
37
|
options.merge!(required_features.pop.symbolize_keys)
|
@@ -42,7 +46,6 @@ module Facebooker
|
|
42
46
|
init_string = <<-FBML
|
43
47
|
#{case options[:js]
|
44
48
|
when :jquery then "jQuery(document).ready("
|
45
|
-
when :mootools then "window.addEvent('domready',"
|
46
49
|
when :dojo then "dojo.addOnLoad("
|
47
50
|
else "Element.observe(window,'load',"
|
48
51
|
end} function() {
|
data/lib/facebooker/version.rb
CHANGED
@@ -41,7 +41,7 @@ class Facebooker::ApplicationTest < Test::Unit::TestCase
|
|
41
41
|
|
42
42
|
def test_can_parse_global_news
|
43
43
|
expect_http_posts_with_responses(clear_global_news_xml)
|
44
|
-
assert_equal({"342345290762"=>
|
44
|
+
assert_equal({"342345290762"=>true}, @session.application.clear_global_news('342345290762'))
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
@@ -356,7 +356,6 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
356
356
|
|
357
357
|
def test_parse_increment_dashboard_count
|
358
358
|
expect_http_posts_with_responses(dashboard_increment_count_xml)
|
359
|
-
debugger
|
360
359
|
assert_equal true, @user.dashboard_increment_count
|
361
360
|
end
|
362
361
|
|
@@ -426,7 +425,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
426
425
|
|
427
426
|
def test_parse_dashboard_multi_set_count
|
428
427
|
expect_http_posts_with_responses(dashboard_multi_set_count_xml)
|
429
|
-
assert_equal({ '1234' =>
|
428
|
+
assert_equal({ '1234' => true, '4321' => true }, Facebooker::User.dashboard_multi_set_count({ '1234' => '11', '5678' => '22' }))
|
430
429
|
end
|
431
430
|
|
432
431
|
def test_can_dashboard_multi_get_count
|
@@ -456,7 +455,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
456
455
|
|
457
456
|
def test_parse_dashboard_multi_increment_count
|
458
457
|
expect_http_posts_with_responses(dashboard_multi_increment_count_xml)
|
459
|
-
assert_equal({ '1234' =>
|
458
|
+
assert_equal({ '1234' => true, '4321' => true }, Facebooker::User.dashboard_multi_increment_count(['1234', '4321']))
|
460
459
|
end
|
461
460
|
|
462
461
|
def test_can_dashboard_multi_decrement_count_with_single_uid
|
@@ -471,7 +470,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
471
470
|
|
472
471
|
def test_parse_dashboard_multi_decrement_count_with_array_of_uids
|
473
472
|
expect_http_posts_with_responses(dashboard_multi_decrement_count_xml)
|
474
|
-
assert_equal({ '1234' =>
|
473
|
+
assert_equal({ '1234' => true, '4321' => true }, Facebooker::User.dashboard_multi_decrement_count(['1234', '4321']))
|
475
474
|
end
|
476
475
|
# Dashboard
|
477
476
|
|
@@ -507,7 +506,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
507
506
|
|
508
507
|
def test_parse_clear_news
|
509
508
|
expect_http_posts_with_responses(clear_news_xml)
|
510
|
-
assert_equal({"362466171040"=>
|
509
|
+
assert_equal({"362466171040"=>true}, @user.clear_news('362466171040'))
|
511
510
|
end
|
512
511
|
|
513
512
|
def test_can_multi_add_news
|
@@ -537,7 +536,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
537
536
|
|
538
537
|
def test_parse_multi_clear_news
|
539
538
|
expect_http_posts_with_responses(multi_clear_news_xml)
|
540
|
-
assert_equal({"1234"=>{"319103117527"=>
|
539
|
+
assert_equal({"1234"=>{"319103117527"=>true}, "4321"=>{"313954287803"=>true}}, Facebooker::User.multi_clear_news({"1234"=>["319103117527"], "4321"=>["313954287803"]}))
|
541
540
|
end
|
542
541
|
|
543
542
|
def test_can_publish_activity
|
@@ -567,7 +566,7 @@ class Facebooker::UserTest < Test::Unit::TestCase
|
|
567
566
|
|
568
567
|
def test_parse_remove_activity
|
569
568
|
expect_http_posts_with_responses(remove_activity_xml)
|
570
|
-
assert_equal({"342454152268"=>
|
569
|
+
assert_equal({"342454152268"=>true}, @user.remove_activity('123'))
|
571
570
|
end
|
572
571
|
|
573
572
|
|
data/test/facebooker_test.rb
CHANGED
@@ -403,7 +403,10 @@ class TestFacebooker < Test::Unit::TestCase
|
|
403
403
|
assert_equal false, @session.post('facebook.auth.revokeAuthorization', :uid => 123)
|
404
404
|
end
|
405
405
|
|
406
|
-
|
406
|
+
def test_revoke_extended_permission
|
407
|
+
expect_http_posts_with_responses(example_revoke_extended_permission)
|
408
|
+
assert_equal true, @session.post('facebook.auth.revokeExtendedPermission', {:perm => 'email', :uid => 123}, false)
|
409
|
+
end
|
407
410
|
|
408
411
|
def test_remove_comment_true
|
409
412
|
expect_http_posts_with_responses(example_remove_comment_true)
|
@@ -1182,7 +1185,13 @@ class TestFacebooker < Test::Unit::TestCase
|
|
1182
1185
|
"0"
|
1183
1186
|
end
|
1184
1187
|
|
1185
|
-
|
1188
|
+
def example_revoke_extended_permission
|
1189
|
+
<<-XML
|
1190
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
1191
|
+
<auth_revokeExtendedPermission_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">1</auth_revokeExtendedPermission_response>
|
1192
|
+
XML
|
1193
|
+
end
|
1194
|
+
|
1186
1195
|
def example_remove_comment_true
|
1187
1196
|
"1"
|
1188
1197
|
end
|
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.66
|
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: 2010-03-
|
17
|
+
date: 2010-03-24 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|