mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-07-05 09:21:13 +08:00
Validate only submitted Project Euler solution (#3977)
* Update validate solution script to fetch only submitted solution * Update workflow file with the updated PE script * Fix: do not fetch `validate_solutions.py` script * Update script to use the requests package for API calls * Fix: install requests module * Pytest ignore scripts/ directory
This commit is contained in:
@ -1,11 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
import importlib.util
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
from types import ModuleType
|
||||
from typing import Dict, List
|
||||
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
PROJECT_EULER_DIR_PATH = pathlib.Path.cwd().joinpath("project_euler")
|
||||
PROJECT_EULER_ANSWERS_PATH = pathlib.Path.cwd().joinpath(
|
||||
@ -24,7 +26,7 @@ def convert_path_to_module(file_path: pathlib.Path) -> ModuleType:
|
||||
return module
|
||||
|
||||
|
||||
def collect_solution_file_paths() -> List[pathlib.Path]:
|
||||
def 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():
|
||||
@ -37,12 +39,51 @@ def collect_solution_file_paths() -> List[pathlib.Path]:
|
||||
return solution_file_paths
|
||||
|
||||
|
||||
def 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 current
|
||||
pull 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).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")
|
||||
):
|
||||
continue
|
||||
solution_file_paths.append(filepath)
|
||||
return solution_file_paths
|
||||
|
||||
|
||||
def collect_solution_file_paths() -> List[pathlib.Path]:
|
||||
if os.environ.get("CI") and os.environ.get("GITHUB_EVENT_NAME") == "pull_request":
|
||||
# Return only if there are any, otherwise default to all solutions
|
||||
if filepaths := added_solution_file_path():
|
||||
return filepaths
|
||||
return 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):
|
||||
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 3
|
||||
problem_number: str = solution_path.parent.name[8:].zfill(3)
|
||||
|
Reference in New Issue
Block a user