jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/761391 )
Change subject: [cleanup] Drop timestamp as since parameter in deprecation warnings
......................................................................
[cleanup] Drop timestamp as since parameter in deprecation warnings
- deprecation warnings only accepts release numbers
- change all remaining timestamps to version numbers
Change-Id: I85644fae7864d284b6f908d891d6fc83694302e4
---
M pywikibot/config.py
M pywikibot/exceptions.py
M pywikibot/page/__init__.py
M pywikibot/page/_revision.py
M pywikibot/pagegenerators.py
M pywikibot/site/_apisite.py
M pywikibot/tools/_deprecate.py
M scripts/solve_disambiguation.py
8 files changed, 64 insertions(+), 78 deletions(-)
Approvals:
D3r1ck01: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/config.py b/pywikibot/config.py
index 09c185f..6600e28 100644
--- a/pywikibot/config.py
+++ b/pywikibot/config.py
@@ -385,7 +385,7 @@
family_files = {}
-@deprecated('family_files[family_name] = file_path', since='20210305')
+@deprecated('family_files[family_name] = file_path', since='6.0.0')
def register_family_file(family_name: str, file_path: str) -> None:
"""Register a single family class file.
diff --git a/pywikibot/exceptions.py b/pywikibot/exceptions.py
index 211c6c1..de97765 100644
--- a/pywikibot/exceptions.py
+++ b/pywikibot/exceptions.py
@@ -162,7 +162,7 @@
removed.
"""
#
-# (C) Pywikibot team, 2008-2021
+# (C) Pywikibot team, 2008-2022
#
# Distributed under the terms of the MIT license.
#
@@ -303,7 +303,7 @@
elif re.search(r'%\(\w+\)s', self.message):
issue_deprecation_warning("'%' style messages are deprecated, "
'please use str.format() style instead',
- since='20210504')
+ since='6.2.0')
msg = self.message % self.__dict__
elif '%s' in self.message:
msg = self.message % page
diff --git a/pywikibot/page/__init__.py b/pywikibot/page/__init__.py
index afe7df4..91a74d2 100644
--- a/pywikibot/page/__init__.py
+++ b/pywikibot/page/__init__.py
@@ -1035,7 +1035,7 @@
"""
return self.site.page_can_be_edited(self, action)
- @deprecated("Page.has_permission('edit')", since='20200208')
+ @deprecated("Page.has_permission('edit')", since='3.0.20200508')
def canBeEdited(self): # pragma: no cover
"""DEPRECATED. Determine whether the page may be edited."""
return self.has_permission()
@@ -2391,7 +2391,7 @@
url_param=url_param)
return self.latest_file_info.thumburl
- @deprecated('file_is_shared', since='20200618')
+ @deprecated('file_is_shared', since='3.0.20200703')
def fileIsShared(self) -> bool: # pragma: no cover
"""DEPRECATED. Check if the image is stored on Wikimedia Commons."""
return self.file_is_shared()
diff --git a/pywikibot/page/_revision.py b/pywikibot/page/_revision.py
index ab0056a..fcdc140 100644
--- a/pywikibot/page/_revision.py
+++ b/pywikibot/page/_revision.py
@@ -1,6 +1,6 @@
"""Object representing page revision."""
#
-# (C) Pywikibot team, 2008-2021
+# (C) Pywikibot team, 2008-2022
#
# Distributed under the terms of the MIT license.
#
@@ -103,7 +103,7 @@
.format(self.__class__.__name__, key))
@property
- @deprecated('parentid property', since='20200802')
+ @deprecated('parentid property', since='4.0.0')
def parent_id(self) -> int:
"""DEPRECATED. Return id of parent/previous revision.
@@ -115,7 +115,7 @@
return self.parentid
@property
- @deprecated('contentmodel', since='20200802')
+ @deprecated('contentmodel', since='4.0.0')
def content_model(self) -> str:
"""DEPRECATED. Return content model of the revision.
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index 53e6c6d..0190518 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -1446,7 +1446,7 @@
return gen
-@deprecated('File.usingPages()', since='20200515')
+@deprecated('File.usingPages()', since='3.0.20200609')
def FileLinksGenerator(referredFilePage: 'pywikibot.page.FilePage',
total: Optional[int] = None,
content: bool = False
@@ -1456,7 +1456,7 @@
content=content) # pragma: no cover
-@deprecated('Page.imagelinks()', since='20200515')
+@deprecated('Page.imagelinks()', since='3.0.20200609')
def ImagesPageGenerator(pageWithImages: 'pywikibot.page.Page',
total: Optional[int] = None,
content: bool = False
@@ -1535,7 +1535,7 @@
yield s
-@deprecated('Page.linkedPages()', since='20200515')
+@deprecated('Page.linkedPages()', since='3.0.20200609')
def LinkedPageGenerator(linkingPage: 'pywikibot.page.Page',
total: Optional[int] = None,
content: bool = False
@@ -1630,7 +1630,7 @@
yield pywikibot.Page(pywikibot.Link(title, site))
-@deprecated('site.load_pages_from_pageids()', since='20200515')
+@deprecated('site.load_pages_from_pageids()', since='3.0.20200609')
def PagesFromPageidGenerator(pageids: Iterable[str],
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2319,7 +2319,7 @@
yield page
-@deprecated('Site.unusedfiles()', since='20200515')
+@deprecated('Site.unusedfiles()', since='3.0.20200609')
def UnusedFilesGenerator(total: Optional[int] = None, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.FilePage']:
@@ -2334,7 +2334,7 @@
return site.unusedfiles(total=total)
-@deprecated('Site.withoutinterwiki()', since='20200515')
+@deprecated('Site.withoutinterwiki()', since='3.0.20200609')
def WithoutInterwikiPageGenerator(total: Optional[int] = None,
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2349,7 +2349,7 @@
return site.withoutinterwiki(total=total)
-@deprecated('Site.uncategorizedcategories()', since='20200515')
+@deprecated('Site.uncategorizedcategories()', since='3.0.20200609')
def UnCategorizedCategoryGenerator(total: Optional[int] = 100,
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.Category']:
@@ -2364,7 +2364,7 @@
return site.uncategorizedcategories(total=total)
-@deprecated('Site.uncategorizedimages()', since='20200515')
+@deprecated('Site.uncategorizedimages()', since='3.0.20200609')
def UnCategorizedImageGenerator(total: int = 100, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.FilePage']:
@@ -2379,7 +2379,7 @@
return site.uncategorizedimages(total=total)
-@deprecated('Site.uncategorizedpages()', since='20200515')
+@deprecated('Site.uncategorizedpages()', since='3.0.20200609')
def UnCategorizedPageGenerator(total: int = 100, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2394,7 +2394,7 @@
return site.uncategorizedpages(total=total)
-@deprecated('Site.uncategorizedtemplates()', since='20200515')
+@deprecated('Site.uncategorizedtemplates()', since='3.0.20200609')
def UnCategorizedTemplateGenerator(total: int = 100, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2409,7 +2409,7 @@
return site.uncategorizedtemplates(total=total)
-@deprecated('Site.lonelypages()', since='20200515')
+@deprecated('Site.lonelypages()', since='3.0.20200609')
def LonelyPagesPageGenerator(total: Optional[int] = None, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2424,7 +2424,7 @@
return site.lonelypages(total=total)
-@deprecated('Site.unwatchedpages()', since='20200515')
+@deprecated('Site.unwatchedpages()', since='3.0.20200609')
def UnwatchedPagesPageGenerator(total: Optional[int] = None,
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2439,7 +2439,7 @@
return site.unwatchedpages(total=total)
-@deprecated('Site.pages_with_property()', since='20200515')
+@deprecated('Site.pages_with_property()', since='3.0.20200609')
def page_with_property_generator(name: str, # pragma: no cover
total: Optional[int] = None,
site: OPT_SITE_TYPE = None
@@ -2470,7 +2470,7 @@
return (page for page, _ in site.ancientpages(total=total))
-@deprecated('Site.deadendpages()', since='20200515')
+@deprecated('Site.deadendpages()', since='3.0.20200609')
def DeadendPagesPageGenerator(total: int = 100, # pragma: no cover
site: OPT_SITE_TYPE = None
) -> Iterable['pywikibot.page.Page']:
@@ -2513,7 +2513,7 @@
return (page for page, _ in site.shortpages(total=total))
-@deprecated('Site.randompages()', since='20200515')
+@deprecated('Site.randompages()', since='3.0.20200609')
def RandomPageGenerator(total: Optional[int] = None, # pragma: no cover
site: OPT_SITE_TYPE = None,
namespaces: Optional[
@@ -2530,7 +2530,7 @@
return site.randompages(total=total, namespaces=namespaces)
-@deprecated('Site.randompages()', since='20200515')
+@deprecated('Site.randompages()', since='3.0.20200609')
def RandomRedirectPageGenerator(total: Optional[int] = None,
site: OPT_SITE_TYPE = None,
namespaces: Optional[
@@ -2548,7 +2548,7 @@
redirects=True)
-@deprecated('Site.exturlusage()', since='20200515')
+@deprecated('Site.exturlusage()', since='3.0.20200609')
def LinksearchPageGenerator(url: str,
namespaces: Optional[List[int]] = None,
total: Optional[int] = None,
@@ -2572,7 +2572,7 @@
total=total, content=False)
-@deprecated('Site.search()', since='20200515')
+@deprecated('Site.search()', since='3.0.20200609')
def SearchPageGenerator(query: str, # pragma: no cover
total: Optional[int] = None,
namespaces: Optional[
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index cc8518a..305dc01 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -904,7 +904,7 @@
# return the magic word without the preceding '#' character
return self.getmagicwords('redirect')[0].lstrip('#')
- @deprecated('redirect_regex', since='20210103')
+ @deprecated('redirect_regex', since='5.5.0')
def redirectRegex(self): # noqa: N802
"""Return a compiled regular expression matching on redirect pages."""
return self.redirect_regex
diff --git a/pywikibot/tools/_deprecate.py b/pywikibot/tools/_deprecate.py
index 1c874af..cc36618 100644
--- a/pywikibot/tools/_deprecate.py
+++ b/pywikibot/tools/_deprecate.py
@@ -16,10 +16,10 @@
a deprecator without any arguments.
.. versionchanged:: 6.4
- deprecation decorators moved to _deprecate module
+ deprecation decorators moved to _deprecate submodule
"""
#
-# (C) Pywikibot team, 2008-2021
+# (C) Pywikibot team, 2008-2022
#
# Distributed under the terms of the MIT license.
#
@@ -29,7 +29,6 @@
import sys
import types
from contextlib import suppress
-from datetime import datetime
from importlib import import_module
from inspect import getfullargspec
from typing import Any, Optional
@@ -164,59 +163,41 @@
return outer_wrapper
-def _build_msg_string(instead, since):
+def _build_msg_string(instead: str, since: str) -> str:
"""Build a deprecation warning message format string.
.. versionadded:: 3.0
+
+ .. versionchanged:: 7.0
+ `since`parameter must be a release number, not a timestamp.
+
+ :param instead: suggested replacement for the deprecated object
+ :param since: a version string string when the method was deprecated
"""
- if not since:
- since = ''
- elif '.' in since:
- since = ' since release ' + since
- else:
- year_str = month_str = day_str = ''
- days = (datetime.utcnow() - datetime.strptime(since, '%Y%m%d')).days
- years = days // 365
- days = days % 365
- months = days // 30
- days = days % 30
- if years == 1:
- years = 0
- months += 12
- if years:
- year_str = '{} years'.format(years)
- else:
- day_str = '{} day{}'.format(days, 's' if days != 1 else '')
- if months:
- month_str = '{} month{}'.format(
- months, 's' if months != 1 else '')
- if year_str and month_str:
- year_str += ' and '
- if month_str and day_str:
- month_str += ' and '
- since = ' for {}{}{}'.format(year_str, month_str, day_str)
+ if since and '.' not in since:
+ raise ValueError('{} is not a valid release number'.format(since))
+
if instead:
msg = '{{0}} is deprecated{since}; use {{1}} instead.'
else:
msg = '{{0}} is deprecated{since}.'
- return msg.format(since=since)
+ return msg.format(since=' since release ' + since if since else '')
-def issue_deprecation_warning(name: str, instead=None, depth=2,
- warning_class=None, since=None):
+def issue_deprecation_warning(name: str, instead: str = '', depth: int = 2,
+ warning_class=None, since: str = ''):
"""Issue a deprecation warning.
+ .. versionchanged:: 7.0
+ `since` parameter must be a release number, not a timestamp.
+
:param name: the name of the deprecated object
:param instead: suggested replacement for the deprecated object
- :type instead: str or None
:param depth: depth + 1 will be used as stacklevel for the warnings
- :type depth: int
:param warning_class: a warning class (category) to be used, defaults to
FutureWarning
:type warning_class: type
- :param since: a timestamp string of the date when the method was
- deprecated (form 'YYYYMMDD') or a version string.
- :type since: str or None
+ :param since: a version string string when the method was deprecated
"""
msg = _build_msg_string(instead, since)
if warning_class is None:
@@ -229,10 +210,12 @@
def deprecated(*args, **kwargs):
"""Decorator to output a deprecation warning.
+ .. versionchanged:: 7.0
+ `since` keyword must be a release number, not a timestamp.
+
:keyword instead: if provided, will be used to specify the replacement
:type instead: str
- :keyword since: a timestamp string of the date when the method was
- deprecated (form 'YYYYMMDD') or a version string.
+ :keyword since: a version string string when the method was deprecated
:type since: str
:keyword future_warning: if True a FutureWarning will be thrown,
otherwise it provides a DeprecationWarning
@@ -298,7 +281,7 @@
return wrapper
- since = kwargs.pop('since', None)
+ since = kwargs.pop('since', '')
future_warning = kwargs.pop('future_warning', True)
without_parameters = len(args) == 1 and not kwargs and callable(args[0])
if 'instead' in kwargs:
@@ -509,14 +492,17 @@
target_module: Optional[str] = None,
old_name: Optional[str] = None,
class_name: Optional[str] = None,
- since: Optional[str] = None,
- future_warning=True):
+ since: str = '',
+ future_warning: bool = True):
"""
Return a function which can be used to redirect to 'target'.
It also acts like marking that function deprecated and copies all
parameters.
+ .. versionchanged:: 7.0
+ `since`parameter must be a release number, not a timestamp.
+
:param target: The targeted function which is to be executed.
:type target: callable
:param source_module: The module of the old function. If '.' defaults
@@ -529,11 +515,9 @@
new function.
:param class_name: The name of the class. It's added to the target and
source module (separated by a '.').
- :param since: a timestamp string of the date when the method was
- deprecated (form 'YYYYMMDD') or a version string.
+ :param since: a version string string when the method was deprecated
:param future_warning: if True a FutureWarning will be thrown,
otherwise it provides a DeprecationWarning
- :type future_warning: bool
:return: A new function which adds a warning prior to each execution.
:rtype: callable
"""
@@ -590,11 +574,14 @@
def add_deprecated_attr(self, name: str, replacement: Any = None, *,
replacement_name: Optional[str] = None,
warning_message: Optional[str] = None,
- since: Optional[str] = None,
+ since: str = '',
future_warning: bool = True):
"""
Add the name to the local deprecated names dict.
+ .. versionchanged:: 7.0
+ `since`parameter must be a release number, not a timestamp.
+
:param name: The name of the deprecated class or variable. It may not
be already deprecated.
:param replacement: The replacement value which should be returned
@@ -606,8 +593,7 @@
object name, and evaluated when the deprecated object is needed.
:param warning_message: The warning to display, with positional
variables: {0} = module, {1} = attribute name, {2} = replacement.
- :param since: a timestamp string of the date when the method was
- deprecated (form 'YYYYMMDD') or a version string.
+ :param since: a version string string when the method was deprecated
:param future_warning: if True a FutureWarning will be thrown,
otherwise it provides a DeprecationWarning
"""
diff --git a/scripts/solve_disambiguation.py b/scripts/solve_disambiguation.py
index 88abc43..81d59a6 100755
--- a/scripts/solve_disambiguation.py
+++ b/scripts/solve_disambiguation.py
@@ -665,7 +665,7 @@
issue_deprecation_warning(
'Positional argument {} ({})'.format(i + 1, arg),
'keyword argument "{}={}"'.format(key, arg),
- since='20210303')
+ since='6.0.0')
if key in kwargs:
pywikibot.warning('{!r} is given as keyword argument {!r} '
'already; ignoring {!r}'
@@ -679,7 +679,7 @@
newkey = keymap[key]
issue_deprecation_warning(
'{!r} argument of {}'.format(key, self.__class__.__name__),
- repr(newkey), since='20210303')
+ repr(newkey), since='6.0.0')
kwargs[newkey] = kwargs.pop(key)
# Expand available_options
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/761391
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I85644fae7864d284b6f908d891d6fc83694302e4
Gerrit-Change-Number: 761391
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: D3r1ck01 <xsavitar.wiki(a)aol.com>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
Huji has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/761111 )
Change subject: [bugfix] detect range blocks with Page.is_blocked()
......................................................................
[bugfix] detect range blocks with Page.is_blocked()
Bug: T301282
Change-Id: I135d7bc492bc5347041aaab8edeb830b6b5b0d8f
---
M pywikibot/page/__init__.py
1 file changed, 3 insertions(+), 2 deletions(-)
Approvals:
Huji: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/page/__init__.py b/pywikibot/page/__init__.py
index 3c5aca7..afe7df4 100644
--- a/pywikibot/page/__init__.py
+++ b/pywikibot/page/__init__.py
@@ -2919,7 +2919,7 @@
if not hasattr(self, '_userprops'):
self._userprops = list(self.site.users([self.username, ]))[0]
if self.isAnonymous():
- r = list(self.site.blocks(users=self.username))
+ r = list(self.site.blocks(iprange=self.username, total=1))
if r:
self._userprops['blockedby'] = r[0]['by']
self._userprops['blockreason'] = r[0]['reason']
@@ -2954,7 +2954,8 @@
"""Determine whether the user is currently blocked.
.. versionchanged:: 7.0
- renamed from :meth:`isBlocked` method
+ renamed from :meth:`isBlocked` method,
+ can also detect range blocks.
:param force: if True, forces reloading the data from API
"""
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/761111
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I135d7bc492bc5347041aaab8edeb830b6b5b0d8f
Gerrit-Change-Number: 761111
Gerrit-PatchSet: 3
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/760636 )
Change subject: [doc] update ROADMAP.rst, HISTORY.rst and CHANGELOG.md
......................................................................
[doc] update ROADMAP.rst, HISTORY.rst and CHANGELOG.md
Change-Id: I57582291053dc89273b6dd6379fec121a689f4b8
---
M HISTORY.rst
M ROADMAP.rst
M scripts/CHANGELOG.md
3 files changed, 13 insertions(+), 1 deletion(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/HISTORY.rst b/HISTORY.rst
index 953d749..4c4b7f8 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,6 +1,13 @@
Release history
^^^^^^^^^^^^^^^
+6.6.5
+-----
+*07 February 2022*
+
+* L10N updates
+
+
6.6.4
-----
*27 January 2022*
@@ -872,7 +879,6 @@
* Use API's retry-after value (T144023)
* Provide startprefix parameter for Category.articles() (T74101, T143120)
* Page.put_async() is marked as deprecated (T193494)
-* pagegenerators.RepeatingGenerator is marked as deprecated (T192229)
* Deprecate requests-requirements.txt (T193476)
* Bugfixes and improvements
* New mediawiki projects were provided
diff --git a/ROADMAP.rst b/ROADMAP.rst
index c3ed0ea..cbd48ab 100644
--- a/ROADMAP.rst
+++ b/ROADMAP.rst
@@ -4,6 +4,9 @@
Improvements
------------
+* to_latin_digits() function was added to textlib as counterpart of to_local_digits() function
+* api.Request.submit now handles search-title-disabled and search-text-disabled API Errors
+* A show_diff parameter was added to Page.put() and Page.change_category()
* Allow categories when saving IndexPage (T299806)
* Add a new function case_escape to textlib
* Support inheritance of the __STATICREDIRECT__
@@ -69,6 +72,8 @@
Code cleanups
-------------
+* BaseBot.stop() method were removed in favour of BaseBot.generator.close()
+* showHelp() function was remove in favour of show_help
* Remove AllpagesPageGenerator, UnconnectedPageGenerator, CombinedPageGenerator, WantedPagesPageGenerator pagegenerators
* Remove deprecated echo.Notification.id
* Remove APISite.newfiles() method (T168339)
diff --git a/scripts/CHANGELOG.md b/scripts/CHANGELOG.md
index a5bd8a2..a77684a 100644
--- a/scripts/CHANGELOG.md
+++ b/scripts/CHANGELOG.md
@@ -18,6 +18,7 @@
* Derive CheckerBot from CurrentPageBot (T196851, T171713)
### category
+* CleanBot was added which can be invoked by clean action option
* Recurse CategoryListifyRobot with depth
* Show a warning if a pagegenerator option is not enabled (T298522)
* Deprecated code parts were removed
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/760636
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I57582291053dc89273b6dd6379fec121a689f4b8
Gerrit-Change-Number: 760636
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: D3r1ck01 <xsavitar.wiki(a)aol.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged