Skip to content

Commit 4244b1a

Browse files
committed
[dmypy] add watch command
1 parent 7b4f631 commit 4244b1a

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

mypy/dmypy/client.py

+44-1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ def __init__(self, prog: str) -> None:
138138
)
139139
p.add_argument("--remove", metavar="FILE", nargs="*", help="Files to remove from the run")
140140

141+
142+
watch_parser = p = subparsers.add_parser("watch", help="Check on a set interval (requires daemon)")
143+
p.add_argument("--log-file", metavar="FILE", type=str, help="Direct daemon stdout/stderr to FILE")
144+
p.add_argument("files", metavar="FILE", nargs="+", help="File (or directory) to check")
145+
p.add_argument(
146+
"--interval", metavar="INTERVAL", default=1, type=int, help="Time between checks (in seconds)"
147+
)
148+
p.add_argument(
149+
"--export-types",
150+
action="store_true",
151+
help="Store types of all expressions in a shared location (useful for inspections)",
152+
)
153+
154+
141155
suggest_parser = p = subparsers.add_parser(
142156
"suggest", help="Suggest a signature or show call sites for a specific function"
143157
)
@@ -599,7 +613,7 @@ def show_stats(response: Mapping[str, object]) -> None:
599613
# Special case text output to display just 40 characters of text
600614
value = repr(value)[1:-1]
601615
if len(value) > 50:
602-
value = f"{value[:40]} ... {len(value)-40} more characters"
616+
value = f"{value[:40]} ... {len(value) - 40} more characters"
603617
print("%-24s: %s" % (key, value))
604618
continue
605619
print("%-24s: %10s" % (key, "%.3f" % value if isinstance(value, float) else value))
@@ -611,6 +625,35 @@ def do_hang(args: argparse.Namespace) -> None:
611625
print(request(args.status_file, "hang", timeout=1))
612626

613627

628+
@action(watch_parser)
629+
def do_watch(args: argparse.Namespace) -> None:
630+
"""Recheck the same set of files every few seconds"""
631+
response = request(args.status_file, "check", files=args.files, export_types=args.export_types)
632+
os.system("cls" if os.name == "nt" else "clear")
633+
previous_output = response["out"]
634+
previous_err = response["err"]
635+
sys.stdout.write(previous_output)
636+
sys.stdout.flush()
637+
sys.stderr.write(previous_err)
638+
sys.stderr.flush()
639+
while True:
640+
try:
641+
time.sleep(args.interval)
642+
response = request(args.status_file, "recheck", export_types=args.export_types)
643+
output = response["out"]
644+
err = response["err"]
645+
if output != previous_output or err != previous_err:
646+
os.system("cls" if os.name == "nt" else "clear")
647+
sys.stdout.write(output)
648+
sys.stdout.flush()
649+
sys.stderr.write(err)
650+
sys.stderr.flush()
651+
previous_output = output
652+
previous_err = err
653+
except KeyboardInterrupt:
654+
break
655+
656+
614657
@action(daemon_parser)
615658
def do_daemon(args: argparse.Namespace) -> None:
616659
"""Serve requests in the foreground."""

0 commit comments

Comments
 (0)