mediawiki-gateway 0.3.8 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,120 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: MediaWiki::Unauthorized</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">MediaWiki::Unauthorized</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/media_wiki/exception_rb.html">
59
+ lib/media_wiki/exception.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="Exception.html">
69
+ MediaWiki::Exception
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+ <div id="description">
84
+ <p>
85
+ User is not authorized to perform this operation. Also thrown if <a
86
+ href="Gateway.html#M000009">MediaWiki::Gateway#login</a> fails.
87
+ </p>
88
+
89
+ </div>
90
+
91
+
92
+ </div>
93
+
94
+
95
+ </div>
96
+
97
+
98
+ <!-- if includes -->
99
+
100
+ <div id="section">
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+ <!-- if method_list -->
110
+
111
+
112
+ </div>
113
+
114
+
115
+ <div id="validator-badges">
116
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
117
+ </div>
118
+
119
+ </body>
120
+ </html>
data/doc/created.rid CHANGED
@@ -1 +1 @@
1
- Mon, 28 Mar 2011 12:16:13 +1100
1
+ Wed, 20 Apr 2011 16:25:00 +1000
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Thu Jan 13 14:26:00 +1100 2011</td>
59
+ <td>Wed Mar 30 13:32:04 +1100 2011</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -117,9 +117,18 @@ Simple page creation script:
117
117
  Maintained by Jani Patokallio.
118
118
  </p>
119
119
  <p>
120
- Thanks to John Carney, Mike Williams, Daniel Heath and the rest of the
121
- Lonely Planet Atlas team.
120
+ Thanks to:
122
121
  </p>
122
+ <ul>
123
+ <li>John Carney, Mike Williams, Daniel Heath and the rest of the Lonely Planet
124
+ Atlas team.
125
+
126
+ </li>
127
+ <li>Github users arturaz, carpodaster, muffinista and singlebrook for code
128
+ contributions
129
+
130
+ </li>
131
+ </ul>
123
132
 
124
133
  </div>
125
134
 
@@ -0,0 +1,101 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>File: exception.rb</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="fileHeader">
50
+ <h1>exception.rb</h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>Path:</strong></td>
54
+ <td>lib/media_wiki/exception.rb
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Wed Apr 20 16:18:20 +1000 2011</td>
60
+ </tr>
61
+ </table>
62
+ </div>
63
+ <!-- banner header -->
64
+
65
+ <div id="bodyContent">
66
+
67
+
68
+
69
+ <div id="contextContent">
70
+
71
+
72
+
73
+ </div>
74
+
75
+
76
+ </div>
77
+
78
+
79
+ <!-- if includes -->
80
+
81
+ <div id="section">
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+ <!-- if method_list -->
91
+
92
+
93
+ </div>
94
+
95
+
96
+ <div id="validator-badges">
97
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
98
+ </div>
99
+
100
+ </body>
101
+ </html>
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Mon Feb 07 14:36:34 +1100 2011</td>
59
+ <td>Wed Apr 20 16:16:59 +1000 2011</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -78,6 +78,7 @@
78
78
  rest_client&nbsp;&nbsp;
79
79
  rexml/document&nbsp;&nbsp;
80
80
  uri&nbsp;&nbsp;
81
+ active_support&nbsp;&nbsp;
81
82
  </div>
82
83
  </div>
83
84
 
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Mon Mar 28 12:14:25 +1100 2011</td>
59
+ <td>Wed Apr 20 15:32:00 +1000 2011</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -21,8 +21,11 @@
21
21
  <h1 class="section-bar">Classes</h1>
22
22
  <div id="index-entries">
23
23
  <a href="classes/MediaWiki.html">MediaWiki</a><br />
24
+ <a href="classes/MediaWiki/APIError.html">MediaWiki::APIError</a><br />
24
25
  <a href="classes/MediaWiki/Config.html">MediaWiki::Config</a><br />
26
+ <a href="classes/MediaWiki/Exception.html">MediaWiki::Exception</a><br />
25
27
  <a href="classes/MediaWiki/Gateway.html">MediaWiki::Gateway</a><br />
28
+ <a href="classes/MediaWiki/Unauthorized.html">MediaWiki::Unauthorized</a><br />
26
29
  </div>
27
30
  </div>
28
31
  </body>
@@ -22,6 +22,7 @@
22
22
  <div id="index-entries">
23
23
  <a href="files/README.html">README</a><br />
