From c18393e5df5e9d788b31fe610d55445855a4a1ae Mon Sep 17 00:00:00 2001 From: Tal Einat <532281+taleinat@users.noreply.github.com> Date: Fri, 13 May 2022 22:47:43 +0300 Subject: [PATCH] support setting output verbosity This changes the internal use of echo to use a logger instead of sys.stdout.write. This uses the stdlib logging library, with the common convention of logger = logging.getLogger(__name__), so that all watchdog logs are under the "watchdog" logging context. Finally, this adds -q/--quiet and -v/--verbose command line options to watchmedo. --- src/watchdog/tricks/__init__.py | 16 +++++++++++----- src/watchdog/watchmedo.py | 32 +++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/watchdog/tricks/__init__.py b/src/watchdog/tricks/__init__.py index 300d3597..e15f970c 100644 --- a/src/watchdog/tricks/__init__.py +++ b/src/watchdog/tricks/__init__.py @@ -41,6 +41,8 @@ """ +import functools +import logging import os import signal import subprocess @@ -50,6 +52,10 @@ from watchdog.events import PatternMatchingEventHandler +logger = logging.getLogger(__name__) +echo_events = functools.partial(echo.echo, write=lambda msg: logger.info(msg)) + + class Trick(PatternMatchingEventHandler): """Your tricks should subclass this class.""" @@ -80,19 +86,19 @@ class LoggerTrick(Trick): def on_any_event(self, event): pass - @echo.echo + @echo_events def on_modified(self, event): pass - @echo.echo + @echo_events def on_deleted(self, event): pass - @echo.echo + @echo_events def on_created(self, event): pass - @echo.echo + @echo_events def on_moved(self, event): pass @@ -202,7 +208,7 @@ def kill_process(stop_signal): pass self.process = None - @echo.echo + @echo_events def on_any_event(self, event): self.stop() self.start() diff --git a/src/watchdog/watchmedo.py b/src/watchdog/watchmedo.py index f610268e..9510a129 100755 --- a/src/watchdog/watchmedo.py +++ b/src/watchdog/watchmedo.py @@ -60,7 +60,8 @@ def _split_lines(self, text, width): return text.splitlines() -epilog = '''Copyright 2011 Yesudeep Mangalapilly . +epilog = '''\ +Copyright 2011 Yesudeep Mangalapilly . Copyright 2012 Google, Inc & contributors. Licensed under the terms of the Apache license, version 2.0. Please see @@ -69,6 +70,7 @@ def _split_lines(self, text, width): cli = ArgumentParser(epilog=epilog, formatter_class=HelpFormatter) cli.add_argument('--version', action='version', version=VERSION_STRING) subparsers = cli.add_subparsers(dest='top_command') +command_parsers = {} def argument(*name_or_flags, **kwargs): @@ -94,6 +96,11 @@ def decorator(func): description=desc, aliases=cmd_aliases, formatter_class=HelpFormatter) + verbosity_group = parser.add_mutually_exclusive_group() + verbosity_group.add_argument('-q', '--quiet', dest='verbosity', + action='append_const', const=-1) + verbosity_group.add_argument('-v', '--verbose', dest='verbosity', + action='append_const', const=1) for arg in args: parser.add_argument(*arg[0], **arg[1]) parser.set_defaults(func=func) @@ -397,7 +404,8 @@ def log(args): from watchdog.tricks import LoggerTrick if args.trace: - echo.echo_class(LoggerTrick) + class_module_logger = logging.getLogger(LoggerTrick.__module__) + echo.echo_class(LoggerTrick, write=lambda msg: class_module_logger.info(msg)) patterns, ignore_patterns =\ parse_patterns(args.patterns, args.ignore_patterns) @@ -637,9 +645,23 @@ def main(): args = cli.parse_args() if args.command is None: cli.print_help() - else: - args.func(args) + return 1 + + verbosity = sum(args.verbosity) + if verbosity < -1: + print("Error: -q/--quiet may be specified only once.", file=sys.stderr) + command_parsers[args.top_command].print_help() + return 1 + if verbosity > 2: + print("Error: -v/--verbose may be specified up to 2 times.", file=sys.stderr) + command_parsers[args.top_command].print_help() + return 1 + log_level = ['ERROR', 'WARNING', 'INFO', 'DEBUG'][1 + verbosity] + logging.getLogger('watchdog').setLevel(log_level) + + args.func(args) + return 0 if __name__ == '__main__': - main() + sys.exit(main())