vkontakte_api 0.2.1 → 1.0.rc

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 (42) hide show
  1. data/.rspec +1 -0
  2. data/.travis.yml +1 -0
  3. data/.yardopts +1 -1
  4. data/CHANGELOG.md +23 -0
  5. data/README.md +136 -61
  6. data/lib/generators/vkontakte_api/install/USAGE +2 -0
  7. data/lib/generators/vkontakte_api/install/install_generator.rb +9 -0
  8. data/lib/generators/vkontakte_api/install/templates/initializer.rb +22 -0
  9. data/lib/vkontakte_api/api.rb +27 -39
  10. data/lib/vkontakte_api/authorization.rb +66 -0
  11. data/lib/vkontakte_api/client.rb +14 -12
  12. data/lib/vkontakte_api/configuration.rb +22 -4
  13. data/lib/vkontakte_api/error.rb +15 -7
  14. data/lib/vkontakte_api/logger.rb +35 -0
  15. data/lib/vkontakte_api/method.rb +40 -0
  16. data/lib/vkontakte_api/namespace.rb +7 -0
  17. data/lib/vkontakte_api/resolvable.rb +20 -0
  18. data/lib/vkontakte_api/resolver.rb +18 -103
  19. data/lib/vkontakte_api/result.rb +48 -0
  20. data/lib/vkontakte_api/uploading.rb +29 -0
  21. data/lib/vkontakte_api/utils.rb +28 -0
  22. data/lib/vkontakte_api/version.rb +2 -1
  23. data/lib/vkontakte_api.rb +14 -3
  24. data/spec/integration_spec.rb +84 -0
  25. data/spec/spec_helper.rb +18 -0
  26. data/spec/vkontakte_api/api_spec.rb +39 -58
  27. data/spec/vkontakte_api/authorization_spec.rb +111 -0
  28. data/spec/vkontakte_api/client_spec.rb +17 -24
  29. data/spec/vkontakte_api/configuration_spec.rb +5 -0
  30. data/spec/vkontakte_api/error_spec.rb +30 -10
  31. data/spec/vkontakte_api/logger_spec.rb +88 -0
  32. data/spec/vkontakte_api/method_spec.rb +59 -0
  33. data/spec/vkontakte_api/namespace_spec.rb +5 -0
  34. data/spec/vkontakte_api/resolvable_spec.rb +21 -0
  35. data/spec/vkontakte_api/resolver_spec.rb +58 -141
  36. data/spec/vkontakte_api/result_spec.rb +115 -0
  37. data/spec/vkontakte_api/uploading_spec.rb +46 -0
  38. data/spec/vkontakte_api/utils_spec.rb +47 -0
  39. data/spec/vkontakte_api_spec.rb +4 -0
  40. data/vkontakte_api.gemspec +6 -5
  41. metadata +119 -38
  42. data/README.ru.md +0 -115
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe VkontakteApi::Result do
4
+ describe ".process" do
5
+ before(:each) do
6
+ @response = stub("Response")
7
+ @result = stub("Result")
8
+ subject.stub(:extract_result).and_return(@result)
9
+ end
10
+
11
+ it "calls .extract_result passing it the response" do
12
+ subject.should_receive(:extract_result).with(@response)
13
+ subject.process(@response, @type, nil)
14
+ end
15
+
16
+ context "with a non-enumerable result" do
17
+ before(:each) do
18
+ @type = stub("Type")
19
+ @typecasted_value = stub("Typecasted value")
20
+ subject.stub(:typecast).and_return(@typecasted_value)
21
+ end
22
+
23
+ it "returns #typecast-ed value" do
24
+ subject.should_receive(:typecast).with(@result, @type).and_return(@typecasted_value)
25
+ subject.send(:process, @result, @type, nil).should == @typecasted_value
26
+ end
27
+
28
+ context "when block_given?" do
29
+ it "yields the #typecast-ed value and returns the result of the block" do
30
+ block_result = stub("Block result")
31
+ @typecasted_value.should_receive(:result_method).and_return(block_result)
32
+ block = proc(&:result_method)
33
+
34
+ subject.send(:process, @response, @type, block).should == block_result
35
+ end
36
+ end
37
+ end
38
+
39
+ context "with an enumerable result" do
40
+ before(:each) do
41
+ @element1 = stub("First element")
42
+ @element2 = stub("Second element")
43
+ @enumerable_result = [@element1, @element2]
44
+ subject.stub(:extract_result).and_return(@enumerable_result)
45
+ end
46
+
47
+ it "returns the untouched value" do
48
+ subject.send(:process, @enumerable_result, :anything, nil).should == @enumerable_result
49
+ end
50
+
51
+ context "when block_given?" do
52
+ it "yields each element untouched to the block" do
53
+ result1 = stub("First element after result_method")
54
+ result2 = stub("Second element after result_method")
55
+ @element1.should_receive(:result_method).and_return(result1)
56
+ @element2.should_receive(:result_method).and_return(result2)
57
+ block = proc(&:result_method)
58
+
59
+ subject.send(:process, @enumerable_result, :anything, block).should == [result1, result2]
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ describe ".extract_result" do
66
+ before(:each) do
67
+ @result_response = {'key' => 'value'}
68
+ @result_error = {'request_params' => [{'key' => 'error', 'value' => 'description'}]}
69
+ end
70
+
71
+ context "with a successful response" do
72
+ before(:each) do
73
+ @result = Hashie::Mash.new(:response => @result_response)
74
+ end
75
+
76
+ it "returns the response part" do
77
+ subject.send(:extract_result, @result).should == @result_response
78
+ end
79
+ end
80
+
81
+ context "with an error response" do
82
+ before(:each) do
83
+ @result = Hashie::Mash.new(:error => @result_error)
84
+ end
85
+
86
+ it "raises a VkontakteApi::Error" do
87
+ expect {
88
+ subject.send(:extract_result, @result)
89
+ }.to raise_error(VkontakteApi::Error)
90
+ end
91
+ end
92
+ end
93
+
94
+ describe ".typecast" do
95
+ context "with an :anything type" do
96
+ it "returns it's argument untouched" do
97
+ subject.send(:typecast, :some_arg, :anything).should == :some_arg
98
+ end
99
+ end
100
+
101
+ context "with a :boolean type" do
102
+ context "and zero result" do
103
+ it "returns false" do
104
+ subject.send(:typecast, '0', :boolean).should == false
105
+ end
106
+ end
107
+
108
+ context "and non-zero parameter" do
109
+ it "returns true" do
110
+ subject.send(:typecast, '1', :boolean).should == true
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe VkontakteApi::Uploading do
4
+ before(:each) do
5
+ @uploader = Object.new
6
+ @uploader.extend VkontakteApi::Uploading
7
+ end
8
+
9
+ describe "#upload" do
10
+ before(:each) do
11
+ @upload_io = stub("Faraday::UploadIO instance")
12
+ Faraday::UploadIO.stub(:new).and_return(@upload_io)
13
+
14
+ @response_body = stub("Server response body")
15
+ response = stub("Server response", :body => @response_body)
16
+ @connection = stub("Faraday connection", :post => response)
17
+ VkontakteApi::API.stub(:connection).and_return(@connection)
18
+ end
19
+
20
+ context "without a :url param" do
21
+ it "raises an ArgumentError" do
22
+ expect {
23
+ @uploader.upload
24
+ }.to raise_error(ArgumentError)
25
+ end
26
+ end
27
+
28
+ it "creates a Faraday::UploadIO for each file passed in" do
29
+ path = stub("File path")
30
+ type = stub("File mime type")
31
+ Faraday::UploadIO.should_receive(:new).with(path, type)
32
+ @uploader.upload(:url => 'http://example.com', :file1 => [path, type])
33
+ end
34
+
35
+ it "POSTs the files through the connection to a given URL" do
36
+ url = stub("URL")
37
+ file = stub("File")
38
+ @connection.should_receive(:post).with(url, :file1 => @upload_io)
39
+ @uploader.upload(:url => url, :file1 => file)
40
+ end
41
+
42
+ it "returns the server response" do
43
+ @uploader.upload(:url => 'http://example.com').should == @response_body
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe VkontakteApi::Utils do
4
+ describe ".flatten_arguments" do
5
+ before(:each) do
6
+ @arg1 = stub("First argument")
7
+ @arg2 = stub("Second argument")
8
+ @flat_arg1 = stub("Flattened first argument")
9
+ @flat_arg2 = stub("Flattened second argument")
10
+
11
+ VkontakteApi::Utils.stub(:flatten_argument) do |arg|
12
+ case arg
13
+ when @arg1 then @flat_arg1
14
+ when @arg2 then @flat_arg2
15
+ end
16
+ end
17
+ end
18
+
19
+ it "sends each value to .flatten_argument" do
20
+ flat_arguments = VkontakteApi::Utils.flatten_arguments(:arg1 => @arg1, :arg2 => @arg2)
21
+ flat_arguments.should == {:arg1 => @flat_arg1, :arg2 => @flat_arg2}
22
+ end
23
+ end
24
+
25
+ describe ".flatten_argument" do
26
+ context "with a flat argument" do
27
+ before(:each) do
28
+ @argument = :flat
29
+ end
30
+
31
+ it "leaves it untouched" do
32
+ subject.send(:flatten_argument, @argument).should == @argument
33
+ end
34
+ end
35
+
36
+ context "with an array argument" do
37
+ before(:each) do
38
+ @array_argument = [1, 2, 3]
39
+ end
40
+
41
+ it "joins the elements with a comma" do
42
+ flat_argument = subject.send(:flatten_argument, @array_argument)
43
+ flat_argument.should == '1,2,3'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -10,5 +10,9 @@ describe VkontakteApi do
10
10
  end