24
24
  <a href="files/lib/media_wiki/config_rb.html">lib/media_wiki/config.rb</a><br />
25
+ <a href="files/lib/media_wiki/exception_rb.html">lib/media_wiki/exception.rb</a><br />
25
26
  <a href="files/lib/media_wiki/gateway_rb.html">lib/media_wiki/gateway.rb</a><br />
26
27
  <a href="files/lib/media_wiki/utils_rb.html">lib/media_wiki/utils.rb</a><br />
27
28
  <a href="files/script/create_page_rb.html">script/create_page.rb</a><br />
@@ -20,41 +20,47 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/MediaWiki/Config.html#M000036">abort (MediaWiki::Config)</a><br />
24
- <a href="classes/MediaWiki/Gateway.html#M000018">backlinks (MediaWiki::Gateway)</a><br />
25
- <a href="classes/MediaWiki/Gateway.html#M000012">create (MediaWiki::Gateway)</a><br />
26
- <a href="classes/MediaWiki/Gateway.html#M000015">delete (MediaWiki::Gateway)</a><br />
27
- <a href="classes/MediaWiki/Gateway.html#M000023">download (MediaWiki::Gateway)</a><br />
28
- <a href="classes/MediaWiki/Gateway.html#M000013">edit (MediaWiki::Gateway)</a><br />
29
- <a href="classes/MediaWiki/Gateway.html#M000025">export (MediaWiki::Gateway)</a><br />
30
- <a href="classes/MediaWiki/Gateway.html#M000027">extensions (MediaWiki::Gateway)</a><br />
23
+ <a href="classes/MediaWiki/Config.html#M000041">abort (MediaWiki::Config)</a><br />
24
+ <a href="classes/MediaWiki/Gateway.html#M000019">backlinks (MediaWiki::Gateway)</a><br />
25
+ <a href="classes/MediaWiki/Gateway.html#M000013">create (MediaWiki::Gateway)</a><br />
26
+ <a href="classes/MediaWiki/Gateway.html#M000016">delete (MediaWiki::Gateway)</a><br />
27
+ <a href="classes/MediaWiki/Gateway.html#M000024">download (MediaWiki::Gateway)</a><br />
28
+ <a href="classes/MediaWiki/Gateway.html#M000014">edit (MediaWiki::Gateway)</a><br />
29
+ <a href="classes/MediaWiki/Gateway.html#M000026">export (MediaWiki::Gateway)</a><br />
30
+ <a href="classes/MediaWiki/Gateway.html#M000028">extensions (MediaWiki::Gateway)</a><br />
31
31
  <a href="classes/MediaWiki/Gateway.html#M000010">get (MediaWiki::Gateway)</a><br />
32
32
  <a href="classes/MediaWiki.html#M000001">get_base_name (MediaWiki)</a><br />
33
33
  <a href="classes/MediaWiki.html#M000002">get_path_to_subpage (MediaWiki)</a><br />
34
- <a href="classes/MediaWiki/Gateway.html#M000032">get_response (MediaWiki::Gateway)</a><br />
34
+ <a href="classes/MediaWiki/Gateway.html#M000037">get_response (MediaWiki::Gateway)</a><br />
35
35
  <a href="classes/MediaWiki.html#M000003">get_subpage (MediaWiki)</a><br />
36
- <a href="classes/MediaWiki/Gateway.html#M000029">get_token (MediaWiki::Gateway)</a><br />
37
- <a href="classes/MediaWiki/Gateway.html#M000030">get_undelete_token (MediaWiki::Gateway)</a><br />
38
- <a href="classes/MediaWiki/Gateway.html#M000022">image_info (MediaWiki::Gateway)</a><br />
39
- <a href="classes/MediaWiki/Gateway.html#M000024">import (MediaWiki::Gateway)</a><br />
40
- <a href="classes/MediaWiki/Gateway.html#M000017">list (MediaWiki::Gateway)</a><br />
36
+ <a href="classes/MediaWiki/Gateway.html#M000032">get_token (MediaWiki::Gateway)</a><br />
37
+ <a href="classes/MediaWiki/Gateway.html#M000033">get_undelete_token (MediaWiki::Gateway)</a><br />
38
+ <a href="classes/MediaWiki/Gateway.html#M000034">get_userrights_token (MediaWiki::Gateway)</a><br />
39
+ <a href="classes/MediaWiki/Gateway.html#M000023">image_info (MediaWiki::Gateway)</a><br />
40
+ <a href="classes/MediaWiki/Gateway.html#M000025">import (MediaWiki::Gateway)</a><br />
41
+ <a href="classes/MediaWiki/Gateway.html#M000018">list (MediaWiki::Gateway)</a><br />
41
42
  <a href="classes/MediaWiki/Gateway.html#M000009">login (MediaWiki::Gateway)</a><br />
