From 09ce95f9f9095176f41b5e61cbf863829f36bb36 Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Mon, 15 Jul 2024 20:08:53 -0700 Subject: [PATCH 1/2] Adjust execution of server code to allow the line thats erroring to show up in the traceback. --- .../problem_bank_scripts.py | 37 +++++++++++++------ .../scripts/check_question.py | 4 +- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/problem_bank_scripts/problem_bank_scripts.py b/src/problem_bank_scripts/problem_bank_scripts.py index 0927f6ac..47355523 100644 --- a/src/problem_bank_scripts/problem_bank_scripts.py +++ b/src/problem_bank_scripts/problem_bank_scripts.py @@ -16,6 +16,8 @@ import problem_bank_helpers as pbh import pandas as pd import warnings +import tempfile +import traceback ## Parse Markdown import markdown_it @@ -1144,13 +1146,20 @@ def str_presenter(dumper, data2): # Run the python code; this improved way was suggested by Phil Austin of UBC EOAS server_py = assemble_server_py(parsed_q, "local") + server = {} + data2 = pbh.create_data2() - spec = importlib.util.spec_from_loader("server", loader=None) - server = importlib.util.module_from_spec(spec) - exec(server_py, server.__dict__) + with tempfile.TemporaryDirectory(suffix=f"_{output_path.stem}", ignore_cleanup_errors=True) as dirpath: + file = pathlib.Path(dirpath).joinpath("server.py") + file.write_text(server_py, encoding="utf8") + try: + code = compile(server_py, file.as_posix(), "exec") + exec(code, server) + server["generate"](data2) + except Exception as e: + msg = f"Error in running the server code, please review the below traceback: \n\n{traceback.format_exc()}" + raise type(e)(msg) from None - data2 = pbh.create_data2() - server.generate(data2) ################################################################################# # Remove the solutions from the server section @@ -1357,14 +1366,20 @@ def process_question_pl(source_filepath, output_path=None, dev=False): # Run the python code; this improved way was suggested by Phil Austin of UBC EOAS server_py = assemble_server_py(parsed_q, "local") - - spec = importlib.util.spec_from_loader("server", loader=None) - server = importlib.util.module_from_spec(spec) - exec(server_py, server.__dict__) - + server = {} data2 = pbh.create_data2() - server.generate(data2) + with tempfile.TemporaryDirectory(suffix=f"_{output_path.stem}", ignore_cleanup_errors=True) as dirpath: + file = pathlib.Path(dirpath).joinpath("server.py") + file.write_text(server_py, encoding="utf8") + try: + code = compile(server_py, file.as_posix(), "exec") + exec(code, server) + server["generate"](data2) + except Exception as e: + msg = f"Error in running the server code, please review the below traceback: \n\n{traceback.format_exc()}" + raise type(e)(msg) from None + ################################################################################# if dev: diff --git a/src/problem_bank_scripts/scripts/check_question.py b/src/problem_bank_scripts/scripts/check_question.py index fdfb0aff..da085a9d 100644 --- a/src/problem_bank_scripts/scripts/check_question.py +++ b/src/problem_bank_scripts/scripts/check_question.py @@ -4,7 +4,7 @@ import argparse import pathlib -from ..problem_bank_scripts import process_question_pl +from problem_bank_scripts import process_question_pl def main(): @@ -48,7 +48,7 @@ def main(): except Exception as e: print(f"There is an error in this problem: \n\t- File path: {question}\n\t- Error: {e}") - raise e + return -1 if __name__ == "__main__": From 4f8bd3fda042951bad37c4ba6cf2d90e2674b91f Mon Sep 17 00:00:00 2001 From: Bluesy1 <68259537+Bluesy1@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:23:43 -0700 Subject: [PATCH 2/2] Update Scripts --- src/problem_bank_scripts/scripts/check_question.py | 5 +++++ src/problem_bank_scripts/scripts/check_server_ast.py | 5 ++--- src/problem_bank_scripts/scripts/lint_server.py | 2 +- src/problem_bank_scripts/scripts/process.py | 2 +- src/problem_bank_scripts/scripts/process_q.py | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/problem_bank_scripts/scripts/check_question.py b/src/problem_bank_scripts/scripts/check_question.py index da085a9d..9324fbb4 100644 --- a/src/problem_bank_scripts/scripts/check_question.py +++ b/src/problem_bank_scripts/scripts/check_question.py @@ -6,6 +6,8 @@ from problem_bank_scripts import process_question_pl +from . import check_server_ast + def main(): parser = argparse.ArgumentParser( @@ -39,6 +41,9 @@ def main(): try: print(f"Processing question: {question}") + if check_server_ast.main([question.as_posix()]) != 0: + return -1 + process_question_pl(question.as_posix(), output_path=output_dir) print(f"\t Moved file to location: {output_dir.parent}") diff --git a/src/problem_bank_scripts/scripts/check_server_ast.py b/src/problem_bank_scripts/scripts/check_server_ast.py index 9bbe2670..95f1d45e 100644 --- a/src/problem_bank_scripts/scripts/check_server_ast.py +++ b/src/problem_bank_scripts/scripts/check_server_ast.py @@ -4,12 +4,11 @@ import argparse import ast import platform -import sys import traceback from collections.abc import Sequence from pathlib import Path -from ..problem_bank_scripts import assemble_server_py, read_md_problem +from problem_bank_scripts import assemble_server_py, read_md_problem def main(argv: Sequence[str] | None = None) -> int: @@ -17,7 +16,7 @@ def main(argv: Sequence[str] | None = None) -> int: parser.add_argument('filenames', nargs='*') args = parser.parse_args(argv) impl = platform.python_implementation() - version = sys.version.split()[0] + version = platform.python_version() retval = 0 for filename in args.filenames: diff --git a/src/problem_bank_scripts/scripts/lint_server.py b/src/problem_bank_scripts/scripts/lint_server.py index 81ae7a8c..09ae88eb 100644 --- a/src/problem_bank_scripts/scripts/lint_server.py +++ b/src/problem_bank_scripts/scripts/lint_server.py @@ -9,7 +9,7 @@ from black import format_str from black.mode import Mode, TargetVersion -from ..problem_bank_scripts import read_md_problem +from problem_bank_scripts import read_md_problem def main(argv: Sequence[str] | None = None) -> int: diff --git a/src/problem_bank_scripts/scripts/process.py b/src/problem_bank_scripts/scripts/process.py index 0f19e904..1d81dc84 100644 --- a/src/problem_bank_scripts/scripts/process.py +++ b/src/problem_bank_scripts/scripts/process.py @@ -7,7 +7,7 @@ import shutil import sys -from ..problem_bank_scripts import process_question_md, process_question_pl +from problem_bank_scripts import process_question_md, process_question_pl def _bool(v: str | bool): diff --git a/src/problem_bank_scripts/scripts/process_q.py b/src/problem_bank_scripts/scripts/process_q.py index a5a2adf6..7940579c 100644 --- a/src/problem_bank_scripts/scripts/process_q.py +++ b/src/problem_bank_scripts/scripts/process_q.py @@ -7,7 +7,7 @@ import git -from ..problem_bank_scripts import process_question_md, process_question_pl +from problem_bank_scripts import process_question_md, process_question_pl def _bool(v: str | bool): @@ -99,7 +99,7 @@ def main(): except Exception as e: print(f"There is an error in this problem: \n\t- File path: {md_file}\n\t- Error: {e}") - raise e + raise if __name__ == "__main__":