89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
from pathlib import Path
|
|
import logging
|
|
from safety_schemas.models import Ecosystem, FileType
|
|
from typer import FileTextWrite
|
|
|
|
from .python.main import PythonFile
|
|
from ...encoding import detect_encoding
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class InspectableFileContext:
|
|
"""
|
|
Context manager for handling the lifecycle of an inspectable file.
|
|
|
|
This class ensures that the file is properly opened and closed, handling any
|
|
exceptions that may occur during the process.
|
|
"""
|
|
|
|
def __init__(self, file_path: Path, file_type: FileType) -> None:
|
|
"""
|
|
Initializes the InspectableFileContext.
|
|
|
|
Args:
|
|
file_path (Path): The path to the file.
|
|
file_type (FileType): The type of the file.
|
|
"""
|
|
self.file_path = file_path
|
|
self.inspectable_file = None
|
|
self.file_type = file_type
|
|
|
|
def __enter__(self): # TODO: Handle permission issue /Applications/...
|
|
"""
|
|
Enters the runtime context related to this object.
|
|
|
|
Opens the file and creates the appropriate inspectable file object based on the file type.
|
|
|
|
Returns:
|
|
The inspectable file object.
|
|
"""
|
|
try:
|
|
encoding = detect_encoding(self.file_path)
|
|
file: FileTextWrite = open(self.file_path, mode="r+", encoding=encoding) # type: ignore
|
|
self.inspectable_file = TargetFile.create(
|
|
file_type=self.file_type, file=file
|
|
)
|
|
except Exception:
|
|
logger.exception("Error opening file")
|
|
|
|
return self.inspectable_file
|
|
|
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
"""
|
|
Exits the runtime context related to this object.
|
|
|
|
Ensures that the file is properly closed.
|
|
"""
|
|
if self.inspectable_file:
|
|
self.inspectable_file.file.close()
|
|
|
|
|
|
class TargetFile:
|
|
"""
|
|
Factory class for creating inspectable file objects based on the file type and ecosystem.
|
|
"""
|
|
|
|
@classmethod
|
|
def create(cls, file_type: FileType, file: FileTextWrite):
|
|
"""
|
|
Creates an inspectable file object based on the file type and ecosystem.
|
|
|
|
Args:
|
|
file_type (FileType): The type of the file.
|
|
file (FileTextWrite): The file object.
|
|
|
|
Returns:
|
|
An instance of the appropriate inspectable file class.
|
|
|
|
Raises:
|
|
ValueError: If the ecosystem or file type is unsupported.
|
|
"""
|
|
if file_type.ecosystem == Ecosystem.PYTHON:
|
|
return PythonFile(file=file, file_type=file_type)
|
|
|
|
raise ValueError(
|
|
"Unsupported ecosystem or file type: "
|
|
f"{file_type.ecosystem}:{file_type.value}"
|
|
)
|