11
11
  end
12
12
  end
13
+
14
+ after(:each) do
15
+ VkontakteApi.reset
16
+ end
13
17
  end
14
18
  end
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = VkontakteApi::VERSION
8
8
  s.authors = ['Vsevolod Romashov']
9
9
  s.email = ['7@7vn.ru']
10
- s.homepage = 'https://github.com/7even/vkontakte_api'
10
+ s.homepage = 'http://7even.github.com/vkontakte_api'
11
11
  s.summary = %q{Ruby-way wrapper for VKontakte API}
12
12
  s.description = %q{A transparent wrapper for API of vk.com social network called VKontakte. Supports ruby-way method naming (without any method lists inside), result typecasting and any faraday-supported http adapter of your choice (no hardcoded Net::HTTP).}
13
13
 
@@ -16,10 +16,11 @@ Gem::Specification.new do |s|
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
17
17
  s.require_paths = ['lib']
18
18
 
19
- s.add_runtime_dependency 'activesupport', '~> 3.0'
20
- s.add_runtime_dependency 'i18n', '~> 0.6'
21
- s.add_runtime_dependency 'faraday', '~> 0.7.6'
22
- s.add_runtime_dependency 'yajl-ruby', '~> 1.0'
19
+ s.add_runtime_dependency 'faraday', '~> 0.8'
20
+ s.add_runtime_dependency 'faraday_middleware', '~> 0.8'
21
+ s.add_runtime_dependency 'faraday_middleware-parse_oj', '~> 0.1'
22
+ s.add_runtime_dependency 'oauth2', '~> 0.8'
23
+ s.add_runtime_dependency 'hashie', '~> 1.2'
23
24
 