42
- <a href="classes/MediaWiki/Gateway.html#M000031">make_api_request (MediaWiki::Gateway)</a><br />
43
- <a href="classes/MediaWiki/Gateway.html#M000014">move (MediaWiki::Gateway)</a><br />
44
- <a href="classes/MediaWiki/Gateway.html#M000026">namespaces_by_prefix (MediaWiki::Gateway)</a><br />
43
+ <a href="classes/MediaWiki/Gateway.html#M000036">make_api_request (MediaWiki::Gateway)</a><br />
44
+ <a href="classes/MediaWiki/Gateway.html#M000015">move (MediaWiki::Gateway)</a><br />
45
+ <a href="classes/MediaWiki/Gateway.html#M000027">namespaces_by_prefix (MediaWiki::Gateway)</a><br />
45
46
  <a href="classes/MediaWiki/Gateway.html#M000008">new (MediaWiki::Gateway)</a><br />
46
- <a href="classes/MediaWiki/Config.html#M000035">new (MediaWiki::Config)</a><br />
47
- <a href="classes/MediaWiki/Gateway.html#M000021">redirect? (MediaWiki::Gateway)</a><br />
48
- <a href="classes/MediaWiki/Gateway.html#M000011">render (MediaWiki::Gateway)</a><br />
49
- <a href="classes/MediaWiki/Gateway.html#M000019">search (MediaWiki::Gateway)</a><br />
50
- <a href="classes/MediaWiki/Gateway.html#M000028">semantic_query (MediaWiki::Gateway)</a><br />
51
- <a href="classes/MediaWiki/Gateway.html#M000016">undelete (MediaWiki::Gateway)</a><br />
47
+ <a href="classes/MediaWiki/Config.html#M000040">new (MediaWiki::Config)</a><br />
48
+ <a href="classes/MediaWiki/APIError.html#M000042">new (MediaWiki::APIError)</a><br />
49
+ <a href="classes/MediaWiki/Gateway.html#M000022">redirect? (MediaWiki::Gateway)</a><br />
50
+ <a href="classes/MediaWiki/Gateway.html#M000012">render (MediaWiki::Gateway)</a><br />
51
+ <a href="classes/MediaWiki/Gateway.html#M000031">review (MediaWiki::Gateway)</a><br />
52
+ <a href="classes/MediaWiki/Gateway.html#M000011">revision (MediaWiki::Gateway)</a><br />
53
+ <a href="classes/MediaWiki/Gateway.html#M000020">search (MediaWiki::Gateway)</a><br />
54
+ <a href="classes/MediaWiki/Gateway.html#M000029">semantic_query (MediaWiki::Gateway)</a><br />
55
+ <a href="classes/MediaWiki/Gateway.html#M000030">set_groups (MediaWiki::Gateway)</a><br />
56
+ <a href="classes/MediaWiki/Gateway.html#M000017">undelete (MediaWiki::Gateway)</a><br />
52
57
  <a href="classes/MediaWiki.html#M000007">upcase_first_char (MediaWiki)</a><br />
53
- <a href="classes/MediaWiki/Gateway.html#M000020">upload (MediaWiki::Gateway)</a><br />
58
+ <a href="classes/MediaWiki/Gateway.html#M000021">upload (MediaWiki::Gateway)</a><br />
54
59
  <a href="classes/MediaWiki.html#M000004">uri_to_wiki (MediaWiki)</a><br />
55
- <a href="classes/MediaWiki/Gateway.html#M000033">valid_page? (MediaWiki::Gateway)</a><br />
60
+ <a href="classes/MediaWiki/Gateway.html#M000035">userrights (MediaWiki::Gateway)</a><br />
61
+ <a href="classes/MediaWiki/Gateway.html#M000038">valid_page? (MediaWiki::Gateway)</a><br />
56
62
  <a href="classes/MediaWiki.html#M000006">version (MediaWiki)</a><br />
