jayvdb created this task.
Herald added subscribers: pywikibot-bugs-list, Aklapper.
TASK DESCRIPTION
`BaseSite.__init__` has some special logic to support single site families,
where it updates the global configuration variable "mylang" to the sites
declared 'code' for its only site.
This allows users to only specify `-family:mediawiki` without needing to also
specify `-lang:mediawiki` . However this breaks when the `-user` option is
also used. The global argument `-user` is handled in `bot.handle_args`, which
is before any BaseSite is initialised, so the incorrect lang code is used in
`bot.handle_args` to add the username, but then in login.py the lang has
changed so it doesnt find the stored and raises `NoUsername`.
e.g.
python pwb.py replace -family:mediawiki -user:JVbot -search:pywikipedia
pywikipedia pywikibot
WARNING: .../pywikibot/site.py:765: UserWarning: Global configuration
variable "mylang" changed to "mediawiki" while instantiating site
mediawiki:mediawiki
WARNING: .../pywikibot/pagegenerators.py:404: UserWarning: Site
mediawiki:mediawiki instantiated using different code "en"
self._site = pywikibot.Site()
The summary message for the command line replacements will be something
like: Bot: Automated text replacement (-pywikipedia +pywikibot)
Press Enter to use this automatic message, or enter a description of the
changes your bot will make:
Traceback (most recent call last):
File "pwb.py", line 256, in <module>
if not main():
File "pwb.py", line 250, in main
run_python_file(filename, [filename] + args, argvu, file_package)
File "pwb.py", line 121, in run_python_file
main_mod.__dict__)
File "./scripts/replace.py", line 1131, in <module>
main()
File "./scripts/replace.py", line 1121, in main
site.login()
File ".../pywikibot/site.py", line 2056, in login
user=self._username[sysop])
File ".../pywikibot/tools/__init__.py", line 1368, in wrapper
return obj(*__args, **__kw)
File ".../pywikibot/login.py", line 115, in __init__
'wiki_code': self.site.code})
pywikibot.exceptions.NoUsername: ERROR: Username for mediawiki:mediawiki is
undefined.
If you have an account for that site, please add a line to user-config.py:
usernames['mediawiki']['mediawiki'] = 'myUsername'
<class 'pywikibot.exceptions.NoUsername'>
CRITICAL: Closing network session.
Essentially, instantiating a class shouldnt change global configuration, as
it is unreliable (especially if used in a multi threaded app).
The same situation can be reliably without `-user:`:
1. Instantiate an APISite for wikipedia:en (mylang is now 'en')
2. Instantiate an APISite for commons (mylang is now 'commons'), but it could
be any single site family.
3. use config.family/config.mylang assuming it refers to the user preferred
site
Any usage of config.family/config.mylang in pywikibot core , except in
`pywikibot.Site`, should be audited to ensure it works correctly if
config.mylang is changed after the pywikibot bootstrap and 'bot'-strap.
TASK DETAIL
https://phabricator.wikimedia.org/T130570
EMAIL PREFERENCES
https://phabricator.wikimedia.org/settings/panel/emailpreferences/
To: jayvdb
Cc: Aklapper, jayvdb, pywikibot-bugs-list
_______________________________________________
pywikibot-bugs mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-bugs