同步操作将从 编程语言算法集/Python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#!/usr/bin/env python3import hashlibimport importlib.utilimport jsonimport osimport pathlibfrom types import ModuleTypeimport pytestimport requestsPROJECT_EULER_DIR_PATH = pathlib.Path.cwd().joinpath("project_euler")PROJECT_EULER_ANSWERS_PATH = pathlib.Path.cwd().joinpath("scripts", "project_euler_answers.json")with open(PROJECT_EULER_ANSWERS_PATH) as file_handle:PROBLEM_ANSWERS: dict[str, str] = json.load(file_handle)def convert_path_to_module(file_path: pathlib.Path) -> ModuleType:"""Converts a file path to a Python module"""spec = importlib.util.spec_from_file_location(file_path.name, str(file_path))module = importlib.util.module_from_spec(spec) # type: ignore[arg-type]spec.loader.exec_module(module) # type: ignore[union-attr]return moduledef all_solution_file_paths() -> list[pathlib.Path]:"""Collects all the solution file path in the Project Euler directory"""solution_file_paths = []for problem_dir_path in PROJECT_EULER_DIR_PATH.iterdir():if problem_dir_path.is_file() or problem_dir_path.name.startswith("_"):continuefor file_path in problem_dir_path.iterdir():if file_path.suffix != ".py" or file_path.name.startswith(("_", "test")):continuesolution_file_paths.append(file_path)return solution_file_pathsdef get_files_url() -> str:"""Return the pull request number which triggered this action."""with open(os.environ["GITHUB_EVENT_PATH"]) as file:event = json.load(file)return event["pull_request"]["url"] + "/files"def added_solution_file_path() -> list[pathlib.Path]:"""Collects only the solution file path which got added in the currentpull request.This will only be triggered if the script is ran from GitHub Actions."""solution_file_paths = []headers = {"Accept": "application/vnd.github.v3+json","Authorization": "token " + os.environ["GITHUB_TOKEN"],}files = requests.get(get_files_url(), headers=headers, timeout=10).json()for file in files:filepath = pathlib.Path.cwd().joinpath(file["filename"])if (filepath.suffix != ".py"or filepath.name.startswith(("_", "test"))or not filepath.name.startswith("sol")):continuesolution_file_paths.append(filepath)return solution_file_pathsdef collect_solution_file_paths() -> list[pathlib.Path]:# Return only if there are any, otherwise default to all solutionsif (os.environ.get("CI")and os.environ.get("GITHUB_EVENT_NAME") == "pull_request"and (filepaths := added_solution_file_path())):return filepathsreturn all_solution_file_paths()@pytest.mark.parametrize("solution_path",collect_solution_file_paths(),ids=lambda path: f"{path.parent.name}/{path.name}",)def test_project_euler(solution_path: pathlib.Path) -> None:"""Testing for all Project Euler solutions"""# problem_[extract this part] and pad it with zeroes for width 3problem_number: str = solution_path.parent.name[8:].zfill(3)expected: str = PROBLEM_ANSWERS[problem_number]solution_module = convert_path_to_module(solution_path)answer = str(solution_module.solution())answer = hashlib.sha256(answer.encode()).hexdigest()assert answer == expected, (f"Expected solution to {problem_number} to have hash {expected}, got {answer}")
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。