57
- <a href="classes/MediaWiki/Gateway.html#M000034">warning (MediaWiki::Gateway)</a><br />
63
+ <a href="classes/MediaWiki/Gateway.html#M000039">warning (MediaWiki::Gateway)</a><br />
58
64
  <a href="classes/MediaWiki.html#M000005">wiki_to_uri (MediaWiki)</a><br />
59
65
  </div>
60
66
  </div>
data/lib/media_wiki.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require File.dirname(__FILE__) + '/media_wiki/config'
2
+ require File.dirname(__FILE__) + '/media_wiki/exception'
2
3
  require File.dirname(__FILE__) + '/media_wiki/utils'
3
4
  require File.dirname(__FILE__) + '/media_wiki/gateway'
4
5
 
5
6
  module MediaWiki
6
- VERSION = "0.3.8"
7
+ VERSION = "0.4.1"
7
8
  end
@@ -0,0 +1,22 @@
1
+ module MediaWiki
2
+ # General exception occurred within MediaWiki::Gateway, and parent class for MediaWiki::APIError, MediaWiki::Unauthorized.
3
+ class Exception < Exception
4
+ end
5
+
6
+ # Wrapper for errors returned by MediaWiki API. Possible codes are defined in http://www.mediawiki.org/wiki/API:Errors_and_warnings.
7
+ #
8
+ # Warnings also throw errors with code 'warning', unless MediaWiki::Gateway#new was called with :ignorewarnings.
9
+ class APIError < MediaWiki::Exception
10
+ attr_reader :code, :info, :message
11
+
12
+ def initialize(code, info)
13
+ @code = code
14
+ @info = info
15
+ @message = "API error: code '#{code}', info '#{info}'"
16
+ end
17
+ end
18
+
19
+ # User is not authorized to perform this operation. Also thrown if MediaWiki::Gateway#login fails.
20
+ class Unauthorized < MediaWiki::Exception
21
+ end
22
+ end
@@ -3,6 +3,7 @@ require 'logger'
3
3
  require 'rest_client'
4
4
  require 'rexml/document'
5
5
  require 'uri'
6
+ require 'active_support'
6
7
 
7
8
  module MediaWiki
8
9
 
@@ -15,7 +16,7 @@ module MediaWiki
15
16
  # [options] Hash of options
16
17
  #
17
18
  # Options:
18
- # [:ignorewarnings] Log API warnings and invalid page titles, instead of aborting with an error.
19
+ # [:ignorewarnings] Log API warnings and invalid page titles, instead throwing MediaWiki::APIError
19
20
  # [:limit] Maximum number of results returned per search (see http://www.mediawiki.org/wiki/API:Query_-_Lists#Limits), defaults to the MediaWiki default of 500.
20
21
  # [:loglevel] Log level to use, defaults to Logger::WARN. Set to Logger::DEBUG to dump every request and response to the log.
21
22
  # [:maxlag] Maximum allowed server lag (see http://www.mediawiki.org/wiki/Manual:Maxlag_parameter), defaults to 5 seconds.
@@ -45,7 +46,7 @@ module MediaWiki
45
46
  # [password] Password
46
47
  # [domain] Domain for authentication plugin logins (eg. LDAP), optional -- defaults to 'local' if not given
47
48
  #
48
- # Throws error if login fails
49
+ # Throws MediaWiki::Unauthorized if login fails
49
50
  def login(username, password, domain = 'local')
50
51
  form_data = {'action' => 'login', 'lgname' => username, 'lgpassword' => password, 'lgdomain' => domain}
51
52
  make_api_request(form_data)
@@ -489,7 +490,7 @@ module MediaWiki
489
490
  # [flags] Hash of flags and values to set, eg. { "accuracy" => "1", "depth" => "2" }
490
491
  # [comment] Comment to add to review (optional)
491
492
  def review(title, flags, comment = "Reviewed by MediaWiki::Gateway")
492
- raise "No article found" unless revid = revision(title)
493
+ raise APIError.new('missingtitle', "Article #{title} not found") unless revid = revision(title)
493
494
  form_data = {'action' => 'review', 'revid' => revid, 'token' => get_token('edit', title), 'comment' => comment}
494
495
  form_data.merge!( Hash[flags.map {|k,v| ["flag_#{k}", v]}] )
495
496
  res, dummy = make_api_request(form_data)
