TESTS TESTS ADDED MORE TEST TESTED GRESOURCES TESTS TESTS I LOVE TESTS SO MUCH

- Fully covered gresource orchestrator and it helpers with tests
- Use abstract command runner INSTEAD OF SUBPROCESS in gresources
- Replaced some subprocesses by builtin functions
This commit is contained in:
Vladyslav Hroshev
2025-04-06 21:56:27 +03:00
parent 9bb229df7d
commit 31e1a3deb9
20 changed files with 661 additions and 313 deletions

View File

@@ -1,16 +1,20 @@
import os
from scripts.utils.command_runner.command_runner import CommandRunner
from scripts.utils.gresource.gresource_backuper import GresourceBackuperManager
from scripts.utils.gresource.gresource_complier import GresourceCompiler
from scripts.utils.gresource.gresource_compiler import GresourceCompiler
from scripts.utils.gresource.gresource_extractor import GresourceExtractor
from scripts.utils.gresource.gresource_mover import GresourceMover
from scripts.utils.logger.logger import LoggerFactory
class Gresource:
"""Orchestrator for gresource files. Manages the extraction, compilation, and backup of gresource files."""
"""Orchestrator for gresource files."""
def __init__(self, gresource_file: str, temp_folder: str, destination: str, logger_factory: LoggerFactory):
def __init__(
self, gresource_file: str, temp_folder: str, destination: str,
logger_factory: LoggerFactory, runner: CommandRunner
):
"""
:param gresource_file: The name of the gresource file to be processed.
:param temp_folder: The temporary folder where resources will be extracted.
@@ -19,28 +23,39 @@ class Gresource:
self.gresource_file = gresource_file
self.temp_folder = temp_folder
self.destination = destination
self.logger_factory = logger_factory
self.runner = runner
self._temp_gresource = os.path.join(temp_folder, gresource_file)
self._destination_gresource = os.path.join(destination, gresource_file)
self._active_source_gresource = self._destination_gresource
self._backuper = GresourceBackuperManager(self._destination_gresource, logger_factory=self.logger_factory)
self._backuper = GresourceBackuperManager(self._destination_gresource,
logger_factory=self.logger_factory)
def use_backup_gresource(self):
self._active_source_gresource = self._backuper.get_backup()
return self._active_source_gresource
def extract(self):
GresourceExtractor(self._active_source_gresource, self.temp_folder, logger_factory=self.logger_factory).extract()
extractor = GresourceExtractor(self._active_source_gresource, self.temp_folder,
logger_factory=self.logger_factory, runner=self.runner)
extractor.extract()
def compile(self):
GresourceCompiler(self.temp_folder, self._temp_gresource, logger_factory=self.logger_factory).compile()
compiler = GresourceCompiler(self.temp_folder, self._temp_gresource,
logger_factory=self.logger_factory, runner=self.runner)
compiler.compile()
def backup(self):
self._backuper.backup()
def restore(self):
self._backuper.restore()
self._active_source_gresource = self._destination_gresource
def move(self):
GresourceMover(self._temp_gresource, self._destination_gresource, logger_factory=self.logger_factory).move()
mover = GresourceMover(self._temp_gresource, self._destination_gresource,
logger_factory=self.logger_factory)
mover.move()

View File

@@ -1,6 +1,5 @@
import os
import shutil
import subprocess
from scripts.utils.gresource import GresourceBackupNotFoundError
from scripts.utils.logger.logger import LoggerFactory
@@ -23,7 +22,7 @@ class GresourceBackuperManager:
class GresourceBackuper:
def __init__(self, destination_file: str, backup_file, logger_factory: LoggerFactory):
def __init__(self, destination_file: str, backup_file: str, logger_factory: LoggerFactory):
self.destination_file = destination_file
self.backup_file = backup_file
self.logger_factory = logger_factory
@@ -41,7 +40,6 @@ class GresourceBackuper:
os.remove(self.backup_file)
shutil.copy2(self.destination_file, self.backup_file)
# subprocess.run(["cp", "-aT", self.destination_file, self.backup_file], check=True)
backup_line.success("Backed up gresource files.")
@@ -49,4 +47,6 @@ class GresourceBackuper:
if not os.path.exists(self.backup_file):
raise GresourceBackupNotFoundError(self.backup_file)
subprocess.run(["mv", "-f", self.backup_file, self.destination_file], check=True)
shutil.move(self.backup_file, self.destination_file)
self.logger_factory.create_logger().success("Restored gresource files.")

View File

@@ -1,17 +1,22 @@
import subprocess
import textwrap
from pathlib import Path
from scripts.utils.command_runner.command_runner import CommandRunner
from scripts.utils.gresource import raise_gresource_error
from scripts.utils.logger.logger import LoggerFactory
class GresourceCompiler:
def __init__(self, source_folder: str, target_file: str, logger_factory: LoggerFactory):
def __init__(
self, source_folder: str, target_file: str,
logger_factory: LoggerFactory, runner: CommandRunner
):
self.source_folder = source_folder
self.target_file = target_file
self.gresource_xml = target_file + ".xml"
self.logger_factory = logger_factory
self.runner = runner
def compile(self):
compile_line = self.logger_factory.create_logger()
@@ -55,7 +60,7 @@ class GresourceCompiler:
raise
def _try_compile_resources(self):
subprocess.run(["glib-compile-resources",
self.runner.run(["glib-compile-resources",
"--sourcedir", self.source_folder,
"--target", self.target_file,
self.gresource_xml

View File

@@ -1,45 +1,48 @@
import os
import subprocess
from scripts.utils.command_runner.command_runner import CommandRunner
from scripts.utils.gresource import raise_gresource_error
from scripts.utils.logger.logger import LoggerFactory
class GresourceExtractor:
def __init__(self, gresource_path: str, extract_folder: str, logger_factory: LoggerFactory):
def __init__(
self, gresource_path: str, extract_folder: str,
logger_factory: LoggerFactory, runner: CommandRunner
):
self.gresource_path = gresource_path
self.extract_folder = extract_folder
self.logger_factory = logger_factory
self.runner = runner
def extract(self):
extract_line = self.logger_factory.create_logger()
extract_line.update("Extracting gresource files...")
resources = self._get_resources_list()
self._extract_resources(resources)
self._try_extract_resources()
extract_line.success("Extracted gresource files.")
def _get_resources_list(self):
resources_list_response = subprocess.run(
["gresource", "list", self.gresource_path],
capture_output=True, text=True, check=False
)
if resources_list_response.stderr:
raise Exception(f"gresource could not process the theme file: {self.gresource_path}")
return resources_list_response.stdout.strip().split("\n")
def _extract_resources(self, resources: list[str]):
def _try_extract_resources(self):
try:
self._try_extract_resources(resources)
resources = self._get_resources_list()
self._extract_resources(resources)
except FileNotFoundError as e:
print(e)
if "gresource" in str(e):
raise_gresource_error("gresource", e)
raise
except Exception as e:
raise Exception(f"gresource could not process the theme file: {self.gresource_path}") from e
def _try_extract_resources(self, resources: list[str]):
def _get_resources_list(self):
resources_list_response = self.runner.run(
["gresource", "list", self.gresource_path],
capture_output=True, text=True, check=True
)
return resources_list_response.stdout.strip().split("\n")
def _extract_resources(self, resources: list[str]):
prefix = "/org/gnome/shell/theme/"
for resource in resources:
resource_path = resource.replace(prefix, "")
@@ -47,7 +50,7 @@ class GresourceExtractor:
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'wb') as f:
subprocess.run(
self.runner.run(
["gresource", "extract", self.gresource_path, resource],
stdout=f, check=True
)

View File

@@ -1,4 +1,5 @@
import subprocess
import os
import shutil
from scripts.utils.logger.logger import LoggerFactory
@@ -13,11 +14,8 @@ class GresourceMover:
move_line = self.logger_factory.create_logger()
move_line.update("Moving gresource files...")
subprocess.run(["cp", "-f",
self.source_file,
self.destination_file],
check=True)
subprocess.run(["chmod", "644", self.destination_file], check=True)
os.makedirs(os.path.dirname(self.destination_file), exist_ok=True)
shutil.copyfile(self.source_file, self.destination_file)
os.chmod(self.destination_file, 0o644)
move_line.success("Moved gresource files.")