jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/572498 )
Change subject: Make WikibaseEntity.concept_uri raise when id isn't known
......................................................................
Make WikibaseEntity.concept_uri raise when id isn't known
Change-Id: Ib17d4f86ae3c58a730e7d43cb411c146344ed417
---
M pywikibot/page.py
1 file changed, 9 insertions(+), 3 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/page.py b/pywikibot/page.py
index c408295..b9f4f35 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -3841,9 +3841,15 @@
return {}
def concept_uri(self):
- """Return the full concept URI."""
- # todo: raise when self.id is -1
- return '{0}{1}'.format(self.repo.concept_base_uri, self.id)
+ """
+ Return the full concept URI.
+
+ @raise NoWikibaseEntity: if this entity doesn't exist
+ """
+ entity_id = self.getID()
+ if entity_id == '-1':
+ raise pywikibot.NoWikibaseEntity(self)
+ return '{0}{1}'.format(self.repo.concept_base_uri, entity_id)
class WikibasePage(BasePage, WikibaseEntity):
--
To view, visit https://gerrit.wikimedia.org/r/572498
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ib17d4f86ae3c58a730e7d43cb411c146344ed417
Gerrit-Change-Number: 572498
Gerrit-PatchSet: 1
Gerrit-Owner: Matěj Suchánek <matejsuchanek97(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/571927 )
Change subject: [IMPR] Provide mediawiki_messages for foreign language codes
......................................................................
[IMPR] Provide mediawiki_messages for foreign language codes
mediawiki_messages can be retrieved with language code.
This patch enables messages to be independend from site.lang
by giving a lang parameter to mediawiki message methods.
- use a new site._mw_msg_cache cache which holds all messages
independend from a special Site object
- remove the all message fetching behaviour of '*' key
which was deprecated 5 years ago due to T111479
- add some test for the new behaviour
- use subTest for the test method
- remove tests for deprcated all message fetching with '*'
Change-Id: I24863cbf369a007404509a7bee19b4a36f9df881
---
M pywikibot/site.py
M tests/site_tests.py
2 files changed, 90 insertions(+), 63 deletions(-)
Approvals:
Mpaa: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py
index c2d20cb..c725868 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -30,7 +30,7 @@
from collections.abc import Iterable, Container, Mapping
except ImportError: # Python 2.7
from collections import Iterable, Container, Mapping
-from collections import namedtuple
+from collections import defaultdict, namedtuple
from enum import IntEnum
from warnings import warn
@@ -1845,6 +1845,9 @@
super(RemovedSite, self).__init__(code, fam, user)
+_mw_msg_cache = defaultdict(dict)
+
+
class APISite(BaseSite):
"""
@@ -2376,81 +2379,86 @@
except KeyError:
return False
- def mediawiki_messages(self, keys):
+ def mediawiki_messages(self, keys, lang=None):
"""Fetch the text of a set of MediaWiki messages.
- If keys is '*' or ['*'], all messages will be fetched. (deprecated)
-
The returned dict uses each key to store the associated message.
@see: U{https://www.mediawiki.org/wiki/API:Allmessages}
@param keys: MediaWiki messages to fetch
- @type keys: set of str, '*' or ['*']
+ @type keys: iterable of str
+ @param lang: a language code, default is self.lang
+ @type lang: str or None
@rtype dict
"""
- if keys == '*' or keys == ['*']:
- issue_deprecation_warning('mediawiki_messages("*")',
- 'specific messages', since='20150905')
-
- if not all(_key in self._msgcache for _key in keys):
+ amlang = lang or self.lang
+ if not all(amlang in _mw_msg_cache
+ and _key in _mw_msg_cache[amlang] for _key in keys):
parameters = {'meta': 'allmessages',
'ammessages': keys,
- 'amlang': self.lang,
+ 'amlang': amlang,
}
msg_query = api.QueryGenerator(site=self, parameters=parameters)
for msg in msg_query:
if 'missing' not in msg:
- self._msgcache[msg['name']] = msg['*']
+ _mw_msg_cache[amlang][msg['name']] = msg['*']
- # Return all messages
- if keys == '*' or keys == ['*']:
- return self._msgcache
+ # Check requested keys
+ result = {}
+ for key in keys:
+ try:
+ result[key] = _mw_msg_cache[amlang][key]
+ except KeyError:
+ raise KeyError("No message '{}' found for lang '{}'"
+ .format(key, amlang))
else:
- # Check requested keys
- for key in keys:
- if key not in self._msgcache:
- raise KeyError("Site %s has no message '%s'"
- % (self, key))
+ return result
- return {_key: self._msgcache[_key] for _key in keys}
+ return {_key: _mw_msg_cache[amlang][_key] for _key in keys}
@deprecated_args(forceReload=None)
- def mediawiki_message(self, key):
+ def mediawiki_message(self, key, lang=None):
"""Fetch the text for a MediaWiki message.
@param key: name of MediaWiki message
@type key: str
+ @param lang: a language code, default is self.lang
+ @type lang: str or None
@rtype unicode
"""
- return self.mediawiki_messages([key])[key]
+ return self.mediawiki_messages([key], lang=lang)[key]
- def has_mediawiki_message(self, key):
+ def has_mediawiki_message(self, key, lang=None):
"""Determine if the site defines a MediaWiki message.
@param key: name of MediaWiki message
@type key: str
+ @param lang: a language code, default is self.lang
+ @type lang: str or None
@rtype: bool
"""
- return self.has_all_mediawiki_messages([key])
+ return self.has_all_mediawiki_messages([key], lang=lang)
- def has_all_mediawiki_messages(self, keys):
+ def has_all_mediawiki_messages(self, keys, lang=None):
"""Confirm that the site defines a set of MediaWiki messages.
@param keys: names of MediaWiki messages
- @type keys: set of str
+ @type keys: iterable of str
+ @param lang: a language code, default is self.lang
+ @type lang: str or None
@rtype: bool
"""
try:
- self.mediawiki_messages(keys)
- return True
+ self.mediawiki_messages(keys, lang=lang)
except KeyError:
return False
+ return True
@property
def months_names(self):
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 279b0f8..6fabc24 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -186,17 +186,6 @@
self.assertOneDeprecationParts('Calling the namespaces property',
'it directly')
- def test_messages_star(self):
- """Test that fetching all messages is deprecated."""
- # Load all messages and check that '*' is not a valid key.
- self.assertEqual(self.site.mediawiki_messages('*'),
- {'*': 'dummy entry'})
- self.assertOneDeprecationParts('mediawiki_messages("*")',
- 'specific messages')
- self.assertEqual(self.site.mediawiki_messages(['hello']),
- {'hello': 'world'})
- self.assertNoDeprecation()
-
class TestBaseSiteProperties(TestCase):
@@ -397,37 +386,67 @@
"""Test MediaWiki: messages."""
mysite = self.get_site()
for msg in ('about', 'aboutpage', 'aboutsite', 'accesskey-n-portal'):
- self.assertTrue(mysite.has_mediawiki_message(msg))
- self.assertIsInstance(mysite.mediawiki_message(msg), basestring)
- self.assertFalse(mysite.has_mediawiki_message('nosuchmessage'))
- self.assertRaises(KeyError, mysite.mediawiki_message, 'nosuchmessage')
+ with self.subTest(message=msg, lang=mysite.lang):
+ self.assertTrue(mysite.has_mediawiki_message(msg))
+ self.assertIsInstance(mysite.mediawiki_message(msg),
+ basestring)
+ self.assertEqual(
+ mysite.mediawiki_message(msg),
+ mysite.mediawiki_message(msg, lang=mysite.lang))
+
+ with self.subTest(message=msg, lang='de'):
+ self.assertTrue(mysite.has_mediawiki_message(msg, lang='de'))
+ self.assertIsInstance(mysite.mediawiki_message(msg, lang='de'),
+ basestring)
+
+ with self.subTest(message='nosuchmessage'):
+ self.assertFalse(mysite.has_mediawiki_message('nosuchmessage'))
+ self.assertRaises(KeyError, mysite.mediawiki_message,
+ 'nosuchmessage')
msg = ('about', 'aboutpage')
- about_msgs = self.site.mediawiki_messages(msg)
- self.assertIsInstance(mysite.mediawiki_messages(msg), dict)
- self.assertTrue(mysite.mediawiki_messages(msg))
- self.assertLength(about_msgs, 2)
- self.assertIn(msg[0], about_msgs)
+ with self.subTest(messages=msg):
+ about_msgs = self.site.mediawiki_messages(msg)
+ self.assertIsInstance(mysite.mediawiki_messages(msg), dict)
+ self.assertTrue(mysite.mediawiki_messages(msg))
+ self.assertLength(about_msgs, 2)
+ self.assertIn(msg[0], about_msgs)
+
+ months = ['january', 'february', 'march', 'april', 'may_long',
+ 'june', 'july', 'august', 'september', 'october',
+ 'november', 'december']
+ with self.subTest(messages=months, lang1='af', lang2='an'):
+ self.assertLength(mysite.mediawiki_messages(months, 'af'), 12)
+ self.assertLength(mysite.mediawiki_messages(months, 'an'), 12)
+ self.assertNotEqual(mysite.mediawiki_messages(months, 'af'),
+ mysite.mediawiki_messages(months, 'an'))
# mediawiki_messages must be given a list; using a string will split it
- self.assertRaises(KeyError, self.site.mediawiki_messages, 'about')
+ with self.subTest(messages='about'):
+ self.assertRaises(KeyError, self.site.mediawiki_messages, 'about')
msg = ('nosuchmessage1', 'about', 'aboutpage', 'nosuchmessage')
- self.assertFalse(mysite.has_all_mediawiki_messages(msg))
- self.assertRaises(KeyError, mysite.mediawiki_messages, msg)
+ with self.subTest(messages=msg):
+ self.assertFalse(mysite.has_all_mediawiki_messages(msg))
+ self.assertRaises(KeyError, mysite.mediawiki_messages, msg)
- self.assertIsInstance(mysite.server_time(), pywikibot.Timestamp)
- ts = mysite.getcurrenttimestamp()
- self.assertIsInstance(ts, basestring)
- self.assertRegex(ts, r'(19|20)\d\d[0-1]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d')
+ with self.subTest(test='server_time'):
+ self.assertIsInstance(mysite.server_time(), pywikibot.Timestamp)
+ ts = mysite.getcurrenttimestamp()
+ self.assertIsInstance(ts, basestring)
+ self.assertRegex(
+ ts, r'(19|20)\d\d[0-1]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d')
- self.assertIsInstance(mysite.months_names, list)
- self.assertLength(mysite.months_names, 12)
- self.assertTrue(all(isinstance(month, tuple)
- for month in mysite.months_names))
- for month in mysite.months_names:
- self.assertLength(month, 2)
- self.assertEqual(mysite.list_to_text(('pywikibot',)), 'pywikibot')
+ with self.subTest(test='months_names'):
+ self.assertIsInstance(mysite.months_names, list)
+ self.assertLength(mysite.months_names, 12)
+ self.assertTrue(all(isinstance(month, tuple)
+ for month in mysite.months_names))
+ for month in mysite.months_names:
+ self.assertLength(month, 2)
+
+ with self.subTest(test='list_to_text'):
+ self.assertEqual(mysite.list_to_text(('pywikibot',)), 'pywikibot')
def test_english_specific_methods(self):
"""Test Site methods using English specific inputs and outputs."""
--
To view, visit https://gerrit.wikimedia.org/r/571927
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I24863cbf369a007404509a7bee19b4a36f9df881
Gerrit-Change-Number: 571927
Gerrit-PatchSet: 7
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/572028 )
Change subject: [cleanup] Some code cleanups within site.merge_history()
......................................................................
[cleanup] Some code cleanups within site.merge_history()
- remove raising FatalServerError in favour of need_version decorator
- dedent deeply nested flow statements
Change-Id: I43b61acf9794f5f9ddab3fb6bcf7da0bc64c8af0
---
M pywikibot/site.py
1 file changed, 26 insertions(+), 29 deletions(-)
Approvals:
JJMC89: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py
index c2d20cb..de6ffaf 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -49,7 +49,6 @@
EntityTypeUnknownException,
Error,
FamilyMaintenanceWarning,
- FatalServerError,
InconsistentTitleReceived,
InterwikiRedirectPage,
IsNotRedirectPage,
@@ -5475,6 +5474,7 @@
}
@need_right('mergehistory')
+ @need_version('1.27.0-wmf.13')
def merge_history(self, source, dest, timestamp=None, reason=None):
"""Merge revisions from one page into another.
@@ -5496,12 +5496,6 @@
@param reason: Optional reason for the history merge
@type reason: str
"""
- # Check wiki version to see if action=mergehistory is supported
- if self.mw_version < '1.27.0-wmf.13':
- raise FatalServerError(str(self) + ' version must be '
- '1.27.0-wmf.13 or newer to support the '
- 'history merge API.')
-
# Data for error messages
errdata = {
'site': self,
@@ -6263,30 +6257,33 @@
"""
if self.mw_version >= '1.27wmf9':
return not self._siteinfo.get('general')['uploadsenabled']
+
if hasattr(self, '_uploaddisabled'):
return self._uploaddisabled
- else:
- # attempt a fake upload; on enabled sites will fail for:
- # missingparam: One of the parameters
- # filekey, file, url, statuskey is required
- # TODO: is there another way?
- try:
- req = self._request(throttle=False,
- parameters={'action': 'upload',
- 'token': self.tokens['edit']})
- req.submit()
- except api.APIError as error:
- if error.code == 'uploaddisabled':
- self._uploaddisabled = True
- elif error.code == 'missingparam':
- # If the upload module is enabled, the above dummy request
- # does not have sufficient parameters and will cause a
- # 'missingparam' error.
- self._uploaddisabled = False
- else:
- # Unexpected error
- raise
- return self._uploaddisabled
+
+ # attempt a fake upload; on enabled sites will fail for:
+ # missingparam: One of the parameters
+ # filekey, file, url, statuskey is required
+ # TODO: is there another way?
+ try:
+ req = self._request(throttle=False,
+ parameters={'action': 'upload',
+ 'token': self.tokens['edit']})
+ req.submit()
+ except api.APIError as error:
+ if error.code == 'uploaddisabled':
+ self._uploaddisabled = True
+ elif error.code == 'missingparam':
+ # If the upload module is enabled, the above dummy request
+ # does not have sufficient parameters and will cause a
+ # 'missingparam' error.
+ self._uploaddisabled = False
+ else:
+ # Unexpected error
+ raise
+ return self._uploaddisabled
+ raise RuntimeError(
+ 'Unexpected success of upload action without parameters.')
def stash_info(self, file_key, props=False):
"""Get the stash info for a given file key.
--
To view, visit https://gerrit.wikimedia.org/r/572028
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I43b61acf9794f5f9ddab3fb6bcf7da0bc64c8af0
Gerrit-Change-Number: 572028
Gerrit-PatchSet: 3
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: JJMC89 <JJMC89.Wikimedia(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/571984 )
Change subject: [bugfix] Return a single Coordinate with primary_only option
......................................................................
[bugfix] Return a single Coordinate with primary_only option
- if primary_only parameter is set in Page.coordinates()
return the first primary Coordinate object found in self._coords
or None if no primary Coordinate is found
- otherwise return a list of all Coordinates
- tests added
Bug: T244963
Change-Id: Iafac7561dff1bc7512c69db7a3a526a92642ef1f
---
M pywikibot/data/api.py
M pywikibot/page.py
M tests/page_tests.py
3 files changed, 34 insertions(+), 6 deletions(-)
Approvals:
JJMC89: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index a75b09e..477010d 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -3301,7 +3301,7 @@
name=co.get('name', ''),
dim=int(co.get('dim', 0)) or None,
globe=co['globe'], # See [[gerrit:67886]]
- primary=True if 'primary' in co else False
+ primary='primary' in co
)
coords.append(coord)
page._coords = coords
diff --git a/pywikibot/page.py b/pywikibot/page.py
index 1e6746a..c408295 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -1666,16 +1666,19 @@
Uses the MediaWiki extension GeoData.
@param primary_only: Only return the coordinate indicated to be primary
- @return: A list of Coordinate objects
- @rtype: list
+ @return: A list of Coordinate objects or a single Coordinate if
+ primary_only is True
+ @rtype: list of Coordinate or Coordinate or None
"""
if not hasattr(self, '_coords'):
self._coords = []
self.site.loadcoordinfo(self)
if primary_only:
- return [coord for coord in self._coords if coord.primary]
- else:
- return self._coords
+ for coord in self._coords:
+ if coord.primary:
+ return coord
+ return None
+ return list(self._coords)
@need_version('1.20')
def page_image(self):
diff --git a/tests/page_tests.py b/tests/page_tests.py
index ad86eaf..1acf918 100644
--- a/tests/page_tests.py
+++ b/tests/page_tests.py
@@ -612,6 +612,31 @@
mainpage.page_image)
+class TestPageCoordinates(TestCase):
+
+ """Test Page Object using German Wikipedia."""
+
+ family = 'wikipedia'
+ code = 'de'
+
+ cached = True
+
+ def test_coordinates(self):
+ """Test C{Page.coodinates} method."""
+ page = pywikibot.Page(self.site, 'Berlin')
+ with self.subTest(primary_only=False):
+ coords = page.coordinates()
+ self.assertIsInstance(coords, list)
+ for coord in coords:
+ self.assertIsInstance(coord, pywikibot.Coordinate)
+ self.assertIsInstance(coord.primary, bool)
+
+ with self.subTest(primary_only=True):
+ coord = page.coordinates(primary_only=True)
+ self.assertIsInstance(coord, pywikibot.Coordinate)
+ self.assertTrue(coord.primary)
+
+
class TestPageDeprecation(DefaultSiteTestCase, DeprecationTestCase):
"""Test deprecation of Page attributes."""
--
To view, visit https://gerrit.wikimedia.org/r/571984
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Iafac7561dff1bc7512c69db7a3a526a92642ef1f
Gerrit-Change-Number: 571984
Gerrit-PatchSet: 4
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: JJMC89 <JJMC89.Wikimedia(a)gmail.com>
Gerrit-Reviewer: Matěj Suchánek <matejsuchanek97(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)