Skip to content

Commit ac74247

Browse files
committed
Added support for alternate API endpoint #127
1 parent 76fe52e commit ac74247

File tree

6 files changed

+76
-24
lines changed

6 files changed

+76
-24
lines changed

tests/test_basic.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,19 @@ def test_query_init_wiki(self):
637637
self.assertEqual(qobj.domain, 'example.com')
638638
self.assertEqual(qobj.uri, 'http://example.com')
639639

640+
def test_query_init_endpoint(self):
641+
qobj = wptools.query.WPToolsQuery(endpoint='ENDPOINT')
642+
self.assertEqual(qobj.endpoint, 'ENDPOINT')
643+
self.assertEqual(qobj.uri, 'https://en.wikipedia.org')
644+
self.assertTrue('.orgENDPOINT?' in qobj.category('CAT'))
645+
self.assertTrue('.orgENDPOINT?' in qobj.labels(['QID']))
646+
self.assertTrue('.orgENDPOINT?' in qobj.imageinfo(['FILE']))
647+
self.assertTrue('.orgENDPOINT?' in qobj.parse('TITLE'))
648+
self.assertTrue('.orgENDPOINT?' in qobj.query('TITLE'))
649+
self.assertTrue('.orgENDPOINT?' in qobj.querymore('TITLE'))
650+
self.assertTrue('.orgENDPOINT?' in qobj.site('siteinfo'))
651+
self.assertTrue('.orgENDPOINT?' in qobj.wikidata('TITLE'))
652+
640653
def test_query_init_lang(self):
641654
qobj = wptools.query.WPToolsQuery(lang='zz')
642655
self.assertEqual(qobj.lang, 'zz')

wptools/category.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def __init__(self, *args, **kwargs):
2525
- [title]: <str> category title
2626
2727
Optional keyword {params}:
28+
- [endpoint]: <str> alternative API endpoint (default=/w/api.php)
2829
- [lang]: <str> Mediawiki language code (default=en)
2930
- [namespace]: <int> filter members (0=article, 14=category)
3031
- [pageid]: <int> category pageid
@@ -41,6 +42,7 @@ def __init__(self, *args, **kwargs):
4142
"""
4243
super(WPToolsCategory, self).__init__(**kwargs)
4344

45+
endpoint = kwargs.get('endpoint')
4446
pageid = kwargs.get('pageid')
4547
namespace = kwargs.get('namespace')
4648

@@ -49,6 +51,9 @@ def __init__(self, *args, **kwargs):
4951
title = args[0]
5052
self.params.update({'title': title})
5153

54+
if endpoint:
55+
self.params.update({'endpoint': endpoint})
56+
5257
if pageid:
5358
try:
5459
self.params.update({'pageid': int(pageid)})

wptools/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ def _get(self, action, show, proxy, timeout):
168168
# make the request
169169
qobj = WPToolsQuery(lang=self.params['lang'],
170170
variant=self.params.get('variant'),
171-
wiki=self.params.get('wiki'))
171+
wiki=self.params.get('wiki'),
172+
endpoint=self.params.get('endpoint'))
172173
qstr = self._query(action, qobj)
173174
req = self._request(proxy, timeout)
174175
response = req.get(qstr, qobj.status)

wptools/page.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def __init__(self, *args, **kwargs):
4444
4545
Optional keyword {params}:
4646
- [boxterm]: <str> Infobox title name or substring
47+
- [endpoint]: <str> alternative API endpoint (default=/w/api.php)
4748
- [lang]: <str> Mediawiki language code (default=en)
4849
- [pageid]: <int> Mediawiki pageid
4950
- [variant]: <str> Mediawiki language variant
@@ -63,6 +64,10 @@ def __init__(self, *args, **kwargs):
6364
if boxterm:
6465
self.params.update({'boxterm': boxterm})
6566

67+
endpoint = kwargs.get('endpoint')
68+
if endpoint:
69+
self.params.update({'endpoint': endpoint})
70+
6671
pageid = kwargs.get('pageid')
6772
if pageid:
6873
self.params.update({'pageid': pageid})

wptools/query.py

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,26 @@ class WPToolsQuery(object):
3030
WPToolsQuery class
3131
"""
3232

33+
DEFAULT_ENDPOINT = '/w/api.php'
3334
MAXWIDTH = 72
3435
RPAD = 4
3536

