giggly 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +23 -0
- data/Rakefile +88 -0
- data/VERSION +1 -0
- data/javascripts/giggly-socialize-min.js +8 -0
- data/javascripts/giggly-socialize.js +109 -0
- data/lib/giggly.rb +18 -0
- data/lib/giggly/friend.rb +4 -0
- data/lib/giggly/javascript.rb +10 -0
- data/lib/giggly/javascript/helper.rb +45 -0
- data/lib/giggly/javascript/socialize.rb +46 -0
- data/lib/giggly/rest.rb +32 -0
- data/lib/giggly/rest/request.rb +85 -0
- data/lib/giggly/rest/socialize.rb +150 -0
- data/lib/giggly/session_info.rb +11 -0
- data/lib/giggly/user.rb +24 -0
- data/test/fake_socialize.rb +37 -0
- data/test/giggly/friend_test.rb +23 -0
- data/test/giggly/javascript/helper_test.rb +7 -0
- data/test/giggly/javascript/socialize_test.rb +35 -0
- data/test/giggly/rest/request_test.rb +26 -0
- data/test/giggly/rest/socialize_test.rb +90 -0
- data/test/giggly/user_test.rb +30 -0
- data/test/responses/disconnect.yml +19 -0
- data/test/responses/get_friends_info.yml +78 -0
- data/test/responses/get_raw_data.yml +19 -0
- data/test/responses/get_session_info.yml +24 -0
- data/test/responses/get_user_info.yml +95 -0
- data/test/responses/publish_user_action.yml +19 -0
- data/test/responses/send_notification.yml +19 -0
- data/test/responses/set_status.yml +19 -0
- data/test/test_helper.rb +44 -0
- metadata +152 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
module Giggly
|
2
|
+
module Rest
|
3
|
+
class Socialize
|
4
|
+
|
5
|
+
GIGYA_URL = "http://socialize.api.gigya.com/socialize."
|
6
|
+
|
7
|
+
attr_accessor :request
|
8
|
+
|
9
|
+
# Create a new socialize object by passing in a <tt>Giggly::Rest::Socialize</tt> object
|
10
|
+
# or by passing in a hash that will be used to initialize a new <tt>Giggly::Rest::Socialize</tt>.
|
11
|
+
# See the rdoc for Request to find details for a new connection hash.
|
12
|
+
# A <tt>Giggly::Rest::Socialize</tt> is used per user (because the Request object is).
|
13
|
+
# example:
|
14
|
+
# @socialize = Giggly::Rest::Socialize.new(@connection)
|
15
|
+
def initialize(request)
|
16
|
+
@request = request and return if request.kind_of?(Giggly::Rest::Request)
|
17
|
+
@request = Giggly::Rest::Request.new(request)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Disconnects the user from the provided network.
|
21
|
+
# Params::
|
22
|
+
# * +network+ array of networks to disconnect from, if emtpy user will be disconnected from all networks
|
23
|
+
# Allowed values for network are facebook, myspace, twitter and yahoo.
|
24
|
+
def disconnect(provider = nil)
|
25
|
+
validate_providers! %w[facebook yahoo myspace twitter], provider
|
26
|
+
perform_post :disconnect, :provider => (provider.join(',') if provider)
|
27
|
+
end
|
28
|
+
|
29
|
+
# retrieves the friends of the current user
|
30
|
+
# Params::
|
31
|
+
# * +enabled_providers+ comma +separated+ list of providers to include. (ONLY)
|
32
|
+
# * +disabled_providers+ comma separated list of providers to exclude. (NOT)
|
33
|
+
# * +uids+ list of users to retrieve.
|
34
|
+
# * +detail_level+ 'basic' or 'extended'
|
35
|
+
# Returns::
|
36
|
+
# * +Array+ of +Giggly::User+ objects
|
37
|
+
def friends_info(options = {})
|
38
|
+
validate_providers! %w[facebook yahoo myspace twitter], options[:enabled_providers]
|
39
|
+
params = provider_hash(options)
|
40
|
+
params[:UIDs], params[:detailLevel] = options[:uids], options[:detailLevel]
|
41
|
+
|
42
|
+
response = perform_post(:getFriendsInfo, params)
|
43
|
+
friends = []
|
44
|
+
response['friends']['friend'].each do |friend|
|
45
|
+
friends << Giggly::Friend.new(friend)
|
46
|
+
end
|
47
|
+
friends
|
48
|
+
end
|
49
|
+
|
50
|
+
# get raw data from an individual provider about a user
|
51
|
+
# Params::
|
52
|
+
# * +provider+ the provider to retrieve the raw data from, only facebook and myspace are currently supported
|
53
|
+
# * +fields+ a array of provider specific fields to retrieve
|
54
|
+
# Returns::
|
55
|
+
# * +Hash+ of the raw data
|
56
|
+
def raw_data(provider, fields)
|
57
|
+
validate_providers! %w[facebook myspace], provider
|
58
|
+
perform_post :getRawData, {:provider => provider, :fields => fields.join(',')}
|
59
|
+
end
|
60
|
+
|
61
|
+
# get the connection info for a session with a direct api provider
|
62
|
+
# this is useful to make calls to a specific provider (not via Socialize)
|
63
|
+
# for functions that are currently unsupported by Gigya Socialize
|
64
|
+
# Params::
|
65
|
+
# * +provider+ the provider to get the connection information for,
|
66
|
+
# * possible values are facebook, myspace, twitter, or yahoo
|
67
|
+
# * +padding_mode+ padding mode for the AES algorithm used in encryping some of the response parameters
|
68
|
+
# * values are PKCS5, PKCS7 or ZEROS PKCS7 will be used as the default
|
69
|
+
# See http://wiki.gigya.com/030_Gigya_Socialize_API_2.0/030_API_reference/REST_API/socialize.getSessionInfo on decrypting
|
70
|
+
def session_info(provider, padding_mode = 'PKCS7')
|
71
|
+
validate_providers! %w[facebook yahoo myspace twitter], provider
|
72
|
+
# TODO: possibly decrypt response
|
73
|
+
Giggly::SessionInfo.new perform_post(:getSessionInfo, {:provider => provider, :paddingMode => padding_mode})
|
74
|
+
end
|
75
|
+
|
76
|
+
# retrieves user information from gigya, including or excluding providers
|
77
|
+
# as indicated. default usage includes all providers. returns user.
|
78
|
+
# Params::
|
79
|
+
# * +providers+ an optional hash of arrays the has the keys of
|
80
|
+
# * +enabled_providers+ an array of provider strings
|
81
|
+
# * +disabled_providers+ an array of provider strings
|
82
|
+
def user_info(providers = {})
|
83
|
+
Giggly::User.new perform_post(:getUserInfo, provider_hash(providers))
|
84
|
+
end
|
85
|
+
|
86
|
+
# see: http://wiki.gigya.com/030_Gigya_Socialize_API_2.0/030_API_reference/REST_API/socialize.publishUserAction
|
87
|
+
# for how to create user_action_xml
|
88
|
+
def publish_user_action(user_action_xml, providers = {})
|
89
|
+
validate_providers! %w[facebook yahoo], providers[:enabled_providers]
|
90
|
+
perform_post :publishUserAction, {:userAction => user_action_xml}.merge(provider_hash(providers))
|
91
|
+
end
|
92
|
+
|
93
|
+
# Sends a notification to a list of friends
|
94
|
+
# Params::
|
95
|
+
# * +recipients+ a string or array of uids to send the notification to
|
96
|
+
# * +subject+ the subject line of the notification
|
97
|
+
# * +body+ the body of the notification, do not use html, Gigya will autolink urls
|
98
|
+
# this will post to both facebook and twitter
|
99
|
+
def send_notification(recipients, subject, body)
|
100
|
+
recipients = recipients.is_a?(Array) ? recipients.join(',') : recipients
|
101
|
+
perform_post :sendNotification, :recipients => recipients, :subject => subject, :body => body
|
102
|
+
end
|
103
|
+
|
104
|
+
# sets the status of a user for the given providers (or all of them if blank)
|
105
|
+
# Params::
|
106
|
+
# * +status+ the status to set for the user
|
107
|
+
# * +providers+ an optional hash of arrays the has the keys of
|
108
|
+
# * +enabled_providers+ an array of provider strings
|
109
|
+
# * +disabled_providers+ an array of provider strings
|
110
|
+
def set_status(status, providers = {})
|
111
|
+
validate_providers! %w[facebook yahoo myspace twitter], providers[:enabled_providers]
|
112
|
+
perform_post :setStatus, {:status => status}.merge(provider_hash(providers))
|
113
|
+
end
|
114
|
+
|
115
|
+
# sets the status of a user for all providers
|
116
|
+
# Params::
|
117
|
+
# * +status+ the status to set for the user
|
118
|
+
# This method will return the status if it is successful, and raise an error on failure
|
119
|
+
# Use set status if you want to return the response object
|
120
|
+
# Its just in here because we think it looks cool and its convenient
|
121
|
+
def status=(status)
|
122
|
+
set_status status
|
123
|
+
end
|
124
|
+
|
125
|
+
protected
|
126
|
+
|
127
|
+
def perform_post(action, params = {})
|
128
|
+
params.reject! {|k,v| v.nil?}
|
129
|
+
@request.post "#{GIGYA_URL}#{action}", params
|
130
|
+
end
|
131
|
+
|
132
|
+
def provider_hash(providers)
|
133
|
+
{ :enabledProviders => (providers[:enabled_providers].join(',') if providers[:enabled_providers]),
|
134
|
+
:disabledProviders => (providers[:disabled_providers].join(',') if providers[:disabled_providers]) }
|
135
|
+
end
|
136
|
+
|
137
|
+
def validate_providers!(valid_providers, given_providers = nil)
|
138
|
+
return if given_providers.nil?
|
139
|
+
given_providers.each do |provider|
|
140
|
+
raise Giggly::Rest::Socialize::InvalidProvider.new(
|
141
|
+
"#{provider} is not a valid provider, please only use #{valid_providers.join(' ')}"
|
142
|
+
) unless valid_providers.include? provider
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class InvalidProvider < StandardError; end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/lib/giggly/user.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Giggly
|
2
|
+
class User
|
3
|
+
|
4
|
+
attr_reader :data
|
5
|
+
|
6
|
+
def initialize(data)
|
7
|
+
@data = data
|
8
|
+
end
|
9
|
+
|
10
|
+
def user_id
|
11
|
+
@data["UID"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](value)
|
15
|
+
@data[value.to_s]
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(method, *args)
|
19
|
+
super unless @data[method.to_s]
|
20
|
+
@data[method.to_s]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
# sets up a socialize faker.
|
5
|
+
#
|
6
|
+
# example::
|
7
|
+
# <tt>
|
8
|
+
# FakeSocialize.setup_response("disconnect", :success)
|
9
|
+
# </tt>
|
10
|
+
class FakeSocialize
|
11
|
+
|
12
|
+
@@responses ||= {}
|
13
|
+
|
14
|
+
def self.setup_response(method_ref, response_name)
|
15
|
+
reload_responses if @@responses.nil? || @@responses.empty?
|
16
|
+
response = @@responses[method_ref]
|
17
|
+
FakeWeb.register_uri(
|
18
|
+
response[:request_type],
|
19
|
+
Regexp.new(Giggly::Rest::Socialize::GIGYA_URL + response[:method_name]),
|
20
|
+
:body => response[response_name]
|
21
|
+
)
|
22
|
+
return response.merge({:response_key => "socialize.#{response[:method_name]}Response"})
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.reload_responses
|
26
|
+
responses = {}
|
27
|
+
Dir.new(File.join(File.dirname(__FILE__), 'responses')).each do |filename|
|
28
|
+
file_path = File.join(File.dirname(__FILE__), 'responses', filename)
|
29
|
+
next unless File.file?(file_path)
|
30
|
+
responses.merge!(YAML.load(File.read(file_path))) if File.file?(file_path)
|
31
|
+
end
|
32
|
+
@@responses = responses
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Giggly::FriendTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A Giggly::Friend instance" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
setup_giggly_rest
|
9
|
+
FakeSocialize.setup_response(:friends_info, :success)
|
10
|
+
@friends = @giggly.friends_info
|
11
|
+
@friend = @friends.first
|
12
|
+
end
|
13
|
+
|
14
|
+
# this is overtesting
|
15
|
+
should "inherit from user" do
|
16
|
+
@friend.kind_of? Giggly::Friend
|
17
|
+
@friend.kind_of? Giggly::User
|
18
|
+
@friend.class.superclass.should == Giggly::User
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Giggly::Javascript::SocializeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A Giggly::Javascript::Socialize instance" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@giggly = Giggly::Javascript::Socialize.new(:api_key => 'API_KEY', :enabled_providers => %w[facebook yahoo twitter])
|
9
|
+
end
|
10
|
+
|
11
|
+
should "should have a config hash with no nil values" do
|
12
|
+
@giggly.to_config.should == {'APIKey' => 'API_KEY', 'enabledProviders' => 'facebook,yahoo,twitter'}
|
13
|
+
end
|
14
|
+
|
15
|
+
should "return the config as a string for javascript" do
|
16
|
+
@giggly.config_to_js.class.should == String
|
17
|
+
@giggly.config_to_js.should =~ /APIKey/
|
18
|
+
@giggly.config_to_js.should =~ /enabledProviders/
|
19
|
+
end
|
20
|
+
|
21
|
+
should "return a script tag with the path to the giggly socialize js api file" do
|
22
|
+
@giggly.include_gigya_socialize =~ /giggly-socialize-min/
|
23
|
+
end
|
24
|
+
|
25
|
+
should "allow a custom path to the giggly socialize api file" do
|
26
|
+
@giggly.include_gigya_socialize('/somewhere') =~ /somewhere/
|
27
|
+
end
|
28
|
+
|
29
|
+
should "require the non minified giggly socialize api file if min is false" do
|
30
|
+
@giggly.include_gigya_socialize('/javascripts', false).should_not =~ /min\.js/
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Giggly::Rest::RequestTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A Giggly::Rest::Request instance" do
|
6
|
+
setup do
|
7
|
+
@request = Giggly::Rest::Request.new(
|
8
|
+
:api_key => 'TEST_KEY',
|
9
|
+
:secret_key => 'SECRET_KEY',
|
10
|
+
:user_id => 'GIGYA_USER_ID'
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
# this is a sanity check for the signature method
|
15
|
+
# the signature is the test was generated using the signature method which we know
|
16
|
+
# currently works with gigya, see http://twitter.com/_ah/status/4567114726
|
17
|
+
# which was posted from irb using Giggly
|
18
|
+
should "create a valid signature" do
|
19
|
+
Time.stubs(:now).returns(1254940826)
|
20
|
+
params = @request.sign('POST', "#{Giggly::Rest::Socialize::GIGYA_URL}getUserInfo", {})
|
21
|
+
'olilJCSJzaBmzb9tsHH8LmJpYp0='.should == params['sig']
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Giggly::Rest::SocializeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A Giggly::Rest::Socialize Instance" do
|
6
|
+
setup do
|
7
|
+
setup_giggly_rest
|
8
|
+
end
|
9
|
+
|
10
|
+
should "disconnect the user" do
|
11
|
+
FakeSocialize.setup_response(:disconnect, :success)
|
12
|
+
response = @giggly.disconnect
|
13
|
+
response.should be_successful
|
14
|
+
end
|
15
|
+
|
16
|
+
should "get friends info and return array of Giggly::Friend objects" do
|
17
|
+
FakeSocialize.setup_response(:friends_info, :success)
|
18
|
+
friends = @giggly.friends_info
|
19
|
+
assert friends.size > 0
|
20
|
+
friends.each do |friend|
|
21
|
+
friend.class.should == Giggly::Friend
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
should "get raw data and return it as a string" do
|
26
|
+
FakeSocialize.setup_response(:raw_data, :success)
|
27
|
+
response = @giggly.raw_data('facebook', %w[birthday name])
|
28
|
+
response.should be_successful
|
29
|
+
response['data'].should == '[{"birthday":"May 31, 1972","name":"Bobo"}]'
|
30
|
+
end
|
31
|
+
|
32
|
+
should "get the session info for the current gigya connection" do
|
33
|
+
FakeSocialize.setup_response(:session_info, :success)
|
34
|
+
session_info = @giggly.session_info('facebook')
|
35
|
+
session_info.class.should == Giggly::SessionInfo
|
36
|
+
session_info.session.should_not be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
should "get the user's info as a user object" do
|
40
|
+
FakeSocialize.setup_response(:user_info, :success)
|
41
|
+
user = @giggly.user_info
|
42
|
+
user.class.should == Giggly::User
|
43
|
+
end
|
44
|
+
|
45
|
+
should "published the user action" do
|
46
|
+
FakeSocialize.setup_response(:publish_user_action, :success)
|
47
|
+
response = @giggly.publish_user_action 'this would be valid xml in real life ^_^'
|
48
|
+
response.should be_successful
|
49
|
+
end
|
50
|
+
|
51
|
+
should "set the users status via set_status" do
|
52
|
+
FakeSocialize.setup_response(:status=, :success)
|
53
|
+
response = @giggly.set_status 'the giggly gem is so awesome!', :enabled_providers => %w[facebook twitter]
|
54
|
+
response.should be_successful
|
55
|
+
end
|
56
|
+
|
57
|
+
should "set the users status via status=" do
|
58
|
+
FakeSocialize.setup_response(:status=, :success)
|
59
|
+
status = 'the giggly gem is so awesome!'
|
60
|
+
response = @giggly.status = status
|
61
|
+
response.class.should == String
|
62
|
+
response.should == status
|
63
|
+
end
|
64
|
+
|
65
|
+
should "raise an exception on failing to set the user's status in status=" do
|
66
|
+
FakeSocialize.setup_response(:status=, :failure)
|
67
|
+
lambda {@giggly.status = 'the giggly gem is so awesome!'}.should raise_error(Giggly::Rest::Unauthorized)
|
68
|
+
end
|
69
|
+
|
70
|
+
should "raise an exception if an invalid provider is given" do
|
71
|
+
FakeSocialize.setup_response(:status=, :success) # just incase of failure
|
72
|
+
fail = lambda {@giggly.set_status 'Fail! #ftw', :enabled_providers => %w[twitter google]}
|
73
|
+
fail.should raise_error(Giggly::Rest::Socialize::InvalidProvider)
|
74
|
+
end
|
75
|
+
|
76
|
+
should "throw an exception on failure" do
|
77
|
+
FakeSocialize.setup_response(:disconnect, :failure)
|
78
|
+
lambda {@giggly.disconnect}.should raise_error(Giggly::Rest::Unauthorized)
|
79
|
+
end
|
80
|
+
|
81
|
+
should "send notification to users friends" do
|
82
|
+
FakeSocialize.setup_response(:send_notification, :success)
|
83
|
+
#response = @giggly.send_notification %w[_gigya_uid1 _gigya_uid2], 'this is a test', 'this is only a test'
|
84
|
+
response = @giggly.send_notification 'foo', 'bar', 'baz'
|
85
|
+
response.should be_successful
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Giggly::UserTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A Giggly::User instance" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
setup_giggly_rest
|
9
|
+
FakeSocialize.setup_response(:user_info, :success)
|
10
|
+
@user = @giggly.user_info
|
11
|
+
end
|
12
|
+
|
13
|
+
should "have data" do
|
14
|
+
@user.data.should_not be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
should "have a user_id" do
|
18
|
+
@user.user_id.should_not be_nil
|
19
|
+
@user.user_id.should == '000000'
|
20
|
+
end
|
21
|
+
|
22
|
+
should "allow access to top level items in the data hash via method calls" do
|
23
|
+
@user.should_not respond_to(:nickname)
|
24
|
+
@user.nickname.should == 'Bobo'
|
25
|
+
@user.data['nickname'].should == 'Bobo'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
:disconnect:
|
2
|
+
:method_name: "disconnect"
|
3
|
+
:request_type: :post
|
4
|
+
:success: >
|
5
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
6
|
+
<socialize.disconnectResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
7
|
+
xsi:schemaLocation="urn:com:gigya:api http://socialize.api.gigya.com/schema/1.0.xsd" xmlns="urn:com:gigya:api">
|
8
|
+
<statusCode>200</statusCode>
|
9
|
+
<statusReason>OK</statusReason>
|
10
|
+
</socialize.disconnectResponse>
|
11
|
+
:failure: >
|
12
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
13
|
+
<socialize.disconnectResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
14
|
+
xsi:schemaLocation="urn:com:gigya:api http://socialize.api.gigya.com/schema/1.0.xsd" xmlns="urn:com:gigya:api">
|
15
|
+
<statusCode>401</statusCode>
|
16
|
+
<statusReason>OK</statusReason>
|
17
|
+
<errorCode>123456</errorCode>
|
18
|
+
<description>FAIL</description>
|
19
|
+
</socialize.disconnectResponse>
|