mediawiki-gateway 0.6.2 → 1.0.0.rc1

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