social 0.0.11 → 0.3.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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +72 -40
  3. data/lib/social.rb +65 -30
  4. data/lib/social/balance.rb +1 -14
  5. data/lib/social/config/ok.rb +16 -18
  6. data/lib/social/config/vk.rb +15 -17
  7. data/lib/social/determinant.rb +4 -0
  8. data/lib/social/determinant/request_param.rb +56 -0
  9. data/lib/social/determinant/social_prefix.rb +81 -0
  10. data/lib/social/env.rb +21 -15
  11. data/lib/social/network.rb +9 -1
  12. data/lib/social/network/base.rb +60 -9
  13. data/lib/social/network/graph.rb +1 -40
  14. data/lib/social/network/graph/ok.rb +1 -5
  15. data/lib/social/network/graph/ok/base.rb +50 -56
  16. data/lib/social/network/graph/ok/notification.rb +9 -15
  17. data/lib/social/network/graph/ok/user.rb +61 -67
  18. data/lib/social/network/graph/tail.rb +14 -20
  19. data/lib/social/network/graph/vk.rb +1 -5
  20. data/lib/social/network/graph/vk/base.rb +27 -33
  21. data/lib/social/network/graph/vk/notification.rb +11 -17
  22. data/lib/social/network/graph/vk/user.rb +55 -61
  23. data/lib/social/network/ok.rb +9 -17
  24. data/lib/social/network/stub.rb +2 -7
  25. data/lib/social/network/vk.rb +9 -17
  26. data/lib/social/version.rb +1 -1
  27. data/social.gemspec +1 -0
  28. data/spec/lib/social/ok_api_spec.rb +8 -8
  29. data/spec/lib/social/vk_api_spec.rb +2 -2
  30. data/spec/spec_helper.rb +1 -4
  31. metadata +80 -48
  32. data/lib/social/auth.rb +0 -4
  33. data/lib/social/auth/controller.rb +0 -144
  34. data/lib/social/builder.rb +0 -22
  35. data/lib/social/cache.rb +0 -26
  36. data/lib/social/helper.rb +0 -4
  37. data/lib/social/helper/controller.rb +0 -43
  38. data/lib/social/helper/model.rb +0 -61
  39. data/lib/social/network/params.rb +0 -31
  40. data/lib/social/provider.rb +0 -42
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a3becb7a8ded7114cb92fbe39b3aa334e8f1c058
4
+ data.tar.gz: b40e98c12f7143e7dd9332b227ffeb09c2a373ea
5
+ SHA512:
6
+ metadata.gz: 038fbcc6d9745a44cfad4750a2933efcc77bc92361ae9df9c2b9dfcb12c2467cdf5baccbaeb90cdbbbaafef5f7905356ab0e3eb8dae64c68a8d44336d7e7bed9
7
+ data.tar.gz: 861d167d64dac6f76c0f8525c907f9e512dec581c5d019d910c14bbc40bedc567b7a0786ed4b4647d7c4f4d86898b725ba227e9b27fadbf338b2a4a66e8626bf
data/README.md CHANGED
@@ -1,82 +1,114 @@
1
- Social API wrapper and Tools
1
+ Social
2
2
  ====================
3
3
 
4
- This is social networks api wrapper and authorization tools for social applications.
4
+ Библиотека для обращения к API социальных сетей со стороны сервера. Содержит методы API и средства определения текущей социальной сети.
5
5
 
