mediawiki-butt 0.4.1 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f0cb702f0e050eec5aad59b978c319b3bdb4d88
4
- data.tar.gz: c3d22dd52186fd7e1bfd837230a5984287835087
3
+ metadata.gz: bc43e07782836b5480c6da51986099f1109c1a7d
4
+ data.tar.gz: 5e8e4ac85f0d95c6e11a522b8a00546b3dbb429a
5
5
  SHA512:
6
- metadata.gz: 5331fe0d0bb49e849ef1d68a50a461215dbb6008563d66d80105340420f86b6ae62e2fe1eab09ab5c19fb10e7a080f99dcf3c185a9b94e0d6b09735ef2afceef
7
- data.tar.gz: 62bbf5cae65347c3040dda3271ac711e5ff8e5aac2e56bee3b04df02b55edc1f1d036c04739b6a39639a25166f9fc74838e2b96a2f78ad7f7a83cdfd69d12ee0
6
+ metadata.gz: 0b770ca63c32c5476df31441d6c8571f20abe7c2234daf003609c3efc1ffb287cfdb659eb2448eea18f24791986e2c12b901a24dcf612a9aeacbf9fd87906f44
7
+ data.tar.gz: 1778b3fc82b77b5decba13a5fedc779829d50a70800126571646932af0ce2f0954309178cca71d0a3a1a69eb9b0c9714d132a1387531141fe8684b9b2808ee75
data/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Changelog
2
2
  ## Version 0
3
+ ### Version 0.5.0
4
+ * New Administration module for administrative methods.
5
+ * New block and unblock methods, for (un)blocking users.
6
+ * Refactor token stuff. It still doesn't work exactly how I'd like yet, but it's better than it was before. Ideally I'd like to have it get the login-specific tokens on login and set them to some well-named instance variables. Then clear those on logout.
7
+ * Single-line each `do end` loops have been converted into `{...}` style loops.
8
+ * New delete method for deleting pages.
9
+ * New move method for moving pages.
10
+
3
11
  ### Version 0.4.1
12
+ * params[:format] is now automatically set to 'json', so it no longer needs to be defined in each method.
13
+ * Fixed a lot of styling issues thanks to Rubocop.
4
14
  * check_login and check_create now use case/when statements instead of elsifs.
5
15
  * check_create no longer returns anything.
6
16
  * Update minimum Ruby version to 2.1, for refinements.
@@ -0,0 +1,54 @@
1
+ module MediaWiki
2
+ module Administration
3
+ # Blocks the user.
4
+ # @param user [String] The user to block.
5
+ # @param expiry [String] The expiry timestamp using a relative expiry time.
6
+ # @param reason [String] The reason to show in the block log.
7
+ # @param nocreate [Boolean] Whether to allow them to create an account.
8
+ # @return [String/Int] The error code, or the block ID.
9
+ def block(user, expiry = '2 weeks', reason = nil, nocreate = true)
10
+ params = {
11
+ action: 'block',
12
+ user: user,
13
+ expiry: expiry
14
+ }
15
+
16
+ token = get_token('block')
17
+ params[:reason] = reason unless reason.nil?
18
+ params[:nocreate] = '1' if nocreate == true
19
+ params[:token] = token
20
+
21
+ response = post(params)
22
+ puts response
23
+
24
+ if !response['error'].nil?
25
+ return response['error']['code']
26
+ else
27
+ return response['id'].to_i
28
+ end
29
+ end
30
+
31
+ # Unblocks the user.
32
+ # @param user [String] The user to unblock.
33
+ # @param reason [String] The reason to show in the block log.
34
+ # @return [String/Int] The error code, or the block ID.
35
+ def unblock(user, reason = nil)
36
+ params = {
37
+ action: 'unblock',
38
+ user: user
39
+ }
40
+ token = get_token('unblock')
41
+ params[:reason] = reason unless reason.nil?
42
+ params[:token] = token
43
+
44
+ response = post(params)
45
+ puts response
46
+
47
+ if !response['error'].nil?
48
+ return response['error']['code']
49
+ else
50
+ return response['id'].to_i
51
+ end
52
+ end
53
+ end
54
+ end
@@ -2,85 +2,88 @@ require_relative 'exceptions'
2
2
 
3
3
  module MediaWiki
4
4
  module Auth
