diff options
author | 2022-11-24 13:43:55 +0800 | |
---|---|---|
committer | 2022-11-24 13:43:55 +0800 | |
commit | deeec17623d61b0899e2a40e4f3cdf75356e1211 (patch) | |
tree | b71b051ee8be14b937d3a7e936b105be8d0c43b5 | |
parent | Add request file IO error handling (diff) |
Include json in file parse time limit
-rw-r--r-- | snekbox/api/resources/eval.py | 2 | ||||
-rw-r--r-- | snekbox/memfs.py | 8 | ||||
-rw-r--r-- | snekbox/nsjail.py | 2 | ||||
-rw-r--r-- | snekbox/snekio.py | 4 |
4 files changed, 12 insertions, 4 deletions
diff --git a/snekbox/api/resources/eval.py b/snekbox/api/resources/eval.py index 14fa295..38a5625 100644 --- a/snekbox/api/resources/eval.py +++ b/snekbox/api/resources/eval.py @@ -117,5 +117,5 @@ class EvalResource: resp.media = { "stdout": result.stdout, "returncode": result.returncode, - "files": [f.to_dict() for f in result.files], + "files": [f.json for f in result.files], } diff --git a/snekbox/memfs.py b/snekbox/memfs.py index 0c157dc..fb62ce9 100644 --- a/snekbox/memfs.py +++ b/snekbox/memfs.py @@ -21,6 +21,7 @@ def parse_files( fs: MemFS, files_limit: int, files_pattern: str, + preload_json: bool = False, ) -> list[FileAttachment]: """ Parse files in a MemFS. @@ -29,11 +30,16 @@ def parse_files( fs: The MemFS to parse. files_limit: The maximum number of files to parse. files_pattern: The glob pattern to match files against. + preload_json: Whether to preload and cache JSON data. Returns: List of FileAttachments sorted lexically by path name. """ - return sorted(fs.attachments(files_limit, files_pattern), key=lambda file: file.path) + res = sorted(fs.attachments(files_limit, files_pattern), key=lambda file: file.path) + if preload_json: + for file in res: + _ = file.json + return res class MemFS: diff --git a/snekbox/nsjail.py b/snekbox/nsjail.py index b33e41e..696f2f9 100644 --- a/snekbox/nsjail.py +++ b/snekbox/nsjail.py @@ -253,7 +253,7 @@ class NsJail: try: attachments = timed( parse_files, - (fs, self.files_limit, self.files_pattern), + (fs, self.files_limit, self.files_pattern, True), timeout=self.files_timeout, ) log.info(f"Found {len(attachments)} files.") diff --git a/snekbox/snekio.py b/snekbox/snekio.py index 7852301..fd48585 100644 --- a/snekbox/snekio.py +++ b/snekbox/snekio.py @@ -3,6 +3,7 @@ from __future__ import annotations from base64 import b64decode, b64encode from dataclasses import dataclass +from functools import cached_property from pathlib import Path from typing import Generic, TypeVar @@ -89,7 +90,8 @@ class FileAttachment(Generic[T]): else: file.write_bytes(self.content) - def to_dict(self) -> dict[str, str]: + @cached_property + def json(self) -> dict[str, str]: """Convert the attachment to a dict.""" content = b64encode(self.as_bytes()).decode("ascii") return { |