diff --git a/source/autograder_platform/StudentSubmissionImpl/Python/PythonSubmission.py b/source/autograder_platform/StudentSubmissionImpl/Python/PythonSubmission.py index aa71b2e..294422f 100644 --- a/source/autograder_platform/StudentSubmissionImpl/Python/PythonSubmission.py +++ b/source/autograder_platform/StudentSubmissionImpl/Python/PythonSubmission.py @@ -38,6 +38,9 @@ class PythonSubmission(AbstractStudentSubmission[CodeType]): # this allows versioned and non versioned packages, but disallows local packages REQUIREMENTS_LINE_REGEX: re.Pattern = re.compile(r"^(\w|-)+(==)?(\d+\.?){0,3}$") + # matches main.py, submission.py, or submission_.py + MAIN_FILE_REGEX: re.Pattern = re.compile(r"^(main|submission(_\w+)?)\.py$") + def __init__(self): super().__init__() @@ -51,7 +54,7 @@ def __init__(self): self.entryPoint: Optional[CodeType] = None - self.addValidator(PythonFileValidator(self.ALLOWED_STRICT_MAIN_NAMES)) + self.addValidator(PythonFileValidator(self.MAIN_FILE_REGEX)) self.addValidator(RequirementsValidator()) self.addValidator(PackageValidator()) @@ -145,7 +148,7 @@ def _identifyMainFile(self) -> str: return self.discoveredFileMap[FileTypeMap.PYTHON_FILES][0] for file in self.discoveredFileMap[FileTypeMap.PYTHON_FILES]: - if os.path.basename(file) in self.ALLOWED_STRICT_MAIN_NAMES: + if self.MAIN_FILE_REGEX.match(os.path.basename(file)): return file # unreachable @@ -201,4 +204,4 @@ def getDiscoveredFileMap(self) -> Dict[FileTypeMap, List[str]]: return self.discoveredFileMap def getExtraPackages(self) -> Dict[str, str]: - return self.extraPackages + return self.extraPackages \ No newline at end of file diff --git a/source/autograder_platform/StudentSubmissionImpl/Python/PythonValidators.py b/source/autograder_platform/StudentSubmissionImpl/Python/PythonValidators.py index ecd4598..ee6f3b4 100644 --- a/source/autograder_platform/StudentSubmissionImpl/Python/PythonValidators.py +++ b/source/autograder_platform/StudentSubmissionImpl/Python/PythonValidators.py @@ -1,5 +1,6 @@ import importlib.util -from typing import Callable, Dict, List +import re +from typing import Dict, List import requests import os from autograder_platform.StudentSubmission.AbstractValidator import AbstractValidator @@ -12,9 +13,9 @@ class PythonFileValidator(AbstractValidator): def getValidationHook() -> ValidationHook: return ValidationHook.POST_LOAD - def __init__(self, allowedMainNames: List[str]): + def __init__(self, mainFileRegex: re.Pattern): super().__init__() - self.allowedMainNames = allowedMainNames + self.mainFileRegex = mainFileRegex self.pythonFiles: Dict[FileTypeMap, List[str]] = {} self.looseMainMatchingAllowed: bool = False @@ -42,14 +43,12 @@ def run(self): if self.looseMainMatchingAllowed: return - mainNameFilter: Callable[[str], bool] = lambda x: x in self.allowedMainNames - - filteredFiles = list(filter(mainNameFilter, self.pythonFiles[FileTypeMap.PYTHON_FILES])) + filteredFiles = [f for f in self.pythonFiles[FileTypeMap.PYTHON_FILES] if self.mainFileRegex.match(f)] if not filteredFiles: - self.addError(MissingMainFileError(self.allowedMainNames, self.pythonFiles[FileTypeMap.PYTHON_FILES])) + self.addError(MissingMainFileError(["main.py", "submission.py", "submission_.py"], self.pythonFiles[FileTypeMap.PYTHON_FILES])) return - + if len(filteredFiles) != 1: self.addError(TooManyFilesError(filteredFiles)) @@ -123,8 +122,4 @@ def run(self): if requests.get(url=url).status_code == 200: continue - self.addError(InvalidPackageError(package, version)) - - - - + self.addError(InvalidPackageError(package, version)) \ No newline at end of file