24
25
  s.add_development_dependency 'rake'
25
26
  s.add_development_dependency 'rspec'
metadata CHANGED
@@ -1,63 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vkontakte_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 1.0.rc
5
+ prerelease: 4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Vsevolod Romashov
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-30 00:00:00.000000000 Z
12
+ date: 2012-07-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: &70165295935300 !ruby/object:Gem::Requirement
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '3.0'
21
+ version: '0.8'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70165295935300
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.8'
25
30
  - !ruby/object:Gem::Dependency
26
- name: i18n
27
- requirement: &70165295934660 !ruby/object:Gem::Requirement
31
+ name: faraday_middleware
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
31
36
  - !ruby/object:Gem::Version
32
- version: '0.6'
37
+ version: '0.8'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70165295934660
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.8'
36
46
  - !ruby/object:Gem::Dependency
37
- name: faraday
38
- requirement: &70165295934200 !ruby/object:Gem::Requirement
47
+ name: faraday_middleware-parse_oj
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
42
52
  - !ruby/object:Gem::Version
43
- version: 0.7.6
53
+ version: '0.1'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70165295934200
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
47
62
  - !ruby/object:Gem::Dependency
48
- name: yajl-ruby
49
- requirement: &70165295933740 !ruby/object:Gem::Requirement
63
+ name: oauth2
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ~>
53
68
  - !ruby/object:Gem::Version