3637
IMAGEINFO = Template((
37-
"${WIKI}/w/api.php?action=query"
38+
"${WIKI}${ENDPOINT}?action=query"
3839
"&format=json"
3940
"&formatversion=2"
4041
"&iiprop=size|url|timestamp|extmetadata"
4142
"&prop=imageinfo"
4243
"&titles=${FILES}"))
4344

4445
LIST = Template((
45-
"${WIKI}/w/api.php?action=query"
46+
"${WIKI}${ENDPOINT}?action=query"
4647
"&format=json"
4748
"&formatversion=2"
4849
"&list=${LIST}"))
4950

5051
PARSE = Template((
51-
"${WIKI}/w/api.php?action=parse"
52+
"${WIKI}${ENDPOINT}?action=parse"
5253
"&format=json"
5354
"&formatversion=2"
5455
"&contentmodel=text"
@@ -60,7 +61,7 @@ class WPToolsQuery(object):
6061
"&page=${PAGE}"))
6162

6263
QUERY = Template((
63-
"${WIKI}/w/api.php?action=query"
64+
"${WIKI}${ENDPOINT}?action=query"
6465
"&exintro"
6566
"&format=json"
6667
"&formatversion=2"
@@ -78,7 +79,7 @@ class WPToolsQuery(object):
7879
"&titles=${TITLES}"))
7980

8081
QUERYMORE = Template((
81-
"${WIKI}/w/api.php?action=query"
82+
"${WIKI}${ENDPOINT}?action=query"
8283
"&bllimit=500"
8384
"&bltitle=${TITLES}"
8485
"&cllimit=500"
@@ -94,39 +95,45 @@ class WPToolsQuery(object):
9495
"&titles=${TITLES}"))
9596

9697
WIKIDATA = Template((
97-
"${WIKI}/w/api.php?action=wbgetentities"
98+
"${WIKI}${ENDPOINT}?action=wbgetentities"
9899
"&format=json"
99100
"&formatversion=2"
100101
"&languages=${LANG}"
101102
"&props=${PROPS}"
102103
"&redirects=yes"))
103104

105+
endpoint = None
104106
lang = None
105107
status = None
106108
variant = None
107109
wiki = None
108110

109-
def __init__(self, lang='en', variant=None, wiki=None):
111+
def __init__(self, lang='en', variant=None, wiki=None, endpoint=None):
110112
"""
111113
Returns a WPToolsQuery object
112114
113115
Arguments:
114116
- [lang=en]: <str> Mediawiki language code
115117
- [variant=None]: <str> language variant
116118
- [wiki=None]: <str> alternative wiki site
119+
- [endpoint=None]: <str> alternative API endoint
117120
"""
118121
self.lang = lang
119122
self.variant = variant
120123

121124
self.wiki = wiki or "%s.wikipedia.org" % self.lang
122125
self.domain = domain_name(self.wiki)
126+
self.endpoint = endpoint or self.DEFAULT_ENDPOINT
123127
self.uri = self.wiki_uri(self.wiki)
124128

125129
def category(self, title, pageid=None, cparams=None, namespace=None):
126130
"""
127131
Returns category query string
128132
"""
129-
query = self.LIST.substitute(WIKI=self.uri, LIST='categorymembers')
133+
query = self.LIST.substitute(
134+
WIKI=self.uri,
135+
ENDPOINT=self.endpoint,
136+
LIST='categorymembers')
130137
status = pageid or title
131138

132139
query += "&cmlimit=500"
@@ -163,6 +170,7 @@ def labels(self, qids):
163170

164171
query = self.WIKIDATA.substitute(
165172
WIKI=self.uri,
173+
ENDPOINT=self.endpoint,
166174
LANG=self.variant or self.lang,
167175
PROPS='labels')
168176

@@ -181,14 +189,19 @@ def imageinfo(self, files):
181189

182190
self.set_status('imageinfo', files)
183191

184-
return self.IMAGEINFO.substitute(WIKI=self.uri, FILES=files)
192+
return self.IMAGEINFO.substitute(
193+
WIKI=self.uri,
194+
ENDPOINT=self.endpoint,
195+
FILES=files)
185196

186197
def parse(self, title, pageid=None):
187198
"""
188199
Returns Mediawiki action=parse query string
189200
"""
190-
qry = self.PARSE.substitute(WIKI=self.uri,
191-
PAGE=safequote(title) or pageid)
201+
qry = self.PARSE.substitute(
202+
WIKI=self.uri,
203+
ENDPOINT=self.endpoint,
204+
PAGE=safequote(title) or pageid)
192205

