vk 0.0.4 → 0.6.5.53
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
* [![Code Climate](https://codeclimate.com/github/alsemyonov/vk.png)](https://codeclimate.com/github/alsemyonov/vk)
|
12
|
+
* [![Build Status](https://travis-ci.org/alsemyonov/vk.png?branch=master)](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
|