vkontakte_api 0.2.1 → 1.0.rc

Sign up to get free protection for your applications and to get access to all the features.
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.