Xqt has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1200448?usp=email )

Change subject: cleanup: remove removeprefix and removesuffix from packports
......................................................................

cleanup: remove removeprefix and removesuffix from packports

use PEP 616 string methods introduced with Python 3.9 instead.

Bug: T401802
Change-Id: If19269a8ee914d9e825ec93ea2b13c81d63e107f
---
M pywikibot/__init__.py
M pywikibot/backports.py
M pywikibot/config.py
M pywikibot/data/api/_requests.py
M pywikibot/data/sparql.py
M pywikibot/family.py
M pywikibot/i18n.py
M pywikibot/pagegenerators/_factory.py
M pywikibot/site/_apisite.py
M pywikibot/site_detect.py
M pywikibot/userinterfaces/terminal_interface_base.py
M scripts/claimit.py
M scripts/delinker.py
M scripts/patrol.py
M scripts/reflinks.py
M scripts/weblinkchecker.py
M tests/__init__.py
M tests/aspects.py
18 files changed, 37 insertions(+), 96 deletions(-)

Approvals:
  Xqt: Verified; Looks good to me, approved




diff --git a/pywikibot/__init__.py b/pywikibot/__init__.py
index 9b35fde..a69dfb8 100644
--- a/pywikibot/__init__.py
+++ b/pywikibot/__init__.py
@@ -30,7 +30,7 @@
     WbTime,
     WbUnknown,
 )