193206
if pageid and not title:
194207
qry = qry.replace('&page=', '&pageid=').replace('&redirects', '')
@@ -204,8 +217,10 @@ def query(self, titles, pageids=None):
204217
"""
205218
Returns MediaWiki action=query query string
206219
"""
207-
query = self.QUERY.substitute(WIKI=self.uri,
208-
TITLES=safequote(titles) or pageids)
220+
query = self.QUERY.substitute(
221+
WIKI=self.uri,
222+
ENDPOINT=self.endpoint,
223+
TITLES=safequote(titles) or pageids)
209224
status = titles or pageids
210225

211226
if pageids and not titles:
@@ -225,6 +240,7 @@ def querymore(self, titles, pageids=None, cparams=None):
225240
"""
226241
query = self.QUERYMORE.substitute(
227242
WIKI=self.uri,
243+
ENDPOINT=self.endpoint,
228244
TITLES=safequote(titles) or pageids)
229245

230246
status = "%s" % (pageids or titles)
@@ -247,7 +263,10 @@ def random(self, namespace=0):
247263
"""
248264
Returns query string for random page
249265
"""
250-
query = self.LIST.substitute(WIKI=self.uri, LIST='random')
266+
query = self.LIST.substitute(
267+
WIKI=self.uri,
268+
ENDPOINT=self.endpoint,
269+
LIST='random')
251270
query += "&rnlimit=1&rnnamespace=%d" % namespace
252271

253272
emoji = [
@@ -309,28 +328,31 @@ def site(self, action):
309328
"""
310329
query = None
311330
viewdays = 7
331+
hostpath = self.uri + self.endpoint
312332

313333
if action == 'siteinfo':
314-
query = self.uri + ('/w/api.php?action=query'
315-
'&meta=siteinfo|siteviews'
316-
'&siprop=general|statistics'
317-
'&list=mostviewed&pvimlimit=max')
334+
query = hostpath + (
335+
'?action=query'
336+
'&meta=siteinfo|siteviews'
337+
'&siprop=general|statistics'
338+
'&list=mostviewed&pvimlimit=max')
318339
query += '&pvisdays=%d' % viewdays # meta=siteviews
319340
self.set_status('query', 'siteinfo|siteviews|mostviewed')
320341
elif action == 'sitematrix':
321-
query = self.uri + '/w/api.php?action=sitematrix'
342+
query = hostpath + '?action=sitematrix'
322343
self.set_status('sitematrix', 'all')
323344
elif action == 'sitevisitors':
324-
query = self.uri + ('/w/api.php?action=query'
325-
'&meta=siteviews&pvismetric=uniques')
345+
query = hostpath + (
346+
'?action=query'
347+
'&meta=siteviews&pvismetric=uniques')
326348
query += '&pvisdays=%d' % viewdays # meta=siteviews
327349
self.set_status('query', 'siteviews:uniques')
328350

329-
query += '&format=json&formatversion=2'
330-
331351
if not query:
332352
raise ValueError("Could not form query")
333353

354+
query += '&format=json&formatversion=2'
355+
334356
return query
335357

336358
def wiki_uri(self, wiki):
@@ -350,6 +372,7 @@ def wikidata(self, title, wikibase=None):
350372

351373
query = self.WIKIDATA.substitute(
352374
WIKI=self.uri,
375+
ENDPOINT=self.endpoint,
353376
LANG=self.variant or self.lang,
354377
PROPS="aliases|info|claims|descriptions|labels|sitelinks")
355378

wptools/site.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self, *args, **kwargs):
2626
Returns a WPToolsSite object.
2727
2828
Optional keyword {params}:
29+
- [endpoint]: <str> alternative API endpoint (default=/w/api.php)
2930
- [lang]: <str> Mediawiki language code (default=en)
3031
- [wiki]: <str> alternative wiki site (default=wikipedia.org)
3132
@@ -36,6 +37,10 @@ def __init__(self, *args, **kwargs):
3637
"""
3738
super(WPToolsSite, self).__init__(*args, **kwargs)
3839

40+
endpoint = kwargs.get('endpoint')
41+
if endpoint:
42+
self.params.update({'endpoint': endpoint})
43+
3944
def _query(self, action, qobj):
4045
"""
4146
returns query string

0 commit comments

Comments
 (0)