smart_vk_api 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e42c24b1492eecfa6a9c1f2fb33054b0ae6bbe8f
4
- data.tar.gz: 821f6c14fcee0bea3f505376563e0b31057817dd
3
+ metadata.gz: cc114237623563fcc0840b489143865529dc4353
4
+ data.tar.gz: 9d1c7c33d2a3da851e6d21db9d7245506b92dfc5
5
5
  SHA512:
6
- metadata.gz: c7e49fe118e49fb980b823f460e7593b1e625aa53a845bdef82afe65b30a2bf3ce3ff3df0d16c7d29e0cd4abdbb570d196c9c49f8795d10992909954d89f55e4
7
- data.tar.gz: b47a63e748a1083a4bd54b8428e20e3663f11a9020a558b23e3eaf8dac813304ae6d744ea05f12133086f0893073ba5dd2bd68249a13a77a61af1ae92d8446b4
6
+ metadata.gz: 586a88970465808274559974e6a2d267caa5e8d980676451075a19ebab55688475cbd001e06f83e7b0b0728a46e64349dc5528fd04763c2efb10f21610be9aef
7
+ data.tar.gz: 50b3e36b5f5a8c420274b1927962dbb378451757f5eaeb5a32a862a5767ca64fd3d30463dd5e25a810e68872fd61ecfd107bc8caa19a663a7fb9e03a4e0ddb10
data/CHANGELOG.md ADDED
@@ -0,0 +1,53 @@
1
+
2
+ ## Версия 1.1.0
3
+
4
+ * Добавлена возможность вызывать методы API, используя обычные методы Ruby.
5
+
6
+ Пример:
7
+
8
+ ```ruby
9
+ vk = SmartVkApi::VK.new
10
+ vk.users.get
11
+ ```
12
+
13
+ * Добавлена возможность задать конфигурацию для обращений к API.
14
+
15
+ Пример:
16
+
17
+ ```ruby
18
+ SmartVkApi.configure do |conf|
19
+ conf.access_token = '7a6fa4dff77a228eeda56603'
20
+ end
21
+ ```
22
+
23
+ При этом токены, которые записаны в конфиг, будут автоматически использованы, если в методы не передано другого значения:
24
+
25
+ ```ruby
26
+ SmartVkApi.configure do |conf|
27
+ conf.access_token = '7a6fa4dff77a228eeda56603'
28
+ end
29
+ vk = SmartVkApi::VK.new
30
+ vk.access_token # => 7a6fa4dff77a228eeda56603
31
+ ```
32
+
33
+ Но можно также передать более специфичный конфиг, если это требуется:
34
+
35
+ ```ruby
36
+ SmartVkApi.configure do |conf|
37
+ conf.access_token = '7a6fa4dff77a228eeda56603'
38
+ end
39
+ config = SmartVkApi::Configuration.new
40
+ config.access_token = '36fb063aa7f0ad997b5f96e91fd362857b'
41
+ vk = SmartVkApi::VK.new(config)
42
+ vk.access_token # => 36fb063aa7f0ad997b5f96e91fd362857b
43
+ ```
44
+
45
+ * Добавлена возможность прямого вызова API через метод модуля:
46
+
47
+ Пример:
48
+
49
+ ```ruby
50
+ SmartVkApi.call('users.get', :user_ids => 'kimrgrey') # [{:uid=>3710412, :first_name=>"Сергей", :last_name=>"Цветков", :hidden=>1}]
51
+ ```
52
+
53
+ Чтобы посомотреть предыдущие изменения, пожалуйста, откройте соответствующий релиз - [v1.0.0](https://github.com/kimrgrey/smart_vk_api/tree/v1.0.0)
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # SmartVkApi
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/smart_vk_api.svg)](http://badge.fury.io/rb/smart_vk_api)
3
4
  [![Build Status](https://travis-ci.org/kimrgrey/smart_vk_api.svg)](https://travis-ci.org/kimrgrey/smart_vk_api)
4
5
  [![Code Climate](https://codeclimate.com/github/kimrgrey/smart_vk_api/badges/gpa.svg)](https://codeclimate.com/github/kimrgrey/smart_vk_api)
5
6
 
@@ -1,7 +1,6 @@
1
1
  module SmartVkApi
2
2
  module Call
3
- def call(method_name, *options)
4
- params = options.last if options && options.last.is_a?(Hash)
3
+ def call(method_name, params = {})
5
4
  http(method_name, params) do |response|
6
5
  raise SmartVkApi::MethodCallError, response.body unless response.is_a?(Net::HTTPSuccess)
7
6
  json = response.body
@@ -24,6 +23,10 @@ module SmartVkApi
24
23
  if method_name.nil? || method_name.empty?
25
24
  raise ArgumentError, 'Method name could not be empty'
26
25
  end
26
+ if access_token && (params.nil? || !params.key?(:access_token))
27
+ params ||= {}
28
+ params[:access_token] = access_token
29
+ end
27
30
  url = SmartVkApi::Constants::METHOD_CALL_URL + "/#{method_name}"
28
31
  url += "?#{URI.encode_www_form(params)}" if params && params.any?
29
32
  url
@@ -0,0 +1,7 @@
1
+ module SmartVkApi
2
+ class Configuration
3
+ attr_accessor :app_id
4
+ attr_accessor :app_token
5
+ attr_accessor :access_token
6
+ end
7
+ end
@@ -2,5 +2,6 @@ module SmartVkApi
2
2
  module Constants
3
3
  API_URL = "https://api.vk.com".freeze
4
4
  METHOD_CALL_URL = "#{SmartVkApi::Constants::API_URL}/method".freeze
5
+ METHOD_NAME_REGEXP = /\A([a-z,A-Z]+)\.([a-z,A-Z]+)\Z/
5
6
  end
6
7
  end
@@ -0,0 +1,29 @@
1
+ module SmartVkApi
2
+ module Methods
3
+ def method_missing(method_name, *arguments, &block)
4
+ Proxy.new(self, method_name)
5
+ end
6
+
7
+ def respond_to?(method_name, include_private = false)
8
+ true # we should respond to any method using Proxy
9
+ end
10
+
11
+ class Proxy
12
+ attr_accessor :vk
13
+ attr_accessor :scope
14
+
15
+ def initialize(vk, scope)
16
+ self.vk = vk
17
+ self.scope = scope
18
+ end
19
+
20
+ def method_missing(method_name, *arguments, &block)
21
+ vk.call("#{scope}.#{method_name}", arguments.first)
22
+ end
23
+
24
+ def respond_to?(method_name, include_private = false)
25
+ true # we should respond to any method using Proxy
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module SmartVkApi
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/smart_vk_api.rb CHANGED
@@ -4,10 +4,54 @@ require 'json'
4
4
  module SmartVkApi
5
5
  autoload :Constants, "smart_vk_api/constants"
6
6
  autoload :Call, "smart_vk_api/call"
7
+ autoload :Methods, "smart_vk_api/methods"
8
+ autoload :Configuration, "smart_vk_api/configuration"
7
9
 
8
10
  class MethodCallError < StandardError; end;
9
11
 
10
12
  class VK
11
13
  include SmartVkApi::Call
14
+ include SmartVkApi::Methods
15
+
16
+ def initialize(configuration = nil)
17
+ @configuration = configuration
18
+ end
19
+
20
+ def configuration
21
+ @configuration || SmartVkApi.configuration
22
+ end
23
+
24
+ def access_token
25
+ configuration.access_token unless configuration.nil?
26
+ end
27
+
28
+ def app_id
29
+ configuration.app_id unless configuration.nil?
30
+ end
31
+
32
+ def app_token
33
+ configuration.app_token unless configuration.nil?
34
+ end
35
+ end
36
+
37
+ class << self
38
+ attr_accessor :configuration
39
+ end
40
+
41
+ def self.reset_configuration
42
+ self.configuration = nil
43
+ end
44
+
45
+ def self.configure
46
+ self.configuration ||= SmartVkApi::Configuration.new
47
+ yield(configuration)
48
+ end
49
+
50
+ def self.vk
51
+ SmartVkApi::VK.new
52
+ end
53
+
54
+ def self.call(method_name, params = {})
55
+ vk.call(method_name, params)
12
56
  end
13
57
  end
data/spec/call_spec.rb CHANGED
@@ -8,37 +8,63 @@ describe SmartVkApi::VK do
8
8
  let (:vk) { SmartVkApi::VK.new }
9
9
  let (:default_response_body) { {:response => {:test => 'yes'} } }
10
10
 
11
- describe '#method_url' do
12
- it 'should raise ArgumentError when method name is nil' do
13
- expect{ vk.method_url(nil) }.to raise_error(ArgumentError, 'Method name could not be empty')
14
- end
15
-
16
- it 'should raise ArgumentError when method name is empty string' do
17
- expect{ vk.method_url('') }.to raise_error(ArgumentError, 'Method name could not be empty')
18
- end
19
-
20
- it 'should take care of method name' do
21
- expect(vk.method_url('scope.method')).to eq('https://api.vk.com/method/scope.method')
11
+ before do
12
+ SmartVkApi.reset_configuration
13
+ end
14
+
15
+ describe '#method_url' do
16
+ context 'without access token' do
17
+ it 'should raise ArgumentError when method name is nil' do
18
+ expect{ vk.method_url(nil) }.to raise_error(ArgumentError, 'Method name could not be empty')
19
+ end
20
+
21
+ it 'should raise ArgumentError when method name is empty string' do
22
+ expect{ vk.method_url('') }.to raise_error(ArgumentError, 'Method name could not be empty')
23
+ end
24
+
25
+ it 'should take care of method name' do
26
+ expect(vk.method_url('users.get')).to eq('https://api.vk.com/method/users.get')
27
+ end
28
+
29
+ it 'should take care of parameters' do
30
+ expect(vk.method_url('users.get', {:aaa => :bbb, :user_ids => :kimrgrey})).to eq('https://api.vk.com/method/users.get?aaa=bbb&user_ids=kimrgrey')
31
+ end
22
32
  end
23
33
 
24
- it 'should take care of parameters' do
25
- expect(vk.method_url('scope.method', {:aaa => :bbb, :xxx => :yyy})).to eq('https://api.vk.com/method/scope.method?aaa=bbb&xxx=yyy')
34
+ context 'with access token' do
35
+ it 'should add access token when no parameters given' do
36
+ expect(vk.method_url('users.get', :access_token => '7a6fa4dff77a228eeda56603')).to eq('https://api.vk.com/method/users.get?access_token=7a6fa4dff77a228eeda56603')
37
+ end
38
+
39
+ it 'should use access token from configuration by default' do
40
+ SmartVkApi.configure do |conf|
41
+ conf.access_token = '7a6fa4dff77a228eeda56603'
42
+ end
43
+ expect(vk.method_url('users.get')).to eq('https://api.vk.com/method/users.get?access_token=7a6fa4dff77a228eeda56603')
44
+ end
45
+
46
+ it 'should use specified access token if it was given' do
47
+ SmartVkApi.configure do |conf|
48
+ conf.access_token = '7a6fa4dff77a228eeda56603'
49
+ end
50
+ expect(vk.method_url('users.get', :access_token => '7a6fa4dff77a228eeda56604')).to eq('https://api.vk.com/method/users.get?access_token=7a6fa4dff77a228eeda56604')
51
+ end
26
52
  end
27
53
  end
28
54
 
29
55
  describe '#http' do
30
56
  it 'should return http connection if block was not given' do
31
- expect( vk.http('scope.method')).to be_a(Net::HTTP)
57
+ expect( vk.http('users.get')).to be_a(Net::HTTP)
32
58
  end
33
59
 
34
60
  it 'should return result of block call if block was given' do
35
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => default_response_body.to_json)
36
- expect( vk.http('scope.method') { |_| 'result of block' }).to eq('result of block')
61
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
62
+ expect( vk.http('users.get') { |_| 'result of block' }).to eq('result of block')
37
63
  end
38
64
 
39
65
  it 'should pass http connection as parameter into block' do
40
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => default_response_body.to_json)
41
- expect(vk.http('scope.method') { |http| http }).to be_a(Net::HTTPResponse)
66
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
67
+ expect(vk.http('users.get') { |http| http }).to be_a(Net::HTTPResponse)
42
68
  end
43
69
 
44
70
  it 'should setup appropriate headers' do
@@ -46,54 +72,54 @@ describe SmartVkApi::VK do
46
72
  'Content-Type' =>'application/json',
47
73
  'Content-Type' =>'application/json'
48
74
  }
49
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => default_response_body.to_json)
50
- vk.call('scope.method')
51
- expect(WebMock).to have_requested(:get, "https://api.vk.com/method/scope.method").with(:headers => headers)
75
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
76
+ vk.call('users.get')
77
+ expect(WebMock).to have_requested(:get, "https://api.vk.com/method/users.get").with(:headers => headers)
52
78
  end
53
79
  end
54
80
 
55
81
  describe '#call' do
56
82
  it 'should send request to appropriate url according to method name' do
57
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => default_response_body.to_json)
58
- vk.call('scope.method')
59
- expect(WebMock).to have_requested(:get, "https://api.vk.com/method/scope.method")
83
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
84
+ vk.call('users.get')
85
+ expect(WebMock).to have_requested(:get, "https://api.vk.com/method/users.get")
60
86
  end