5
-
6
- # Checks the login result for errors. Returns true if it is successful, else false with an error raised.
5
+ # Checks the login result for errors. Returns true if it is successful,
6
+ # else false with an error raised.
7
7
  # @param result [String] The parsed version of the result.
8
- # @param secondtry [Boolean] Whether this login is the first or second try. False for first, true for second.
8
+ # @param secondtry [Boolean] Whether this login is the first or second try.
9
+ # False for first, true for second.
9
10
  # @return [Boolean] true if successful, else false.
10
11
  def check_login(result, secondtry)
11
12
  case result
12
- when "Success"
13
+ when 'Success'
13
14
  @logged_in = true
14
15
  return true
15
- when "NeedToken"
16
+ when 'NeedToken'
16
17
  if secondtry == true
17
- raise MediaWiki::Butt::NeedTokenMoreThanOnceError
18
+ fail MediaWiki::Butt::NeedTokenMoreThanOnceError
18
19
  return false
19
20
  end
20
- when "NoName"
21
- raise MediaWiki::Butt::NoNameError
21
+ when 'NoName'
22
+ fail MediaWiki::Butt::NoNameError
22
23
  return false
23
- when "Illegal"
24
- raise MediaWiki::Butt::IllegalUsernameError
24
+ when 'Illegal'
25
+ fail MediaWiki::Butt::IllegalUsernameError
25
26
  return false
26
- when "NotExists"
27
- raise MediaWiki::Butt::UsernameNotExistsError
27
+ when 'NotExists'
28
+ fail MediaWiki::Butt::UsernameNotExistsError
28
29
  return false
29
- when "EmptyPass"
30
- raise MediaWiki::Butt::EmptyPassError
30
+ when 'EmptyPass'
31
+ fail MediaWiki::Butt::EmptyPassError
31
32
  return false
32
- when "WrongPass"
33
- raise MediaWiki::Butt::WrongPassError
33
+ when 'WrongPass'
34
+ fail MediaWiki::Butt::WrongPassError
34
35
  return false
35
- when "WrongPluginPass"
36
- raise MediaWiki::Butt::WrongPluginPassError
36
+ when 'WrongPluginPass'
37
+ fail MediaWiki::Butt::WrongPluginPassError
37
38
  return false
38
- when "CreateBlocked"
39
- raise MediaWiki::Butt::CreateBlockedError
39
+ when 'CreateBlocked'
40
+ fail MediaWiki::Butt::CreateBlockedError
40
41
  return false
41
- when "Throttled"
42
- raise MediaWiki::Butt::ThrottledError
42
+ when 'Throttled'
43
+ fail MediaWiki::Butt::ThrottledError
43
44
  return false
44
- when "Blocked"
45
- raise MediaWiki::Butt::BlockedError
45
+ when 'Blocked'
46
+ fail MediaWiki::Butt::BlockedError
46
47
  return false
47
48
  end
48
49
  end
49
50
 
50
- # Checks the account creation result's error and raises the corresponding error.
51
- # @param error [String] The parsed error "code" string
51
+ # Checks the account creation result's error and raises the corresponding
52
+ # exception.
53
+ # @param error [String] The parsed error code string
52
54
  def check_create(error)
53
55
  case error
