Xqt has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/692283 )
Change subject: Revert "[test] Test flushing ui and redefining TerminalHandler for T282962" ......................................................................
Revert "[test] Test flushing ui and redefining TerminalHandler for T282962"
This reverts commit d8cc11de8d8da9a174572534a02c79d08e7270d0.
Revert "[test] Test flushing ui for T282962"
This reverts commit 8b1725204d0886f45def183deea1d5a5c583a743.
Change-Id: I74dc7a14aaa710d57ea602a94b605e6bd5cd3f95 --- M pywikibot/userinterfaces/terminal_interface_base.py M tests/__init__.py M tests/ui_tests.py 3 files changed, 112 insertions(+), 110 deletions(-)
Approvals: jenkins-bot: Verified Xqt: Looks good to me, approved
diff --git a/pywikibot/userinterfaces/terminal_interface_base.py b/pywikibot/userinterfaces/terminal_interface_base.py index c21295f..9db7fc3 100755 --- a/pywikibot/userinterfaces/terminal_interface_base.py +++ b/pywikibot/userinterfaces/terminal_interface_base.py @@ -97,7 +97,7 @@ default_stream = self.stderr
# default handler for display to terminal - default_handler = TerminalHandler(self, stream=default_stream) + default_handler = TerminalHandler(self, strm=default_stream) if config.verbose_output: default_handler.setLevel(VERBOSE) else: @@ -105,22 +105,22 @@ # this handler ignores levels above INPUT default_handler.addFilter(MaxLevelFilter(INPUT)) default_handler.setFormatter( - logging.Formatter(fmt='%(message)s%(newline)s')) + TerminalFormatter(fmt='%(message)s%(newline)s')) root_logger.addHandler(default_handler)
# handler for level STDOUT - output_handler = TerminalHandler(self, stream=self.stdout) + output_handler = TerminalHandler(self, strm=self.stdout) output_handler.setLevel(STDOUT) output_handler.addFilter(MaxLevelFilter(STDOUT)) output_handler.setFormatter( - logging.Formatter(fmt='%(message)s%(newline)s')) + TerminalFormatter(fmt='%(message)s%(newline)s')) root_logger.addHandler(output_handler)
# handler for levels WARNING and higher - warning_handler = TerminalHandler(self, stream=self.stderr) + warning_handler = TerminalHandler(self, strm=self.stderr) warning_handler.setLevel(WARNING) warning_handler.setFormatter( - logging.Formatter(fmt='%(levelname)s: %(message)s%(newline)s')) + TerminalFormatter(fmt='%(levelname)s: %(message)s%(newline)s')) root_logger.addHandler(warning_handler)
warnings_logger = logging.getLogger('py.warnings') @@ -494,7 +494,7 @@ return list(self.argv)
-class TerminalHandler(logging.StreamHandler): +class TerminalHandler(logging.Handler):
"""A handler class that writes logging records to a terminal.
@@ -509,19 +509,26 @@ # create a class-level lock that can be shared by all instances sharedlock = threading.RLock()
- def __init__(self, UI, stream=None): - """Initializer.""" - super().__init__(stream=stream) + def __init__(self, UI, strm=None): + """Initialize the handler. + + If strm is not specified, sys.stderr is used. + + """ + super().__init__() # replace Handler's instance-specific lock with the shared class lock # to ensure that only one instance of this handler can write to # the console at a time self.lock = TerminalHandler.sharedlock + if strm is None: + strm = sys.stderr + self.stream = strm + self.formatter = None self.UI = UI
def flush(self): """Flush the stream.""" - super().flush() - self.UI.flush() + self.stream.flush()
def emit(self, record): """Emit the record formatted to the output and return it.""" @@ -534,10 +541,14 @@ record.__dict__.setdefault('newline', '\n')
text = self.format(record) - self.flush() return self.UI.output(text, targetStream=self.stream)
+class TerminalFormatter(logging.Formatter): + + """Terminal logging formatter.""" + + class MaxLevelFilter(logging.Filter):
"""Filter that only passes records at or below a specific level. diff --git a/tests/__init__.py b/tests/__init__.py index cae36d79..ebac252 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -74,98 +74,97 @@ _pwb_py = join_root_path('pwb.py')
library_test_modules = { -## 'api', -## 'basesite', -## 'bot', -## 'category', -## 'collections', -## 'cosmetic_changes', -## 'date', -## 'datasite', -## 'deprecation', -## 'diff', -## 'djvu', -## 'dry_api', -## 'dry_site', -## 'echo', -## 'edit', -## 'edit_failure', -## 'eventstreams', -## 'family', -## 'file', -## 'fixes', -## 'flow', -## 'flow_edit', -## 'flow_thanks', -## 'http', -## 'i18n', -## 'interwiki_graph', -## 'interwiki_link', -## 'interwikimap', -## 'link', -## 'linter', -## 'logentries', -## 'login', -## 'mediawikiversion', -## 'mysql', -## 'namespace', -## 'oauth', -## 'page', -## 'pagegenerators', -## 'paraminfo', -## 'plural', -## 'proofreadpage', -## 'site', -## 'site_decorators', -## 'site_detect', -## 'siteinfo', -## 'sparql', -## 'tests', -## 'textlib', -## 'thanks', -## 'thread', -## 'timestamp', -## 'timestripper', -## 'tk', -## 'token', -## 'tools', -## 'tools_chars', -## 'tools_formatter', + 'api', + 'basesite', + 'bot', + 'category', + 'collections', + 'cosmetic_changes', + 'date', + 'datasite', + 'deprecation', + 'diff', + 'djvu', + 'dry_api', + 'dry_site', + 'echo', + 'edit', + 'edit_failure', + 'eventstreams', + 'family', + 'file', + 'fixes', + 'flow', + 'flow_edit', + 'flow_thanks', + 'http', + 'i18n', + 'interwiki_graph', + 'interwiki_link', + 'interwikimap', + 'link', + 'linter', + 'logentries', + 'login', + 'mediawikiversion', + 'mysql', + 'namespace', + 'oauth', + 'page', + 'pagegenerators', + 'paraminfo', + 'plural', + 'proofreadpage', + 'site', + 'site_decorators', + 'site_detect', + 'siteinfo', + 'sparql', + 'tests', + 'textlib', + 'thanks', + 'thread', + 'timestamp', + 'timestripper', + 'tk', + 'token', + 'tools', + 'tools_chars', + 'tools_formatter', 'ui', -## 'ui_options', -## 'upload', -## 'uploadbot', -## 'user', -## 'wikibase', -## 'wikibase_edit', -## 'wikistats', -## 'xmlreader' + 'ui_options', + 'upload', + 'uploadbot', + 'user', + 'wikibase', + 'wikibase_edit', + 'wikistats', + 'xmlreader' }
-script_test_modules = set() - -## 'add_text', -## 'archivebot', -## 'cache', -## 'category_bot', -## 'checkimages', -## 'deletionbot', -## 'fixing_redirects', -## 'generate_family_file', -## 'generate_user_files', -## 'interwikidata', -## 'l10n', -## 'patrolbot', -## 'protectbot', -## 'pwb', -## 'redirect_bot', -## 'reflinks', -## 'replacebot', -## 'script', -## 'template_bot', -## 'uploadscript', -## 'weblinkchecker' -##} +script_test_modules = { + 'add_text', + 'archivebot', + 'cache', + 'category_bot', + 'checkimages', + 'deletionbot', + 'fixing_redirects', + 'generate_family_file', + 'generate_user_files', + 'interwikidata', + 'l10n', + 'patrolbot', + 'protectbot', + 'pwb', + 'redirect_bot', + 'reflinks', + 'replacebot', + 'script', + 'template_bot', + 'uploadscript', + 'weblinkchecker' +}
disabled_test_modules = { 'tests', # tests of the tests package diff --git a/tests/ui_tests.py b/tests/ui_tests.py index ce56b14..4f5e610 100644 --- a/tests/ui_tests.py +++ b/tests/ui_tests.py @@ -154,43 +154,36 @@
def test_output(self): pywikibot.output('output') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), 'output\n')
def test_stdout(self): pywikibot.stdout('output') - ui.flush() self.assertEqual(newstdout.getvalue(), 'output\n') self.assertEqual(newstderr.getvalue(), '')
def test_warning(self): pywikibot.warning('warning') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), 'WARNING: warning\n')
def test_error(self): pywikibot.error('error') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), 'ERROR: error\n')
def test_log(self): pywikibot.log('log') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), '')
def test_critical(self): pywikibot.critical('critical') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), 'CRITICAL: critical\n')
def test_debug(self): pywikibot.debug('debug', 'test') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), '')
@@ -203,7 +196,6 @@ raise TestException('Testing Exception') except TestException: pywikibot.exception('exception') - ui.flush() self.assertEqual(newstdout.getvalue(), '') self.assertEqual(newstderr.getvalue(), 'ERROR: TestException: Testing Exception\n')