54
- version: '1.0'
69
+ version: '0.8'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70165295933740
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '0.8'
78
+ - !ruby/object:Gem::Dependency
79
+ name: hashie
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '1.2'
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: '1.2'
58
94
  - !ruby/object:Gem::Dependency
59
95
  name: rake
60
- requirement: &70165295933300 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
61
97
  none: false
62
98
  requirements:
63
99
  - - ! '>='
@@ -65,10 +101,15 @@ dependencies:
65
101
  version: '0'
66
102
  type: :development
67
103
  prerelease: false
68
- version_requirements: *70165295933300
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
69
110
  - !ruby/object:Gem::Dependency
70
111
  name: rspec
71
- requirement: &70165295932800 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
72
113
  none: false
73
114
  requirements:
74
115
  - - ! '>='
@@ -76,10 +117,15 @@ dependencies:
76
117
  version: '0'
77
118
  type: :development
78
119
  prerelease: false
79
- version_requirements: *70165295932800
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
80
126
  - !ruby/object:Gem::Dependency
81
127
  name: pry
82
- requirement: &70165295932360 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
83
129
  none: false
84
130
  requirements:
85
131
  - - ! '>='
@@ -87,10 +133,15 @@ dependencies:
87
133
  version: '0'
88
134
  type: :development
89
135
  prerelease: false
90
- version_requirements: *70165295932360
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
91
142
  - !ruby/object:Gem::Dependency
92
143
  name: awesome_print
93
- requirement: &70165295931900 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
94
145
  none: false
95
146
  requirements:
96
147
  - - ! '>='
@@ -98,7 +149,12 @@ dependencies:
98
149
  version: '0'
99
150
  type: :development
100
151
  prerelease: false
101
- version_requirements: *70165295931900
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
102
158
  description: A transparent wrapper for API of vk.com social network called VKontakte.
103
159
  Supports ruby-way method naming (without any method lists inside), result typecasting
104
160
  and any faraday-supported http adapter of your choice (no hardcoded Net::HTTP).
@@ -109,30 +165,51 @@ extensions: []
109
165
  extra_rdoc_files: []
110
166
  files:
111
167
  - .gitignore
168
+ - .rspec
112
169
  - .travis.yml
113
170
  - .yardopts
171
+ - CHANGELOG.md
114
172
  - Gemfile
115
173
  - MIT-LICENSE
116
174
  - README.md
117
- - README.ru.md
118
175
  - Rakefile
176
+ - lib/generators/vkontakte_api/install/USAGE
177
+ - lib/generators/vkontakte_api/install/install_generator.rb
178
+ - lib/generators/vkontakte_api/install/templates/initializer.rb
119
179
  - lib/vkontakte_api.rb
120
180
  - lib/vkontakte_api/api.rb
181
+ - lib/vkontakte_api/authorization.rb
121
182
  - lib/vkontakte_api/client.rb
122
183
  - lib/vkontakte_api/configuration.rb
123
184
  - lib/vkontakte_api/error.rb
185
+ - lib/vkontakte_api/logger.rb
186
+ - lib/vkontakte_api/method.rb
187
+ - lib/vkontakte_api/namespace.rb
124
188
  - lib/vkontakte_api/namespaces.yml
189
+ - lib/vkontakte_api/resolvable.rb
125
190
  - lib/vkontakte_api/resolver.rb
191
+ - lib/vkontakte_api/result.rb
192
+ - lib/vkontakte_api/uploading.rb
193
+ - lib/vkontakte_api/utils.rb
126
194
  - lib/vkontakte_api/version.rb
195
+ - spec/integration_spec.rb
127
196
  - spec/spec_helper.rb
128
197
  - spec/vkontakte_api/api_spec.rb
198
+ - spec/vkontakte_api/authorization_spec.rb
129
199
  - spec/vkontakte_api/client_spec.rb
130
200
  - spec/vkontakte_api/configuration_spec.rb
131
201
  - spec/vkontakte_api/error_spec.rb
202
+ - spec/vkontakte_api/logger_spec.rb
203
+ - spec/vkontakte_api/method_spec.rb
204
+ - spec/vkontakte_api/namespace_spec.rb
205
+ - spec/vkontakte_api/resolvable_spec.rb
132
206
  - spec/vkontakte_api/resolver_spec.rb
