diff options
author | 2022-11-28 11:53:54 +0800 | |
---|---|---|
committer | 2022-11-28 11:53:54 +0800 | |
commit | 8272f88c3b50cc3912ae087b4f7eec506a5abaac (patch) | |
tree | 603d665e8569f03da59e391c689dbf8e69cdc4fa | |
parent | Update NSJail docstring (diff) |
parse_files refactor as instance method
-rw-r--r-- | snekbox/memfs.py | 65 | ||||
-rw-r--r-- | snekbox/nsjail.py | 4 | ||||
-rw-r--r-- | tests/test_memfs.py | 2 |
3 files changed, 32 insertions, 39 deletions
diff --git a/snekbox/memfs.py b/snekbox/memfs.py index ebbbb4a..b8abc23 100644 --- a/snekbox/memfs.py +++ b/snekbox/memfs.py @@ -14,32 +14,7 @@ from snekbox.snekio import FileAttachment log = logging.getLogger(__name__) -__all__ = ("MemFS", "parse_files") - - -def parse_files( - fs: MemFS, - files_limit: int, - files_pattern: str, - preload_dict: bool = False, -) -> list[FileAttachment]: - """ - Parse files in a MemFS. - - Args: - fs: The MemFS to parse. - files_limit: The maximum number of files to parse. - files_pattern: The glob pattern to match files against. - preload_dict: Whether to preload as_dict property data. - - Returns: - List of FileAttachments sorted lexically by path name. - """ - res = sorted(fs.attachments(files_limit, files_pattern), key=lambda f: f.path) - if preload_dict: - for file in res: - _ = file.as_dict - return res +__all__ = ("MemFS",) class MemFS: @@ -114,28 +89,46 @@ class MemFS: folder.chmod(chmod) return folder - def attachments( - self, max_count: int, pattern: str = "**/*" - ) -> Generator[FileAttachment, None, None]: + def files(self, limit: int, pattern: str = "**/*") -> Generator[FileAttachment, None, None]: """ - Generate FileAttachments for files in the MemFS. + Yields FileAttachments for files in the MemFS. Args: - max_count: The maximum number of files to parse. + limit: The maximum number of files to parse. pattern: The glob pattern to match files against. - - Yields: - FileAttachments for files in the MemFS. """ count = 0 for file in self.output.rglob(pattern): - if count > max_count: - log.info(f"Max attachments {max_count} reached, skipping remaining files") + if count > limit: + log.info(f"Max attachments {limit} reached, skipping remaining files") break if file.is_file(): count += 1 yield FileAttachment.from_path(file, relative_to=self.output) + def files_list( + self, + limit: int, + pattern: str, + preload_dict: bool = False, + ) -> list[FileAttachment]: + """ + Returns a sorted list of output files found in the MemFS. + + Args: + limit: The maximum number of files to parse. + pattern: The glob pattern to match files against. + preload_dict: Whether to preload as_dict property data. + + Returns: + List of FileAttachments sorted lexically by path name. + """ + res = sorted(self.files(limit, pattern), key=lambda f: f.path) + if preload_dict: + for file in res: + _ = file.as_dict + return res + def cleanup(self) -> None: """Unmount the tmpfs.""" if self._path is None: diff --git a/snekbox/nsjail.py b/snekbox/nsjail.py index c4a2965..1b2bb41 100644 --- a/snekbox/nsjail.py +++ b/snekbox/nsjail.py @@ -10,7 +10,7 @@ from google.protobuf import text_format from snekbox import DEBUG, utils from snekbox.config_pb2 import NsJailConfig -from snekbox.memfs import MemFS, parse_files +from snekbox.memfs import MemFS from snekbox.process import EvalResult from snekbox.snekio import FileAttachment from snekbox.utils.timed import timed @@ -252,7 +252,7 @@ class NsJail: # Parse attachments with time limit try: attachments = timed( - parse_files, + MemFS.files_list, (fs, self.files_limit, self.files_pattern, True), timeout=self.files_timeout, ) diff --git a/tests/test_memfs.py b/tests/test_memfs.py index 2876613..8050562 100644 --- a/tests/test_memfs.py +++ b/tests/test_memfs.py @@ -47,7 +47,7 @@ class MemFSTests(TestCase): attrgetter("home"), attrgetter("output"), lambda fs: fs.mkdir(""), - lambda fs: list(fs.attachments(1)), + lambda fs: list(fs.files(1)), ] memfs = MemFS(10) |