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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +22 -0
  3. data/ChangeLog +16 -0
  4. data/README.md +80 -21
  5. data/Rakefile +28 -34
  6. data/bin/mediawiki-gateway +203 -0
  7. data/lib/media_wiki.rb +4 -9
  8. data/lib/media_wiki/exception.rb +11 -8
  9. data/lib/media_wiki/fake_wiki.rb +636 -0
  10. data/lib/media_wiki/gateway.rb +105 -940
  11. data/lib/media_wiki/gateway/files.rb +173 -0
  12. data/lib/media_wiki/gateway/pages.rb +400 -0
  13. data/lib/media_wiki/gateway/query.rb +98 -0
  14. data/lib/media_wiki/gateway/site.rb +101 -0
  15. data/lib/media_wiki/gateway/users.rb +182 -0
  16. data/lib/media_wiki/utils.rb +47 -13
  17. data/lib/media_wiki/version.rb +27 -0
  18. data/lib/mediawiki-gateway.rb +1 -0
  19. data/spec/{import-test-data.xml → data/import.xml} +0 -0
  20. data/spec/media_wiki/gateway/files_spec.rb +34 -0
  21. data/spec/media_wiki/gateway/pages_spec.rb +390 -0
  22. data/spec/media_wiki/gateway/query_spec.rb +84 -0
  23. data/spec/media_wiki/gateway/site_spec.rb +122 -0
  24. data/spec/media_wiki/gateway/users_spec.rb +171 -0
  25. data/spec/media_wiki/gateway_spec.rb +129 -0
  26. data/spec/{live_gateway_spec.rb → media_wiki/live_gateway_spec.rb} +31 -35
  27. data/spec/{utils_spec.rb → media_wiki/utils_spec.rb} +41 -39
  28. data/spec/spec_helper.rb +17 -16
  29. metadata +77 -135
  30. data/.ruby-version +0 -1
  31. data/.rvmrc +0 -34
  32. data/Gemfile +0 -19
  33. data/Gemfile.lock +0 -77
  34. data/LICENSE +0 -21
  35. data/config/hosts.yml +0 -17
  36. data/lib/media_wiki/config.rb +0 -69
  37. data/mediawiki-gateway.gemspec +0 -113
  38. data/samples/README +0 -18
  39. data/samples/create_page.rb +0 -13
  40. data/samples/delete_batch.rb +0 -14
  41. data/samples/download_batch.rb +0 -15
  42. data/samples/email_user.rb +0 -14
  43. data/samples/export_xml.rb +0 -14
  44. data/samples/get_page.rb +0 -11
  45. data/samples/import_xml.rb +0 -14
  46. data/samples/run_fake_media_wiki.rb +0 -8
  47. data/samples/search_content.rb +0 -12
  48. data/samples/semantic_query.rb +0 -17
  49. data/samples/upload_commons.rb +0 -45
  50. data/samples/upload_file.rb +0 -13
  51. data/spec/fake_media_wiki/api_pages.rb +0 -135
  52. data/spec/fake_media_wiki/app.rb +0 -360
  53. data/spec/fake_media_wiki/query_handling.rb +0 -136
  54. 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'
@@ -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&amp;action=edit&amp;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&amp;action=edit&amp;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