207
+ - spec/vkontakte_api/result_spec.rb
208
+ - spec/vkontakte_api/uploading_spec.rb
209
+ - spec/vkontakte_api/utils_spec.rb
133
210
  - spec/vkontakte_api_spec.rb
134
211
  - vkontakte_api.gemspec
135
- homepage: https://github.com/7even/vkontakte_api
212
+ homepage: http://7even.github.com/vkontakte_api
136
213
  licenses: []
137
214
  post_install_message:
138
215
  rdoc_options: []
@@ -144,29 +221,33 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
221
  - - ! '>='
145
222
  - !ruby/object:Gem::Version
146
223
  version: '0'
147
- segments:
148
- - 0
149
- hash: 3384818246116410230
150
224
  required_rubygems_version: !ruby/object:Gem::Requirement
151
225
  none: false
152
226
  requirements:
153
- - - ! '>='
227
+ - - ! '>'
154
228
  - !ruby/object:Gem::Version
155
- version: '0'
156
- segments:
157
- - 0
158
- hash: 3384818246116410230
229
+ version: 1.3.1
159
230
  requirements: []
160
231
  rubyforge_project:
161
- rubygems_version: 1.8.10
232
+ rubygems_version: 1.8.23
162
233
  signing_key:
163
234
  specification_version: 3
164
235
  summary: Ruby-way wrapper for VKontakte API
165
236
  test_files:
237
+ - spec/integration_spec.rb
166
238
  - spec/spec_helper.rb
167
239
  - spec/vkontakte_api/api_spec.rb
240
+ - spec/vkontakte_api/authorization_spec.rb
168
241
  - spec/vkontakte_api/client_spec.rb
169
242
  - spec/vkontakte_api/configuration_spec.rb
170
243
  - spec/vkontakte_api/error_spec.rb
244
+ - spec/vkontakte_api/logger_spec.rb
245
+ - spec/vkontakte_api/method_spec.rb
246
+ - spec/vkontakte_api/namespace_spec.rb
247
+ - spec/vkontakte_api/resolvable_spec.rb
171
248
  - spec/vkontakte_api/resolver_spec.rb
249
+ - spec/vkontakte_api/result_spec.rb
250
+ - spec/vkontakte_api/uploading_spec.rb
251
+ - spec/vkontakte_api/utils_spec.rb
172
252
  - spec/vkontakte_api_spec.rb
