mediawiki_api 0.5.0 → 0.6.0
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 +4 -4
- data/README.md +4 -0
- data/Rakefile +19 -0
- data/lib/mediawiki_api/client.rb +39 -2
- data/lib/mediawiki_api/version.rb +1 -1
- data/spec/client_spec.rb +101 -32
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 176f86e086fb5b9c2a275cade16f2199c7a662b8
|
4
|
+
data.tar.gz: da273be34eff6481902b5e30621f0c08ba481af1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a76cf068332b572df322dfd3d98a76c6a018f1213aee4585f1cc94e787e15edc5678e6df2b2002d41fd37f61baf3601c569397a6c210cf1d261317e878702b8
|
7
|
+
data.tar.gz: cc667e15712a3acf66b26f88f366ee468606e50081dc18f72909b65ec6c23d9cd5093db8c8b3cf214512f20262b80307d026c739ca636b0829de5d48b2d81d0b
|
data/README.md
CHANGED
@@ -65,6 +65,10 @@ See https://www.mediawiki.org/wiki/Gerrit
|
|
65
65
|
|
66
66
|
## Release notes
|
67
67
|
|
68
|
+
### 0.6.0 2016-05-25
|
69
|
+
- Update account creation code for AuthManager. This change updates the gem to test which API
|
70
|
+
flavor is in use, then send requests accordingly.
|
71
|
+
|
68
72
|
### 0.5.0 2015-09-04
|
69
73
|
- Client cookies can now be read and modified via MediawikiApi::Client#cookies.
|
70
74
|
- Logging in will recurse upon a `NeedToken` API error only once to avoid
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# pre-flight
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
require 'rubocop/rake_task'
|
7
|
+
require 'yard'
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
|
+
RuboCop::RakeTask.new(:rubocop)
|
11
|
+
YARD::Rake::YardocTask.new(:yard)
|
12
|
+
|
13
|
+
task default: [:test]
|
14
|
+
|
15
|
+
desc 'Run all build/tests commands (CI entry point)'
|
16
|
+
task test: [:build, :rubocop, :spec, :yard]
|
17
|
+
|
18
|
+
desc 'Generate all documentations'
|
19
|
+
task doc: [:yard]
|
data/lib/mediawiki_api/client.rb
CHANGED
@@ -41,7 +41,44 @@ module MediawikiApi
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def create_account(username, password
|
44
|
+
def create_account(username, password)
|
45
|
+
params = { modules: 'createaccount', token_type: false }
|
46
|
+
d = action(:paraminfo, params).data
|
47
|
+
params = d['modules'] && d['modules'][0] && d['modules'][0]['parameters']
|
48
|
+
if !params || !params.map
|
49
|
+
raise CreateAccountError, 'unexpected API response format'
|
50
|
+
end
|
51
|
+
params = params.map{ |o| o['name'] }
|
52
|
+
|
53
|
+
if params.include? 'requests'
|
54
|
+
create_account_new(username, password)
|
55
|
+
else
|
56
|
+
create_account_old(username, password)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_account_new(username, password)
|
61
|
+
# post-AuthManager
|
62
|
+
data = action(:query, { meta: 'tokens', type: 'createaccount', token_type: false }).data
|
63
|
+
token = data['tokens'] && data['tokens']['createaccounttoken']
|
64
|
+
unless token
|
65
|
+
raise CreateAccountError, 'failed to get createaccount API token'
|
66
|
+
end
|
67
|
+
|
68
|
+
data = action(:createaccount, {
|
69
|
+
username: username,
|
70
|
+
password: password,
|
71
|
+
retype: password,
|
72
|
+
createreturnurl: 'http://example.com', # won't be used but must be a valid URL
|
73
|
+
createtoken: token,
|
74
|
+
token_type: false
|
75
|
+
}).data
|
76
|
+
raise CreateAccountError, data['message'] if data['status'] != 'PASS'
|
77
|
+
data
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_account_old(username, password, token = nil)
|
81
|
+
# pre-AuthManager
|
45
82
|
params = { name: username, password: password, token_type: false }
|
46
83
|
params[:token] = token unless token.nil?
|
47
84
|
|
@@ -52,7 +89,7 @@ module MediawikiApi
|
|
52
89
|
@logged_in = true
|
53
90
|
@tokens.clear
|
54
91
|
when 'NeedToken'
|
55
|
-
data =
|
92
|
+
data = create_account_old(username, password, data['token'])
|
56
93
|
else
|
57
94
|
raise CreateAccountError, data['result']
|
58
95
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -335,57 +335,126 @@ describe MediawikiApi::Client do
|
|
335
335
|
end
|
336
336
|
|
337
337
|
describe '#create_account' do
|
338
|
-
|
339
|
-
stub_request(:post, api_url).
|
340
|
-
with(body: { format: 'json', action: 'createaccount', name: 'Test', password: 'qwe123' }).
|
341
|
-
to_return(body: { createaccount: body_base.merge(result: 'Success') }.to_json)
|
342
|
-
|
343
|
-
expect(subject.create_account('Test', 'qwe123')).to include('result' => 'Success')
|
344
|
-
end
|
345
|
-
|
346
|
-
context 'when API returns NeedToken' do
|
338
|
+
context 'when the old createaccount API is used' do
|
347
339
|
before do
|
348
340
|
stub_request(:post, api_url).
|
349
|
-
with(body: { format: 'json',
|
350
|
-
|
351
|
-
|
352
|
-
body: { createaccount: body_base.merge(result: 'NeedToken', token: '456') }.to_json,
|
353
|
-
headers: { 'Set-Cookie' => 'prefixSession=789; path=/; domain=localhost; HttpOnly' }
|
354
|
-
)
|
341
|
+
with(body: { action: 'paraminfo', format: 'json', modules: 'createaccount' }).
|
342
|
+
to_return(body: { paraminfo: body_base.merge(modules: [{ parameters: [] }]) }.to_json)
|
343
|
+
end
|
355
344
|
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
with(headers: { 'Cookie' => 'prefixSession=789' }).
|
345
|
+
it 'creates an account when API returns Success' do
|
346
|
+
stub_request(:post, api_url).
|
347
|
+
with(body: { format: 'json', action: 'createaccount', name: 'Test', password: 'qwe123' }).
|
360
348
|
to_return(body: { createaccount: body_base.merge(result: 'Success') }.to_json)
|
361
|
-
end
|
362
349
|
|
363
|
-
it 'creates an account' do
|
364
350
|
expect(subject.create_account('Test', 'qwe123')).to include('result' => 'Success')
|
365
351
|
end
|
366
352
|
|
367
|
-
|
368
|
-
|
369
|
-
|
353
|
+
context 'when API returns NeedToken' do
|
354
|
+
before do
|
355
|
+
stub_request(:post, api_url).
|
356
|
+
with(body: { format: 'json', action: 'createaccount',
|
357
|
+
name: 'Test', password: 'qwe123' }).
|
358
|
+
to_return(
|
359
|
+
body: { createaccount: body_base.merge(result: 'NeedToken', token: '456') }.to_json,
|
360
|
+
headers: { 'Set-Cookie' => 'prefixSession=789; path=/; domain=localhost; HttpOnly' }
|
361
|
+
)
|
362
|
+
|
363
|
+
@success_req = stub_request(:post, api_url).
|
364
|
+
with(body: { format: 'json', action: 'createaccount',
|
365
|
+
name: 'Test', password: 'qwe123', token: '456' }).
|
366
|
+
with(headers: { 'Cookie' => 'prefixSession=789' }).
|
367
|
+
to_return(body: { createaccount: body_base.merge(result: 'Success') }.to_json)
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'creates an account' do
|
371
|
+
expect(subject.create_account('Test', 'qwe123')).to include('result' => 'Success')
|
372
|
+
end
|
373
|
+
|
374
|
+
it 'sends second request with token and cookies' do
|
375
|
+
subject.create_account 'Test', 'qwe123'
|
376
|
+
expect(@success_req).to have_been_requested
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
# docs don't specify other results, but who knows
|
381
|
+
# http://www.mediawiki.org/wiki/API:Account_creation
|
382
|
+
context 'when API returns neither Success nor NeedToken' do
|
383
|
+
before do
|
384
|
+
stub_request(:post, api_url).
|
385
|
+
with(body: { format: 'json', action: 'createaccount',
|
386
|
+
name: 'Test', password: 'qwe123' }).
|
387
|
+
to_return(body: { createaccount: body_base.merge(result: 'WhoKnows') }.to_json)
|
388
|
+
end
|
389
|
+
|
390
|
+
it 'raises error with proper message' do
|
391
|
+
expect { subject.create_account 'Test', 'qwe123' }.to raise_error(
|
392
|
+
MediawikiApi::CreateAccountError,
|
393
|
+
'WhoKnows'
|
394
|
+
)
|
395
|
+
end
|
370
396
|
end
|
371
397
|
end
|
372
398
|
|
373
|
-
|
374
|
-
# http://www.mediawiki.org/wiki/API:Account_creation
|
375
|
-
context 'when API returns neither Success nor NeedToken' do
|
399
|
+
context 'when the new createaccount API is used' do
|
376
400
|
before do
|
377
401
|
stub_request(:post, api_url).
|
378
|
-
with(body: { format: 'json',
|
379
|
-
|
380
|
-
|
402
|
+
with(body: { action: 'paraminfo', format: 'json', modules: 'createaccount' }).
|
403
|
+
to_return(body: { paraminfo: body_base.merge(
|
404
|
+
modules: [{ parameters: [{ name: 'requests' }] }]
|
405
|
+
) }.to_json)
|
381
406
|
end
|
382
407
|
|
383
|
-
it 'raises error
|
408
|
+
it 'raises an error when fetching a token fails' do
|
409
|
+
stub_request(:post, api_url).
|
410
|
+
with(body: { action: 'query', format: 'json', meta: 'tokens', type: 'createaccount' }).
|
411
|
+
to_return(body: { tokens: body_base.merge(foo: '12345\\+') }.to_json)
|
384
412
|
expect { subject.create_account 'Test', 'qwe123' }.to raise_error(
|
385
413
|
MediawikiApi::CreateAccountError,
|
386
|
-
'
|
414
|
+
'failed to get createaccount API token'
|
387
415
|
)
|
388
416
|
end
|
417
|
+
|
418
|
+
context 'when fetching a token succeeds' do
|
419
|
+
before do
|
420
|
+
stub_request(:post, api_url).
|
421
|
+
with(body: { format: 'json', action: 'query', meta: 'tokens', type: 'createaccount' }).
|
422
|
+
to_return(body: { tokens: body_base.merge(createaccounttoken: '12345\\+') }.to_json)
|
423
|
+
end
|
424
|
+
|
425
|
+
it 'creates an account when the API returns success' do
|
426
|
+
stub_request(:post, api_url).
|
427
|
+
with(body: { format: 'json', action: 'createaccount',
|
428
|
+
createreturnurl: 'http://example.com', username: 'Test',
|
429
|
+
password: 'qwe123', retype: 'qwe123', createtoken: '12345\\+' }).
|
430
|
+
to_return(body: { createaccount: body_base.merge(status: 'PASS') }.to_json)
|
431
|
+
expect(subject.create_account('Test', 'qwe123')).to include('status' => 'PASS')
|
432
|
+
end
|
433
|
+
|
434
|
+
it 'raises an error when the API returns failure' do
|
435
|
+
stub_request(:post, api_url).
|
436
|
+
with(body: { format: 'json', action: 'createaccount',
|
437
|
+
createreturnurl: 'http://example.com', username: 'Test',
|
438
|
+
password: 'qwe123', retype: 'qwe123', createtoken: '12345\\+' }).
|
439
|
+
to_return(body: { createaccount: body_base.merge(
|
440
|
+
status: 'FAIL', message: 'User exists!'
|
441
|
+
) }.to_json)
|
442
|
+
expect { subject.create_account 'Test', 'qwe123' }.to raise_error(
|
443
|
+
MediawikiApi::CreateAccountError,
|
444
|
+
'User exists!'
|
445
|
+
)
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
it 'raises an error when the paraminfo query result is weird' do
|
451
|
+
stub_request(:post, api_url).
|
452
|
+
with(body: { action: 'paraminfo', format: 'json', modules: 'createaccount' }).
|
453
|
+
to_return(body: { paraminfo: body_base.merge(modules: []) }.to_json)
|
454
|
+
expect { subject.create_account 'Test', 'qwe123' }.to raise_error(
|
455
|
+
MediawikiApi::CreateAccountError,
|
456
|
+
'unexpected API response format'
|
457
|
+
)
|
389
458
|
end
|
390
459
|
end
|
391
460
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mediawiki_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Amir Aharoni
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date:
|
17
|
+
date: 2016-05-25 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: faraday
|
@@ -188,6 +188,7 @@ files:
|
|
188
188
|
- Gemfile
|
189
189
|
- LICENSE.txt
|
190
190
|
- README.md
|
191
|
+
- Rakefile
|
191
192
|
- lib/mediawiki_api.rb
|
192
193
|
- lib/mediawiki_api/client.rb
|
193
194
|
- lib/mediawiki_api/exceptions.rb
|
@@ -219,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
220
|
version: '0'
|
220
221
|
requirements: []
|
221
222
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.
|
223
|
+
rubygems_version: 2.5.1
|
223
224
|
signing_key:
|
224
225
|
specification_version: 4
|
225
226
|
summary: A library for interacting with MediaWiki API from Ruby.
|