Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions cms/grading/languagemanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def get_language(name: str) -> Language:
return _BY_NAME[name]


def filename_to_language(filename: str) -> Language | None:
def filename_to_language(filename: str, available_languages: list[Language] | None=None) -> Language | None:
"""Return one of the languages inferred from the given filename.

filename: the file to test.
Expand All @@ -59,12 +59,14 @@ def filename_to_language(filename: str) -> Language | None:
matching the given filename, or None if none match.

"""
if available_languages is None:
available_languages = LANGUAGES
ext_index = filename.rfind(".")
if ext_index == -1:
return None
ext = filename[ext_index:]
names = sorted(language.name
for language in LANGUAGES
for language in available_languages
if ext in language.source_extensions)
return None if len(names) == 0 else get_language(names[0])

Expand Down
10 changes: 7 additions & 3 deletions cmscontrib/AddSubmission.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def maybe_send_notification(submission_id: int):
rs.disconnect()


def language_from_submitted_files(files: dict[str, str]) -> Language | None:
def language_from_submitted_files(files: dict[str, str], contest_languages: list[Language]) -> Language | None:
"""Return the language inferred from the submitted files.

files: dictionary mapping the expected filename to a path in
Expand All @@ -61,7 +61,7 @@ def language_from_submitted_files(files: dict[str, str]) -> Language | None:
# TODO: deduplicate with the code in SubmitHandler.
language = None
for filename in files.keys():
this_language = filename_to_language(files[filename])
this_language = filename_to_language(files[filename], contest_languages)
if this_language is None and ".%l" in filename:
raise ValueError(
"Cannot recognize language for file `%s'." % filename)
Expand Down Expand Up @@ -126,7 +126,11 @@ def add_submission(
if given_language is not None:
language = get_language(given_language)
else:
language = language_from_submitted_files(files)
contest_languages = [
get_language(language)
for language in task.contest.languages
]
language = language_from_submitted_files(files, contest_languages)
except ValueError as e:
logger.critical(e)
return False
Expand Down