mediawiki-butt 0.1.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 +7 -0
- data/CHANGELOG.md +4 -0
- data/lib/mediawiki-butt.rb +1 -0
- data/lib/mediawiki/auth.rb +185 -0
- data/lib/mediawiki/butt.rb +92 -0
- data/lib/mediawiki/exceptions.rb +65 -0
- data/lib/mediawiki/query.rb +154 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e92d6477086ed671ae506b7dab213c47777e004c
|
4
|
+
data.tar.gz: 3bcb59b71c5d084cb8f27f365934710e2e60015f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4048a9e68a138b23e8412e4c991504fb894a20632f0fe673b4c9b62ee169d03e8a965991e912a61d23c4466a6fe60de97a21b0db2c10f2becad7a727468e5bc9
|
7
|
+
data.tar.gz: 2cc73a41fae56f3e0c535f589e3ee9fecde5f6b74892e7bd968035739126d818e17f935b8aaf6c2a1494aca5b65aa89369c2dc9d693f086fe1110084eb267d44
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'mediawiki/butt'
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require_relative 'exceptions'
|
2
|
+
|
3
|
+
module MediaWiki
|
4
|
+
module Auth
|
5
|
+
|
6
|
+
# Checks the login result for errors. Return true if success, else false, and will raise an error if it is not successful.
|
7
|
+
#
|
8
|
+
# ==== Attributes
|
9
|
+
#
|
10
|
+
# * +result+ - The parsed version of the result parameter of the login action.
|
11
|
+
# * +secondtry+ - Whether this login is the first or second try, false for first, true for second.
|
12
|
+
#
|
13
|
+
# ==== Examples
|
14
|
+
#
|
15
|
+
# This method should not be used by normal users.
|
16
|
+
def check_login(result, secondtry)
|
17
|
+
if result == "Success"
|
18
|
+
@logged_in = true
|
19
|
+
return true
|
20
|
+
elsif result == "NeedToken" && secondtry == true
|
21
|
+
raise MediaWiki::Butt::NeedTokenMoreThanOnceError
|
22
|
+
return false
|
23
|
+
elsif result == "NoName"
|
24
|
+
raise MediaWiki::Butt::NoNameError
|
25
|
+
return false
|
26
|
+
elsif result == "Illegal"
|
27
|
+
raise MediaWiki::Butt::IllegalUsernameError
|
28
|
+
return false
|
29
|
+
elsif result == "NotExists"
|
30
|
+
raise MediaWiki::Butt::UsernameNotExistsError
|
31
|
+
return false
|
32
|
+
elsif result == "EmptyPass"
|
33
|
+
raise MediaWiki::Butt::EmptyPassError
|
34
|
+
return false
|
35
|
+
elsif result == "WrongPass"
|
36
|
+
raise MediaWiki::Butt::WrongPassError
|
37
|
+
return false
|
38
|
+
elsif result == "WrongPluginPass"
|
39
|
+
raise MediaWiki::Butt::WrongPluginPassError
|
40
|
+
return false
|
41
|
+
elsif result == "CreateBlocked"
|
42
|
+
raise MediaWiki::Butt::CreateBlockedError
|
43
|
+
return false
|
44
|
+
elsif result == "Throttled"
|
45
|
+
raise MediaWiki::Butt::ThrottledError
|
46
|
+
return false
|
47
|
+
elsif result == "Blocked"
|
48
|
+
raise MediaWiki::Butt::BlockedError
|
49
|
+
return false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# Logs the user in to the wiki. This is generally required for editing, or getting restricted data.
|
53
|
+
# Will return the result of check_login.
|
54
|
+
#
|
55
|
+
# ==== Attributes
|
56
|
+
#
|
57
|
+
# * +username+ - The desired login handle
|
58
|
+
# * +password+ - The password of that user
|
59
|
+
#
|
60
|
+
# ==== Examples
|
61
|
+
#
|
62
|
+
# => butt.login("MyUsername", "My5up3r53cur3P@55w0rd")
|
63
|
+
def login(username, password)
|
64
|
+
params = {
|
65
|
+
action: 'login',
|
66
|
+
lgname: username,
|
67
|
+
lgpassword: password,
|
68
|
+
format: 'json'
|
69
|
+
}
|
70
|
+
|
71
|
+
result = post(params, true, false)
|
72
|
+
if check_login(result["login"]["result"], false) == true
|
73
|
+
@logged_in = true
|
74
|
+
@tokens.clear
|
75
|
+
elsif result["login"]["result"] == "NeedToken" && result["login"]["token"] != nil
|
76
|
+
token = result["login"]["token"]
|
77
|
+
token_params = {
|
78
|
+
action: 'login',
|
79
|
+
lgname: username,
|
80
|
+
lgpassword: password,
|
81
|
+
format: 'json',
|
82
|
+
lgtoken: token
|
83
|
+
}
|
84
|
+
|
85
|
+
#Consider refactor the @cookie initialization.
|
86
|
+
@cookie = "#{result["login"]["cookieprefix"]}Session=#{result["login"]["sessionid"]}"
|
87
|
+
result = post(token_params, true, true)
|
88
|
+
return check_login(result["login"]["result"], true)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Logs the current user out
|
93
|
+
#
|
94
|
+
# ==== Examples
|
95
|
+
#
|
96
|
+
# => butt.login("MyUsername", "My5up3r53cur3P@55w0rd")
|
97
|
+
# => # do stuff
|
98
|
+
# => butt.logout
|
99
|
+
def logout
|
100
|
+
if @logged_in == true
|
101
|
+
params = {
|
102
|
+
action: 'logout'
|
103
|
+
}
|
104
|
+
|
105
|
+
post(params)
|
106
|
+
@logged_in = false
|
107
|
+
@tokens.clear
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Creates an account using the standard procedure.
|
112
|
+
#
|
113
|
+
# ==== Attributes
|
114
|
+
#
|
115
|
+
# *+username+ - The desired username
|
116
|
+
# *+password+ - The desired password.
|
117
|
+
# *+language+ - The language code to set as default for the account being created. Defaults to 'en' or English. Use the language code, not the name.
|
118
|
+
# *+reason+ - The reason for creating the account, shown in the account creation log. Optional.
|
119
|
+
#
|
120
|
+
# ==== Examples
|
121
|
+
#
|
122
|
+
# => butt.create_account("MyUser", "password", "es", "MyEmailAddress@MailMain.com", "Quiero un nuevo acuenta sin embargo correocontraseña")
|
123
|
+
def create_account(username, password, language = 'en', *reason)
|
124
|
+
params = {
|
125
|
+
name: username,
|
126
|
+
password: password,
|
127
|
+
reason: reason,
|
128
|
+
language: language,
|
129
|
+
token: ''
|
130
|
+
}
|
131
|
+
|
132
|
+
result = post(params)
|
133
|
+
|
134
|
+
if result["createaccount"]["result"] == "Success"
|
135
|
+
@tokens.clear
|
136
|
+
elsif result["createaccount"]["result"] == "NeedToken"
|
137
|
+
params = {
|
138
|
+
name: username,
|
139
|
+
password: password,
|
140
|
+
reason: reason,
|
141
|
+
language: language,
|
142
|
+
token: result["createaccount"]["token"]
|
143
|
+
}
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Creates an account using the random-password-sent-by-email procedure.
|
148
|
+
#
|
149
|
+
# ==== Attributes
|
150
|
+
#
|
151
|
+
# *+username+ - The desired username
|
152
|
+
# *+email+ - The desired email address.
|
153
|
+
# *+reason+ - The reason for creating the account, shown in the account creation log. Optional.
|
154
|
+
# *+language+ - The language code to set as default for the account being created. Defaults to 'en' or English. Use the language code, not the name.
|
155
|
+
#
|
156
|
+
# ==== Examples
|
157
|
+
#
|
158
|
+
# => butt.create_account_email("MyUser", "MyEmailAddress@Whatever.com", "es", "Quiero una nueva acuenta porque quiero a comer caca")
|
159
|
+
def create_account_email(username, email, language = 'en', *reason)
|
160
|
+
params = {
|
161
|
+
name: username,
|
162
|
+
email: email,
|
163
|
+
mailpassword: 'value',
|
164
|
+
reason: reason,
|
165
|
+
language: language,
|
166
|
+
token: ''
|
167
|
+
}
|
168
|
+
|
169
|
+
result = post(params)
|
170
|
+
|
171
|
+
if result["createaccount"]["result"] == "Success"
|
172
|
+
@tokens.clear
|
173
|
+
elsif result["createaccount"]["result"] == "NeedToken"
|
174
|
+
params = {
|
175
|
+
name: username,
|
176
|
+
email: email,
|
177
|
+
mailpassword: 'value',
|
178
|
+
reason: reason,
|
179
|
+
language: language,
|
180
|
+
token: result["createaccount"]["token"]
|
181
|
+
}
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require_relative 'auth'
|
2
|
+
require_relative 'query'
|
3
|
+
require 'httpclient'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module MediaWiki
|
7
|
+
class Butt
|
8
|
+
include MediaWiki::Auth
|
9
|
+
include MediaWiki::Query::Meta
|
10
|
+
include MediaWiki::Query::Properties
|
11
|
+
include MediaWiki::Query::Lists
|
12
|
+
# Creates a new instance of MediaWiki::Butt
|
13
|
+
#
|
14
|
+
# ==== Attributes
|
15
|
+
#
|
16
|
+
# * +url+ - The FULL wiki URL. api.php can be omitted, but it will make harsh assumptions about your wiki configuration.
|
17
|
+
# * +use_ssl+ - Whether or not to use SSL. Will default to true.
|
18
|
+
#
|
19
|
+
# ==== Examples
|
20
|
+
#
|
21
|
+
# The example below shows an ideal usage of the method.
|
22
|
+
# => butt = MediaWiki::Butt.new("http://ftb.gamepedia.com/api.php")
|
23
|
+
#
|
24
|
+
# The example below shows a less than idea, but still functional, usage of the method. It is less than ideal because it has to assume that your API page is at /api.php, but it could easily be at /w/api.php, or even /wiki/api.php. It also does not use a secure connection.
|
25
|
+
# => butt = MediaWiki::Butt.new("http://ftb.gamepedia.com", false)
|
26
|
+
def initialize(url, use_ssl = true)
|
27
|
+
if url =~ /api.php$/
|
28
|
+
@url = url
|
29
|
+
else
|
30
|
+
@url = "#{url}/api.php"
|
31
|
+
end
|
32
|
+
|
33
|
+
@client = HTTPClient.new
|
34
|
+
@uri = URI.parse(@url)
|
35
|
+
@ssl = use_ssl
|
36
|
+
@logged_in = false
|
37
|
+
@tokens = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
# 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.
|
41
|
+
#
|
42
|
+
# ==== Attributes
|
43
|
+
#
|
44
|
+
# * +params+ - A basic hash containing MediaWiki API parameters. Please see mediawiki.org/wiki/API for more information.
|
45
|
+
# * +autoparse+ - Whether or not to provide a parsed version of the response's JSON. Will default to true.
|
46
|
+
# * +setcookie+ - Whether you want to set the auth cookie. Only used in authentication. Defaults to false.
|
47
|
+
#
|
48
|
+
# ==== Examples
|
49
|
+
#
|
50
|
+
# => login = butt.post({action: 'login', lgname: username, lgpassword: password, format: 'json'})
|
51
|
+
def post(params, autoparse = true, setcookie = false)
|
52
|
+
if setcookie == true
|
53
|
+
header = { 'Set-Cookie' => @cookie }
|
54
|
+
response = @client.post(@uri, params, header)
|
55
|
+
else
|
56
|
+
response = @client.post(@uri, params)
|
57
|
+
end
|
58
|
+
|
59
|
+
if autoparse == true
|
60
|
+
return JSON.parse(response.body)
|
61
|
+
else
|
62
|
+
return response
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns true if the currently logged in user is in the "bot" group.
|
67
|
+
# Will return false if the user is either not a bot or if they are not logged in.
|
68
|
+
def is_current_user_bot()
|
69
|
+
if @logged_in == true
|
70
|
+
params = {
|
71
|
+
action: 'query',
|
72
|
+
meta: 'userinfo',
|
73
|
+
uiprop: 'groups',
|
74
|
+
format: 'json'
|
75
|
+
}
|
76
|
+
|
77
|
+
ret = Array.new
|
78
|
+
response = post(params)
|
79
|
+
response["query"]["userinfo"]["groups"].each do |g|
|
80
|
+
if g == "bot"
|
81
|
+
return true
|
82
|
+
else
|
83
|
+
next
|
84
|
+
end
|
85
|
+
end
|
86
|
+
return false
|
87
|
+
else
|
88
|
+
return false
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
class Butt
|
3
|
+
class AuthenticationError < StandardError; end
|
4
|
+
|
5
|
+
class NeedTokenMoreThanOnceError < AuthenticationError
|
6
|
+
def message
|
7
|
+
"You tried to get the token more than once. You likely have some problem with your login call."
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class NoNameError < AuthenticationError
|
12
|
+
def message
|
13
|
+
"You did not set the lgname parameter."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class IllegalUsernameError < AuthenticationError
|
18
|
+
def message
|
19
|
+
"You provided an illegal username."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class UsernameNotExistsError < AuthenticationError
|
24
|
+
def message
|
25
|
+
"You provided a username that does not exist."
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class EmptyPassError < AuthenticationError
|
30
|
+
def message
|
31
|
+
"You did not set the lgpassword paremeter."
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class WrongPassError < AuthenticationError
|
36
|
+
def message
|
37
|
+
"The password you provided is not correct."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class WrongPluginPassError < AuthenticationError
|
42
|
+
def message
|
43
|
+
"A plugin (not MediaWiki) claims your password is not correct."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class CreateBlockedError < AuthenticationError
|
48
|
+
def message
|
49
|
+
"MediaWiki tried to automatically create an account for you, but your IP is blocked from account creation."
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ThrottledError < AuthenticationError
|
54
|
+
def message
|
55
|
+
"You've logged in too many times."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class BlockedError < AuthenticationError
|
60
|
+
def message
|
61
|
+
"User is blocked."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
module Query
|
3
|
+
#TODO: Actually decide on a good way to deal with meta information queries.
|
4
|
+
# The metainformation could probably be handled in a much less verbose way.
|
5
|
+
module Meta
|
6
|
+
|
7
|
+
# Gets all raw names for the wiki's image repositories into an array.
|
8
|
+
#
|
9
|
+
# ==== Examples
|
10
|
+
#
|
11
|
+
# => names = butt.get_filerepo_names()
|
12
|
+
def get_filerepo_names()
|
13
|
+
params = {
|
14
|
+
action: 'query',
|
15
|
+
meta: 'filerepoinfo',
|
16
|
+
friprop: 'name',
|
17
|
+
format: 'json'
|
18
|
+
}
|
19
|
+
|
20
|
+
result = post(params)
|
21
|
+
array = Array.new
|
22
|
+
result["query"]["repos"].each do |repo|
|
23
|
+
array.push(repo["name"])
|
24
|
+
end
|
25
|
+
return array
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Properties
|
30
|
+
|
31
|
+
# Gets the text for the given page. Returns nil if the page does not exist.
|
32
|
+
#
|
33
|
+
# ==== Attributes
|
34
|
+
#
|
35
|
+
# * +title+ - The page.
|
36
|
+
#
|
37
|
+
# ==== Examples
|
38
|
+
#
|
39
|
+
# => text = butt.get_text("User:Pendejo")
|
40
|
+
def get_text(title)
|
41
|
+
params = {
|
42
|
+
action: 'query',
|
43
|
+
prop: 'revisions',
|
44
|
+
rvprop: 'content',
|
45
|
+
format: 'json',
|
46
|
+
titles: title
|
47
|
+
}
|
48
|
+
|
49
|
+
response = post(params)
|
50
|
+
response["query"]["pages"].each do |revid, data|
|
51
|
+
$revid = revid
|
52
|
+
end
|
53
|
+
|
54
|
+
if response["query"]["pages"][$revid]["missing"] == ""
|
55
|
+
return nil
|
56
|
+
else
|
57
|
+
return response["query"]["pages"][$revid]["revisions"][0]["*"]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
module Lists
|
63
|
+
# Gets the list of backlinks of the title.
|
64
|
+
#
|
65
|
+
# ==== Attributes
|
66
|
+
#
|
67
|
+
# * +title+ - List pages linking to this title.
|
68
|
+
# * +limit+ - The maximum number of pages to get. Defaults to 500, and cannot be greater than 5000.
|
69
|
+
#
|
70
|
+
# ==== Examples
|
71
|
+
#
|
72
|
+
# => backlinks = butt.what_links_here("Title", 5)
|
73
|
+
# => backlinks.each do |butt|
|
74
|
+
# => puts butt
|
75
|
+
# => end
|
76
|
+
def what_links_here(title, limit = 500)
|
77
|
+
params = {
|
78
|
+
action: 'query',
|
79
|
+
bltitle: title,
|
80
|
+
format: 'json'
|
81
|
+
}
|
82
|
+
|
83
|
+
if limit > 500
|
84
|
+
if is_current_user_bot() == true
|
85
|
+
if limit > 5000
|
86
|
+
params[:bllimit] = 5000
|
87
|
+
else
|
88
|
+
params[:bllimit] = limit
|
89
|
+
end
|
90
|
+
else
|
91
|
+
params[:bllimit] = 500
|
92
|
+
end
|
93
|
+
else
|
94
|
+
params[:bllimit] = limit
|
95
|
+
end
|
96
|
+
|
97
|
+
ret = Array.new
|
98
|
+
response = post(params)
|
99
|
+
response["query"]["backlinks"].each do |bl|
|
100
|
+
ret.push(bl["title"])
|
101
|
+
end
|
102
|
+
return ret
|
103
|
+
end
|
104
|
+
# Returns an array of all pages (titles specifically, because IDs and namespace ints aren't very important) that belong to a given category. See API:Categorymembers
|
105
|
+
#
|
106
|
+
# ==== Attributes
|
107
|
+
#
|
108
|
+
# * +category+ - The category title.
|
109
|
+
# * +limit+ - The maximum number of members to get. Defaults to 500, and cannot be greater than 5000.
|
110
|
+
#
|
111
|
+
# ==== Examples
|
112
|
+
#
|
113
|
+
# => members = butt.get_category_members("Category:Butts", 5000)
|
114
|
+
# => members.each do |butts|
|
115
|
+
# => puts butts
|
116
|
+
# => end
|
117
|
+
def get_category_members(category, limit = 500)
|
118
|
+
params = {
|
119
|
+
action: 'query',
|
120
|
+
list: 'categorymembers',
|
121
|
+
#cmprop: 'title',
|
122
|
+
format: 'json'
|
123
|
+
}
|
124
|
+
|
125
|
+
if category =~ /Category\:/
|
126
|
+
params[:cmtitle] = category
|
127
|
+
else
|
128
|
+
params[:cmtitle] = "Category:#{category}"
|
129
|
+
end
|
130
|
+
|
131
|
+
if limit > 500
|
132
|
+
if is_current_user_bot() == true
|
133
|
+
if limit > 5000
|
134
|
+
params[:cmlimit] = 5000
|
135
|
+
else
|
136
|
+
params[:cmlimit] = limit
|
137
|
+
end
|
138
|
+
else
|
139
|
+
params[:cmlimit] = 500
|
140
|
+
end
|
141
|
+
else
|
142
|
+
params[:cmlimit] = limit
|
143
|
+
end
|
144
|
+
|
145
|
+
ret = Array.new
|
146
|
+
response = post(params)
|
147
|
+
response["query"]["categorymembers"].each do |cm|
|
148
|
+
ret.push(cm["title"])
|
149
|
+
end
|
150
|
+
return ret
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mediawiki-butt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eli Foster
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httpclient
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: |2
|
42
|
+
MediaWiki::Butt is a Ruby Gem that provides a fully-featured MediaWiki API interface.
|
43
|
+
email: elifosterwy@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- CHANGELOG.md
|
49
|
+
- lib/mediawiki-butt.rb
|
50
|
+
- lib/mediawiki/auth.rb
|
51
|
+
- lib/mediawiki/butt.rb
|
52
|
+
- lib/mediawiki/exceptions.rb
|
53
|
+
- lib/mediawiki/query.rb
|
54
|
+
homepage: https://github.com/ftb-gamepedia/mediawiki-butt-ruby
|
55
|
+
licenses:
|
56
|
+
- CC-BY-NC-ND-4.0
|
57
|
+
metadata:
|
58
|
+
issue_tracker: https://github.com/ftb-gamepedia/mediawiki-butt-ruby/issues
|
59
|
+
post_install_message: ONE OF US! ONE OF US!
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 2.4.5
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: Interacting with the MediaWiki API
|
79
|
+
test_files: []
|