54
- when "noname"
55
- raise MediaWiki::Butt::NoNameError
56
- when "userexists"
57
- raise MediaWiki::Butt::UserExistsError
58
- when "password-name-match"
59
- raise MediaWiki::Butt::UserPassMatchError
60
- when "password-login-forbidden"
61
- raise MediaWiki::Butt::PasswordLoginForbiddenError
62
- when "noemailtitle"
63
- raise MediaWiki::Butt::NoEmailTitleError
64
- when "invalidemailaddress"
65
- raise MediaWiki::Butt::InvalidEmailAddressError
66
- when "passwordtooshort"
67
- raise MediaWiki::Butt::PasswordTooShortError
68
- when "noemail"
69
- raise MediaWiki::Butt::NoEmailError
70
- when "acct_creation_throttle_hit"
71
- raise MediaWiki::Butt::ThrottledError
72
- when "aborted"
73
- raise MediaWiki::Butt::AbortedError
74
- when "blocked"
75
- raise MediaWiki::Butt::BlockedError
76
- when "permdenied-createaccount"
77
- raise MediaWiki::Butt::PermDeniedError
78
- when "createaccount-hook-aborted"
79
- raise MediaWiki::Butt::HookAbortedError
56
+ when 'noname'
57
+ fail MediaWiki::Butt::NoNameError
58
+ when 'userexists'
59
+ fail MediaWiki::Butt::UserExistsError
60
+ when 'password-name-match'
61
+ fail MediaWiki::Butt::UserPassMatchError
62
+ when 'password-login-forbidden'
63
+ fail MediaWiki::Butt::PasswordLoginForbiddenError
64
+ when 'noemailtitle'
65
+ fail MediaWiki::Butt::NoEmailTitleError
66
+ when 'invalidemailaddress'
67
+ fail MediaWiki::Butt::InvalidEmailAddressError
68
+ when 'passwordtooshort'
69
+ fail MediaWiki::Butt::PasswordTooShortError
70
+ when 'noemail'
71
+ fail MediaWiki::Butt::NoEmailError
72
+ when 'acct_creation_throttle_hit'
73
+ fail MediaWiki::Butt::ThrottledError
74
+ when 'aborted'
75
+ fail MediaWiki::Butt::AbortedError
76
+ when 'blocked'
77
+ fail MediaWiki::Butt::BlockedError
78
+ when 'permdenied-createaccount'
79
+ fail MediaWiki::Butt::PermDeniedError
80
+ when 'createaccount-hook-aborted'
81
+ fail MediaWiki::Butt::HookAbortedError
80
82
  end
81
83
  end
82
84
 
83
- # Logs the user into the wiki. This is generally required for editing and getting restricted data. Will return the result of #check_login
85
+ # Logs the user into the wiki. This is generally required for editing and
86
+ # getting restricted data. Will return the result of #check_login
84
87
  # @param username [String] The username
85
88
  # @param password [String] The password
86
89
  # @return [Boolean] True if the login was successful, false if not.
@@ -88,39 +91,39 @@ module MediaWiki
88
91
  params = {
89
92
  action: 'login',
90
93
  lgname: username,
91
- lgpassword: password,
92
- format: 'json'
94
+ lgpassword: password
93
95
  }
94
96
 
95
97
  result = post(params)
96
- if check_login(result["login"]["result"], false)
98
+ if check_login(result['login']['result'], false)
97
99
  @logged_in = true
98
100
  @tokens.clear
99
101
  true
100
- elsif result["login"]["result"] == "NeedToken" && result["login"]["token"] != nil
101
- token = result["login"]["token"]
102
+ elsif result['login']['result'] == 'NeedToken' &&
103
+ !result['login']['token'].nil?
104
+ token = result['login']['token']
102
105
  token_params = {
103
106
  action: 'login',
104
107
  lgname: username,
105
108
  lgpassword: password,
106
- format: 'json',
107
109
  lgtoken: token
108
110
  }
109
111
 
110
- #Consider refactor the @cookie initialization.
111
- @cookie = "#{result["login"]["cookieprefix"]}Session=#{result["login"]["sessionid"]}"
112
- result = post(token_params, true, { 'Set-Cookie' => @cookie })
113
- check_login(result["login"]["result"], true)
112
+ # Consider refactor the @cookie initialization.
113
+ @cookie = "#{result['login']['cookieprefix']}" \
114
+ "Session=#{result['login']['sessionid']}"
115
+ result = post(token_params, true, 'Set-Cookie' => @cookie)
116
+ check_login(result['login']['result'], true)
114
117
  end
115
118
  end
116
119
 
117
120
  # Logs the current user out.
118
- # @return [Boolean] True if it was able to log anyone out, false if not (basically, if someone was logged in, it returns true).
121
+ # @return [Boolean] True if it was able to log anyone out, false if not
122
+ # (basically, if someone was logged in, it returns true).
119
123
  def logout
120
124
  if @logged_in
121
125
  params = {
122
- action: 'logout',
123
- format: 'json'
126
+ action: 'logout'
124
127
  }
125
128
 
126
129
  post(params)
@@ -135,8 +138,11 @@ module MediaWiki
135
138
  # Creates an account using the standard procedure.
136
139
  # @param username [String] The desired username.
137
140
  # @param password [String] The desired password.
138
- # @param language [String] The language code to be set as default for the account. Defaults to 'en', or English. Use the language code, not the name.
139
- # @param reason [String] The reason for creating the account, as shown in the account creation log. Optional.
141
+ # @param language [String] The language code to be set as default for the
142
+ # account. Defaults to 'en', or English. Use the language code, not
143
+ # the name.
144
+ # @param reason [String] The reason for creating the account, as shown in
145
+ # the account creation log. Optional.
140
146
  # @return [Boolean] True if successful, false if not.
