social_profile 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -18,6 +18,8 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ Parse auth hash:
22
+
21
23
  ``` ruby
22
24
  profile = SocialProfile.get(auth_hash)
23
25
  profile.picture_url # http://profile.ak.fbcdn.net/h..._4963049_s.jpg
@@ -26,6 +28,17 @@ profile.profile_url # http://www.facebook.com/develop.rails
26
28
  profile.provider # facebook
27
29
  ```
28
30
 
31
+ Post photo to social album. If album dosn't exists, it's create new one:
32
+
33
+ ``` ruby
34
+ user = SocialProfile::Person.get(:facebook, uid, access_token)
35
+
36
+ user.share_photo!(album_id, filepath, {
37
+ :album => {:title => "Site pictures"},
38
+ :photo => {:message => "Cool photo"}
39
+ })
40
+
41
+ ```
29
42
 
30
43
  ## Contributing
31
44
 
@@ -34,3 +47,5 @@ profile.provider # facebook
34
47
  3. Commit your changes (`git commit -am 'Add some feature'`)
35
48
  4. Push to the branch (`git push origin my-new-feature`)
36
49
  5. Create new Pull Request
50
+
51
+ Copyright (c) 2013 Fodojo, released under the MIT license
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ require "fb_graph"
3
+
4
+ module SocialProfile
5
+ module People
6
+ class Facebook < Person
7
+ # Find album by id
8
+ def fetch_album(album_id)
9
+ ::FbGraph::Album.fetch(album_id, :access_token => access_token)
10
+ end
11
+
12
+ # Create new album id
13
+ def album!(options = {})
14
+ user.album!(options)
15
+ end
16
+
17
+ protected
18
+
19
+ def user
20
+ @user ||= ::FbGraph::User.me(access_token)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ require "vkontakte"
3
+ require "httpclient"
4
+ require "multi_json"
5
+
6
+ module SocialProfile
7
+ module People
8
+ class Vkontakte < Person
9
+ # Find album by id
10
+ def fetch_album(album_id)
11
+ response = user.photos.getAlbums(:aids => album_id)
12
+ Album.new(response, user)
13
+ end
14
+
15
+ # Create new album id
16
+ def album!(options = {})
17
+ response = user.photos.createAlbum(:title => options[:name], :description => options[:message])
18
+ Album.new(response, user)
19
+ end
20
+
21
+ protected
22
+
23
+ def user
24
+ @user ||= ::Vkontakte::App::User.new(uid, :access_token => access_token)
25
+ end
26
+ end
27
+
28
+ class Album
29
+
30
+ def initialize(hash, target)
31
+ @hash = Array.wrap(hash["response"]).first || {}
32
+ @target = target
33
+ end
34
+
35
+ def http_client
36
+ @http_client ||= ::HTTPClient.new(:agent_name => 'SocialProfile robot/0.1')
37
+ end
38
+
39
+ # Get album id
40
+ def identifier
41
+ @hash['aid']
42
+ end
43
+
44
+ # Upload photo to album
45
+ #
46
+ # album.photo!(
47
+ # :source => File.new('/path/to/image')
48
+ # :message => "some photo info"
49
+ # )
50
+ #
51
+ # http://vk.com/developers.php?oid=-1&p=%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80_%D0%92%D0%9A%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B5
52
+ #
53
+ def photo!(options)
54
+ return if identifier.nil?
55
+
56
+ if upload_url = find_upload_url
57
+ data = http_client.post(upload_url, 'file1' => options[:source])
58
+ parsed_response = MultiJson.decode(data.body)
59
+
60
+ @target.photos.save(parsed_response.merge('caption' => options[:message]))
61
+ end
62
+ end
63
+
64
+ def respond_to?(method_name)
65
+ @hash.has_key?(method_name.to_s) ? true : super
66
+ end
67
+
68
+ def method_missing(method_name, *args, &block)
69
+ if @hash.has_key?(method_name.to_s)
70
+ @hash[method_name.to_s]
71
+ else
72
+ super
73
+ end
74
+ end
75
+
76
+ protected
77
+
78
+ def find_upload_url
79
+ server = @target.photos.getUploadServer(:aid => identifier)
80
+
81
+ if server && server['response']
82
+ server['response']['upload_url']
83
+ else
84
+ nil
85
+ end
86
+ end
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ require "social_profile/version"
3
+
4
+ module SocialProfile
5
+ class Person
6
+ attr_reader :uid, :access_token
7
+
8
+ def initialize(uid, access_token, options = {})
9
+ @uid = uid
10
+ @access_token = access_token
11
+ @options = options
12
+ end
13
+
14
+ def self.get(provider, uid, access_token, options = {})
15
+ return if provider.nil?
16
+
17
+ klass = case provider.to_s
18
+ when "facebook" then People::Facebook
19
+ when "vkontakte" then People::Vkontakte
20
+ else Person
21
+ end
22
+
23
+ klass.new(uid, access_token, options)
24
+ end
25
+
26
+ # Find album by id
27
+ def fetch_album(album_id)
28
+ raise NotImplementedError("Subclasses should implement this!")
29
+ end
30
+
31
+ # Create new album id
32
+ def album!(options = {})
33
+ raise NotImplementedError("Subclasses should implement this!")
34
+ end
35
+
36
+ def find_album(album_id)
37
+ return if album_id.nil?
38
+
39
+ begin
40
+ fetch_album(album_id)
41
+ rescue Exception => e
42
+ return nil
43
+ end
44
+ end
45
+
46
+ def find_or_create_album(album_id, options = {})
47
+ record = find_album(album_id)
48
+ record ||= album!(options)
49
+ record
50
+ end
51
+
52
+ def share_photo!(album_id, filepath, options = {})
53
+ album = find_or_create_album(album_id, options[:album])
54
+
55
+ data = {
56
+ :source => File.new(filepath)
57
+ }.merge(options[:photo] || {})
58
+
59
+ album.photo!(data)
60
+ end
61
+
62
+ def tag_object!(object, tags)
63
+ tags = Array.wrap(tags)
64
+
65
+ return if tags.empty? || object.nil?
66
+
67
+ object.tag!(:tags => tags)
68
+ end
69
+ end
70
+ end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module SocialProfile
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
@@ -4,12 +4,18 @@ require "social_profile/version"
4
4
  module SocialProfile