-from pywikibot.backports import Callable, cache, removesuffix
+from pywikibot.backports import Callable, cache
 from pywikibot.bot import (
     Bot,
     CurrentPageBot,
@@ -111,8 +111,7 @@

     if not matched_sites:
         if not name:  # create a name from url
-            name = urlparse(url).netloc.split('.')[-2]
-            name = removesuffix(name, 'wiki')
+            name = urlparse(url).netloc.split('.')[-2].removesuffix('wiki')
         family = AutoFamily(name, url)
         matched_sites.append((family.code, family))

diff --git a/pywikibot/backports.py b/pywikibot/backports.py
index ca4d3c6..c15df77 100644
--- a/pywikibot/backports.py
+++ b/pywikibot/backports.py
@@ -81,47 +81,6 @@
 else:
     from collections.abc import Callable

-
-# PEP 616 string methods
-if PYTHON_VERSION < (3, 9) or SPHINX_RUNNING:
-    def removeprefix(string: str, prefix: str) -> str:  # skipcq: TYP-053
-        """Remove prefix from a string or return a copy otherwise.
-
-        >>> removeprefix('TestHook', 'Test')
-        'Hook'
-        >>> removeprefix('BaseTestCase', 'Test')
-        'BaseTestCase'
-
-        .. seealso:: :python:`str.removeprefix
-           <library/stdtypes.html#str.removeprefix>`,
-           backported from Python 3.9.
-        .. versionadded:: 5.4
-        """
-        if string.startswith(prefix):
-            return string[len(prefix):]
-        return string
-
-    def removesuffix(string: str, suffix: str) -> str:  # skipcq: TYP-053
-        """Remove suffix from a string or return a copy otherwise.
-
-        >>> removesuffix('MiscTests', 'Tests')
-        'Misc'
-        >>> removesuffix('TmpDirMixin', 'Tests')
-        'TmpDirMixin'
-
-        .. seealso:: :python:`str.removesuffix
-           <library/stdtypes.html#str.removesuffix>`,
-           backported from Python 3.9.
-        .. versionadded:: 5.4
-        """
-        if string.endswith(suffix):
-            return string[:-len(suffix)]
-        return string
-else:
-    removeprefix = str.removeprefix  # type: ignore[assignment]
-    removesuffix = str.removesuffix  # type: ignore[assignment]
-
-
 if PYTHON_VERSION < (3, 10) or SPHINX_RUNNING:
     from itertools import tee

diff --git a/pywikibot/config.py b/pywikibot/config.py
index ced631c..18ea53c 100644
--- a/pywikibot/config.py
+++ b/pywikibot/config.py
@@ -56,12 +56,7 @@
 from zipfile import ZipFile, is_zipfile

 from pywikibot.__metadata__ import __version__ as pwb_version
-from pywikibot.backports import (
-    DefaultDict,
-    Mapping,
-    removeprefix,
-    removesuffix,
-)
+from pywikibot.backports import DefaultDict, Mapping
 from pywikibot.logging import error, info, warning


@@ -338,7 +333,7 @@
     base_dir = ''
     for arg in sys.argv[1:]:
         if arg.startswith('-dir:'):
-            base_dir = removeprefix(arg, '-dir:')
+            base_dir = arg.removeprefix('-dir:')
             base_dir = os.path.expanduser(base_dir)
             break
     else:
@@ -440,7 +435,7 @@
     if os.path.isdir(folder_path):
         for file_name in os.listdir(folder_path):
             if file_name.endswith(suffix):
-                family_name = removesuffix(file_name, suffix)
+                family_name = file_name.removesuffix(suffix)
                 family_files[family_name] = os.path.join(folder_path,
                                                          file_name)
         return
@@ -462,7 +457,7 @@
     for file_name in zip_file.namelist():
         if file_name.endswith(suffix):
             file_path = Path(file_name)
-            family_name = removesuffix(file_path.name, suffix)
+            family_name = file_path.name.removesuffix(suffix)
             family_files[family_name] = os.path.join(folder_path,
                                                      file_path.name)

diff --git a/pywikibot/data/api/_requests.py b/pywikibot/data/api/_requests.py
index 5fd6e11..26ed60a 100644
--- a/pywikibot/data/api/_requests.py
+++ b/pywikibot/data/api/_requests.py
@@ -25,7 +25,7 @@

 import pywikibot
 from pywikibot import config
-from pywikibot.backports import Callable, Match, removeprefix
+from pywikibot.backports import Callable, Match
 from pywikibot.comms import http
 from pywikibot.data import WaitingMixin
 from pywikibot.exceptions import (
@@ -945,7 +945,7 @@
             return False

         # T154011
-        class_name = code if code == 'readonly' else removeprefix(code, iae)
+        class_name = code if code == 'readonly' else code.removeprefix(iae)

         del error['code']  # is added via class_name
         e = pywikibot.exceptions.APIMWError(class_name, **error)
diff --git a/pywikibot/data/sparql.py b/pywikibot/data/sparql.py
index ca5042d..ea06b32 100644
--- a/pywikibot/data/sparql.py
+++ b/pywikibot/data/sparql.py
@@ -14,7 +14,7 @@
 from requests.exceptions import Timeout

 from pywikibot import Site
-from pywikibot.backports import Dict, removeprefix
+from pywikibot.backports import Dict
 from pywikibot.comms import http
 from pywikibot.data import WaitingMixin
 from pywikibot.exceptions import Error, NoUsernameError, ServerError
@@ -239,7 +239,8 @@
         :return: ID of Wikibase object, e.g. Q1234
         """
         if self.value.startswith(self.entity_url):
-            return removeprefix(self.value, self.entity_url)
+            return self.value.removeprefix(self.entity_url)
+
         return None

     def __repr__(self) -> str:
diff --git a/pywikibot/family.py b/pywikibot/family.py
index 390e8b0..c3cdef6 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -22,7 +22,7 @@

 import pywikibot
 from pywikibot import config
-from pywikibot.backports import DefaultDict, Mapping, Sequence, removesuffix
+from pywikibot.backports import DefaultDict, Mapping, Sequence
 from pywikibot.data import wikistats
 from pywikibot.exceptions import FamilyMaintenanceWarning, UnknownFamilyError
 from pywikibot.tools import classproperty, deprecated
@@ -1195,7 +1195,7 @@
     def scriptpath(self, code):
         """Extract the script path from the URL."""
         if self.url.path.endswith('/api.php'):
-            return removesuffix(self.url.path, '/api.php')
+            return self.url.path.removesuffix('/api.php')

         # AutoFamily refers to the variable set below, not the function
         # but the reference must be given here
diff --git a/pywikibot/i18n.py b/pywikibot/i18n.py
index 62d5b27..d92f3b2 100644
--- a/pywikibot/i18n.py
+++ b/pywikibot/i18n.py
@@ -41,7 +41,6 @@
     Match,
     Sequence,
     cache,
-    removesuffix,
 )
 from pywikibot.plural import plural_rule

@@ -878,7 +877,7 @@
     pathname = os.path.join(next(iter(mod.__path__)), package)

     # build a list of languages in that directory
-    langs = [removesuffix(filename, '.json')
+    langs = [filename.removesuffix('.json')
              for filename in sorted(os.listdir(pathname))
              if filename.endswith('.json')]

diff --git a/pywikibot/pagegenerators/_factory.py 
b/pywikibot/pagegenerators/_factory.py
index ba4c648..3ba9460 100644
--- a/pywikibot/pagegenerators/_factory.py
+++ b/pywikibot/pagegenerators/_factory.py
@@ -16,7 +16,7 @@

 import pywikibot
 from pywikibot import i18n
-from pywikibot.backports import Callable, Iterable, Sequence, removeprefix
+from pywikibot.backports import Callable, Iterable, Sequence
 from pywikibot.bot import ShowingListOption
 from pywikibot.data import api
 from pywikibot.exceptions import (
@@ -636,7 +636,7 @@
             value = pywikibot.input('What namespace are you filtering on?')
         not_key = 'not:'
         if value.startswith(not_key):
-            value = removeprefix(value, not_key)
+            value = value.removeprefix(not_key)
             resolve = self.site.namespaces.resolve
             not_ns = set(resolve(value.split(',')))
             if not self._namespaces:
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index a796814..9c0f525 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -20,7 +20,6 @@
 from pywikibot import login
 from pywikibot.backports import DefaultDict, Iterable, Match
 from pywikibot.backports import OrderedDict as OrderedDictType
-from pywikibot.backports import removesuffix
 from pywikibot.comms import http
 from pywikibot.data import api
 from pywikibot.exceptions import (
@@ -228,7 +227,7 @@
                     if m_site['dbname'] == dbname:
                         # extract site from dbname
                         family = m_site['code']
-                        code = removesuffix(dbname, family).replace('_', '-')
+                        code = dbname.removesuffix(family).replace('_', '-')
                         if family == 'wiki':
                             family = 'wikipedia'
                         return pywikibot.Site(code, family)
@@ -1772,7 +1771,7 @@

         user_tokens = {}
         if data.get('tokens'):
-            user_tokens = {removesuffix(key, 'token'): val
+            user_tokens = {key.removesuffix('token'): val
                            for key, val in data['tokens'].items()
                            if val != '+\\'}

diff --git a/pywikibot/site_detect.py b/pywikibot/site_detect.py
index 95b6ddb..97f59d3 100644
--- a/pywikibot/site_detect.py
+++ b/pywikibot/site_detect.py
@@ -1,6 +1,6 @@
 """Classes for detecting a MediaWiki site."""
 #
-# (C) Pywikibot team, 2010-2024
+# (C) Pywikibot team, 2010-2025
 #
 # Distributed under the terms of the MIT license.
 #
@@ -17,7 +17,6 @@
 from requests.exceptions import RequestException

 import pywikibot
-from pywikibot.backports import removesuffix
 from pywikibot.comms.http import fetch
 from pywikibot.exceptions import ClientError, ServerError
 from pywikibot.tools import MediaWikiVersion
@@ -42,7 +41,7 @@
         :raises RuntimeError: Version not found or version less than
             1.31
         """
-        fromurl = removesuffix(fromurl, '$1')
+        fromurl = fromurl.removesuffix('$1')

         r = fetch(fromurl, **kwargs)
         check_response(r)
diff --git a/pywikibot/userinterfaces/terminal_interface_base.py 
b/pywikibot/userinterfaces/terminal_interface_base.py
index 6c4c8e3..ba9d4c6 100644
--- a/pywikibot/userinterfaces/terminal_interface_base.py
+++ b/pywikibot/userinterfaces/terminal_interface_base.py
@@ -15,13 +15,7 @@

 import pywikibot
 from pywikibot import config
-from pywikibot.backports import (
-    Iterable,
-    RLock,
-    Sequence,
-    batched,
-    removeprefix,
-)
+from pywikibot.backports import Iterable, RLock, Sequence, batched
 from pywikibot.bot_choice import (
     ChoiceException,
     Option,
@@ -505,7 +499,7 @@
                         if force:
                             raise ValueError(
                                 f'{default!r} is not a valid Option for '
-                                f'{removeprefix(output, question).lstrip()}')
+                                f'{output.removeprefix(question).lstrip()}')

         if isinstance(answer, ChoiceException):
             raise answer
diff --git a/scripts/claimit.py b/scripts/claimit.py
index ebfe875..2ed502f 100755
--- a/scripts/claimit.py
+++ b/scripts/claimit.py
@@ -44,7 +44,7 @@
 but 'p' must be included.
 """
 #
-# (C) Pywikibot team, 2013-2024
+# (C) Pywikibot team, 2013-2025
 #
 # Distributed under the terms of the MIT license.
 #
@@ -52,7 +52,7 @@

 import pywikibot
 from pywikibot import WikidataBot, pagegenerators
-from pywikibot.backports import batched, removeprefix
+from pywikibot.backports import batched


 # This is required for the text that is shown when you run this script
@@ -114,7 +114,7 @@
     for arg in local_args:
         # Handle args specifying how to handle duplicate claims
         if arg.startswith('-exists:'):
-            exists_arg = removeprefix(arg, '-exists:')
+            exists_arg = arg.removeprefix('-exists:')
             continue
         # Handle page generator args
         if gen.handle_arg(arg):
diff --git a/scripts/delinker.py b/scripts/delinker.py
index 73ae0f3..9357bee 100755
--- a/scripts/delinker.py
+++ b/scripts/delinker.py
@@ -36,7 +36,7 @@
    *-category* option was added.
 """
 #
-# (C) Pywikibot team, 2006-2024
+# (C) Pywikibot team, 2006-2025
 #
 # Distributed under the terms of the MIT license.
 #
@@ -48,7 +48,6 @@
 from difflib import get_close_matches

 import pywikibot
-from pywikibot.backports import removeprefix
 from pywikibot.bot import (
     AutomaticTWSummaryBot,
     ConfigParserBot,
@@ -232,7 +231,7 @@
     local_args = pywikibot.handle_args()
     for arg in local_args:
         opt, _, value = arg.partition(':')
-        opt = removeprefix(opt, '-')
+        opt = opt.removeprefix('-')
         if opt == 'localonly':
             options[opt] = True
         elif opt == 'category':
diff --git a/scripts/patrol.py b/scripts/patrol.py
index 05f000a..1e76518 100755
--- a/scripts/patrol.py
+++ b/scripts/patrol.py
@@ -40,7 +40,7 @@
 -usercontribs      Filter generators above to the given user
 """
 #
-# (C) Pywikibot team, 2011-2024
+# (C) Pywikibot team, 2011-2025
 #
 # Distributed under the terms of the MIT license.
 #
@@ -54,7 +54,7 @@

 import pywikibot
 from pywikibot import pagegenerators
-from pywikibot.backports import Container, removeprefix
+from pywikibot.backports import Container
 from pywikibot.bot import BaseBot, suggest_help
 from pywikibot.site import Namespace

@@ -269,7 +269,7 @@
             author_ns = self.site.family.authornamespaces[self.site.lang][0]

         author_ns_prefix = self.site.namespace(author_ns) + ':'
-        author_page_name = removeprefix(title, author_ns_prefix)
+        author_page_name = title.removeprefix(author_ns_prefix)
         if title != author_page_name:
             verbose_output('Found author ' + author_page_name)
             return True
diff --git a/scripts/reflinks.py b/scripts/reflinks.py
index b851e79..4395f01 100755
--- a/scripts/reflinks.py
+++ b/scripts/reflinks.py
@@ -45,7 +45,7 @@

 &params;
 """
-# (C) Pywikibot team, 2008-2024
+# (C) Pywikibot team, 2008-2025
 #
 # Distributed under the terms of the MIT license.
 #
@@ -66,7 +66,6 @@

 import pywikibot
 from pywikibot import comms, config, i18n, pagegenerators, textlib
-from pywikibot.backports import removeprefix
 from pywikibot.bot import ConfigParserBot, ExistingPageBot, SingleSiteBot
 from pywikibot.comms.http import get_charset_from_content_type
 from pywikibot.exceptions import ServerError
@@ -369,7 +368,7 @@
         # Find used autogenerated numbers
         used_numbers = set()
         for name in found_ref_names:
-            number = removeprefix(name, self.autogen)
+            number = name.removeprefix(self.autogen)
             with suppress(ValueError):
                 used_numbers.add(int(number))

diff --git a/scripts/weblinkchecker.py b/scripts/weblinkchecker.py
index 4da1a67..1b8d2c8 100755
--- a/scripts/weblinkchecker.py
+++ b/scripts/weblinkchecker.py
@@ -122,7 +122,6 @@

 import pywikibot
 from pywikibot import comms, config, i18n, pagegenerators, textlib
-from pywikibot.backports import removeprefix
 from pywikibot.bot import ExistingPageBot, SingleSiteBot, suggest_help
 from pywikibot.exceptions import (
     IsRedirectPageError,
@@ -568,7 +567,7 @@
                 # use hostname as thread.name
                 hostname = urlparse.urlparse(url).hostname
                 if hostname is not None:
-                    thread.name = removeprefix(hostname, 'www.')
+                    thread.name = hostname.removeprefix('www.')
                 self.threads.append(thread)

     def teardown(self) -> None:
diff --git a/tests/__init__.py b/tests/__init__.py
index dca5690..f223aed 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -30,7 +30,6 @@

 import pywikibot.data.api
 from pywikibot import config
-from pywikibot.backports import removesuffix
 from pywikibot.data.api import CachedRequest
 from pywikibot.data.api import Request as _original_Request

@@ -180,7 +179,7 @@
 def _unknown_test_modules():
     """List tests which are to be executed."""
     dir_list = os.listdir(join_tests_path())
-    all_test_set = {removesuffix(name, '_tests.py') for name in dir_list
+    all_test_set = {name.removesuffix('_tests.py') for name in dir_list
                     if name.endswith('_tests.py')
                     and not name.startswith('_')}  # skip __init__.py and _*

diff --git a/tests/aspects.py b/tests/aspects.py
index 34a6ea1..0f38749 100644
--- a/tests/aspects.py
+++ b/tests/aspects.py
@@ -27,7 +27,7 @@

 import pywikibot
 from pywikibot import Site, config
-from pywikibot.backports import Iterable, Iterator, removeprefix, removesuffix
+from pywikibot.backports import Iterable, Iterator
 from pywikibot.comms import http
 from pywikibot.data.api import Request as _original_Request
 from pywikibot.exceptions import (
@@ -859,7 +859,7 @@
             # sitedata['family'] may be an AutoFamily. Use str() for its name
             sitename = str(sitedata['family']) + ':' + sitedata['code']
             if func.__doc__:
-                wrapped_method.__doc__ = removesuffix(func.__doc__, '.')
+                wrapped_method.__doc__ = func.__doc__.removesuffix('.')
                 wrapped_method.__doc__ += ' on ' + sitename
             else:
                 wrapped_method.__doc__ = 'Test ' + sitename  # pragma: no cover
@@ -1185,7 +1185,7 @@
             return self._mainpage

         maintitle = site.siteinfo['mainpage']
-        maintitle = removeprefix(maintitle, 'Special:MyLanguage/')  # T278702
+        maintitle = maintitle.removeprefix('Special:MyLanguage/')  # T278702
         mainpage = pywikibot.Page(site, maintitle)
         if not isinstance(site, DrySite) and mainpage.isRedirectPage():
             mainpage = mainpage.getRedirectTarget()  # pragma: no cover

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1200448?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: If19269a8ee914d9e825ec93ea2b13c81d63e107f
Gerrit-Change-Number: 1200448
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to