import json import os import subprocess import sys def main(): """ Main function :return: None """ if len(sys.argv) < 2: print('Please provide the path to the project folder as an argument.') sys.exit(1) folder_path = sys.argv[1] # select_project() try: os.chdir(folder_path) except FileNotFoundError: print(f'The folder {folder_path} does not exist.') sys.exit(1) test_modules = find_test_modules(folder_path) test_functions = [] for module in test_modules: new_functions = find_test_functions(file_name=module, path=folder_path) test_functions.extend(new_functions) output_json(test_functions) def select_project(): """ Asks the user to select the project folder :return: path to the project folder """ try: # Run the zenity command to open a directory selection dialog result = subprocess.run( ["zenity", "--file-selection", "--directory", "--title=Select a Directory"], text=True, # Capture output as string stdout=subprocess.PIPE, # Redirect standard output stderr=subprocess.PIPE # Redirect standard error ) # Check if a directory was selected if result.returncode == 0: # Return code 0 means success return result[1].strip() # Return the selected directory else: print("No directory was selected.") return "" except FileNotFoundError: print("Zenity is not installed. Please install it using 'sudo apt install zenity'.") return "" except Exception as e: print(f"An error occurred: {e}") return "" def find_test_modules(path='.'): """ Searches for files matching test_*.py or *_test.py in the specified folder using a Bash command. Parameters ---------- path : str The path to the folder to search in. Default is the current Returns ------- List[str] A list of matching file paths. """ # Define the Bash command to search for test files command = f'ls {path} | grep -E "test_.*\.py|_test\.py"' result = execute_bash(command) # Split the output into lines to get a list of file paths if result[1]: files = result[1].strip() file_list = files.split('\n') return file_list return [] def find_test_functions(file_name, path='.'): """ Searches for test functions in the specified file using a Bash command. Parameters ---------- path : str The path to the folder to search in. Default is the current directory. file_name : str The name of the file to search in. Returns ------- List[str] A list of test function names. """ # Define the Bash command to search for test functions in the file command = f'grep -E "def test_*" "{path}/{file_name}"' result = execute_bash(command) # Split the output into lines to get a list of function names if result[1]: functions = result[1].strip() function_list = functions.split('\n') for i in range(len(function_list)): function_list[i] = sanitize_function_name(function_list[i]) return function_list return [] def sanitize_function_name(function_name): """ Sanitize the function name by removing the 'def ' prefix and any leading/trailing whitespace. Parameters ---------- function_name : str The function names to sanitize. Returns ------- str The sanitized function names. """ # remove the 'def ' prefix and any leading/trailing whitespace function_name = function_name.replace('def ', '').strip() # remove the arguments including the colon and brackets function_name = function_name.split('(')[0] return function_name def output_json(test_functions): """ Output the test functions as a JSON string. Parameters ---------- test_functions : List[str] A list of test function names. """ json_str = json.dumps(test_functions, indent=4) print(json_str) def execute_bash(command): """ Execute a Bash command and return the result. Parameters ---------- command : str The Bash command to execute. Returns ------- subprocess.CompletedProcess The result of the command execution. """ try: result = subprocess.run( command, shell=True, # Use a shell to interpret the command check=True, # Raise an error if the command fails text=True, # Capture output as a string stdout=subprocess.PIPE, # Redirect standard output stderr=subprocess.PIPE # Redirect standard error ) return [result.returncode, result.stdout] except subprocess.CalledProcessError as e: print(f'Error executing the command: {e.cmd}') print(f'Error message: {e.stderr}') sys.exit(1) except Exception as ex: print(f'An unexpected error occurred: {ex}') sys.exit(1) if __name__ == '__main__': main()