mediawiki-butt 1.0.0 → 1.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 +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/mediawiki/butt.rb +36 -0
- data/lib/mediawiki/query/lists/all.rb +10 -56
- data/lib/mediawiki/query/lists/backlinks.rb +7 -41
- data/lib/mediawiki/query/lists/categories.rb +1 -5
- data/lib/mediawiki/query/lists/miscellaneous.rb +8 -11
- data/lib/mediawiki/query/lists/querypage.rb +4 -12
- data/lib/mediawiki/query/lists/search.rb +2 -15
- data/lib/mediawiki/query/lists/users.rb +12 -22
- data/lib/mediawiki/query/properties/contributors.rb +19 -21
- data/lib/mediawiki/query/properties/files.rb +6 -17
- data/lib/mediawiki/query/properties/pages.rb +43 -66
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f401612e4a15f409ee096a93af7db54d7b1a622
|
4
|
+
data.tar.gz: 95f0582b2eb5c83c84ed37c911e2b17ae3f1684a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74a04d30b93a548662119f85118ba0b6261e7b8ed4bab1d57db7e8b0303cdee2e19d4b23548c9a5d499a4e16dde1554e37855b68a542ff5e70028f27063d1251
|
7
|
+
data.tar.gz: 4eaaa0362c1620c9e62c928f8d7916c204514b4b6ef745b12555cfdd6a20f1eda21f4a603cbbabb6b3618fe77a19958fc483cd82ed86b2d3235e2ec017986404
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Changelog
|
2
2
|
## Version 1
|
3
|
+
### Version 1.1.0
|
4
|
+
* Support for the continuation API (Issue #9 and PR #47)
|
5
|
+
|
3
6
|
### Version 1.0.0
|
4
7
|
* Important: MediaWiki::Butt now depends on Ruby 2.3. If you aren't using that yet, use it. It's worth it.
|
5
8
|
* MediaWiki::Butt.new now takes two parameters, `url`, and an options hash. See the documentation for initialize for more details.
|
data/lib/mediawiki/butt.rb
CHANGED
@@ -22,6 +22,7 @@ module MediaWiki
|
|
22
22
|
include MediaWiki::Watch
|
23
23
|
|
24
24
|
attr_accessor :query_limit_default
|
25
|
+
attr_accessor :use_continuation
|
25
26
|
|
26
27
|
# Creates a new instance of MediaWiki::Butt.
|
27
28
|
# @param url [String] The FULL wiki URL. api.php can be omitted, but it will make harsh assumptions about
|
@@ -32,6 +33,7 @@ module MediaWiki
|
|
32
33
|
# the various query methods. In other words, if you pass a limit parameter to the valid query methods, it will
|
33
34
|
# use that, otherwise, it will use this. Defaults to 500. It can be set to 'max' to use MW's default max for
|
34
35
|
# each API.
|
36
|
+
# @option opts [Boolean] :use_continuation Whether to use the continuation API on queries.
|
35
37
|
def initialize(url, opts = {})
|
36
38
|
@url = url =~ /api.php$/ ? url : "#{url}/api.php"
|
37
39
|
@query_limit_default = opts[:query_limit_default] || 500
|
@@ -39,6 +41,7 @@ module MediaWiki
|
|
39
41
|
@uri = URI.parse(@url)
|
40
42
|
@logged_in = false
|
41
43
|
@custom_agent = opts[:custom_agent]
|
44
|
+
@use_continuation = opts[:use_continuation]
|
42
45
|
end
|
43
46
|
|
44
47
|
# Performs a generic HTTP POST request and provides the response. This method generally should not be used by the
|
@@ -62,6 +65,39 @@ module MediaWiki
|
|
62
65
|
autoparse ? JSON.parse(res.body) : res
|
63
66
|
end
|
64
67
|
|
68
|
+
# Performs a Mediawiki API query and provides the response, dealing with continuation as necessary.
|
69
|
+
# @param params [Hash] A hash containing MediaWiki API parameters.
|
70
|
+
# @param base_return [Any] The return value to start with. Defaults to an empty array.
|
71
|
+
# @yield [base_return, query] Provides the value provided to the base_return parameter, and the value in the
|
72
|
+
# 'query' key in the API response. See the API documentation for more information on this. If the base_return
|
73
|
+
# value is modified in the block, its modifications will persist across each continuation loop.
|
74
|
+
# @return [Any] The base_return value as modified by the yielded block.
|
75
|
+
def query(params, base_return = [])
|
76
|
+
params[:action] = 'query'
|
77
|
+
params[:continue] = ''
|
78
|
+
|
79
|
+
loop do
|
80
|
+
result = post(params)
|
81
|
+
yield(base_return, result['query']) if result.key?('query')
|
82
|
+
break unless @use_continuation || result.key?('continue')
|
83
|
+
continue = result['continue']
|
84
|
+
continue.each do |key, val|
|
85
|
+
params[key.to_sym] = val
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
base_return
|
90
|
+
end
|
91
|
+
|
92
|
+
# Helper method for query methods that return an array built from the query objects.
|
93
|
+
# @param params [Hash] A hash containing MediaWiki API parameters.
|
94
|
+
# @param
|
95
|
+
def query_ary(params, base_response_key, property_key)
|
96
|
+
query(params) do |return_val, query|
|
97
|
+
query[base_response_key].each { |obj| return_val << obj[property_key] }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
65
101
|
# Gets whether the currently logged in user is a bot.
|
66
102
|
# @param username [String] The username to check. Optional. Defaults to
|
67
103
|
# the currently logged in user if nil.
|
@@ -10,17 +10,11 @@ module MediaWiki
|
|
10
10
|
# @return [Array<String>] An array of all categories.
|
11
11
|
def get_all_categories(limit = @query_limit_default)
|
12
12
|
params = {
|
13
|
-
action: 'query',
|
14
13
|
list: 'allcategories',
|
15
14
|
aclimit: get_limited(limit)
|
16
15
|
}
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
ret = []
|
21
|
-
response['query']['allcategories'].each { |c| ret << c['*'] }
|
22
|
-
|
23
|
-
ret
|
17
|
+
query_ary(params, 'allcategories', '*')
|
24
18
|
end
|
25
19
|
|
26
20
|
# Gets all the images on the wiki.
|
@@ -30,17 +24,11 @@ module MediaWiki
|
|
30
24
|
# @return [Array<String>] An array of all images.
|
31
25
|
def get_all_images(limit = @query_limit_default)
|
32
26
|
params = {
|
33
|
-
action: 'query',
|
34
27
|
list: 'allimages',
|
35
28
|
ailimit: get_limited(limit)
|
36
29
|
}
|
37
30
|
|
38
|
-
|
39
|
-
|
40
|
-
ret = []
|
41
|
-
response['query']['allimages'].each { |i| ret << i['name'] }
|
42
|
-
|
43
|
-
ret
|
31
|
+
query_ary(params, 'allimages', 'name')
|
44
32
|
end
|
45
33
|
|
46
34
|
# Gets all pages within a namespace integer.
|
@@ -51,18 +39,12 @@ module MediaWiki
|
|
51
39
|
# @return [Array<String>] An array of all page titles.
|
52
40
|
def get_all_pages_in_namespace(namespace, limit = @query_limit_default)
|
53
41
|
params = {
|
54
|
-
action: 'query',
|
55
42
|
list: 'allpages',
|
56
43
|
apnamespace: namespace,
|
57
44
|
aplimit: get_limited(limit)
|
58
45
|
}
|
59
46
|
|
60
|
-
|
61
|
-
|
62
|
-
ret = []
|
63
|
-
response['query']['allpages'].each { |p| ret << p['title'] }
|
64
|
-
|
65
|
-
ret
|
47
|
+
query_ary(params, 'allpages', 'title')
|
66
48
|
end
|
67
49
|
|
68
50
|
# Gets all users, or all users in a group.
|
@@ -73,18 +55,14 @@ module MediaWiki
|
|
73
55
|
# @return [Hash<String, Fixnum>] A hash of all users, names are keys, IDs are values.
|
74
56
|
def get_all_users(group = nil, limit = @query_limit_default)
|
75
57
|
params = {
|
76
|
-
action: 'query',
|
77
58
|
list: 'allusers',
|
78
59
|
aulimit: get_limited(limit)
|
79
60
|
}
|
80
61
|
params[:augroup] = group unless group.nil?
|
81
62
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
response['query']['allusers'].each { |u| ret[u['name']] = u['userid'] }
|
86
|
-
|
87
|
-
ret
|
63
|
+
query(params, {}) do |return_val, query|
|
64
|
+
query['allusers'].each { |u| return_val[u['name']] = u['userid']}
|
65
|
+
end
|
88
66
|
end
|
89
67
|
|
90
68
|
# Gets all block IDs on the wiki. It seems like this only gets non-IP blocks, but the MediaWiki docs are a
|
@@ -95,18 +73,12 @@ module MediaWiki
|
|
95
73
|
# @return [Array<Fixnum>] All block IDs as strings.
|
96
74
|
def get_all_blocks(limit = @query_limit_default)
|
97
75
|
params = {
|
98
|
-
action: 'query',
|
99
76
|
list: 'blocks',
|
100
77
|
bklimit: get_limited(limit),
|
101
78
|
bkprop: 'id'
|
102
79
|
}
|
103
80
|
|
104
|
-
|
105
|
-
|
106
|
-
ret = []
|
107
|
-
response['query']['blocks'].each { |b| ret.push(b['id']) }
|
108
|
-
|
109
|
-
ret
|
81
|
+
query_ary(params, 'blocks', 'id')
|
110
82
|
end
|
111
83
|
|
112
84
|
# Gets all page titles that transclude a given page.
|
@@ -117,18 +89,12 @@ module MediaWiki
|
|
117
89
|
# @return [Array<String>] All transcluder page titles.
|
118
90
|
def get_all_transcluders(page, limit = @query_limit_default)
|
119
91
|
params = {
|
120
|
-
action: 'query',
|
121
92
|
list: 'embeddedin',
|
122
93
|
eititle: page,
|
123
94
|
eilimit: get_limited(limit)
|
124
95
|
}
|
125
96
|
|
126
|
-
|
127
|
-
|
128
|
-
ret = []
|
129
|
-
response['query']['embeddedin'].each { |e| ret << e['title'] }
|
130
|
-
|
131
|
-
ret
|
97
|
+
query_ary(params, 'embeddedin', 'title')
|
132
98
|
end
|
133
99
|
|
134
100
|
# Gets an array of all deleted or archived files on the wiki.
|
@@ -138,17 +104,11 @@ module MediaWiki
|
|
138
104
|
# @return [Array<String>] All deleted file names. These are not titles, so they do not include "File:".
|
139
105
|
def get_all_deleted_files(limit = @query_limit_default)
|
140
106
|
params = {
|
141
|
-
action: 'query',
|
142
107
|
list: 'filearchive',
|
143
108
|
falimit: get_limited(limit)
|
144
109
|
}
|
145
110
|
|
146
|
-
|
147
|
-
|
148
|
-
ret = []
|
149
|
-
response['query']['filearchive'].each { |f| ret.push(f['name']) }
|
150
|
-
|
151
|
-
ret
|
111
|
+
query_ary(params, 'filearchive', 'name')
|
152
112
|
end
|
153
113
|
|
154
114
|
# Gets a list of all protected pages, by protection level if provided.
|
@@ -159,18 +119,12 @@ module MediaWiki
|
|
159
119
|
# @return [Array<String>] All protected page titles.
|
160
120
|
def get_all_protected_titles(protection_level = nil, limit = @query_limit_default)
|
161
121
|
params = {
|
162
|
-
action: 'query',
|
163
122
|
list: 'protectedtitles',
|
164
123
|
ptlimit: get_limited(limit)
|
165
124
|
}
|
166
125
|
params[:ptlevel] = protection_level unless protection_level.nil?
|
167
126
|
|
168
|
-
|
169
|
-
|
170
|
-
ret = []
|
171
|
-
response['query']['protectedtitles'].each { |t| ret << t['title'] }
|
172
|
-
|
173
|
-
ret
|
127
|
+
query_ary(params, 'protectedtitles', 'title')
|
174
128
|
end
|
175
129
|
end
|
176
130
|
end
|
@@ -11,17 +11,12 @@ module MediaWiki
|
|
11
11
|
# @return [Array<String>] All backlinks until the limit
|
12
12
|
def what_links_here(title, limit = @query_limit_default)
|
13
13
|
params = {
|
14
|
-
action: 'query',
|
15
14
|
list: 'backlinks',
|
16
15
|
bltitle: title,
|
17
16
|
bllimit: get_limited(limit)
|
18
17
|
}
|
19
18
|
|
20
|
-
|
21
|
-
response = post(params)
|
22
|
-
response['query']['backlinks'].each { |bl| ret << bl['title'] }
|
23
|
-
|
24
|
-
ret
|
19
|
+
query_ary(params, 'backlinks', 'title')
|
25
20
|
end
|
26
21
|
|
27
22
|
# Gets interwiki backlinks by the prefix and title.
|
@@ -33,18 +28,13 @@ module MediaWiki
|
|
33
28
|
# @return [Array<String>] All interwiki backlinking page titles.
|
34
29
|
def get_interwiki_backlinks(prefix = nil, title = nil, limit = @query_limit_default)
|
35
30
|
params = {
|
36
|
-
action: 'query',
|
37
31
|
list: 'iwbacklinks',
|
38
32
|
iwbllimit: get_limited(limit)
|
39
33
|
}
|
40
34
|
params[:iwblprefix] = prefix unless prefix.nil?
|
41
35
|
params[:iwbltitle] = title unless title.nil?
|
42
36
|
|
43
|
-
|
44
|
-
response = post(params)
|
45
|
-
response['query']['iwbacklinks'].each { |bl| ret << bl['title'] }
|
46
|
-
|
47
|
-
ret
|
37
|
+
query_ary(params, 'iwbacklinks', 'title')
|
48
38
|
end
|
49
39
|
|
50
40
|
# Gets language backlinks by the language and title.
|
@@ -56,18 +46,13 @@ module MediaWiki
|
|
56
46
|
def get_language_backlinks(language = nil, title = nil, limit = @query_limit_default)
|
57
47
|
language.downcase! if language.match(/[^A-Z]*/)[0].empty?
|
58
48
|
params = {
|
59
|
-
action: 'query',
|
60
49
|
list: 'langbacklinks',
|
61
50
|
lbltitle: get_limited(limit)
|
62
51
|
}
|
63
52
|
params[:lbllang] = language unless language.nil?
|
64
53
|
params[:lbltitle] = title unless title.nil?
|
65
54
|
|
66
|
-
|
67
|
-
response = post(params)
|
68
|
-
response['query']['langbacklinks'].each { |bl| ret << bl['title'] }
|
69
|
-
|
70
|
-
ret
|
55
|
+
query_ary(params, 'langbacklinks', 'title')
|
71
56
|
end
|
72
57
|
|
73
58
|
# Gets image backlinks, or the pages that use a given image.
|
@@ -80,20 +65,14 @@ module MediaWiki
|
|
80
65
|
# @return [Array<String>] All page titles that fit the requirements.
|
81
66
|
def get_image_backlinks(title, list_redirects = nil, thru_redir = false, limit = @query_limit_default)
|
82
67
|
params = {
|
83
|
-
action: 'query',
|
84
68
|
list: 'imageusage',
|
85
69
|
iutitle: title,
|
86
70
|
iulimit: get_limited(limit)
|
87
71
|
}
|
88
|
-
|
89
72
|
params[:iufilterredir] = list_redirects.nil? ? 'all' : list_redirects
|
90
73
|
params[:iuredirect] = '1' if thru_redir
|
91
74
|
|
92
|
-
|
93
|
-
ret = []
|
94
|
-
response['query']['imageusage'].each { |bl| ret << bl['title'] }
|
95
|
-
|
96
|
-
ret
|
75
|
+
query_ary(params, 'imageusage', 'title')
|
97
76
|
end
|
98
77
|
|
99
78
|
# Gets all external link page titles.
|
@@ -106,27 +85,14 @@ module MediaWiki
|
|
106
85
|
# hash, url and title.
|
107
86
|
def get_url_backlinks(url = nil, limit = @query_limit_default)
|
108
87
|
params = {
|
109
|
-
action: 'query',
|
110
88
|
list: 'exturlusage',
|
111
89
|
eulimit: get_limited(limit)
|
112
90
|
}
|
113
|
-
params[:euquery] = url
|
91
|
+
params[:euquery] = url if url
|
114
92
|
|
115
|
-
|
116
|
-
|
117
|
-
response['query']['exturlusage'].each do |bl|
|
118
|
-
if url.nil?
|
119
|
-
hash = {
|
120
|
-
url: bl['url'],
|
121
|
-
title: bl['title']
|
122
|
-
}
|
123
|
-
ret << hash
|
124
|
-
else
|
125
|
-
ret << bl['title']
|
126
|
-
end
|
93
|
+
query(params) do |return_val, query|
|
94
|
+
query['exturlusage'].each { |bl| return_val << url ? bl['title'] : { url: bl['url'], title: bl['title'] } }
|
127
95
|
end
|
128
|
-
|
129
|
-
ret
|
130
96
|
end
|
131
97
|
end
|
132
98
|
end
|
@@ -13,7 +13,6 @@ module MediaWiki
|
|
13
13
|
# @return [Array<String>] All category members until the limit
|
14
14
|
def get_category_members(category, limit = @query_limit_default, type = 'page')
|
15
15
|
params = {
|
16
|
-
action: 'query',
|
17
16
|
list: 'categorymembers',
|
18
17
|
cmprop: 'title',
|
19
18
|
cmlimit: get_limited(limit),
|
@@ -21,11 +20,8 @@ module MediaWiki
|
|
21
20
|
}
|
22
21
|
|
23
22
|
params[:cmtitle] = category =~ /[Cc]ategory:/ ? category : "Category:#{category}"
|
24
|
-
ret = []
|
25
|
-
response = post(params)
|
26
|
-
response['query']['categorymembers'].each { |cm| ret << cm['title'] }
|
27
23
|
|
28
|
-
|
24
|
+
query_ary(params, 'categorymembers', 'title')
|
29
25
|
end
|
30
26
|
|
31
27
|
# Gets the subcategories of a given category.
|
@@ -4,23 +4,23 @@ module MediaWiki
|
|
4
4
|
module Miscellaneous
|
5
5
|
# Returns an array of random pages titles.
|
6
6
|
# @param limit [Fixnum] The number of articles to get. Defaults to 1. Cannot be greater than 10 for normal
|
7
|
-
# users, or 20 for bots. This method does *not* use the query_limit_default attribute.
|
7
|
+
# users, or 20 for bots. This method does *not* use the query_limit_default attribute. This method does not
|
8
|
+
# use continuation.
|
8
9
|
# @param namespace [Fixnum] The namespace ID. Defaults to 0 (the main namespace).
|
9
10
|
# @see https://www.mediawiki.org/wiki/API:Random MediaWiki Random API Docs
|
10
11
|
# @since 0.2.0
|
11
12
|
# @return [Array<String>] All members
|
12
13
|
def get_random_pages(limit = 1, namespace = 0)
|
13
14
|
params = {
|
14
|
-
action: 'query',
|
15
15
|
list: 'random',
|
16
16
|
rnlimit: get_limited(limit, 10, 20),
|
17
17
|
rnnamespace: validate_namespace(namespace)
|
18
18
|
}
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
continue = @use_continuation
|
21
|
+
@use_continuation = false
|
22
|
+
ret = query_ary(params, 'random', 'title')
|
23
|
+
@use_continuation = continue
|
24
24
|
ret
|
25
25
|
end
|
26
26
|
|
@@ -31,14 +31,11 @@ module MediaWiki
|
|
31
31
|
# @return [Array<String>] All tag names.
|
32
32
|
def get_tags(limit = @query_limit_default)
|
33
33
|
params = {
|
34
|
-
action: 'query',
|
35
34
|
list: 'tags',
|
36
35
|
limit: get_limited(limit)
|
37
36
|
}
|
38
|
-
|
39
|
-
|
40
|
-
response['query']['tags'].each { |tag| ret << tag['name'] }
|
41
|
-
ret
|
37
|
+
|
38
|
+
query_ary(params, 'tags', 'name')
|
42
39
|
end
|
43
40
|
end
|
44
41
|
end
|
@@ -89,11 +89,7 @@ module MediaWiki
|
|
89
89
|
# @return [Nil] If the user does not have the necessary rights.
|
90
90
|
def get_unwatchedpages_page(limit = @query_limit_default)
|
91
91
|
rights = get_userrights
|
92
|
-
|
93
|
-
get_querypage('Unwatchedpages', limit)
|
94
|
-
else
|
95
|
-
return nil
|
96
|
-
end
|
92
|
+
rights && rights.include?('unwatchedpages') ? get_querypage('Unwatchedpages', limit) : nil
|
97
93
|
end
|
98
94
|
|
99
95
|
# @since 0.10.0
|
@@ -182,18 +178,14 @@ module MediaWiki
|
|
182
178
|
# @return [Array<String>] All of the page titles in the querypage.
|
183
179
|
def get_querypage(page, limit = @query_limit_default)
|
184
180
|
params = {
|
185
|
-
action: 'query',
|
186
181
|
list: 'querypage',
|
187
182
|
qppage: page,
|
188
183
|
qplimit: get_limited(limit)
|
189
184
|
}
|
190
|
-
response = post(params)
|
191
|
-
ret = []
|
192
|
-
response['query']['querypage']['results'].each do |result|
|
193
|
-
ret << result['title']
|
194
|
-
end
|
195
185
|
|
196
|
-
|
186
|
+
query(params) do |return_val, query|
|
187
|
+
query['querypage']['results'].each { |result| return_val << result['title'] }
|
188
|
+
end
|
197
189
|
end
|
198
190
|
end
|
199
191
|
end
|
@@ -28,18 +28,12 @@ module MediaWiki
|
|
28
28
|
# @return [Array<String>] The page titles that matched the search.
|
29
29
|
def get_search_results(search_value, namespace = 0)
|
30
30
|
params = {
|
31
|
-
action: 'query',
|
32
31
|
list: 'search',
|
33
32
|
srsearch: search_value,
|
34
33
|
srnamespace: validate_namespace(namespace)
|
35
34
|
}
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
ret = []
|
40
|
-
response['query']['search'].each { |search| ret << search['title'] }
|
41
|
-
|
42
|
-
ret
|
36
|
+
query_ary(params, 'search', 'title')
|
43
37
|
end
|
44
38
|
|
45
39
|
# Searches the wiki by a prefix.
|
@@ -51,19 +45,12 @@ module MediaWiki
|
|
51
45
|
# @return [Array<String>] All of the page titles that match the search.
|
52
46
|
def get_prefix_search(prefix, limit = 100)
|
53
47
|
params = {
|
54
|
-
action: 'query',
|
55
48
|
list: 'prefixsearch',
|
56
49
|
pssearch: prefix,
|
57
50
|
pslimit: get_limited(limit, 100, 200)
|
58
51
|
}
|
59
52
|
|
60
|
-
|
61
|
-
ret = []
|
62
|
-
response['query']['prefixsearch'].each do |result|
|
63
|
-
ret << result['title']
|
64
|
-
end
|
65
|
-
|
66
|
-
ret
|
53
|
+
query_ary(params, 'prefixsearch', 'title')
|
67
54
|
end
|
68
55
|
end
|
69
56
|
end
|
@@ -3,7 +3,7 @@ module MediaWiki
|
|
3
3
|
module Lists
|
4
4
|
module Users
|
5
5
|
# Gets user information. This method should rarely be used by
|
6
|
-
# normal users, unless they want a huge amount of
|
6
|
+
# normal users, unless they want a huge amount of usnot g data at once.
|
7
7
|
# @param prop [String] The usprop parameter.
|
8
8
|
# @param username [String] The username to get info for. Optional. Defaults to the currently logged in user
|
9
9
|
# if omitted.
|
@@ -144,26 +144,22 @@ module MediaWiki
|
|
144
144
|
# the size change relative to the previous edit.
|
145
145
|
def get_user_contributions(user, limit = @query_limit_default)
|
146
146
|
params = {
|
147
|
-
action: 'query',
|
148
147
|
list: 'usercontribs',
|
149
148
|
ucuser: user,
|
150
149
|
uclimit: get_limited(limit),
|
151
150
|
ucprop: 'ids|title|comment|size|sizediff|flags|patrolled'
|
152
151
|
}
|
153
152
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
}
|
153
|
+
query(params, {}) do |return_val, query|
|
154
|
+
query['usercontribs'].each do |item|
|
155
|
+
return_val[item['revid']] = {
|
156
|
+
title: item['title'],
|
157
|
+
summary: item['comment'],
|
158
|
+
total_size: item['size'],
|
159
|
+
diff_size: item['sizediff']
|
160
|
+
}
|
161
|
+
end
|
164
162
|
end
|
165
|
-
|
166
|
-
ret
|
167
163
|
end
|
168
164
|
|
169
165
|
# Gets the user's full watchlist. If no user is provided, it will use the currently logged in user, according
|
@@ -175,19 +171,13 @@ module MediaWiki
|
|
175
171
|
# @return [Array<String>] All the watchlist page titles.
|
176
172
|
def get_full_watchlist(user = nil, limit = @query_limit_default)
|
177
173
|
params = {
|
178
|
-
action: 'query',
|
179
174
|
list: 'watchlist',
|
180
175
|
wlprop: 'title',
|
181
176
|
wllimit: get_limited(limit)
|
182
177
|
}
|
183
|
-
params[:wluser] = user
|
178
|
+
params[:wluser] = user if user
|
184
179
|
|
185
|
-
|
186
|
-
|
187
|
-
ret = []
|
188
|
-
response['query']['watchlist'].each { |t| ret << t['title'] }
|
189
|
-
|
190
|
-
ret
|
180
|
+
query_ary(params, 'watchlist', 'title')
|
191
181
|
end
|
192
182
|
end
|
193
183
|
end
|
@@ -12,10 +12,12 @@ module MediaWiki
|
|
12
12
|
# @see #get_logged_in_contributors
|
13
13
|
# @since 0.8.0
|
14
14
|
# @return [Fixnum] The number of contributors to that page.
|
15
|
+
# @return [Nil] If the page does not exist.
|
15
16
|
def get_total_contributors(title, limit = @query_limit_default)
|
16
17
|
anon_users = get_anonymous_contributors_count(title, limit)
|
17
18
|
users = get_logged_in_contributors(title, limit)
|
18
19
|
|
20
|
+
return if users.nil?
|
19
21
|
users.size + anon_users
|
20
22
|
end
|
21
23
|
|
@@ -23,21 +25,14 @@ module MediaWiki
|
|
23
25
|
# @param (see #get_total_contributors)
|
24
26
|
# @see #get_contributors_response
|
25
27
|
# @since 0.8.0
|
26
|
-
# @return [Array] All usernames for the contributors.
|
28
|
+
# @return [Array<String>] All usernames for the contributors.
|
27
29
|
def get_logged_in_contributors(title, limit = @query_limit_default)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
return nil
|
34
|
-
else
|
35
|
-
response['query']['pages'][pageid]['contributors'].each do |c|
|
36
|
-
ret.push(c['name'])
|
37
|
-
end
|
30
|
+
get_contributors_response(title, limit) do |return_val, query|
|
31
|
+
pageid = nil
|
32
|
+
query['pages'].each { |r, _| pageid = r }
|
33
|
+
return if query['pages'][pageid].key?('missing')
|
34
|
+
query['pages'][pageid]['contributors'].each { |c| return_val << c['name'] }
|
38
35
|
end
|
39
|
-
|
40
|
-
ret
|
41
36
|
end
|
42
37
|
|
43
38
|
private
|
@@ -46,16 +41,15 @@ module MediaWiki
|
|
46
41
|
# @param (see #get_total_contributors)
|
47
42
|
# @see https://www.mediawiki.org/wiki/API:Contributors MediaWiki Contributors Property API Docs
|
48
43
|
# @since 0.8.0
|
49
|
-
# @return [Hash] See {MediaWiki::Butt#
|
44
|
+
# @return [Hash] See {MediaWiki::Butt#query}
|
50
45
|
def get_contributors_response(title, limit = @query_limit_default)
|
51
46
|
params = {
|
52
|
-
action: 'query',
|
53
47
|
prop: 'contributors',
|
54
48
|
titles: title,
|
55
49
|
pclimit: get_limited(limit)
|
56
50
|
}
|
57
51
|
|
58
|
-
|
52
|
+
query(params) { |return_val, query| yield(return_val, query) }
|
59
53
|
end
|
60
54
|
|
61
55
|
# Gets the total number of anonymous contributors for the given page.
|
@@ -65,12 +59,16 @@ module MediaWiki
|
|
65
59
|
# @return [Fixnum] The number of anonymous contributors for the page.
|
66
60
|
# @return [Nil] If title is not a valid page.
|
67
61
|
def get_anonymous_contributors_count(title, limit = @query_limit_default)
|
68
|
-
|
69
|
-
pageid = nil
|
70
|
-
response['query']['pages'].each { |r, _| pageid = r }
|
71
|
-
return nil if response['query']['pages'][pageid]['missing'] == ''
|
62
|
+
ret = 0
|
72
63
|
|
73
|
-
|
64
|
+
get_contributors_response(title, limit) do |_, query|
|
65
|
+
pageid = nil
|
66
|
+
query['pages'].each { |r, __| pageid = r }
|
67
|
+
return if query['pages'][pageid].key?('missing')
|
68
|
+
ret += query['pages'][pageid]['anoncontributors'].to_i
|
69
|
+
end
|
70
|
+
|
71
|
+
ret
|
74
72
|
end
|
75
73
|
end
|
76
74
|
end
|
@@ -10,24 +10,19 @@ module MediaWiki
|
|
10
10
|
# @see https://www.mediawiki.org/wiki/API:Duplicatefiles MediaWiki Duplicate Files API Docs
|
11
11
|
# @since 0.8.0
|
12
12
|
# @return [Array<String>] Array of all the duplicated file names.
|
13
|
-
# @return [Nil] If there aren't any duplicated files.
|
14
13
|
def get_duplicated_files_of(title, limit = @query_limit_default)
|
15
14
|
params = {
|
16
|
-
action: 'query',
|
17
15
|
prop: 'duplicatefiles',
|
18
16
|
titles: title,
|
19
17
|
dflimit: get_limited(limit)
|
20
18
|
}
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
c['duplicatefiles'].each do |f|
|
27
|
-
ret << f['name']
|
20
|
+
query(params) do |return_val, query|
|
21
|
+
query['pages'].each do |_, c|
|
22
|
+
next unless c['duplicatefies']
|
23
|
+
c['duplicatefiles'].each { |f| return_val << f['name'] }
|
28
24
|
end
|
29
25
|
end
|
30
|
-
ret
|
31
26
|
end
|
32
27
|
|
33
28
|
# Gets all duplicated files on the wiki.
|
@@ -37,18 +32,12 @@ module MediaWiki
|
|
37
32
|
# @return [Array<String>] All duplicate file titles on the wiki.
|
38
33
|
def get_all_duplicated_files(limit = @query_limit_default)
|
39
34
|
params = {
|
40
|
-
action: 'query',
|
41
35
|
generator: 'allimages',
|
42
|
-
prop: '
|
36
|
+
prop: 'duplicatedfiles',
|
43
37
|
dflimit: get_limited(limit)
|
44
38
|
}
|
45
39
|
|
46
|
-
|
47
|
-
ret = []
|
48
|
-
response['query']['pages'].each do |_, c|
|
49
|
-
ret << c['title']
|
50
|
-
end
|
51
|
-
ret
|
40
|
+
query_ary(params, 'pages', 'title')
|
52
41
|
end
|
53
42
|
|
54
43
|
# Gets the size of an image in bytes.
|
@@ -12,18 +12,20 @@ module MediaWiki
|
|
12
12
|
# @return [Nil] If the title does not exist.
|
13
13
|
def get_categories_in_page(title)
|
14
14
|
params = {
|
15
|
-
action: 'query',
|
16
15
|
prop: 'categories',
|
17
16
|
titles: title
|
18
17
|
}
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
query(params) do |return_val, query|
|
20
|
+
pageid = nil
|
21
|
+
query['pages'].each do |r, _|
|
22
|
+
pageid = r
|
23
|
+
break
|
24
|
+
end
|
25
25
|
|
26
|
-
|
26
|
+
return if query['pages'][pageid].key?('missing')
|
27
|
+
query['pages'][pageid].fetch('categories', []).each { |c| return_val << c['title'] }
|
28
|
+
end
|
27
29
|
end
|
28
30
|
|
29
31
|
# Gets the wiki text for the given page. Returns nil if it for some reason cannot get the text, for example,
|
@@ -85,16 +87,12 @@ module MediaWiki
|
|
85
87
|
ellimit: get_limited(limit)
|
86
88
|
}
|
87
89
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
response['query']['pages'][revid]['extlinks'].each do |l|
|
93
|
-
ret << l['*']
|
90
|
+
query(params) do |return_val, query|
|
91
|
+
query['pages'].each do |revid, _|
|
92
|
+
return if revid == '-1'
|
93
|
+
query['pages'][revid]['extlinks'].each { |l| return_val << l['*'] }
|
94
94
|
end
|
95
95
|
end
|
96
|
-
|
97
|
-
ret
|
98
96
|
end
|
99
97
|
|
100
98
|
# Gets whether the current user watches the page.
|
@@ -273,22 +271,17 @@ module MediaWiki
|
|
273
271
|
# @return [Nil] If the page does not exist.
|
274
272
|
def get_images_in_page(title, limit = @query_limit_default)
|
275
273
|
params = {
|
276
|
-
action: 'query',
|
277
274
|
prop: 'images',
|
278
275
|
titles: title,
|
279
276
|
imlimit: get_limited(limit)
|
280
277
|
}
|
281
278
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
response['query']['pages'][revid]['images'].each do |img|
|
287
|
-
ret << img['title']
|
279
|
+
query(params) do |return_val, query|
|
280
|
+
query['pages'].each do |revid, _|
|
281
|
+
return if revid == '-1'
|
282
|
+
query['pages'][revid]['images'].each { |img| return_val << img['title'] }
|
288
283
|
end
|
289
284
|
end
|
290
|
-
|
291
|
-
ret
|
292
285
|
end
|
293
286
|
|
294
287
|
# Gets all of the templates in the given page.
|
@@ -299,48 +292,40 @@ module MediaWiki
|
|
299
292
|
# @return [Nil] If the page does not exist.
|
300
293
|
def get_templates_in_page(title, limit = @query_limit_default)
|
301
294
|
params = {
|
302
|
-
action: 'query',
|
303
295
|
prop: 'templates',
|
304
296
|
titles: title,
|
305
297
|
tllimit: get_limited(limit)
|
306
298
|
}
|
307
299
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
response['query']['pages'][revid]['templates'].each do |tmp|
|
313
|
-
ret << tmp['title']
|
300
|
+
query(params) do |return_val, query|
|
301
|
+
query['pages'].each do |revid, _|
|
302
|
+
return if revid == '-1'
|
303
|
+
query['pages'][revid]['templates'].each { |template| return_val << template['title'] }
|
314
304
|
end
|
315
305
|
end
|
316
|
-
|
317
|
-
ret
|
318
306
|
end
|
319
307
|
|
320
308
|
# Gets all of the interwiki links on the given page.
|
321
309
|
# @param (see #get_external_links)
|
322
310
|
# @see https://www.mediawiki.org/wiki/API:Iwlinks MediaWiki Interwiki Links API Docs
|
323
311
|
# @since 0.8.0
|
324
|
-
# @return [Array<String
|
312
|
+
# @return [Array<Hash<Symbol, String>>] All interwiki links. Each hash has a :prefix and :title
|
325
313
|
# @return [Nil] If the page does not exist.
|
326
314
|
def get_interwiki_links_in_page(title, limit = @query_limit_default)
|
327
315
|
params = {
|
328
|
-
action: 'query',
|
329
316
|
prop: 'iwlinks',
|
330
317
|
titles: title,
|
331
318
|
tllimit: get_limited(limit)
|
332
319
|
}
|
333
320
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
321
|
+
query(params) do |return_val, query|
|
322
|
+
query['pages'].each do |revid, _|
|
323
|
+
return if revid == '-1'
|
324
|
+
query['pages'][revid].fetch('iwlinks', []).each do |l|
|
325
|
+
return_val << { prefix: l['prefix'], title: l['*'] }
|
326
|
+
end
|
340
327
|
end
|
341
328
|
end
|
342
|
-
|
343
|
-
ret
|
344
329
|
end
|
345
330
|
|
346
331
|
# Gets a hash of data for the page in every language that it is available in. This includes url, language
|
@@ -352,28 +337,25 @@ module MediaWiki
|
|
352
337
|
# @return [Nil] If the page does not exist.
|
353
338
|
def get_other_langs_of_page(title, limit = @query_limit_default)
|
354
339
|
params = {
|
355
|
-
action: 'query',
|
356
340
|
prop: 'langlinks',
|
357
341
|
titles: title,
|
358
342
|
lllimit: get_limited(limit),
|
359
343
|
llprop: 'url|langname|autonym'
|
360
344
|
}
|
361
345
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
346
|
+
query(params) do |return_val, query|
|
347
|
+
query['pages'].each do |revid, _|
|
348
|
+
return if revid == '-1'
|
349
|
+
query['pages'][revid]['langlinks'].each do |l|
|
350
|
+
return_val[l['lang'].to_sym] = {
|
351
|
+
url: l['url'],
|
352
|
+
langname: l['langname'],
|
353
|
+
autonym: l['autonym'],
|
354
|
+
title: l['*']
|
355
|
+
}
|
356
|
+
end
|
373
357
|
end
|
374
358
|
end
|
375
|
-
|
376
|
-
ret
|
377
359
|
end
|
378
360
|
|
379
361
|
# Gets every single link in a page.
|
@@ -384,22 +366,17 @@ module MediaWiki
|
|
384
366
|
# @return [Nil] If the page does not exist.
|
385
367
|
def get_all_links_in_page(title, limit = @query_limit_default)
|
386
368
|
params = {
|
387
|
-
action: 'query',
|
388
369
|
prop: 'links',
|
389
370
|
titles: title,
|
390
371
|
pllimit: get_limited(limit)
|
391
372
|
}
|
392
373
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
response['query']['pages'][revid]['links'].each do |l|
|
398
|
-
ret << l['title']
|
374
|
+
query(params) do |return_val, query|
|
375
|
+
query['pages'].each do |revid, _|
|
376
|
+
return if revid == '-1'
|
377
|
+
query['pages'][revid]['links'].each { |l| return_val << l['title'] }
|
399
378
|
end
|
400
379
|
end
|
401
|
-
|
402
|
-
ret
|
403
380
|
end
|
404
381
|
end
|
405
382
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mediawiki-butt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eli Foster
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-08-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httpclient
|