vk 0.0.4 → 0.6.5.53
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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +5 -0
- data/Gemfile +5 -1
- data/README.markdown +38 -25
- data/Rakefile +3 -1
- data/bin/console +31 -0
- data/lib/vk.rb +42 -18
- data/lib/vk/access.rb +28 -0
- data/lib/vk/album.rb +30 -0
- data/lib/vk/audio.rb +73 -0
- data/lib/vk/audio/album.rb +9 -0
- data/lib/vk/audio/lyrics.rb +10 -0
- data/lib/vk/base.rb +70 -37
- data/lib/vk/city.rb +14 -4
- data/lib/vk/client.rb +104 -0
- data/lib/vk/client/oauth2.rb +43 -0
- data/lib/vk/country.rb +9 -4
- data/lib/vk/dsl.rb +20 -88
- data/lib/vk/dsl/audio.rb +51 -0
- data/lib/vk/dsl/database.rb +108 -0
- data/lib/vk/dsl/friends.rb +24 -0
- data/lib/vk/dsl/groups.rb +40 -0
- data/lib/vk/dsl/newsfeed.rb +137 -0
- data/lib/vk/dsl/photos.rb +36 -0
- data/lib/vk/dsl/users.rb +34 -0
- data/lib/vk/dsl/wall.rb +24 -0
- data/lib/vk/error.rb +18 -0
- data/lib/vk/exceptions.rb +10 -0
- data/lib/vk/group.rb +47 -0
- data/lib/vk/photo.rb +38 -0
- data/lib/vk/post.rb +6 -12
- data/lib/vk/post/wall.rb +3 -7
- data/lib/vk/prompt.rb +43 -0
- data/lib/vk/region.rb +15 -0
- data/lib/vk/result.rb +85 -0
- data/lib/vk/stats.rb +114 -0
- data/lib/vk/street.rb +17 -0
- data/lib/vk/user.rb +111 -28
- data/lib/vk/version.rb +2 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/vk/client_spec.rb +19 -0
- data/spec/vk_spec.rb +1 -1
- data/vk.gemspec +23 -14
- metadata +191 -30
- data/lib/vk/request.rb +0 -65
- data/spec/vk/request_spec.rb +0 -19
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e5cf6cc3967a10795bac86e867d2f9572af40035
|
4
|
+
data.tar.gz: bad1ca740033624204e839e8b3519116349b7726
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 48dd1970eeb9062d32c9824b102d15d4f259e9457b91468223ba36f17df6c81135dc713b59172f0e9faa4d4140cacfee08f95583bf70ce4346664106377715a1
|
7
|
+
data.tar.gz: 3da26495cbd61650bc26041b8a50b7409ab70fc43bd2a52a75c04744a654525859ecaa211b738b634108202b8580a5fc6f3256050d6fced2e0aa812e4b59cea2
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -2,55 +2,68 @@
|
|
2
2
|
|
3
3
|
Vk is a wrapper for vk.com API
|
4
4
|
|
5
|
+
## Project links
|
6
|
+
|
5
7
|
* [Documentation](http://rubydoc.info/gems/vk)
|
6
|
-
* [Source](
|
7
|
-
* [Issues](
|
8
|
-
* [Wiki](
|
9
|
-
* [
|
8
|
+
* [Source](https://github.com/alsemyonov/vk)
|
9
|
+
* [Issues](https://github.com/alsemyonov/vk/issues)
|
10
|
+
* [Wiki](https://github.com/alsemyonov/vk/wiki)
|
11
|
+
* [](https://codeclimate.com/github/alsemyonov/vk)
|
12
|
+
* [](https://travis-ci.org/alsemyonov/vk)
|
10
13
|
|
11
14
|
## Installation
|
12
15
|
|
13
|
-
|
16
|
+
```bash
|
17
|
+
gem install vk
|
18
|
+
```
|
14
19
|
|
15
20
|
## Usage
|
16
21
|
|
17
22
|
### Initialization
|
18
23
|
|
19
|
-
|
20
|
-
|
24
|
+
```ruby
|
25
|
+
Vk.app_id = 12345
|
26
|
+
Vk.app_secret = 'secret'
|
27
|
+
```
|
21
28
|
|
22
29
|
### Basic usage
|
23
30
|
|
24
31
|
Simple request. Docs ad {Vk::Request}
|
25
32
|
|
26
|
-
|
27
|
-
|
28
|
-
|
33
|
+
```ruby
|
34
|
+
vk = Vk.request
|
35
|
+
profiles = vk.request 'getProfiles', uids: 12345
|
36
|
+
puts profiles # [{uid: 12345, first_name: 'Ivan', last_name: 'Ivanov'}]
|
37
|
+
```
|
29
38
|
|
30
39
|
### Usage with DSL
|
31
40
|
|
32
41
|
View methods list at {Vk::DSL}.
|
33
42
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
43
|
+
```ruby
|
44
|
+
Vk.dsl!
|
45
|
+
vk = Vk.request
|
46
|
+
profiles = vk.get_profiles([123, 456, 789], fields: %w('has_mobile'))
|
47
|
+
puts profiles # [{uid: 1234, ..., has_mobile: 1}]
|
48
|
+
```
|
38
49
|
|
39
50
|
### Usage with object oriented DSL
|
40
51
|
|
41
52
|
Currently implemented classes: {Vk::User}, {Vk::City}, {Vk::Country}, {Vk::Post}.
|
42
53
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
```ruby
|
55
|
+
user = Vk::User.find 12345
|
56
|
+
user # => #<Vk::User:12345 @attributes={first_name: 'Ivan', last_name: 'Ivanov', uid: 12345}>
|
57
|
+
user.first_name # => 'Ivan'
|
58
|
+
user.last_name # => 'Ivanov'
|
59
|
+
user.name # => 'Ivan Ivanov'
|
60
|
+
user.city # => #<Vk::City:1 @attributes={name: 'Moscow', cid: 1}>
|
61
|
+
user.country # => #<Vk::Country:1 @attributes={name: 'Russia', cid: 1}>
|
62
|
+
user.friends # => [#<Vk::User:1 @attributes={first_name: "Pavel", last_name: "Durov", uid: 1}>, ...]
|
63
|
+
user.friends.first.city # => #<Vk::City:1 @attributes={name: 'Moscow', cid: 1}>
|
64
|
+
user.posts.first # => #<Vk::Post:1_123 @attributes={text: 'Preved!11'}>
|
65
|
+
```
|
53
66
|
|
54
67
|
## License
|
55
68
|
|
56
|
-
MIT License. © [
|
69
|
+
MIT License. © [Alex Semyonov](http://al.semyonov.us/), <alex@semyonov.us>, 2011-2016
|
data/Rakefile
CHANGED
data/bin/console
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'bundler/setup'
|
4
|
+
begin
|
5
|
+
require 'dotenv'
|
6
|
+
Dotenv.load('.env')
|
7
|
+
rescue LoadError
|
8
|
+
end
|
9
|
+
require 'vk'
|
10
|
+
require 'vk/dsl'
|
11
|
+
|
12
|
+
require 'pry'
|
13
|
+
begin
|
14
|
+
require 'pry-byebug'
|
15
|
+
rescue LoadError
|
16
|
+
STDERR.puts 'Byebug is enabled only in Ruby 2'
|
17
|
+
end
|
18
|
+
require 'pp'
|
19
|
+
|
20
|
+
SPEC_ROOT = File.expand_path('..', __FILE__)
|
21
|
+
|
22
|
+
Dir[File.join(SPEC_ROOT, 'spec/support/**/*.rb')].each { |f| require f }
|
23
|
+
|
24
|
+
Vk.app_id = ENV['VK_APP_ID']
|
25
|
+
Vk.app_secret = ENV['VK_APP_SECRET']
|
26
|
+
Vk.dsl!
|
27
|
+
Vk.log!
|
28
|
+
|
29
|
+
client = Vk.client
|
30
|
+
binding.pry
|
31
|
+
client
|
data/lib/vk.rb
CHANGED
@@ -1,37 +1,61 @@
|
|
1
1
|
require 'active_support/core_ext/object/try'
|
2
|
+
require 'vk/exceptions'
|
3
|
+
require 'vk/version'
|
2
4
|
|
3
5
|
module Vk
|
4
|
-
|
5
|
-
|
6
|
-
autoload :
|
7
|
-
autoload :
|
8
|
-
|
9
|
-
autoload :Base,
|
10
|
-
autoload :User,
|
11
|
-
autoload :City,
|
12
|
-
autoload :Country,
|
13
|
-
autoload :Post,
|
6
|
+
autoload :Client, 'vk/client'
|
7
|
+
autoload :DSL, 'vk/dsl'
|
8
|
+
autoload :Error, 'vk/error'
|
9
|
+
autoload :Result, 'vk/result'
|
10
|
+
|
11
|
+
autoload :Base, 'vk/base'
|
12
|
+
autoload :User, 'vk/user'
|
13
|
+
autoload :City, 'vk/city'
|
14
|
+
autoload :Country, 'vk/country'
|
15
|
+
autoload :Post, 'vk/post'
|
16
|
+
autoload :Stats, 'vk/stats'
|
17
|
+
autoload :Group, 'vk/group'
|
18
|
+
autoload :Album, 'vk/album'
|
14
19
|
|
15
20
|
class << self
|
16
|
-
|
21
|
+
# @return [String]
|
22
|
+
attr_accessor :app_id
|
23
|
+
# @return [String]
|
24
|
+
attr_accessor :app_secret
|
17
25
|
end
|
18
26
|
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
# @return [Logger]
|
28
|
+
def self.logger
|
29
|
+
@logger ||=
|
30
|
+
begin
|
31
|
+
require 'logger'
|
32
|
+
Logger.new(STDOUT)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [Logger] logger
|
37
|
+
# @return [Logger]
|
38
|
+
def self.logger=(logger)
|
39
|
+
@logger = logger
|
23
40
|
end
|
24
41
|
|
25
|
-
|
26
|
-
|
42
|
+
module_function
|
43
|
+
|
44
|
+
# Request to vk.com API
|
45
|
+
# @return [Vk::Client] Request object
|
46
|
+
def client(access_token = ENV['VK_ACCESS_TOKEN'])
|
47
|
+
@client ||= Client.new(access_token)
|
27
48
|
end
|
28
49
|
|
50
|
+
# @return [Vk::Client]
|
29
51
|
def dsl!
|
30
|
-
|
52
|
+
Client.dsl!
|
31
53
|
end
|
32
54
|
|
33
55
|
def log!
|
34
56
|
require 'logger'
|
35
57
|
self.logger = Logger.new STDOUT
|
36
58
|
end
|
59
|
+
|
60
|
+
dsl!
|
37
61
|
end
|
data/lib/vk/access.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'vk'
|
2
|
+
|
3
|
+
module Vk
|
4
|
+
module Access
|
5
|
+
SCOPES = {
|
6
|
+
:notify => 1, # Пользователь разрешил отправлять ему уведомления (для flash/iframe-приложений).
|
7
|
+
:friends => 2, # Доступ к друзьям.
|
8
|
+
:photos => 4, # Доступ к фотографиям.
|
9
|
+
:audio => 8, # Доступ к аудиозаписям.
|
10
|
+
:video => 16, # Доступ к видеозаписям.
|
11
|
+
:docs => 131072, # Доступ к документам.
|
12
|
+
:notes => 2048, # Доступ к заметкам пользователя.
|
13
|
+
:pages => 128, # Доступ к wiki-страницам.
|
14
|
+
# +256 Добавление ссылки на приложение в меню слева.:status => 1024, # Доступ к статусу пользователя.
|
15
|
+
:offers => 32, # Доступ к предложениям (устаревшие методы).
|
16
|
+
:questions => 64, # Доступ к вопросам (устаревшие методы).
|
17
|
+
:wall => 8192, # Доступ к обычным и расширенным методам работы со стеной. Данное право доступа по умолчанию недоступно для сайтов при использовании OAuth-авторизации (игнорируется при попытке авторизации). : groups => 262144, # Доступ к группам пользователя.
|
18
|
+
:messages => 4096, # Доступ к расширенным методам работы с сообщениями (только для Standalone-приложений).
|
19
|
+
:email => 4194304, # Доступ к email пользователя.
|
20
|
+
:notifications => 524288, # Доступ к оповещениям об ответах пользователю.
|
21
|
+
:stats => 1048576, # Доступ к статистике групп и приложений пользователя, администратором которых он является.
|
22
|
+
:ads => 32768, # Доступ к расширенным методам работы с рекламным API.
|
23
|
+
:market => 134217728, # Доступ к товарам.
|
24
|
+
:offline => 65536, # Доступ к API в любое время (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 — токен бессрочный).
|
25
|
+
:nohttps => 0 # Возможность осуществлять запросы к API без HTTPS.
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
data/lib/vk/album.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'vk/base'
|
2
|
+
|
3
|
+
module Vk
|
4
|
+
class Album < Base
|
5
|
+
self.key_field = :id
|
6
|
+
self.fields = %i[
|
7
|
+
id
|
8
|
+
thumb_id
|
9
|
+
owner_id
|
10
|
+
title description
|
11
|
+
created updated
|
12
|
+
size can_upload privacy_view privacy_comment
|
13
|
+
thumb_src
|
14
|
+
]
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
title.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def photos(options = {})
|
21
|
+
loader.get_photos(owner_id, id, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def load_data(options = {})
|
27
|
+
@attributes = @attributes.merge(loader.get_group_by_id(id, options)) unless @attributes.size > 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/vk/audio.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'vk/base'
|
2
|
+
|
3
|
+
module Vk
|
4
|
+
class Audio < Base
|
5
|
+
GENRES = {
|
6
|
+
1 => 'Rock',
|
7
|
+
2 => 'Pop',
|
8
|
+
3 => 'Rap & Hip-Hop',
|
9
|
+
4 => 'Easy Listening',
|
10
|
+
5 => 'House & Dance',
|
11
|
+
6 => 'Instrumental',
|
12
|
+
7 => 'Metal',
|
13
|
+
21 => 'Alternative',
|
14
|
+
8 => 'Dubstep',
|
15
|
+
1001 => 'Jazz & Blues',
|
16
|
+
10 => 'Drum & Bass',
|
17
|
+
11 => 'Trance',
|
18
|
+
12 => 'Chanson',
|
19
|
+
13 => 'Ethnic',
|
20
|
+
14 => 'Acoustic & Vocal',
|
21
|
+
15 => 'Reggae',
|
22
|
+
16 => 'Classical',
|
23
|
+
17 => 'Indie Pop',
|
24
|
+
19 => 'Speech',
|
25
|
+
22 => 'Electropop & Disco',
|
26
|
+
18 => 'Other',
|
27
|
+
}
|
28
|
+
|
29
|
+
self.fields = %i(
|
30
|
+
id
|
31
|
+
owner_id
|
32
|
+
album_id
|
33
|
+
genre_id
|
34
|
+
lyrics_id
|
35
|
+
artist
|
36
|
+
title
|
37
|
+
duration
|
38
|
+
url
|
39
|
+
date
|
40
|
+
no_search
|
41
|
+
)
|
42
|
+
|
43
|
+
# @return [Vk::Audio::Album]
|
44
|
+
def album
|
45
|
+
album_id = read_attribute(:album_id).to_s
|
46
|
+
@album ||= owner.audio_albums.detect { |album| album.id.to_s == album_id }
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Vk::User]
|
50
|
+
def owner
|
51
|
+
@owner ||= Vk::User.find(owner_id)
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String]
|
55
|
+
def genre
|
56
|
+
GENRES[genre_id]
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [String]
|
60
|
+
def lyrics
|
61
|
+
@lyrics ||= loader.get_lyrics(lyrics_id).text if lyrics_id
|
62
|
+
end
|
63
|
+
|
64
|
+
# @param [String] genre
|
65
|
+
# @return [Integer]
|
66
|
+
def genre=(genre)
|
67
|
+
self.genre_id = GENRES.key(genre)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
require 'vk/audio/album'
|
73
|
+
require 'vk/audio/lyrics'
|
data/lib/vk/base.rb
CHANGED
@@ -2,87 +2,120 @@ require 'vk'
|
|
2
2
|
|
3
3
|
require 'active_support/core_ext/class/attribute'
|
4
4
|
require 'active_support/core_ext/array/extract_options'
|
5
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
5
6
|
require 'active_support/hash_with_indifferent_access'
|
6
|
-
require 'active_support/memoizable'
|
7
7
|
|
8
8
|
module Vk
|
9
9
|
dsl! # require DSL methods in Vk::Request
|
10
10
|
|
11
11
|
class Base
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
12
|
+
# @return [{Integer => self}]
|
13
|
+
class_attribute :identity_map
|
14
|
+
|
15
|
+
# @return [Vk::Client]
|
16
|
+
class_attribute :loader
|
17
|
+
|
18
|
+
# @return [Symbol]
|
19
|
+
class_attribute :key_field
|
20
|
+
|
21
|
+
# @return [<Symbol>]
|
22
|
+
class_attribute :fields
|
23
|
+
|
24
|
+
# Find object in identity map or initialize object
|
25
|
+
# @param [self, <self>] ids
|
26
|
+
def self.find(*ids)
|
27
|
+
options = ids.extract_options!
|
28
|
+
if ids.count == 1
|
29
|
+
id = ids.first.to_i
|
30
|
+
identity_map[id] ||= new(id, options)
|
31
|
+
elsif respond_to?(:find_all)
|
32
|
+
find_all(ids, options)
|
33
|
+
else
|
34
|
+
ids.map do |id|
|
35
|
+
find(id, options)
|
30
36
|
end
|
31
37
|
end
|
32
|
-
|
38
|
+
end
|
33
39
|
|
34
|
-
|
35
|
-
if identity_map.respond_to?(method)
|
36
|
-
identity_map.send(method, *args)
|
37
|
-
else
|
38
|
-
super
|
39
|
-
end
|
40
|
-
end
|
40
|
+
instance_eval { alias [] find }
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
def self.method_missing(method, *args)
|
43
|
+
if identity_map.respond_to?(method)
|
44
|
+
identity_map.send(method, *args)
|
45
|
+
else
|
46
|
+
super
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
50
|
+
def self.inherited(subclass)
|
51
|
+
super(subclass)
|
52
|
+
subclass.identity_map = {}
|
53
|
+
subclass.fields = []
|
54
|
+
subclass.key_field = :id
|
55
|
+
subclass.fields = []
|
56
|
+
subclass.loader = Vk.client
|
57
|
+
end
|
58
|
+
|
48
59
|
def initialize(id, options = {})
|
49
60
|
@attributes = ActiveSupport::HashWithIndifferentAccess.new
|
50
61
|
|
62
|
+
if id.is_a?(Hash)
|
63
|
+
options[:data] = id
|
64
|
+
id = options[:data][key_field.to_s]
|
65
|
+
end
|
66
|
+
|
51
67
|
self.id = id
|
52
68
|
self.class.identity_map[id] = self
|
53
69
|
|
54
70
|
if options.key? :data
|
55
|
-
@attributes.merge!(options[:data])
|
71
|
+
@attributes.merge!(options[:data].with_indifferent_access)
|
56
72
|
else
|
57
73
|
load_data(options)
|
58
74
|
end
|
59
75
|
end
|
60
76
|
|
77
|
+
attr_reader :attributes
|
78
|
+
|
61
79
|
def id=(id)
|
62
80
|
@attributes[key_field] = id
|
63
81
|
end
|
64
82
|
|
83
|
+
# @return [String]
|
65
84
|
def id
|
66
|
-
@attributes[key_field].
|
85
|
+
@attributes[key_field].to_s
|
67
86
|
end
|
68
87
|
|
69
88
|
def read_attribute(name)
|
70
|
-
if !@attributes.key?(name) && fields.include?(name.to_sym)
|
89
|
+
if !@attributes.key?(name) && self.class.fields.include?(name.to_sym)
|
71
90
|
load_data(fields: name)
|
72
91
|
end
|
73
92
|
@attributes[name]
|
74
93
|
end
|
75
94
|
|
76
95
|
def method_missing(method, *args)
|
77
|
-
if
|
96
|
+
if method =~ /\?\Z/
|
97
|
+
respond_to_missing?(method) && @attributes[method]
|
98
|
+
elsif @attributes.key?(method)
|
78
99
|
@attributes[method]
|
79
|
-
elsif self.class.fields.include?(
|
80
|
-
read_attribute(
|
100
|
+
elsif self.class.fields.include?(method.to_sym)
|
101
|
+
read_attribute(method.to_s)
|
81
102
|
else
|
82
103
|
super
|
83
104
|
end
|
84
105
|
end
|
85
106
|
|
107
|
+
def respond_to_missing?(method, include_all = false)
|
108
|
+
@attributes.key?(method) || self.class.fields.include?(method.to_sym) || super(method, include_all)
|
109
|
+
end
|
110
|
+
|
111
|
+
def logger
|
112
|
+
Vk.logger
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_hash
|
116
|
+
attributes.to_hash
|
117
|
+
end
|
118
|
+
|
86
119
|
def inspect
|
87
120
|
"#<#{self.class.name}:#{id} @attributes=#{@attributes.inspect}>"
|
88
121
|
end
|
@@ -90,7 +123,7 @@ module Vk
|
|
90
123
|
protected
|
91
124
|
|
92
125
|
def load_data(options = {})
|
93
|
-
raise 'Not implemented. Use subclasses'
|
126
|
+
# raise 'Not implemented. Use subclasses'
|
94
127
|
end
|
95
128
|
end
|
96
129
|
end
|