5
5
  autoload :Utils, "social_profile/utils"
6
6
  autoload :Response, "social_profile/response"
7
+ autoload :Person, "social_profile/person"
7
8
 
8
9
  module Providers
9
10
  autoload :Base, "social_profile/providers/base"
10
11
  autoload :Facebook, "social_profile/providers/facebook"
11
12
  autoload :Vkontakte, "social_profile/providers/vkontakte"
12
13
  end
14
+
15
+ module People
16
+ autoload :Facebook, "social_profile/people/facebook"
17
+ autoload :Vkontakte, "social_profile/people/vkontakte"
18
+ end
13
19
 
14
20
  def self.get(auth_hash, options = {})
15
21
  provider = auth_hash["provider"].to_s.downcase if auth_hash && auth_hash["provider"]
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = SocialProfile::VERSION
9
9
  spec.authors = ["Igor Galeta"]
10
10
  spec.email = ["galeta.igor@gmail.com"]
11
- spec.description = %q{Wrapper for Omniauth profile hash}
11
+ spec.description = %q{Wrapper for Omniauth profile hash, post photo to album}
12
12
  spec.summary = %q{Wrapper for Omniauth profile hash}
13
13
  spec.homepage = "https://github.com/galetahub/social_profile"
14
14
  spec.license = "MIT"
@@ -20,4 +20,9 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency "fb_graph"
25
+ spec.add_dependency "vkontakte"
26
+ spec.add_dependency "httpclient"
27
+ spec.add_dependency "multi_json"
23
28
  end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SocialProfile::People::Facebook do
5
+ it "should be a Module" do
6
+ SocialProfile::People.should be_a(Module)
7
+ end
8
+
9
+ context "facebook" do
10
+ before(:each) do
11
+ @user = SocialProfile::Person.get(:facebook, "100000730417342", "abc")
12
+ end
13
+
14
+ it "should be a facebook profile" do
15
+ @user.should be_a(SocialProfile::People::Facebook)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SocialProfile::People::Vkontakte do
5
+ it "should be a Module" do
6
+ SocialProfile::People.should be_a(Module)
7
+ end
8
+
9
+ context "facebook" do
10
+ before(:each) do
11
+ @user = SocialProfile::Person.get(:vkontakte, "123456789", "abc")
12
+ end
13
+
14
+ it "should be a facebook profile" do
15
+ @user.should be_a(SocialProfile::People::Vkontakte)
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: social_profile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-26 00:00:00.000000000 Z
12
+ date: 2013-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,7 +43,71 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
- description: Wrapper for Omniauth profile hash
46
+ - !ruby/object:Gem::Dependency
47
+ name: fb_graph
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: vkontakte
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: httpclient
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: multi_json
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Wrapper for Omniauth profile hash, post photo to album
47
111
  email:
48
112
  - galeta.igor@gmail.com
49
113
  executables: []
@@ -57,6 +121,9 @@ files:
57
121
  - README.md
58
122
  - Rakefile
59
123
  - lib/social_profile.rb
124
+ - lib/social_profile/people/facebook.rb
125
+ - lib/social_profile/people/vkontakte.rb
126
+ - lib/social_profile/person.rb
60
127
  - lib/social_profile/providers/base.rb
61
128
  - lib/social_profile/providers/facebook.rb
62
129
  - lib/social_profile/providers/vkontakte.rb
@@ -64,6 +131,8 @@ files:
64
131
  - lib/social_profile/utils.rb
65
132
  - lib/social_profile/version.rb
66
133
  - social_profile.gemspec
134
+ - spec/people/facebook_spec.rb
135
+ - spec/people/vkontakte_spec.rb
67
136
  - spec/providers/facebook_spec.rb
68
137
  - spec/providers/vkontakte_spec.rb
69
138
  - spec/spec_helper.rb
@@ -93,6 +162,8 @@ signing_key:
93
162
  specification_version: 3
94
163
  summary: Wrapper for Omniauth profile hash
95
164
  test_files:
165
+ - spec/people/facebook_spec.rb
166
+ - spec/people/vkontakte_spec.rb
96
167
  - spec/providers/facebook_spec.rb
97
168
  - spec/providers/vkontakte_spec.rb
98
169
  - spec/spec_helper.rb