-
Notifications
You must be signed in to change notification settings - Fork 94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tui 1.0 #5731
Tui 1.0 #5731
Changes from all commits
571b27f
b175218
6f3f170
7b2058c
de23766
c303aa9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Major upgrade to `cylc tui` which now supports larger workflows and can browse installed workflows. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,34 +15,35 @@ | |
# You should have received a copy of the GNU General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
"""cylc tui WORKFLOW | ||
"""cylc tui [WORKFLOW] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you give a workflow, tui will startup, pre-filtered to just that workflow. Press "E" to unset this filtering an view all workflows. |
||
|
||
View and control running workflows in the terminal. | ||
|
||
(Tui = Terminal User Interface) | ||
|
||
WARNING: Tui is experimental and may break with large flows. | ||
An upcoming change to the way Tui receives data from the scheduler will make it | ||
much more efficient in the future. | ||
Tui allows you to monitor and interact with workflows in a manner similar | ||
to the GUI. | ||
|
||
Press "h" whilst running Tui to bring up the help screen, use the arrow | ||
keys to navigage. | ||
|
||
""" | ||
# TODO: remove this warning once Tui is delta-driven | ||
# https://github.com/cylc/cylc-flow/issues/3527 | ||
|
||
from getpass import getuser | ||
from textwrap import indent | ||
from typing import TYPE_CHECKING | ||
from urwid import html_fragment | ||
from typing import TYPE_CHECKING, Optional | ||
|
||
from cylc.flow.id import Tokens | ||
from cylc.flow.id_cli import parse_id | ||
from cylc.flow.option_parsers import ( | ||
WORKFLOW_ID_ARG_DOC, | ||
OPT_WORKFLOW_ID_ARG_DOC, | ||
CylcOptionParser as COP, | ||
) | ||
from cylc.flow.terminal import cli_function | ||
from cylc.flow.tui import TUI | ||
from cylc.flow.tui.util import suppress_logging | ||
from cylc.flow.tui.app import ( | ||
TuiApp, | ||
TREE_EXPAND_DEPTH | ||
# ^ a nasty solution | ||
) | ||
|
||
if TYPE_CHECKING: | ||
|
@@ -55,57 +56,25 @@ | |
def get_option_parser() -> COP: | ||
parser = COP( | ||
__doc__, | ||
argdoc=[WORKFLOW_ID_ARG_DOC], | ||
argdoc=[OPT_WORKFLOW_ID_ARG_DOC], | ||
# auto_add=False, NOTE: at present auto_add can not be turned off | ||
color=False | ||
) | ||
|
||
parser.add_option( | ||
'--display', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed the HTML testing mode from the Tui script as this is now handled by an integration test fixture. |
||
help=( | ||
'Specify the display technology to use.' | ||
' "raw" for interactive in-terminal display.' | ||
' "html" for non-interactive html output.' | ||
), | ||
action='store', | ||
choices=['raw', 'html'], | ||
default='raw', | ||
) | ||
parser.add_option( | ||
'--v-term-size', | ||
help=( | ||
'The virtual terminal size for non-interactive' | ||
'--display options.' | ||
), | ||
action='store', | ||
default='80,24' | ||
) | ||
|
||
return parser | ||
|
||
|
||
@cli_function(get_option_parser) | ||
def main(_, options: 'Values', workflow_id: str) -> None: | ||
workflow_id, *_ = parse_id( | ||
workflow_id, | ||
constraint='workflows', | ||
) | ||
screen = None | ||
if options.display == 'html': | ||
TREE_EXPAND_DEPTH[0] = -1 # expand tree fully | ||
screen = html_fragment.HtmlGenerator() | ||
screen.set_terminal_properties(256) | ||
screen.register_palette(TuiApp.palette) | ||
html_fragment.screenshot_init( | ||
[tuple(map(int, options.v_term_size.split(',')))], | ||
[] | ||
def main(_, options: 'Values', workflow_id: Optional[str] = None) -> None: | ||
# get workflow ID if specified | ||
if workflow_id: | ||
workflow_id, *_ = parse_id( | ||
workflow_id, | ||
constraint='workflows', | ||
) | ||
tokens = Tokens(workflow_id) | ||
workflow_id = tokens.duplicate(user=getuser()).id | ||
|
||
try: | ||
TuiApp(workflow_id, screen=screen).main() | ||
|
||
if options.display == 'html': | ||
for fragment in html_fragment.screenshot_collect(): | ||
print(fragment) | ||
except KeyboardInterrupt: | ||
# start Tui | ||
with suppress_logging(), TuiApp().main(workflow_id): | ||
pass |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unrelated, spotted during testing.
The
.get
here wasn't protecting against anything as the default return value ofNone
would cause the['name']
bit to error anyway.