141
147
  def create_account(username, password, language = 'en', *reason)
142
148
  params = {
@@ -148,28 +154,28 @@ module MediaWiki
148
154
  }
149
155
 
150
156
  result = post(params)
151
- if result["error"] != nil
152
- check_create(result["error"]["code"])
157
+ unless result['error'].nil?
158
+ check_create(result['error']['code'])
153
159
  return false
154
160
  end
155
161
 
156
- if result["createaccount"]["result"] == "Success"
162
+ if result['createaccount']['result'] == 'Success'
157
163
  @tokens.clear
158
164
  return true
159
- elsif result["createaccount"]["result"] == "NeedToken"
165
+ elsif result['createaccount']['result'] == 'NeedToken'
160
166
  params = {
161
167
  name: username,
162
168
  password: password,
163
169
  reason: reason,
164
170
  language: language,
165
- token: result["createaccount"]["token"]
171
+ token: result['createaccount']['token']
166
172
  }
167
173
 
168
174
  result = post(params, true, true)
169
- if result["error"] != nil
170
- check_create(result["error"]["code"])
175
+ if !result['error'].nil?
176
+ check_create(result['error']['code'])
171
177
  return false
172
- elsif result["createaccount"]["result"] == "Success"
178
+ elsif result['createaccount']['result'] == 'Success'
173
179
  return true
174
180
  else
175
181
  return false
@@ -180,8 +186,11 @@ module MediaWiki
180
186
  # Creates an account using the random password sent by email procedure.
181
187
  # @param username [String] The desired username
182
188
  # @param email [String] The desired email address
183
- # @param language [String] The language code to be set as default for the account. Defaults to 'en', or English. Use the language code, not the name.
184
- # @param reason [String] The reason for creating the account, as shown in the account creation log. Optional.
189
+ # @param language [String] The language code to be set as default for the
190
+ # account. Defaults to 'en', or English. Use the language code, not
191
+ # the name.
192
+ # @param reason [String] The reason for creating the account, as shown in
193
+ # the account creation log. Optional.
185
194
  # @return [Boolean] True if successful, false if not.
186
195
  def create_account_email(username, email, language = 'en', *reason)
187
196
  params = {
@@ -194,30 +203,29 @@ module MediaWiki
194
203
  }
195
204
 
196
205
  result = post(params)
197
- result = post(params)
198
- if result["error"] != nil
199
- check_create(result["error"]["code"])
206
+ unless result['error'].nil?
207
+ check_create(result['error']['code'])
200
208
  return false
201
209
  end
202
210
 
203
- if result["createaccount"]["result"] == "Success"
211
+ if result['createaccount']['result'] == 'Success'
204
212
  @tokens.clear
205
213
  return true
206
- elsif result["createaccount"]["result"] == "NeedToken"
214
+ elsif result['createaccount']['result'] == 'NeedToken'
207
215
  params = {
208
216
  name: username,
209
217
  email: email,
210
218
  mailpassword: 'value',
211
219
  reason: reason,
212
220
  language: language,
213
- token: result["createaccount"]["token"]
221
+ token: result['createaccount']['token']
214
222
  }
215
223
 
216
224
  result = post(params, true, true)
217
- if result["error"] != nil
218
- check_create(result["error"]["code"])
225
+ if !result['error'].nil?
226
+ check_create(result['error']['code'])
219
227
  return false
220
- elsif result["createaccount"]["result"] == "Success"
228
+ elsif result['createaccount']['result'] == 'Success'
221
229
  return true
222
230
  else
223
231
  return false
@@ -2,6 +2,7 @@ require_relative 'auth'
2
2
  require_relative 'query'
3
3
  require_relative 'constants'
4
4
  require_relative 'edit'
5
+ require_relative 'administration'
5
6
  require 'httpclient'
6
7
  require 'json'
7
8
 
@@ -13,10 +14,12 @@ module MediaWiki
13
14
  include MediaWiki::Query::Lists
14
15
  include MediaWiki::Constants::Namespaces
15
16
  include MediaWiki::Edit
17
+ include MediaWiki::Administration
16
18
 
17
- # Creates a new instance of MediaWiki::Butt. To work with any MediaWiki::Butt methods, you must first create an instance of it.
18
- #
19
- # @param url [String] The FULL wiki URL. api.php can be omitted, but it will make harsh assumptions about your wiki configuration.
19
+ # Creates a new instance of MediaWiki::Butt. To work with any
20
+ # MediaWiki::Butt methods, you must first create an instance of it.
21
+ # @param url [String] The FULL wiki URL. api.php can be omitted, but it
22
+ # will make harsh assumptions about your wiki configuration.
20
23
  # @param use_ssl [Boolean] Whether or not to use SSL. Will default to true.
21
24
  # @return [MediaWiki::Butt] new instance of MediaWiki::Butt
22
25
  def initialize(url, use_ssl = true)
@@ -29,18 +32,32 @@ module MediaWiki
29
32
  @tokens = {}
30
33
  end
31
34
 
32
- # Performs a generic HTTP POST action and provides the response. This method generally should not be used by the user, unless there is not a method provided by the Butt developers for a particular action.
33
- #
34
- # @param params [Hash] A basic hash containing MediaWiki API parameters. Please see the MediaWiki API for more information.
35
- # @param autoparse [Boolean] Whether or not to provide a parsed version of the response's JSON. Will default to true.
35
+ # Performs a generic HTTP POST action and provides the response. This
36
+ # method generally should not be used by the user, unless there is not a
37
+ # method provided by the Butt developers for a particular action.
38
+ # @param params [Hash] A basic hash containing MediaWiki API parameters.
39
+ # Please see the MediaWiki API for more information.
40
+ # @param autoparse [Boolean] Whether or not to provide a parsed version
41
+ # of the response's JSON. Will default to true.
36
42
  # @param header [Hash] The header hash. Optional.
37
- # @return [JSON/HTTPMessage] Parsed JSON if autoparse is true, or raw response if not.
43
+ # @return [JSON/HTTPMessage] Parsed JSON if autoparse is true, or raw
44
+ # response if not.
38
45
  def post(params, autoparse = true, header = nil)
39
- # Note that defining the header argument as a splat argument (*header) causes errors in HTTPClient.
40
- # We must use header.nil? rather than a splat argument and defined? header due to this error.
41
- # For those interested, the error is: undefined method `downcase' for {"Set-Cookie"=>"cookie"}:Hash (NoMethodError)
42
- # This is obvisouly an error in HTTPClient, but we must work around it until there is a fix in the gem.
43
- res = header.nil? ? @client.post(@uri, params) : @client.post(@uri, params, header)
46
+ # Note that defining the header argument as a splat argument (*header)
47
+ # causes errors in HTTPClient. We must use header.nil? rather than a
48
+ # splat argument and defined? header due to this error. For those
49
+ # interested, the error is:
50
+ # undefined method `downcase' for {"Set-Cookie"=>"cookie"}:Hash
51
+ # This is obvisouly an error in HTTPClient, but we must work around it
52
+ # until there is a fix in the gem.
53
+
54
+ params[:format] = 'json'
55
+
56
+ if header.nil?
57
+ res = @client.post(@uri, params)
58
+ else
59
+ res = @client.post(@uri, params, header)
60
+ end
44
61
 
45
62
  if autoparse
46
63
  return JSON.parse(res.body)
@@ -49,14 +66,18 @@ module MediaWiki
49
66
  end
50
67
  end
51
68
 
52
- # Returns true if the currently logged in user is in the "bot" group. This can be helpful to some developers, but it is mostly for use internally in MediaWiki::Butt.
53
- # @param username [String] The username to check. Optional. Defaults to the currently logged in user if nil.
54
- # @return [Boolean] true if logged in as a bot, false if not logged in or logged in as a non-bot
55
- def is_user_bot?(*username)
69
+ # Returns true if the currently logged in user is in the "bot" group.
70
+ # This can be helpful to some developers, but it is mostly for use
71
+ # internally in MediaWiki::Butt.
72
+ # @param username [String] The username to check. Optional. Defaults to
73
+ # the currently logged in user if nil.
74
+ # @return [Boolean] true if logged in as a bot, false if not logged in or
75
+ # logged in as a non-bot
76
+ def user_bot?(*username)
56
77
  groups = defined? username ? get_usergroups(username) : get_usergroups
57
78
 
58
79
  if groups != false
59
- return groups.include?("bot")
80
+ return groups.include?('bot')
60
81
  else
61
82
  return false
62
83
  end