diff --git a/DEVELOP.md b/DEVELOP.md index adea668..d58d7dc 100644 --- a/DEVELOP.md +++ b/DEVELOP.md @@ -8,7 +8,7 @@ Run tests pytest -Run tests with watch +Run tests with pytest watcher ptw diff --git a/ask/ask.py b/ask/ask.py index 4a9b0af..b6c2cf6 100644 --- a/ask/ask.py +++ b/ask/ask.py @@ -6,9 +6,9 @@ from prompt_toolkit.patch_stdout import patch_stdout from .config import default_parse_args, load_config -from .handler import InputHandler -from .input import AbstractInputter, InputInterrupt, PromptInputter -from .prompt import get_prompt +from .pre_processor import PromptPreProcessor +from .prompt_generator import generate_prompt +from .prompter import AbstractPrompter, InputInterrupt, UserPrompter from .renderer import AbstractRenderer, RichRenderer from .services.anthropic import AnthropicService from .services.bot_service import BotService @@ -18,7 +18,7 @@ def run( - inputter: AbstractInputter = PromptInputter(), + inputter: AbstractPrompter = UserPrompter(), Service: Optional[type[BotService]] = None, Renderer: type[AbstractRenderer] = RichRenderer, parse_args=default_parse_args, @@ -41,11 +41,11 @@ def signal_handler(sig: int, frame: Optional[object]) -> None: config = load_config(parse_args, config_file_name) renderer = Renderer(pretty_markdown=config.markdown) - input_handler = InputHandler(renderer=renderer) + input_handler = PromptPreProcessor(renderer=renderer) file_input = False - prompt, file_input = get_prompt(config.inputs, config.template) + prompt, file_input = generate_prompt(config.inputs, config.template) if config.dry: renderer.print_line("Prompt : ") diff --git a/ask/handler.py b/ask/pre_processor.py similarity index 78% rename from ask/handler.py rename to ask/pre_processor.py index 251dea4..46b0512 100644 --- a/ask/handler.py +++ b/ask/pre_processor.py @@ -5,7 +5,7 @@ from .save import save -class InputHandlerResponse: +class PromptPreProcessorResponse: def __init__(self, ignore=False, process=True, quit=False) -> None: self._ignore = ignore self._process = process @@ -27,24 +27,24 @@ def __str__(self) -> str: return f"ignore:{self._ignore}, process:{self._process}, quit:{self._quit}" -class InputHandler: +class PromptPreProcessor: def __init__(self, renderer: AbstractRenderer) -> None: self.renderer = renderer def handle( self, input: str, previous_response_text: Optional[str] - ) -> InputHandlerResponse: + ) -> PromptPreProcessorResponse: input_lower = input.lower() if input_lower == "save": save(previous_response_text) - return InputHandlerResponse(process=False) + return PromptPreProcessorResponse(process=False) if previous_response_text and ( ("copy code" in input_lower and len(input) < 17) or ("copy" in input_lower and len(input) < 7) ): copy_code(self.renderer, previous_response_text) - return InputHandlerResponse(process=False) + return PromptPreProcessorResponse(process=False) # The handling for is currently only used within end to end # tests and may be removed. @@ -53,9 +53,9 @@ def handle( or input_lower.endswith("") or input_lower.startswith("") ): - return InputHandlerResponse(quit=True) + return PromptPreProcessorResponse(quit=True) if input_lower.endswith("ignore"): - return InputHandlerResponse(process=False, ignore=True) + return PromptPreProcessorResponse(process=False, ignore=True) - return InputHandlerResponse() + return PromptPreProcessorResponse() diff --git a/ask/prompt.py b/ask/prompt_generator.py similarity index 94% rename from ask/prompt.py rename to ask/prompt_generator.py index 44975a5..6c03bd6 100644 --- a/ask/prompt.py +++ b/ask/prompt_generator.py @@ -7,7 +7,7 @@ ASK_PROMPT_DIRECTORY_NAME = "ASK_PROMPT_DIRECTORY" -def get_prompt(inputs: List[str], template: Optional[str]) -> Tuple[str, bool]: +def generate_prompt(inputs: List[str], template: Optional[str]) -> Tuple[str, bool]: parts = [] file_input = False for word in inputs: diff --git a/ask/input.py b/ask/prompter.py similarity index 97% rename from ask/input.py rename to ask/prompter.py index 75b9903..4e1118b 100644 --- a/ask/input.py +++ b/ask/prompter.py @@ -16,7 +16,7 @@ class InputInterrupt(KeyboardInterrupt): prompt_fragments: AnyFormattedText = [("class:marker", "(-_-) ")] -class AbstractInputter: +class AbstractPrompter: @abstractmethod def get_input(self) -> str: pass @@ -37,7 +37,7 @@ def is_running(self) -> bool: return True -class PromptInputter(AbstractInputter): +class UserPrompter(AbstractPrompter): def __init__(self) -> None: self.prompt_session: PromptSession = PromptSession( prompt_fragments, style=style, vi_mode=True diff --git a/ask/tests/e2e_utils.py b/ask/tests/e2e_utils.py index cc9238b..d96b383 100644 --- a/ask/tests/e2e_utils.py +++ b/ask/tests/e2e_utils.py @@ -1,11 +1,11 @@ import argparse from collections import deque -from ..input import AbstractInputter, InputInterrupt +from ..prompter import AbstractPrompter, InputInterrupt from ..renderer import AbstractRenderer -class MockInputter(AbstractInputter): +class MockInputter(AbstractPrompter): def __init__(self, inputs=["mock input 1"]) -> None: self.queue = deque(inputs) diff --git a/ask/tests/test_prompt.py b/ask/tests/test_prompt.py index dff81ff..ccd001a 100644 --- a/ask/tests/test_prompt.py +++ b/ask/tests/test_prompt.py @@ -1,34 +1,34 @@ import os -from ..prompt import get_prompt +from ..prompt_generator import generate_prompt TESTS_DIRECTORY = os.path.dirname(__file__) -def test_get_prompt_with_words(): +def test_generate_prompt_with_words(): inputs = ["hello", "world"] - assert get_prompt(inputs, None) == ("hello world", False) + assert generate_prompt(inputs, None) == ("hello world", False) -def test_get_prompt_with_text_file(): +def test_generate_prompt_with_text_file(): inputs = [f"{TESTS_DIRECTORY}/test.md"] - assert get_prompt(inputs, None) == ( + assert generate_prompt(inputs, None) == ( "# Test\n\nThis is a test file\n", True, ) -def test_get_prompt_with_pdf_file(): +def test_generate_prompt_with_pdf_file(): inputs = [f"{TESTS_DIRECTORY}/test.pdf"] - assert get_prompt(inputs, None) == ( + assert generate_prompt(inputs, None) == ( "test\n Test\nThis is a test file", True, ) -def test_get_prompt_with_template(): +def test_generate_prompt_with_template(): inputs = ["fish", "cat"] - assert get_prompt(inputs, f"{TESTS_DIRECTORY}/prompt.txt") == ( + assert generate_prompt(inputs, f"{TESTS_DIRECTORY}/prompt.txt") == ( "one fish two cat\n", False, ) diff --git a/ask/tests/transcribe_prompt_inputter.py b/ask/tests/transcribe_prompt_inputter.py index 1009d3b..2bc9f0a 100644 --- a/ask/tests/transcribe_prompt_inputter.py +++ b/ask/tests/transcribe_prompt_inputter.py @@ -3,11 +3,11 @@ from prompt_toolkit import PromptSession -from ..input import AbstractInputter, InputInterrupt +from ..prompter import AbstractPrompter, InputInterrupt from ..transcribe import is_running -class TranscribePromptInputter(AbstractInputter): +class TranscribePromptInputter(AbstractPrompter): def __init__( self, transcribe_filename, diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b2c53ba --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,7 @@ +[tool.pytest-watcher] +now = false +delay = 0.2 +runner = "pytest" +runner_args = [] +patterns = ["*.py"] +ignore_patterns = [".null-ls*"] diff --git a/requirements-dev.txt b/requirements-dev.txt index 2c24905..8286644 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -3,3 +3,4 @@ flake8 isort pre-commit pytest +pytest-watcher