61
87
 
62
88
  it 'should send request to appropriate url according params' do
63
- stub_request(:get, "https://api.vk.com/method/scope.method?xxx=yyy").to_return(:status => 200, :body => default_response_body.to_json)
64
- vk.call('scope.method', {:xxx => 'yyy'})
65
- expect(WebMock).to have_requested(:get, "https://api.vk.com/method/scope.method?xxx=yyy")
89
+ stub_request(:get, "https://api.vk.com/method/users.get?user_ids=kimrgrey").to_return(:status => 200, :body => default_response_body.to_json)
90
+ vk.call('users.get', {:user_ids => 'kimrgrey'})
91
+ expect(WebMock).to have_requested(:get, "https://api.vk.com/method/users.get?user_ids=kimrgrey")
66
92
  end
67
93
 
68
94
  it 'should return raise MethodCallError if body of response is nil' do
69
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => nil)
70
- expect { vk.call('scope.method') }.to raise_error(SmartVkApi::MethodCallError, 'Response could not be empty')
95
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => nil)
96
+ expect { vk.call('users.get') }.to raise_error(SmartVkApi::MethodCallError, 'Response could not be empty')
71
97
  end
72
98
 
73
99
  it 'should return raise MethodCallError if body of response is empty string' do
74
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => "")
75
- expect { vk.call('scope.method') }.to raise_error(SmartVkApi::MethodCallError, 'Response could not be empty')
100
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => "")
101
+ expect { vk.call('users.get') }.to raise_error(SmartVkApi::MethodCallError, 'Response could not be empty')
76
102
  end
