mediawiki-gateway 0.6.2 → 1.0.0.rc1
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/COPYING +22 -0
- data/ChangeLog +16 -0
- data/README.md +80 -21
- data/Rakefile +28 -34
- data/bin/mediawiki-gateway +203 -0
- data/lib/media_wiki.rb +4 -9
- data/lib/media_wiki/exception.rb +11 -8
- data/lib/media_wiki/fake_wiki.rb +636 -0
- data/lib/media_wiki/gateway.rb +105 -940
- data/lib/media_wiki/gateway/files.rb +173 -0
- data/lib/media_wiki/gateway/pages.rb +400 -0
- data/lib/media_wiki/gateway/query.rb +98 -0
- data/lib/media_wiki/gateway/site.rb +101 -0
- data/lib/media_wiki/gateway/users.rb +182 -0
- data/lib/media_wiki/utils.rb +47 -13
- data/lib/media_wiki/version.rb +27 -0
- data/lib/mediawiki-gateway.rb +1 -0
- data/spec/{import-test-data.xml → data/import.xml} +0 -0
- data/spec/media_wiki/gateway/files_spec.rb +34 -0
- data/spec/media_wiki/gateway/pages_spec.rb +390 -0
- data/spec/media_wiki/gateway/query_spec.rb +84 -0
- data/spec/media_wiki/gateway/site_spec.rb +122 -0
- data/spec/media_wiki/gateway/users_spec.rb +171 -0
- data/spec/media_wiki/gateway_spec.rb +129 -0
- data/spec/{live_gateway_spec.rb → media_wiki/live_gateway_spec.rb} +31 -35
- data/spec/{utils_spec.rb → media_wiki/utils_spec.rb} +41 -39
- data/spec/spec_helper.rb +17 -16
- metadata +77 -135
- data/.ruby-version +0 -1
- data/.rvmrc +0 -34
- data/Gemfile +0 -19
- data/Gemfile.lock +0 -77
- data/LICENSE +0 -21
- data/config/hosts.yml +0 -17
- data/lib/media_wiki/config.rb +0 -69
- data/mediawiki-gateway.gemspec +0 -113
- data/samples/README +0 -18
- data/samples/create_page.rb +0 -13
- data/samples/delete_batch.rb +0 -14
- data/samples/download_batch.rb +0 -15
- data/samples/email_user.rb +0 -14
- data/samples/export_xml.rb +0 -14
- data/samples/get_page.rb +0 -11
- data/samples/import_xml.rb +0 -14
- data/samples/run_fake_media_wiki.rb +0 -8
- data/samples/search_content.rb +0 -12
- data/samples/semantic_query.rb +0 -17
- data/samples/upload_commons.rb +0 -45
- data/samples/upload_file.rb +0 -13
- data/spec/fake_media_wiki/api_pages.rb +0 -135
- data/spec/fake_media_wiki/app.rb +0 -360
- data/spec/fake_media_wiki/query_handling.rb +0 -136
- data/spec/gateway_spec.rb +0 -888
@@ -0,0 +1,27 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
|
3
|
+
module Version
|
4
|
+
|
5
|
+
MAJOR = 1
|
6
|
+
MINOR = 0
|
7
|
+
PATCH = 0
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
# Returns array representation.
|
12
|
+
def to_a
|
13
|
+
[MAJOR, MINOR, PATCH] << 'rc1'
|
14
|
+
end
|
15
|
+
|
16
|
+
# Short-cut for version string.
|
17
|
+
def to_s
|
18
|
+
to_a.join('.')
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
VERSION = Version.to_s
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'media_wiki'
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway::Files do
|
2
|
+
|
3
|
+
describe "#upload" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@gateway.login('atlasmw', 'wombat')
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "when uploading a new file" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@path = 'some/path/sample_image.jpg'
|
13
|
+
allow(File).to receive(:new).with(@path).and_return('SAMPLEIMAGEDATA')
|
14
|
+
@page = @gateway.upload(@path)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should open the file" do
|
18
|
+
File.should have_received(:new).with(@path)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should upload the file" do
|
22
|
+
expected = <<-XML
|
23
|
+
<api>
|
24
|
+
<upload result="Success" filename="sample_image.jpg"/>
|
25
|
+
</api>
|
26
|
+
XML
|
27
|
+
expect(@page.to_s).to be_equivalent_to(expected)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,390 @@
|
|
1
|
+
describe_fake MediaWiki::Gateway::Pages do
|
2
|
+
|
3
|
+
describe "#get" do
|
4
|
+
|
5
|
+
describe "for an existing wiki page" do
|
6
|
+
|
7
|
+
it "returns raw page content" do
|
8
|
+
@gateway.get("Main Page").should == "Content"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "for an existing empty wiki page" do
|
14
|
+
|
15
|
+
it "returns an empty string" do
|
16
|
+
@gateway.get("Empty").should == ""
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "for a missing wiki page" do
|
22
|
+
|
23
|
+
it "returns nil" do
|
24
|
+
@gateway.get("page/missing").should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "for root (/)" do
|
30
|
+
|
31
|
+
it "returns nil" do
|
32
|
+
@gateway.get("").should be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "when wiki returns 503" do
|
38
|
+
|
39
|
+
before do
|
40
|
+
@log = double(:debug => nil, :warn => nil)
|
41
|
+
@fail_gateway = MediaWiki::Gateway.new(@gateway.wiki_url, maxlag: -1, retry_delay: 0)
|
42
|
+
allow(@fail_gateway).to receive(:log) { @log }
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should retry twice and fail" do
|
46
|
+
lambda {
|
47
|
+
@fail_gateway.get("")
|
48
|
+
}.should raise_error
|
49
|
+
@log.should have_received(:warn).with("503 Service Unavailable: Maxlag exceeded. Retry in 0 seconds.").twice
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should pass options to RestClient::Request" do
|
55
|
+
gateway = MediaWiki::Gateway.new(@gateway.wiki_url, {}, verify_ssl: false)
|
56
|
+
RestClient::Request.should receive(:execute).with(hash_including(:verify_ssl => false)).and_return([double(:elements => {})])
|
57
|
+
gateway.get("").should be_nil
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#render" do
|
63
|
+
|
64
|
+
describe "for an existing wiki page" do
|
65
|
+
|
66
|
+
before do
|
67
|
+
@pages = @gateway.render('Main Page')
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return the page content" do
|
71
|
+
expected = 'Sample <B>HTML</B> content.'
|
72
|
+
@pages.to_s.should == expected
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should raise an ArgumentError on illegal options" do
|
76
|
+
lambda do
|
77
|
+
@gateway.render("Main Page", :doesnotexist => :at_all)
|
78
|
+
end.should raise_error(ArgumentError)
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "with option" do
|
82
|
+
|
83
|
+
it "should strip img tags" do
|
84
|
+
@pages = @gateway.render('Foopage', :noimages => true)
|
85
|
+
|
86
|
+
expected = 'Sample <B>HTML</B> content.'\
|
87
|
+
'<span class="editsection">[<a title="Edit section: Nomenclature" href="/w/index.php?title=Seat_of_local_government&action=edit&section=1">edit</a>]</span>'\
|
88
|
+
'<a title="Interpreted language" href="/wiki/Interpreted_language">interpreted language</a>'
|
89
|
+
@pages.to_s.should == expected
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should strip edit sections" do
|
93
|
+
@pages = @gateway.render('Foopage', :noeditsections => true)
|
94
|
+
|
95
|
+
expected = 'Sample <B>HTML</B> content.' \
|
96
|
+
'<img width="150" height="150" class="thumbimage" src="http://upload.wikimedia.org/foo/Ruby_logo.svg" alt="Ruby logo.svg"/>' \
|
97
|
+
'<a title="Interpreted language" href="/wiki/Interpreted_language">interpreted language</a>'
|
98
|
+
@pages.to_s.should == expected
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should make all links absolute" do
|
102
|
+
@pages = @gateway.render('Foopage', :linkbase => "http://en.wikipedia.org")
|
103
|
+
|
104
|
+
expected = 'Sample <B>HTML</B> content.' \
|
105
|
+
'<img width="150" height="150" class="thumbimage" src="http://upload.wikimedia.org/foo/Ruby_logo.svg" alt="Ruby logo.svg"/>' \
|
106
|
+
'<span class="editsection">[<a title="Edit section: Nomenclature" href="/w/index.php?title=Seat_of_local_government&action=edit&section=1">edit</a>]</span>'\
|
107
|
+
'<a title="Interpreted language" href="http://en.wikipedia.org/wiki/Interpreted_language">interpreted language</a>'
|
108
|
+
@pages.to_s.should == expected
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "for a missing wiki page" do
|
116
|
+
|
117
|
+
before do
|
118
|
+
@pages = @gateway.render('Invalidpage')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should return nil" do
|
122
|
+
@pages.should == nil
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#create" do
|
130
|
+
|
131
|
+
before do
|
132
|
+
@gateway.login('atlasmw', 'wombat')
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "when creating a new page" do
|
136
|
+
|
137
|
+
before do
|
138
|
+
@page = @gateway.create("A New Page", "Some content")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should create the page" do
|
142
|
+
expected = <<-XML
|
143
|
+
<api>
|
144
|
+
<edit new='' result='Success' pageid='8' title='A New Page' oldrevid='0' newrevid='8'/>
|
145
|
+
</api>
|
146
|
+
XML
|
147
|
+
expect(@page.to_s).to be_equivalent_to(expected)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "when creating a page that already exists" do
|
153
|
+
|
154
|
+
before do
|
155
|
+
$fake_media_wiki.reset
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "and the 'overwrite' option is set" do
|
159
|
+
|
160
|
+
before do
|
161
|
+
@new_page = @gateway.create("Main Page", "Some new content", :summary => "The summary", :overwrite => true)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should overwrite the existing page" do
|
165
|
+
expected = <<-XML
|
166
|
+
<api>
|
167
|
+
<edit result='Success' pageid='8' title='Main Page' oldrevid='1' newrevid='8'/>
|
168
|
+
</api>
|
169
|
+
XML
|
170
|
+
expect(@new_page.to_s).to be_equivalent_to(expected)
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "and the 'overwrite' option is not set" do
|
176
|
+
|
177
|
+
it "should raise an error" do
|
178
|
+
lambda do
|
179
|
+
@gateway.create("Main Page", "Some new content")
|
180
|
+
end.should raise_error(MediaWiki::APIError)
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "#edit" do
|
190
|
+
|
191
|
+
before do
|
192
|
+
$fake_media_wiki.reset
|
193
|
+
@edit_page = @gateway.edit("Main Page", "Some new content")
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should overwrite the existing page" do
|
197
|
+
expected = <<-XML
|
198
|
+
<api>
|
199
|
+
<edit result='Success' pageid='8' title='Main Page' oldrevid='1' newrevid='8'/>
|
200
|
+
</api>
|
201
|
+
XML
|
202
|
+
expect(@edit_page.to_s).to be_equivalent_to(expected)
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#delete" do
|
208
|
+
|
209
|
+
before do
|
210
|
+
title, content = 'Deletable Page', 'Some content'
|
211
|
+
|
212
|
+
@gateway.send_request(
|
213
|
+
'action' => 'edit',
|
214
|
+
'title' => title,
|
215
|
+
'text' => content,
|
216
|
+
'summary' => '',
|
217
|
+
'createonly' => '',
|
218
|
+
'token' => @gateway.send(:get_token, 'edit', title)
|
219
|
+
)
|
220
|
+
end
|
221
|
+
|
222
|
+
describe "when logged in as admin" do
|
223
|
+
|
224
|
+
describe "and the page exists" do
|
225
|
+
|
226
|
+
def delete_response
|
227
|
+
<<-XML
|
228
|
+
<api>
|
229
|
+
<delete title='Deletable Page' reason='Default reason'/>
|
230
|
+
</api>
|
231
|
+
XML
|
232
|
+
end
|
233
|
+
|
234
|
+
before do
|
235
|
+
@gateway.login("atlasmw", "wombat")
|
236
|
+
@page = @gateway.delete("Deletable Page")
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should delete the page" do
|
240
|
+
expect(@page.to_s).to be_equivalent_to(delete_response)
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
describe "and the page does not exist" do
|
246
|
+
|
247
|
+
before do
|
248
|
+
@gateway.login("atlasmw", "wombat")
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should raise an error" do
|
252
|
+
lambda do
|
253
|
+
@gateway.delete("Missing Page")
|
254
|
+
end.should raise_error(MediaWiki::APIError)
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
describe "when not logged in" do
|
262
|
+
|
263
|
+
it "should raise an error" do
|
264
|
+
lambda do
|
265
|
+
@gateway.delete("Deletable Page")
|
266
|
+
end.should raise_error(MediaWiki::Unauthorized)
|
267
|
+
end
|
268
|
+
|
269
|
+
end
|
270
|
+
|
271
|
+
end
|
272
|
+
|
273
|
+
describe "#undelete" do
|
274
|
+
|
275
|
+
describe "when logged in as admin" do
|
276
|
+
before do
|
277
|
+
$fake_media_wiki.reset
|
278
|
+
@gateway.login("atlasmw", "wombat")
|
279
|
+
end
|
280
|
+
|
281
|
+
describe "and the page no longer exists" do
|
282
|
+
before do
|
283
|
+
@revs = @gateway.undelete("Sandbox:Undeleted")
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should recreate the given page" do
|
287
|
+
@gateway.list("Sandbox:Undeleted").should == [ "Sandbox:Undeleted" ]
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should report one undeleted revision" do
|
291
|
+
@revs.should == 1
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
describe "but the page exists" do
|
296
|
+
before do
|
297
|
+
@revs = @gateway.undelete("Main Page")
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should report zero undeleted revisions" do
|
301
|
+
@revs.should == 0
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe "when not logged in" do
|
307
|
+
|
308
|
+
it "should raise an error" do
|
309
|
+
lambda do
|
310
|
+
@gateway.undelete("Undeletable Page")
|
311
|
+
end.should raise_error(MediaWiki::APIError)
|
312
|
+
end
|
313
|
+
|
314
|
+
end
|
315
|
+
|
316
|
+
end
|
317
|
+
|
318
|
+
describe "#list" do
|
319
|
+
|
320
|
+
before do
|
321
|
+
$fake_media_wiki.reset
|
322
|
+
end
|
323
|
+
|
324
|
+
describe "with an empty key" do
|
325
|
+
|
326
|
+
before do
|
327
|
+
@list = @gateway.list("")
|
328
|
+
end
|
329
|
+
|
330
|
+
it "should list all pages" do
|
331
|
+
@list.sort.should == [ "Book:Italy", "Empty", "Foopage", "Level/Level/Index", "Main 2", "Main Page", "Redirect" ]
|
332
|
+
end
|
333
|
+
|
334
|
+
end
|
335
|
+
|
336
|
+
describe "with a namespace as the key" do
|
337
|
+
|
338
|
+
before do
|
339
|
+
@list = @gateway.list("Book:")
|
340
|
+
end
|
341
|
+
|
342
|
+
it "should list all pages in the namespace" do
|
343
|
+
@list.should == [ "Book:Italy" ]
|
344
|
+
end
|
345
|
+
|
346
|
+
end
|
347
|
+
|
348
|
+
describe "with a partial title as the key" do
|
349
|
+
|
350
|
+
before do
|
351
|
+
@list = @gateway.list("Main")
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should list all pages in the main namespace that start with key" do
|
355
|
+
@list.sort.should == [ "Main 2", "Main Page" ]
|
356
|
+
end
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
describe "#redirect?" do
|
363
|
+
|
364
|
+
describe "for an existing redirect page" do
|
365
|
+
|
366
|
+
it "returns true" do
|
367
|
+
@gateway.redirect?("Redirect").should == true
|
368
|
+
end
|
369
|
+
|
370
|
+
end
|
371
|
+
|
372
|
+
describe "for an existing non-redirect page" do
|
373
|
+
|
374
|
+
it "returns false" do
|
375
|
+
@gateway.redirect?("Main Page").should == false
|
376
|
+
end
|
377
|
+
|
378
|
+
end
|
379
|
+
|
380
|
+
describe "for a missing wiki page" do
|
381
|
+
|
382
|
+
it "returns false" do
|
383
|
+
@gateway.redirect?("page/missing").should == false
|
384
|
+
end
|
385
|
+
|
386
|
+
end
|
387
|
+
|
388
|
+
end
|
389
|
+
|
390
|
+
end
|