diff --git a/src/primaite/simulator/file_system/file_system_file.py b/src/primaite/simulator/file_system/file_system_file.py index 441a27b0..efb1ae93 100644 --- a/src/primaite/simulator/file_system/file_system_file.py +++ b/src/primaite/simulator/file_system/file_system_file.py @@ -1,11 +1,11 @@ from random import choice, randint from typing import Dict -from primaite.simulator.file_system.file_system_file_type import FileSystemFileType -from primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC +from primaite.simulator.file_system.file_system_file_type import file_type_sizes_KB, FileSystemFileType +from primaite.simulator.file_system.file_system_item_abc import FileSystemItem -class FileSystemFile(FileSystemItemABC): +class FileSystemFile(FileSystemItem): """Class that represents a file in the simulation.""" file_type: FileSystemFileType = None @@ -24,23 +24,19 @@ class FileSystemFile(FileSystemItemABC): :param item_size: The size of the FileSystemItem :type item_size: Optional[float] """ - super().__init__(**kwargs) - # set random file type if none provided if kwargs.get("item_name") is None: raise Exception("File name not provided.") - # set random file size if non provided - if kwargs.get("item_size") is None: - kwargs["item_size"] = float(randint(1, 1000)) - # set random file type if none provided if kwargs.get("file_type") is None: kwargs["file_type"] = choice(list(FileSystemFileType)) - self.item_name = kwargs.get("item_name") - self.item_size = kwargs.get("item_size") - self.file_type = kwargs.get("file_type") + # set random file size if none provided + if kwargs.get("item_size") is None: + kwargs["item_size"] = float(randint(1, file_type_sizes_KB[kwargs["file_type"]])) + + super().__init__(**kwargs) def get_file_name(self) -> str: """Returns the name of the file.""" diff --git a/src/primaite/simulator/file_system/file_system_file_type.py b/src/primaite/simulator/file_system/file_system_file_type.py index fd11f30f..7e2d8706 100644 --- a/src/primaite/simulator/file_system/file_system_file_type.py +++ b/src/primaite/simulator/file_system/file_system_file_type.py @@ -2,12 +2,123 @@ from enum import Enum class FileSystemFileType(str, Enum): - """Enum used to determine the FileSystemFile type.""" + """An enumeration of common file types.""" - CSV = ("CSV",) - DOC = ("DOC",) - EXE = ("EXE",) - PDF = ("PDF",) - TXT = ("TXT",) - XML = ("XML",) - ZIP = "ZIP" + UNKNOWN = 0 + "Unknown file type." + + # Text formats + TXT = 1 + "Plain text file." + DOC = 2 + "Microsoft Word document (.doc)" + DOCX = 3 + "Microsoft Word document (.docx)" + PDF = 4 + "Portable Document Format." + HTML = 5 + "HyperText Markup Language file." + XML = 6 + "Extensible Markup Language file." + CSV = 7 + "Comma-Separated Values file." + + # Spreadsheet formats + XLS = 8 + "Microsoft Excel file (.xls)" + XLSX = 9 + "Microsoft Excel file (.xlsx)" + + # Image formats + JPEG = 10 + "JPEG image file." + PNG = 11 + "PNG image file." + GIF = 12 + "GIF image file." + BMP = 13 + "Bitmap image file." + + # Audio formats + MP3 = 14 + "MP3 audio file." + WAV = 15 + "WAV audio file." + + # Video formats + MP4 = 16 + "MP4 video file." + AVI = 17 + "AVI video file." + MKV = 18 + "MKV video file." + FLV = 19 + "FLV video file." + + # Presentation formats + PPT = 20 + "Microsoft PowerPoint file (.ppt)" + PPTX = 21 + "Microsoft PowerPoint file (.pptx)" + + # Web formats + JS = 22 + "JavaScript file." + CSS = 23 + "Cascading Style Sheets file." + + # Programming languages + PY = 24 + "Python script file." + C = 25 + "C source code file." + CPP = 26 + "C++ source code file." + JAVA = 27 + "Java source code file." + + # Compressed file types + RAR = 28 + "RAR archive file." + ZIP = 29 + "ZIP archive file." + TAR = 30 + "TAR archive file." + GZ = 31 + "Gzip compressed file." + + +file_type_sizes_KB = { + FileSystemFileType.UNKNOWN: 0, + FileSystemFileType.TXT: 4, + FileSystemFileType.DOC: 50, + FileSystemFileType.DOCX: 30, + FileSystemFileType.PDF: 100, + FileSystemFileType.HTML: 15, + FileSystemFileType.XML: 10, + FileSystemFileType.CSV: 15, + FileSystemFileType.XLS: 100, + FileSystemFileType.XLSX: 25, + FileSystemFileType.JPEG: 100, + FileSystemFileType.PNG: 40, + FileSystemFileType.GIF: 30, + FileSystemFileType.BMP: 300, + FileSystemFileType.MP3: 5000, + FileSystemFileType.WAV: 25000, + FileSystemFileType.MP4: 25000, + FileSystemFileType.AVI: 50000, + FileSystemFileType.MKV: 50000, + FileSystemFileType.FLV: 15000, + FileSystemFileType.PPT: 200, + FileSystemFileType.PPTX: 100, + FileSystemFileType.JS: 10, + FileSystemFileType.CSS: 5, + FileSystemFileType.PY: 5, + FileSystemFileType.C: 5, + FileSystemFileType.CPP: 10, + FileSystemFileType.JAVA: 10, + FileSystemFileType.RAR: 1000, + FileSystemFileType.ZIP: 1000, + FileSystemFileType.TAR: 1000, + FileSystemFileType.GZ: 800, +} diff --git a/src/primaite/simulator/file_system/file_system_folder.py b/src/primaite/simulator/file_system/file_system_folder.py index f5024966..a381e57d 100644 --- a/src/primaite/simulator/file_system/file_system_folder.py +++ b/src/primaite/simulator/file_system/file_system_folder.py @@ -1,10 +1,10 @@ from typing import Dict, List, Optional from primaite.simulator.file_system.file_system_file import FileSystemFile -from primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC +from primaite.simulator.file_system.file_system_item_abc import FileSystemItem -class FileSystemFolder(FileSystemItemABC): +class FileSystemFolder(FileSystemItem): """Simulation FileSystemFolder.""" files: List[FileSystemFile] = [] diff --git a/src/primaite/simulator/file_system/file_system_item_abc.py b/src/primaite/simulator/file_system/file_system_item_abc.py index 4dca0f4e..a1258665 100644 --- a/src/primaite/simulator/file_system/file_system_item_abc.py +++ b/src/primaite/simulator/file_system/file_system_item_abc.py @@ -1,9 +1,9 @@ -from abc import ABC +from typing import Dict from primaite.simulator.core import SimComponent -class FileSystemItemABC(SimComponent, ABC): +class FileSystemItem(SimComponent): """Abstract base class for FileSystemItems used in the file system simulation.""" item_size: float = 0 @@ -11,3 +11,7 @@ class FileSystemItemABC(SimComponent, ABC): item_name: str """The name of the file system item.""" + + def describe_state(self) -> Dict: + """Returns the state of the FileSystemItem.""" + pass diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system.py index dae8b34e..f4c1ccda 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system.py @@ -10,7 +10,7 @@ def test_create_folder_and_file(): file_system.create_file(file_name="test_file", file_size=10, folder_uuid=folder.uuid) assert len(file_system.get_folders()[0].get_files()) is 1 assert file_system.get_folders()[0].get_files()[0].get_file_name() is "test_file" - assert file_system.get_folders()[0].get_files()[0].get_file_size() is 10 + assert file_system.get_folders()[0].get_files()[0].get_file_size() == 10 def test_create_file(): @@ -92,6 +92,6 @@ def test_serialisation(): assert len(file_system.get_folders()[0].get_files()) is 1 serialised_file_sys = file_system.model_dump_json() - deserialised_file_sys = FileSystem().model_validate_json(serialised_file_sys) + deserialised_file_sys = FileSystem.model_validate_json(serialised_file_sys) assert file_system == deserialised_file_sys diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_file.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_file.py index 669be62d..ed4a4ad5 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_file.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_file.py @@ -11,13 +11,13 @@ def test_file_type(): def test_get_file_size(): """Tests that the file size is being returned properly.""" file = FileSystemFile(item_name="test", item_size=1.5) - assert file.get_file_size() is 1.5 + assert file.get_file_size() == 1.5 def test_serialisation(): """Test to check that the object serialisation works correctly.""" file = FileSystemFile(item_name="test", item_size=1.5, file_type=FileSystemFileType.DOC) serialised_file = file.model_dump_json() - deserialised_file = FileSystemFile(item_name="test").model_validate_json(serialised_file) + deserialised_file = FileSystemFile.model_validate_json(serialised_file) assert file == deserialised_file diff --git a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_folder.py b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_folder.py index f9ba80f0..871b4e94 100644 --- a/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_folder.py +++ b/tests/unit_tests/_primaite/_simulator/_file_system/test_file_system_folder.py @@ -10,11 +10,11 @@ def test_adding_removing_file(): file = FileSystemFile(item_name="test_file", item_size=10, file_type=FileSystemFileType.DOC) folder.add_file(file) - assert folder.get_folder_size() is 10 + assert folder.get_folder_size() == 10 assert len(folder.get_files()) is 1 folder.remove_file(file) - assert folder.get_folder_size() is 0 + assert folder.get_folder_size() == 0 assert len(folder.get_files()) is 0 @@ -27,7 +27,7 @@ def test_get_file_by_id(): folder.add_file(file) folder.add_file(file2) - assert folder.get_folder_size() is 20 + assert folder.get_folder_size() == 20 assert len(folder.get_files()) is 2 assert folder.get_file(file_id=file.uuid) is file @@ -54,6 +54,6 @@ def test_serialisation(): serialised_folder = folder.model_dump_json() - deserialised_folder = FileSystemFolder(item_name="test").model_validate_json(serialised_folder) + deserialised_folder = FileSystemFolder.model_validate_json(serialised_folder) assert folder == deserialised_folder