• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 21552830208

31 Jan 2026 11:40PM UTC coverage: 80.277% (-0.05%) from 80.324%
21552830208

Pull #23062

github

web-flow
Merge 808a9786c into 2c4dcf9cf
Pull Request #23062: Remove support for Get

18 of 25 new or added lines in 4 files covered. (72.0%)

17119 existing lines in 541 files now uncovered.

78278 of 97510 relevant lines covered (80.28%)

3.36 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.19
/src/python/pants/engine/console.py
1
# Copyright 2018 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3
from __future__ import annotations
12✔
4

5
import sys
12✔
6
from collections.abc import Callable
12✔
7
from typing import TextIO
12✔
8

9
from colors import blue, cyan, green, magenta, red, yellow
12✔
10

11
from pants.engine.engine_aware import SideEffecting
12✔
12
from pants.engine.internals.scheduler import SchedulerSession
12✔
13

14

15
class Console(SideEffecting):
12✔
16
    """Class responsible for writing text to the console while Pants is running.
17

18
    A SchedulerSession should always be set in production usage, in order to track side effects, and
19
    tear down any running UI before stdio is rendered.
20
    """
21

22
    def __init__(
12✔
23
        self,
24
        stdin: TextIO | None = None,
25
        stdout: TextIO | None = None,
26
        stderr: TextIO | None = None,
27
        use_colors: bool = True,
28
        session: SchedulerSession | None = None,
29
    ):
30
        self._stdin = stdin or sys.stdin
12✔
31
        self._stdout = stdout or sys.stdout
12✔
32
        self._stderr = stderr or sys.stderr
12✔
33
        self._use_colors = use_colors
12✔
34
        self._session = session
12✔
35
        self._enforce_effects = self._session is not None
12✔
36

37
    @property
12✔
38
    def stdin(self) -> TextIO:
12✔
UNCOV
39
        if self._session:
1✔
40
            self.side_effected()
×
41
            self._session.teardown_dynamic_ui()
×
UNCOV
42
        return self._stdin
1✔
43

44
    @property
12✔
45
    def stdout(self) -> TextIO:
12✔
UNCOV
46
        if self._session:
4✔
47
            self.side_effected()
×
48
            self._session.teardown_dynamic_ui()
×
UNCOV
49
        return self._stdout
4✔
50

51
    @property
12✔
52
    def stderr(self) -> TextIO:
12✔
UNCOV
53
        if self._session:
3✔
54
            self.side_effected()
×
55
            self._session.teardown_dynamic_ui()
×
UNCOV
56
        return self._stderr
3✔
57

58
    def input(self, prompt: str | None = None) -> str:
12✔
59
        """Equivalent to the `input` builtin, but clears any running UI before rendering."""
UNCOV
60
        if prompt is not None:
1✔
UNCOV
61
            self.write_stdout(prompt)
1✔
UNCOV
62
        return self.stdin.readline().rstrip("\n")
1✔
63

64
    def write_stdout(self, payload: str) -> None:
12✔
UNCOV
65
        self.stdout.write(payload)
3✔
66

67
    def write_stderr(self, payload: str) -> None:
12✔
UNCOV
68
        self.stderr.write(payload)
3✔
69

70
    def print_stdout(self, payload: str, end: str = "\n") -> None:
12✔
UNCOV
71
        self.write_stdout(f"{payload}{end}")
2✔
72

73
    def print_stderr(self, payload: str, end: str = "\n") -> None:
12✔
UNCOV
74
        self.write_stderr(f"{payload}{end}")
3✔
75

76
    def flush(self) -> None:
12✔
77
        self._stdout.flush()
12✔
78
        self._stderr.flush()
12✔
79

80
    def sigil_succeeded(self) -> str:
12✔
81
        """Sigil for a successful item."""
UNCOV
82
        return self.green("✓")
3✔
83

84
    def sigil_succeeded_with_edits(self) -> str:
12✔
85
        """Sigil for a successful item which caused an edit to the workspace."""
86
        return self.yellow("+")
×
87

88
    def sigil_failed(self) -> str:
12✔
89
        """Sigil for a failed item."""
UNCOV
90
        return self.red("✕")
3✔
91

92
    def sigil_skipped(self) -> str:
12✔
93
        """Sigil for a skipped item."""
94
        return self.yellow("-")
×
95

96
    @property
12✔
97
    def use_colors(self):
12✔
98
        return self._use_colors
×
99

100
    def _safe_color(self, text: str, color: Callable[[str], str]) -> str:
12✔
101
        """We should only output color when the global flag --colors is enabled."""
UNCOV
102
        return color(text) if self._use_colors else text
3✔
103

104
    def blue(self, text: str) -> str:
12✔
105
        return self._safe_color(text, blue)
×
106

107
    def cyan(self, text: str) -> str:
12✔
108
        return self._safe_color(text, cyan)
×
109

110
    def green(self, text: str) -> str:
12✔
UNCOV
111
        return self._safe_color(text, green)
3✔
112

113
    def magenta(self, text: str) -> str:
12✔
114
        return self._safe_color(text, magenta)
×
115

116
    def red(self, text: str) -> str:
12✔
UNCOV
117
        return self._safe_color(text, red)
3✔
118

119
    def yellow(self, text: str) -> str:
12✔
120
        return self._safe_color(text, yellow)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc