Skip to content
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

[Python] - Enhance "find-prompt" script functionality and user interaction #731

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions scripts/find-prompt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys

import pandas as pd


class PromptFinder:
"""
A class to search for prompts based on a given action from a CSV file.
"""

def __init__(self, csv_file_path=None):
"""
Initialize the PromptFinder with a CSV file path.
"""
self.csv_file_path = csv_file_path or self.get_default_csv_path()
if self.csv_file_path is None:
sys.exit("Error: CSV file not found in default paths or specified path.")
try:
self.df = pd.read_csv(self.csv_file_path)
except FileNotFoundError:
sys.exit(f"Error: CSV file '{self.csv_file_path}' not found.")

@staticmethod
def get_default_csv_path():
"""
Returns the first existing default CSV path, or None if none found.
"""
default_paths = ["../prompts.csv", "./prompts.csv"]
return next((path for path in default_paths if os.path.exists(path)), None)

def find_prompt(self, search_string):
"""
Find prompts based on the search_string.
:param search_string: The action to search for in the CSV.
:return: The found prompts or a message if no prompt is found.
"""
filtered_df = self.df[
self.df["act"].str.lower().str.contains(search_string.lower())
]
if len(filtered_df) > 0:
return filtered_df[["act", "prompt"]]
else:
return f"No prompt found for '{search_string}'."

@staticmethod
def display_and_select_prompt(results):
"""
Display prompts and allow user to select one.
:param results: DataFrame of found prompts.
"""
try:
if isinstance(results, str):
print(results) # No prompt found
elif len(results) == 1:
# Automatically select if only one prompt is found
return results.iloc[0]["prompt"]
else:
for idx, row in enumerate(results.itertuples(), 1): # Use enumerate for sequential numbering
print(f"{idx}. {row.act}: {row.prompt}")
choice = int(input("Select a prompt number: "))
return results.iloc[choice - 1]["prompt"]
except KeyboardInterrupt:
print("\nOperation cancelled by the user.")
sys.exit(0)


if __name__ == "__main__":
try:
csv_file_path = sys.argv[1] if len(sys.argv) > 1 else None
prompt_finder = PromptFinder(csv_file_path)

if not sys.stdin.isatty():
act_to_search = sys.stdin.readline().strip()
else:
act_to_search = input("Enter the ACT to search for: ")

found_prompts = prompt_finder.find_prompt(act_to_search)
if isinstance(found_prompts, str):
print(found_prompts)
else:
selected_prompt = prompt_finder.display_and_select_prompt(found_prompts)
print(f"Selected Prompt: {selected_prompt}")
except KeyboardInterrupt:
print("\nScript interrupted by the user.")
sys.exit(0)