6
- Now it is a compilation of terrible code from various projects. Without tests and benchmark. =(
6
+ Данная библиотека была создана в рамках проекта SocialFrame - Шаблон для IFrame приложений на базе Sinatra (Padrino). Но библиотеку можно также использовать и для Rails-приложений и других.
7
7
 
8
- ## NOT RECOMMENDED USE IN PRODUCTION
8
+ Библиотека решает следующие задачи:
9
+ * Определение типа соцсети до создания сессии и авторизации по средствам Rack::Builder
10
+ * Осуществление общих запросов к API соцсети
11
+ * Генерирует уникальный пользовательский UID и уникальный SESSION_ID для сессии на основе SID соцсети
9
12
 
10
- Now supported networks:
11
-
12
- * vk.com
13
+ Поддержка социальных сетей:
14
+ * vk.com
13
15
  * odnoklassniki.ru
14
- * mail.ru (plans to support)
15
- * facebook.com (plans to support)
16
-
17
- Now supported features:
18
16
 
19
- * Get user profile
20
- * Get user friend profiles
21
- * Get user balance and charge off (only vk.com)
22
- * Initialize environment by request (example /odkl/*, /vk/* and other) - Rack Middleware
23
- * Authorization user for Rails application (support transition between pages)
24
- * Parameterized wrapper to call the API methods
17
+ Поддерживаемые методы API:
18
+ * Получает профиль пользователя
19
+ * Получить список друзей для пользователя
20
+ * Получить профили друзей
21
+ * Работа с балансом пользователя (только для vk.com)
25
22
 
26
- Install
23
+ Установка
24
+ ---------------------
27
25
 
28
26
  gem install social
29
27
 
28
+ Для Gemfile
30
29
 
31
- Use wrapper
30
+ gem 'social'
31
+
32
+ Использование
32
33
  ---------------------
33
34
 
35
+ Получение профиля пользователя (get user profile)
36
+
34
37
  Social::Network(:ok).user.get_info(uid)
35
38
 
36
- or
39
+ или
37
40
 
38
41
  Social::Network::Vk.user.get_info(uid)
39
42
 
40
- or
43
+ или отправка нотификации
41
44
 
42
- Social::Network(socio_type).notification.send(:message => msg, :uids => [ ... ])
45
+ Social::Network(social_type).notification.send(:message => msg, :uids => [ ... ])
43
46
 
44
- Use environment tools
47
+ Обращение к текущей социальной сети осуществляется после Глобального определения этого типа (см. ниже). При этом возможны следующие вызовы.
48
+
49
+ Social::Network.current.user.get_info(uid)
50
+
51
+
52
+ Глобальное определение типа социальной сети
45
53
  ---------------------
46
54
 
47
- In config.ru
55
+ Social::Env.init(params[:social_types])
48
56
 
49
- builder = Social::Builder::produce(App::Application)
57
+ Определение соцсети с помощью SocialPrefix
58
+ ---------------------
59
+
60
+ SocialPrefix позволяет определять социальную сеть по строке запроса т.е.
61
+
62
+ - без использования субдоменов
63
+ - без определения соц.сети по параметрам запроса (что также поддерживается)
64
+ - без добавления доп.роутов в приложение
65
+
66
+ Также пользоволяет решить проблему с показам аватаров пользователей в Одноклассниках, для которых в REFERRAL должно быть слово "odnoklassniki" или "odkl".
67
+
68
+ config.ru
69
+
70
+ builder = Social::Builder::produce(Example::Application)
50
71
  run builder
51
72
 
52
- Adds an initializing environment.
73
+ При этом в параметры запроса добавляется ключ social_env
74
+ со следующим содержанием
53
75
 
54
- request['social_env'] = {
76
+ request.params['social_env'] = {
55
77
  'prefix' => <SOCIAL_PREFIX>,
56
78
  'type' => <SOCIAL_TYPE_NAME>,
57
79
  'id' => <SOCIAL_TYPE_ID>
58
80
  }
59
81
 
60
- For example, on request /odkl/*
82
+ Например, при запросе /odkl/*
61
83
 
62
84
  params[:social_env][:id] # => 1
85
+ params[:social_env][:prefix] # => 'odkl'
86
+ params[:social_env][:type] # => :ok
87
+
88
+ Для SinglePage приложения:
89
+ Предпологается, что первый GET запрос приходит на URL из SocialPrefix,
90
+ а последующие запросы идут уже без без SocialPrefix и тип соцсети
91
+ берется из сессии и передается в метод Social::Env.init(<SOCIAL_TYPE>).
63
92
 
64
- and after
65
-
66
- include Social::Helper::Controller
93
+ Для "Многостраничного" приложения:
94
+ Предпологается, что все запросы все запросы осуществляются с помощью
95
+ SocialPrefix
96
+
97
+ Определение соцсети с помощью
98
+ ---------------------
67
99
 
68
- in your Rails application controller
100
+ Помимо SocialPrefix определение соцсети можно осуществлять
101
+ с помощью параметров запроса. Например если запрос содержит
102
+ параметры viewer_id и sid, то можно сказать что это
103
+ соцсеть ВКонтакт.
69
104
 
70
- Social::Env.id # => 1
71
- Social::Env.type # => :ok
72
- Social::Env.prefix # => :odkl
105
+ Этот способ также предпологает использование Rack::Builder.
73
106
 
74
107
  TODO
75
108
  ---------------------
76
109
 
77
- * Tests, tests, tests ...
78
- * More network
79
- * More and beautiful API for Rails, Sinatra and Rack applications
80
- * More supported features
110
+ * Тесты с использованием VCR
111
+ * Поддержка Mail.ru
112
+ * Поддержка Facebook
113
+ * Больше поддерживаемых "общих" методов API
81
114
 
82
- ### Welcome to contributing!
@@ -2,32 +2,27 @@ require 'singleton'
2
2
  require 'active_support/all'
3
3
  require 'rack'
4
4
  require 'social/version'
5
- require 'social/provider'
6
- require 'social/builder'
7
- require 'social/cache'
5
+ require 'social/determinant'
6
+ require 'social/determinant/social_prefix'
7
+ require 'social/determinant/request_param'
8
+ require 'social/config'
8
9
  require 'social/config/vk'
9
10
  require 'social/config/ok'
10
- require 'social/config'
11
11
  require 'social/env'
12
- require 'social/helper/controller'
13
- require 'social/helper/model'
14
- require 'social/helper'
15
- require 'social/auth/controller'
16
- require 'social/auth'
17
- require 'social/network/graph/tail'
18
- require 'social/network/params'
19
- require 'social/network/base'
12
+ require 'social/network'
20
13
  require 'social/network/graph'
14
+ require 'social/network/base'
21
15
  require 'social/network/ok'
22
16
  require 'social/network/vk'
17
+ require 'social/network/graph/tail'
18
+ require 'social/network/graph/ok'
23
19
  require 'social/network/graph/ok/base'
24
20
  require 'social/network/graph/ok/notification'
25
21
  require 'social/network/graph/ok/user'
26
- require 'social/network/graph/ok'
22
+ require 'social/network/graph/vk'
27
23
  require 'social/network/graph/vk/base'
28
24
  require 'social/network/graph/vk/notification'
29
25
  require 'social/network/graph/vk/user'
30
- require 'social/network/graph/vk'
31
26
  require 'social/network/stub'
32
27
  require 'social/network'
33
28
  require 'social/networks'
@@ -46,30 +41,71 @@ module Social
46
41
  :fb => 'fb'
47
42
  }
48
43
 
44
+ VK_PARAMS = %w(
45
+ api_url api_id api_settings viewer_id
46
+ viewer_type sid secret access_token
47
+ user_id group_id is_app_user auth_key
48
+ language parent_language ad_info
49
+ is_secure ads_app_id referrer lc_name hash
50
+ )
51
+
52
+ OK_PARAMS = %w(
53
+ authorized ip_geo_location api_server
54
+ new_sig apiconnection first_start
55
+ clientLog session_secret_key
56
+ application_key auth_sig web_server
57
+ session_key logged_user_id sig
58
+ )
59
+
49
60
  class << self
50
61
 
51
- def current_id=(id)
52
- @id = id
62
+ def social_params(params)
63
+ params.slice(VK_PARAMS + OK_PARAMS)
53
64
  end
54
65
 
55
- def current_id
56
- @id
66
+ def social_request?(params)
67
+ request_social_type(params).present?
57
68
  end
58
-
59
- def current_type=(type)
60
- @type = type
69
+
70
+ def request_social_type(params)
71
+ if social_env = (params[:social_env])
72
+ # Если параметр задается с помощью RackBuilder
73
+ # через SocialPrefix и передается как social_env
74
+ # через параметры приложения
75
+ params[:social_env][:type]
76
+ else
77
+ params_social_type(params)
78
+ end
61
79
  end
62
80
 
63
- def current_type
64
- @type
81
+ # Определяем тип социальной сети по параметрам
82
+ # первоначального запроса. Например если передан параметр
83
+ # viewer_id и sid, то это Вконтакте
84
+ def params_social_type(params)
85
+ case
86
+ when params[:viewer_id].present? && params[:sid].present? then :vk
87
+ when params[:logged_user_id].present? && params[:session_key].present? then :ok
88
+ else
89
+ nil
90
+ end
65
91
  end
66
92
 
67
- def current_prefix=(prefix)
68
- @prefix = prefix
93
+ def request_session_token(params)
94
+ case request_social_type(params)
95
+ when :vk then "vk::#{params[:sid]}"
96
+ when :ok then "ok::#{params[:session_key]}"
97
+ else
98
+ raise 'Not defined social type'
99
+ end
69
100
  end
70
101
 
71
- def current_prefix
72
- @prefix
102
+ def request_uid(params)
103
+ case request_social_type(params)
104
+ when :vk then "vk::#{params[:user_id]}"
105
+ when :ok then "ok::#{params[:logged_user_id]}"
106
+ else
107
+ raise 'Not defined social type'
108
+ end
73
109
  end
74
110
 
75
111
  def Network(network, params = nil)
@@ -100,9 +136,8 @@ module Social
100
136
  id_by_type(type_by_prefix(prefix))
101
137
  end
102
138
 
103
- def typing(index)
104
- return type_by_id(index) if SOCIAL_TYPES.keys.include?(index.to_i)
105
- return index.to_sym if SOCIAL_TYPES.values.include?(index.to_sym)
139
+ def prefix_by_type(type)
140
+ SOCIAL_PREFIX[type]
106
141
  end
107
142
 
108
143
  def type_codes
@@ -1,6 +1,7 @@
1
1
  module Social
2
2
  module Balance
3
3
 
4
+ # @deprecated
4
5
  def self.included(base)
5
6
  base.instance_eval do
6
7
 
@@ -21,20 +22,6 @@ module Social
21
22
  end
22
23
  end
23
24
 
24
- def payments
25
- Payment.where(:uid => self.uid, :social_type_id => self.social_type_id)
26
- end
27
-
28
- def payments_create(hash)
29
- param = {:uid => self.uid, :social_type_id => self.social_type_id, :user_id => nil}.merge(hash)
30
- param.delete(:initiatable) if param[:initiatable].is_a? Profile
31
- Payment.create(param)
32
- end
33
-
34
- def initiated
35
- []
36
- end
37
-
38
25
  end
39
26
 
40
27
  end
@@ -1,24 +1,22 @@
1
- module Social
2
- class Config
3
- module Ok
1
+ class Social::Config
2
+ module Ok
4
3
 
5
- def config
6
-
7
- unless @config
8
- @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
9
- @config_ins = Social::Config.new(:ok)
10
- @config = @config_ins.config[@env]
11
- end
12
-
13
- @config
4
+ def config
5
+
6
+ unless @config
7
+ @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ @config_ins = Social::Config.new(:ok)
9
+ @config = @config_ins.config[@env]
14
10
  end
15
11
 
16
- def safe_config(auth_params = {})
17
- auth_params.merge \
18
- :api_server => Social::Network(:ok).config[:api_server],
19
- :application_key => Social::Network(:ok).config[:application_key],
20
- :logged_user_id => auth_params['uid']
21
- end
12
+ @config
13
+ end
14
+
15
+ def safe_config(auth_params = {})
16
+ auth_params.merge \
17
+ :api_server => Social::Network(:ok).config[:api_server],
18
+ :application_key => Social::Network(:ok).config[:application_key],
19
+ :logged_user_id => auth_params['uid']
22
20
  end
23
21
  end
24
22
  end
@@ -1,24 +1,22 @@
1
- module Social
2
- class Config
3
- module Vk
1
+ class Social::Config
2
+ module Vk
3
+
4
+ def config
4
5
 
5
- def config
6
-
7
- unless @config
8
- @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
9
- @config_ins = Social::Config.new(:vk)
10
- @config = @config_ins.config[@env]
11
- end
12
-
13
- @config
6
+ unless @config
7
+ @env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ @config_ins = Social::Config.new(:vk)
9
+ @config = @config_ins.config[@env]
14
10
  end
15
11
 
16
- def safe_config(auth_params = {})
17
- auth_params.merge \
18
- :app_id => Social::Network(:vk).config['app_id'],
19
- :logged_user_id => auth_params['uid']
20
- end
12
+ @config
13
+ end
21
14
 
15
+ def safe_config(auth_params = {})
16
+ auth_params.merge \
17
+ :app_id => Social::Network(:vk).config['app_id'],
18
+ :logged_user_id => auth_params['uid']
22
19
  end
20
+
23
21
  end
24
22
  end
@@ -0,0 +1,4 @@
1
+ module Social
2
+ class Determinant < Rack::Builder
3
+ end
4
+ end
@@ -0,0 +1,56 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
3
+ class Social::Determinant
4
+ class RequestParam < self
5
+
6
+ class Provider
7
+
8
+ def self.build(social_type)
9
+ klass = Class.new do
10
+
11
+ class << self
12
+ attr_accessor :social_type
13
+ end
14
+
15
+ def initialize(app)
16
+ @app = app
17
+ end
18
+
19
+ def call(env)
20
+ request = Rack::Request.new(env)
21
+ social_type = self.class.social_type
22
+ prefix = Social.prefix_by_type(social_type)
23
+ id = Social.id_by_type(social_type)
24
+
25
+ request.GET['social_env'] = {
26
+ 'prefix' => prefix, 'type' => social_type, 'id' => id
27
+ }
28
+
29
+ @app.call(request.env)
30
+ end
31
+
32
+ end
33
+
34
+ klass.social_type = social_type
35
+ klass
36
+ end
37
+
38
+ end
39
+
40
+ def self.produce(app)
41
+ new do
42
+
43
+ map '/' do
44
+ params = HashWithIndifferentAccess.new(Social.social_params(request.GET))
45
+ if params.present? && type = Social.params_social_type(params)
46
+ use Provider.build(type)
47
+ run app
48
+ else
49
+ run app
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end