#1714: FileSystemItem is no longer an abstract base class + Added enums and enum sizes + stream lined FileSystemFile init

This commit is contained in:
Czar Echavez
2023-08-07 11:52:54 +01:00
parent d57c2a936e
commit b58a3a3e24
7 changed files with 143 additions and 32 deletions

View File

@@ -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."""

View File

@@ -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,
}

View File

@@ -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] = []

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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