Source code for almanac.completion.page_path_completer

from pathlib import PurePosixPath
from typing import Iterable

from prompt_toolkit.completion import CompleteEvent, Completer
from prompt_toolkit.completion.base import Completion
from prompt_toolkit.document import Document

from ..context import current_app
from ..errors import BasePageError
from ..parsing import last_incomplete_token_from_document


[docs]class PagePathCompleter(Completer): """A completer for paths to an application's pages."""
[docs] def get_completions( self, document: Document, complete_event: CompleteEvent ) -> Iterable[Completion]: app = current_app() last_token = last_incomplete_token_from_document(document) typed_path = last_token.value if typed_path.endswith('/'): complete_from_dir = typed_path stem = '' else: posix_path = PurePosixPath(typed_path) complete_from_dir = str(posix_path.parent) stem = posix_path.stem try: page = app.page_navigator[complete_from_dir] except BasePageError: return for child_page in page.children: candidate_page_name = child_page.path.segments[-1] if candidate_page_name.startswith(stem): yield Completion(candidate_page_name, start_position=-len(stem))