77
103
 
78
104
  it 'should return raise MethodCallError if body of response has no key :response' do
79
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => { :bad => :response }.to_json)
80
- expect { vk.call('scope.method') }.to raise_error(SmartVkApi::MethodCallError, 'Response should include key named :response')
105
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => { :bad => :response }.to_json)
106
+ expect { vk.call('users.get') }.to raise_error(SmartVkApi::MethodCallError, 'Response should include key named :response')
81
107
  end
82
108
 
83
109
  it 'should raise MethodCallError error in case of internal server error' do
84
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 500, :body => 'Internal Server Error')
85
- expect { vk.call('scope.method') }.to raise_error(SmartVkApi::MethodCallError, 'Internal Server Error')
110
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 500, :body => 'Internal Server Error')
111
+ expect { vk.call('users.get') }.to raise_error(SmartVkApi::MethodCallError, 'Internal Server Error')
86
112
  end
87
113
 
88
114
  it 'should raise MethodCallError in case of method call error' do
89
115
  response = { :error => { :error_code => 113, :error_msg => 'Invalid user id' } }
90
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => response.to_json)
91
- expect { vk.call('scope.method') }.to raise_error(SmartVkApi::MethodCallError, response.to_json)
116
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => response.to_json)
117
+ expect { vk.call('users.get') }.to raise_error(SmartVkApi::MethodCallError, response.to_json)
92
118
  end