253
+ has_rdoc:
data/README.ru.md DELETED
@@ -1,115 +0,0 @@
1
- # vkontakte_api [![Build Status](https://secure.travis-ci.org/7even/vkontakte_api.png)](http://travis-ci.org/7even/vkontakte_api)
2
-
3
- `vkontakte_api` - ruby-обертка для API ВКонтакте. Она позволяет вызывать методы API настолько просто, насколько это возможно.
4
-
5
- Это русская версия readme. Английская версия лежит [здесь](https://github.com/7even/vkontakte_api/blob/master/README.md).
6
-
7
- ## Установка
8
-
9
- ``` bash
10
- gem install vkontakte_api
11
- ```
12
-
13
- ## Использование
14
-
15
- По умолчанию для HTTP-запросов используется `Net::HTTP`. Можно выбрать любой другой адаптер, поддерживаемый `faraday`, в блоке `VkontakteApi.configure` следующим образом:
16
-
17
- ``` ruby
18
- VkontakteApi.configure do |config|
19
- config.adapter = :net_http
20
- end
21
- ```
22
-
23
- Все запросы к API отправляются через объект класса `VkontakteApi::Client`.
24
-
25
- ``` ruby
26
- @app = VkontakteApi::Client.new
27
- ```
28
-
29
- Чтобы создать клиент для отправки авторизованных запросов, нужно просто передать в конструктор токен доступа.
30
-
31
- ``` ruby
32
- @app = VkontakteApi::Client.new('my_access_token')
33
- ```
34
-
35
- Пожалуй, самый простой способ получить токен в веб-приложении - использовать [OmniAuth](https://github.com/intridea/omniauth), но если это неприемлемо, можно реализовать свой механизм авторизации. На данный момент `vkontakte_api` не умеет получать токен.
36
-
37
- Теперь можно вызывать методы API. Все названия методов переведены в underscore_case - в отличие от [официальной документации](http://vk.com/developers.php?oid=-17680044&p=API_Method_Description), где они в camelCase, т.е. `getGroups` становится `get_groups`. Можно по прежнему писать методы в camelCase, но это не соответствует стандартам стиля кода, принятым в ruby.
38
-
39
- ``` ruby
40
- @app.get_user_settings # => 327710
41
- @app.groups.get # => [1, 31022447]
42
- ```
43
-
44
- Предикатные методы (названия которых начинаются с `is`, например `is_app_user`) должны возвращать результат какого-то условия, поэтому в конец названия метода добавляется '?', и возвращается булево значение (`true` или `false`):
45
-
46
- ``` ruby
47
- @app.is_app_user? # => true
48
- ```
49
-
50
- Можно вызывать эти методы и без '?' на конце, тогда они будут возвращать `'0'` или `'1'`.
51
-
52
- Теперь о параметрах. Все параметры именованные, и передаются в методы в виде хэша, где ключи соответствуют названиям параметров, а значения - соответственно, их значениям:
53
-
54
- ``` ruby
55
- @app.friends.get(fields: 'uid,first_name,last_name')
56
- # => [
57
- # {
58
- # :uid => "1",
59
- # :first_name => "Павел",
60
- # :last_name => "Дуров"
61
- # },
62
- # {
63
- # :uid => "6492",
64
- # :first_name => "Andrew",
65
- # :last_name => "Rogozov"
66
- # }
67
- # ]
68
- ```
69
-
70
- Если значение параметра - список, разделенный запятыми, то его можно передать в виде массива; он будет корректно обработан перед отправкой запроса:
71
-
72
- ``` ruby
73
- users_ids = [1, 6492]
74
- @app.users.get(uids: users_ids) # => тот же вывод, что и выше
75
- ```
76
-
77
- Также следует заметить, что все возвращаемые хэши имеют символьные ключи.
78
-
79
- Если результат метода - Enumerable, то методу можно передать блок, который будет вызван для каждого элемента результата. В этом случае метод вернет массив из результатов выполнения блока с каждым элементом (аналогично `Enumerable#map`):
80
-
81
- ``` ruby
82
- @app.friends.get(fields: 'first_name,last_name') do |friend|
83
- "#{friend[:first_name]} #{friend[:last_name]}"
84
- end
85
- # => ["Павел Дуров", "Andrew Rogozov"]
86
- ```
87
-
88
- `vkontakte_api` не содержит списка названий методов (если не считать пространств имен, вроде `friends` или `groups`) - когда вызывается метод, его название переводится в camelCase, а уже потом отправляется запрос к ВКонтакте. Поэтому когда новый метод добавляется в API, не нужно ждать новой версии гема `vkontakte_api` - можно использовать этот новый метод сразу же. Если в названии запрошенного метода допущены ошибки, или вызван метод, на выполнение которого отсутствуют права, будет выброшено исключение с соответствующим сообщением (об исключениях чуть ниже).
89
-
90
- ### Обработка ошибок
91
-
92
- Если ВКонтакте возвращает ошибку, выбрасывается исключение класса `VkontakteApi::Error` со всей значимой информацией, которую можно получить:
93
-
94
- ``` ruby
95
- @app.audio.get_by_id
96
- # => VkontakteApi::Error: VKontakte returned an error 1: 'Unknown error occured' after calling method 'audio.getById' with parameters {}.
97
- ```
98
-
99
- ## Changelog
100
-
101
- * 0.1 Первая стабильная версия
102
- * 0.2 Поддержка аргументов-массивов, подчищенные неавторизованные запросы, обновленный список пространств имен, документация кода
103
- * 0.2.1 Пространство имен `stats`
104
-
105
- ## Планы
106
-
107
- * Логирование запросов
108
- * Авторизация (получение токена доступа с ВКонтакте)
109
- * Возможно, Struct-подобные объекты в результатах запросов (вместо Hash)
110
-
111
- ## Участие в разработке
112
-
113
- Если вы хотите поучаствовать в разработке проекта, форкните репозиторий, положите свои изменения в отдельную ветку и отправьте мне pull request.
114
-
115
- `vkontakte_api` тестируется под MRI `1.8.7`, `1.9.2` и `1.9.3`. Если в одной из этих сред что-то работает неправильно, либо вообще не работает, то это следует считать багом, и написать об этом в issues на Github.