@@ -503,7 +504,7 @@ module MediaWiki
503
504
  form_data = {'action' => 'query', 'prop' => 'info', 'intoken' => type, 'titles' => page_titles}
504
505
  res, dummy = make_api_request(form_data)
505
506
  token = res.elements["query/pages/page"].attributes[type + "token"]
506
- raise "User is not permitted to perform this operation: #{type}" if token.nil?
507
+ raise Unauthorized.new "User is not permitted to perform this operation: #{type}" if token.nil?
507
508
  token
508
509
  end
509
510
 
@@ -512,7 +513,7 @@ module MediaWiki
512
513
  res, dummy = make_api_request(form_data)
513
514
  if res.elements["query/deletedrevs/page"]
514
515
  token = res.elements["query/deletedrevs/page"].attributes["token"]
515
- raise "User is not permitted to perform this operation: #{type}" if token.nil?
516
+ raise Unauthorized.new "User is not permitted to perform this operation: #{type}" if token.nil?
516
517
  token
517
518
  else
518
519
  nil
@@ -528,9 +529,9 @@ module MediaWiki
528
529
  @log.debug("RESPONSE: #{res.to_s}")
529
530
  if token.nil?
530
531
  if res.elements["query/users/user"].attributes["missing"]
531
- raise "User '#{user}' was not found (get_userrights_token)"
532
+ raise APIError.new('invaliduser', "User '#{user}' was not found (get_userrights_token)")
532
533
  else
533
- raise "User '#{@username}' is not permitted to perform this operation: get_userrights_token"
534
+ raise Unauthorized.new "User '#{@username}' is not permitted to perform this operation: get_userrights_token"
534
535
  end
535
536
  end
536
537
 
@@ -575,7 +576,7 @@ module MediaWiki
575
576
  make_api_request(form_data, continue_xpath, retry_count + 1)
576
577
  end
577
578
  # Check response for errors and return XML
578
- raise "API error, bad response: #{response}" unless response.code >= 200 and response.code < 300
579
+ raise MediaWiki::Exception.new "Bad response: #{response}" unless response.code >= 200 and response.code < 300
579
580
  doc = get_response(response.dup)
580
581
  if(form_data['action'] == 'login')
581
582
  login_result = doc.elements["login"].attributes['result']
@@ -583,7 +584,7 @@ module MediaWiki
583
584
  case login_result
584
585
  when "Success" then # do nothing
585
586
  when "NeedToken" then make_api_request(form_data.merge('lgtoken' => doc.elements["login"].attributes["token"]))
586
- else raise "Login failed: " + login_result
587
+ else raise Unauthorized.new "Login failed: " + login_result
587
588
  end
588
589
  end
589
590
  continue = (continue_xpath and doc.elements['query-continue']) ? REXML::XPath.first(doc, continue_xpath).value : nil
@@ -592,20 +593,20 @@ module MediaWiki
592
593
  end
593
594
 
594
595
  # Get API XML response
595
- # If there are errors or warnings, raise exception
596
+ # If there are errors or warnings, raise APIError
596
597
  # Otherwise return XML root
597
598
  def get_response(res)
598
599
  begin
599
600
  doc = REXML::Document.new(res).root
600
601
  rescue REXML::ParseException => e
601
- raise "Response is not XML. Are you sure you are pointing to api.php?"
602
+ raise MediaWiki::Exception.new "Response is not XML. Are you sure you are pointing to api.php?"
602
603
  end
603
604
  log.debug("RES: #{doc}")
604
- raise "Response does not contain Mediawiki API XML: #{res}" unless [ "api", "mediawiki" ].include? doc.name
605
+ raise MediaWiki::Exception.new "Response does not contain Mediawiki API XML: #{res}" unless [ "api", "mediawiki" ].include? doc.name
605
606
  if doc.elements["error"]
606
607
  code = doc.elements["error"].attributes["code"]
607
608
  info = doc.elements["error"].attributes["info"]
608
- raise "API error: code '#{code}', info '#{info}'"
609
+ raise APIError.new(code, info)
609
610
  end
610
611
  if doc.elements["warnings"]
611
612
  warning("API warning: #{doc.elements["warnings"].children.map {|e| e.text}.join(", ")}")
@@ -628,7 +629,7 @@ module MediaWiki
628
629
  log.warn(msg)
629
630
  return false
630
631
  else
631
- raise msg
632
+ raise APIError.new('warning', msg)
632
633
  end
633
634
  end
634
635
  end