Xqt has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1310022?usp=email )
Change subject: mypy: Fix typing errors in login.py ......................................................................
mypy: Fix typing errors in login.py
Change-Id: Id9f259c9f2f8de8edb62a7433cf3591b9a826902 --- M .pre-commit-config.yaml M conftest.py M pywikibot/login.py 3 files changed, 23 insertions(+), 16 deletions(-)
Approvals: Xqt: Verified; Looks good to me, approved
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e58af9..a9e7439 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -124,7 +124,7 @@ # They should be also used in conftest.py to exclude them from non-voting mypy test. files: |- (?x)^pywikibot/( - (__metadata__|backports|config|cosmetic_changes|daemonize|diff|echo|exceptions|fixes|logging|plural|time|titletranslate)| + (__metadata__|backports|config|cosmetic_changes|daemonize|diff|echo|exceptions|fixes|logging|login|plural|time|titletranslate)| (comms|data|families|specialbots)/__init__| comms/eventstreams| data/(api/(__init__|_generators|_optionset)|citoid|memento|wikistats)| diff --git a/conftest.py b/conftest.py index 7693fa1..780fb5a 100644 --- a/conftest.py +++ b/conftest.py @@ -38,7 +38,7 @@ EXCLUDE_PATTERN = re.compile( r'(?:' r'(__metadata__|backports|config|cosmetic_changes|daemonize|diff|echo|' - r'exceptions|fixes|logging|plural|time|titletranslate)|' + r'exceptions|fixes|logging|login|plural|time|titletranslate)|' r'(comms|data|families|specialbots)/__init__|' r'comms/eventstreams|' r'data/(api/(__init__|_generators|_optionset)|citoid|memento|wikistats)|' diff --git a/pywikibot/login.py b/pywikibot/login.py index 5a856cd..9ae59f6 100644 --- a/pywikibot/login.py +++ b/pywikibot/login.py @@ -14,7 +14,7 @@ from enum import IntEnum from pathlib import Path from textwrap import fill -from typing import Any +from typing import Any, cast from warnings import warn
import pywikibot @@ -98,7 +98,8 @@ :raises pywikibot.exceptions.NoUsernameError: No username is configured for the requested site. """ - site = self.site = site or pywikibot.Site() + site = cast(pywikibot.site.APISite, site or pywikibot.Site()) + if not user: config_names = config.usernames
@@ -114,8 +115,11 @@ f"usernames['{site.family.name}']['{site.code}'] =" " 'myUsername'" ) + self.password = password self.login_name = self.username = user + self.site = site + if getattr(config, 'password_file', ''): self.readPassword()
@@ -371,6 +375,8 @@ - https://www.mediawiki.org/wiki/Extension:EmailAuth """
+ _waituntil: datetime.datetime + # API login parameters mapping mapping = { 'user': ('lgname', 'username'), @@ -387,18 +393,14 @@ """Get API keyword from mapping.""" return self.mapping[key][self.action != 'login']
- def _login_parameters(self, *, botpassword: bool = False - ) -> dict[str, str]: + def _login_parameters(self, user: str, password: str) -> dict[str, str]: """Return login parameters.""" - if botpassword: - self.action = 'login' - else: - self.action = 'clientlogin' - + botpassword = '@' in user or '@' in password + self.action = 'login' if botpassword else 'clientlogin' # prepare default login parameters parameters = {'action': self.action, - self.keyword('user'): self.login_name, - self.keyword('password'): self.password} + self.keyword('user'): user, + self.keyword('password'): password}
if self.action == 'login': parameters['lgtoken'] = self.site.tokens['login'] @@ -424,9 +426,12 @@ 2FA login was implemented. .. version-changed:: 10.2 Secondary authentication via email was implemented. + .. version-changed:: 11.6 + Raise RuntimeError if login name or password were not set.
:raises RuntimeError: Unexpected API login response key or - unexpected API login requests response + unexpected API login requests response, or login name or + password were not set. :raises APIError: API login error """ if hasattr(self, '_waituntil') \ @@ -438,12 +443,14 @@
self.site._loginstatus = LoginStatus.IN_PROGRESS
+ if self.login_name is None or self.password is None: + raise RuntimeError("'login_name' or 'password' were not set") + # Bot passwords username contains @, # otherwise @ is not allowed in usernames. # @ in bot password is deprecated, # but we don't want to break bots using it. - parameters = self._login_parameters( - botpassword='@' in self.login_name or '@' in self.password) + parameters = self._login_parameters(self.login_name, self.password)
# base login request login_request = self.site._request(use_get=False,
pywikibot-commits@lists.wikimedia.org