From cde941ca4f8ee07bfa4175d5a4ebd4a44740c253 Mon Sep 17 00:00:00 2001 From: Pamela Fox Date: Fri, 25 Feb 2022 23:20:22 -0800 Subject: [PATCH] More cleanup of load.py --- parsons/constants.py | 3 +-- parsons/load.py | 43 ++++++++++++++--------------------------- parsons/local_server.py | 6 +++--- parsons/test_load.py | 22 +++++++++++++++------ 4 files changed, 35 insertions(+), 39 deletions(-) diff --git a/parsons/constants.py b/parsons/constants.py index 63f78f3..3f7c08b 100644 --- a/parsons/constants.py +++ b/parsons/constants.py @@ -1,7 +1,6 @@ PARSONS_FOLDER_NAME = 'parsons_probs' PARSONS_FOLDER_PATH = './parsons_probs' PARSONS_GLOB = 'parsons_probs/*.py' -PROBLEM_PATHS = [PARSONS_FOLDER_PATH] PARSONS_OUTFILE = f"{PARSONS_FOLDER_PATH}/test_log" PARSONS_CORRECTNESS = f"{PARSONS_FOLDER_PATH}/correctness" PARSONS_REPR_SUFFIX = "_repr" @@ -12,4 +11,4 @@ REQUIRED_PROBLEMS = "required_problem_names" OPTIONAL_PROBLEMS = "optional_problem_names" PROBLEM_NAMES = "problem_names" -MAX_NUM_RETRIES = 20 \ No newline at end of file +MAX_NUM_RETRIES = 20 diff --git a/parsons/load.py b/parsons/load.py index f072a6f..13cca22 100644 --- a/parsons/load.py +++ b/parsons/load.py @@ -4,33 +4,12 @@ import yaml -from constants import PROBLEM_PATHS, UTILITY_FILES, PARSONS_GLOB, PARSONS_FOLDER_PATH +from constants import UTILITY_FILES, PARSONS_GLOB, PARSONS_FOLDER_PATH -def load_config_file(paths): - """ - Loads a YAML file. - Args: - paths: Either a single path or a list of paths for YAML files. - - Returns: The contents of the YAML file as a defaultdict, returning None - for unspecified attributes. - """ - if type(paths) != list: - paths = [paths] - for path in paths: - try: - with open(os.path.abspath(path), 'r') as file: - config = yaml.load(file, Loader=yaml.Loader) - if type(config) == dict: - config = defaultdict(lambda: None, config) - return config - except IOError as e: - pass - raise Exception("Cannot find files {0}".format(paths)) def load_config(problem_name): """ - Loads a YAML file, assuming that the YAML file is located at {PROBLEM_PATHS}/{problem_name}.yaml + Loads a YAML file, assuming that the YAML file is located at {PARSONS_FOLDER_PATH}/{problem_name}.yaml Normalizes problem_name to lowercase as all filenames should be lowercased. Args: @@ -39,10 +18,16 @@ def load_config(problem_name): Returns: The contents of the YAML file as a defaultdict, returning None for unspecified attributes. """ - config_files = [] - for path in PROBLEM_PATHS: - config_files.append(os.path.join(os.path.abspath(path), problem_name.lower() + ".yaml")) - return load_config_file(config_files) + path = os.path.join(os.path.abspath(PARSONS_FOLDER_PATH), problem_name.lower() + ".yaml") + try: + with open(os.path.abspath(path), 'r') as file: + config = yaml.load(file, Loader=yaml.Loader) + if type(config) == dict: + config = defaultdict(lambda: None, config) + return config + except IOError as e: + pass + raise Exception("Cannot find path {0}".format(path)) def problem_name_from_file(filename): with open(filename, "r", encoding="utf8") as f: @@ -54,7 +39,9 @@ def problem_name_from_file(filename): name = func_sig[:func_sig.index('(')] return name - +def problem_name_to_file(problem_name, extension): + return f'{PARSONS_FOLDER_PATH}/{problem_name.lower()}.{extension}' + def path_to_name(names_to_paths, path): for key, val in names_to_paths.items(): if val == path: diff --git a/parsons/local_server.py b/parsons/local_server.py index d6f574c..6dd9271 100644 --- a/parsons/local_server.py +++ b/parsons/local_server.py @@ -14,7 +14,7 @@ from client.api.assignment import load_assignment from client.cli.common import messages from output import DisableStdout -from load import load_config, path_to_name, problem_name_from_file +from load import load_config, path_to_name, problem_name_from_file, problem_name_to_file from constants import * from multiprocessing import Semaphore @@ -133,7 +133,7 @@ def submit(): problem_name = request.form['problem_name'] submitted_code = request.form['submitted_code'] parsons_repr_code = request.form['parsons_repr_code'] - fname = f'{PARSONS_FOLDER_PATH}/{problem_name.lower()}.py' + fname = problem_name_to_file(problem_name, 'py') write_parsons_prob_locally(fname, submitted_code, parsons_repr_code, True) test_results = grade_and_backup(problem_name) return jsonify({'test_results': test_results}) @@ -302,7 +302,7 @@ def get_useful_syntax_error_logs(logs, problem_name): return logs[:traceback_index + 1] + logs[file_index:] def count_docstring_lines(problem_name): - fname = f'{PARSONS_FOLDER_PATH}/{problem_name.lower()}.py' + fname = problem_name_to_file(problem_name, 'py') num_lines = 0 with open(fname, "r", encoding="utf8") as f: for i, line in enumerate(f): diff --git a/parsons/test_load.py b/parsons/test_load.py index d39c632..62dc9d0 100644 --- a/parsons/test_load.py +++ b/parsons/test_load.py @@ -3,19 +3,29 @@ import load -class TestLoad(unittest.TestCase): +class TestLoad(unittest.TestCase): def test_load_config_lowercased(self): with self.assertRaises(Exception) as context: - load.load_config('remove_indexes') - self.assertIn('remove_indexes.yaml', str(context.exception)) + load.load_config("remove_indexes") + self.assertIn("remove_indexes.yaml", str(context.exception)) def test_load_config_camelcased(self): with self.assertRaises(Exception) as context: - load.load_config('SmartFridge') + load.load_config("SmartFridge") # Make sure it lowercases the file name - self.assertIn('smartfridge.yaml', str(context.exception)) + self.assertIn("smartfridge.yaml", str(context.exception)) + + def test_problem_name_to_file(self): + self.assertEqual( + load.problem_name_to_file("smartfridge", "py"), + "./parsons_probs/smartfridge.py", + ) + self.assertEqual( + load.problem_name_to_file("SmartFridge", "py"), + "./parsons_probs/smartfridge.py", + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main()