93
119
 
94
120
  it 'should return value of :response key of returned json' do
95
- stub_request(:get, "https://api.vk.com/method/scope.method").to_return(:status => 200, :body => default_response_body.to_json)
96
- expect(vk.call('scope.method')).to eq(default_response_body[:response])
121
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
122
+ expect(vk.call('users.get')).to eq(default_response_body[:response])
97
123
  end
98
124
  end
99
125
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe SmartVkApi::VK do
4
+ it { is_expected.to respond_to(:users, :wall, :photos, :friends, :audio, :groups) }
5
+
6
+ before do
7
+ SmartVkApi.reset_configuration
8
+ end
9
+
10
+ describe 'methods proxy' do
11
+ let (:vk) { SmartVkApi::VK.new }
12
+ let (:default_response_body) { {:response => {:test => 'yes'} } }
13
+
14
+ it 'should allow to call API methods using scope.method notation' do
15
+ expect(vk.users).to respond_to(:get, :search, :report)
16
+ end
17
+
18
+ it 'should perform API request on method call' do
19
+ stub_request(:get, "https://api.vk.com/method/users.get").to_return(:status => 200, :body => default_response_body.to_json)
20
+ vk.users.get
21
+ expect(WebMock).to have_requested(:get, "https://api.vk.com/method/users.get")
22
+ end
23
+
24
+ it 'should pass parameters to API request' do
25
+ stub_request(:get, "https://api.vk.com/method/users.get?user_ids=kimrgrey").to_return(:status => 200, :body => default_response_body.to_json)
26
+ vk.users.get({:user_ids => "kimrgrey"})
27
+ expect(WebMock).to have_requested(:get, "https://api.vk.com/method/users.get?user_ids=kimrgrey")
28
+ end
29
+ end
30
+
31
+ describe 'configuration' do
32
+ it { is_expected.to respond_to(:configuration) }
33
+
34
+ before do
35
+ SmartVkApi.configure do |conf|
36
+ conf.app_id = '0000000'
37
+ conf.app_token = '7a6fa4dff77a228eeda56603'
38
+ conf.access_token = '7a6fa4dff77a228eeda220349'
39
+ end
40
+ end
41
+
42
+ it 'should use global configuration by default' do
43
+ vk = SmartVkApi::VK.new
44
+ expect(vk.configuration).to eq(SmartVkApi.configuration)
45
+ end
46
+
47
+ it 'should provide direct access to configuration fields' do
48
+ vk = SmartVkApi::VK.new
49
+ expect(vk.app_id).to eq('0000000')
50
+ expect(vk.app_token).to eq('7a6fa4dff77a228eeda56603')
51
+ expect(vk.access_token).to eq('7a6fa4dff77a228eeda220349')
52
+ end
53
+
54
+ it 'should be ready that configuration will be nil' do
55
+ SmartVkApi.reset_configuration
56
+ vk = SmartVkApi::VK.new
57
+ expect(vk.configuration).to be nil
58
+ expect(vk.app_id).to be nil
59
+ expect(vk.app_token).to be nil
60
+ expect(vk.access_token).to be nil
61
+ end
62
+
63
+ it 'should use specific configuration if is was given' do
64
+ config = SmartVkApi::Configuration.new
65
+ vk = SmartVkApi::VK.new(config)
66
+ expect(vk.configuration).to eq(config)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe SmartVkApi do
4
+
5
+ describe 'call' do
6
+ it { is_expected.to respond_to(:vk) }
7
+ it { is_expected.to respond_to(:call) }
8
+
9
+ it 'should delegate call to VK instance' do
10
+ vk = SmartVkApi.vk
11
+ allow(SmartVkApi).to receive(:vk) { vk }
12
+ expect(vk).to receive(:call)
13
+ SmartVkApi.call('users.get', {:user_ids => 'kimrgrey'})
14
+ end
15
+ end
16
+
17
+ describe 'configuration' do
18
+ it { is_expected.to respond_to(:configure) }
19
+
20
+ before do
21
+ SmartVkApi.configure do |conf|
22
+ conf.app_id = '0000000'
23
+ conf.app_token = '7a6fa4dff77a228eeda56603'
24
+ end
25
+ end
26
+
27
+ it 'should allow to reset configuration' do
28
+ SmartVkApi.reset_configuration
29
+ expect(SmartVkApi.configuration).to be nil
30
+ end
31
+
32
+ it 'should allow to read global configuration' do
33
+ expect(SmartVkApi.configuration.app_id).to eq('0000000')
34
+ expect(SmartVkApi.configuration.app_token).to eq('7a6fa4dff77a228eeda56603')
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_vk_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Tsvetkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-26 00:00:00.000000000 Z
11
+ date: 2015-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -76,16 +76,21 @@ files:
76
76
  - ".gitignore"
77
77
  - ".rspec"
78
78
  - ".travis.yml"
79
+ - CHANGELOG.md
79
80
  - Gemfile
80
81
  - LICENSE.txt
81
82
  - README.md
82
83
  - Rakefile
83
84
  - lib/smart_vk_api.rb
84
85
  - lib/smart_vk_api/call.rb
86
+ - lib/smart_vk_api/configuration.rb
85
87
  - lib/smart_vk_api/constants.rb
88
+ - lib/smart_vk_api/methods.rb
86
89
  - lib/smart_vk_api/version.rb
87
90
  - smart_vk_api.gemspec
88
91
  - spec/call_spec.rb
92
+ - spec/methods_spec.rb
93
+ - spec/smart_vk_api_spec.rb
89
94
  - spec/spec_helper.rb
90
95
  homepage: https://github.com/kimrgrey/smart_vk_api
91
96
  licenses:
@@ -113,4 +118,6 @@ specification_version: 4
113
118
  summary: Small, thin and fast client for VK API
114
119
  test_files:
115
120
  - spec/call_spec.rb
121
+ - spec/methods_spec.rb
122
+ - spec/smart_vk_api_spec.rb
116
123
  - spec/spec_helper.rb