53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
import logging
|
|
import subprocess
|
|
from typing import ClassVar
|
|
|
|
logger = logging.getLogger("willow")
|
|
|
|
|
|
class OptimizerBase:
|
|
library_name: ClassVar[str] = ""
|
|
image_format: ClassVar[str] = ""
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
@classmethod
|
|
def applies_to(cls, image_format: str) -> bool:
|
|
return image_format.lower() == cls.image_format.lower()
|
|
|
|
@classmethod
|
|
def get_check_library_arguments(cls) -> list[str]:
|
|
"""
|
|
Return a list of arguments to check if the library exists.
|
|
|
|
Note: using --help by default as that usually returns a zero exit code
|
|
"""
|
|
return ["--help"]
|
|
|
|
@classmethod
|
|
def check_library(cls) -> bool:
|
|
args = [cls.library_name] + cls.get_check_library_arguments()
|
|
try:
|
|
subprocess.check_output(args, stderr=subprocess.STDOUT)
|
|
return True
|
|
except (FileNotFoundError, subprocess.CalledProcessError):
|
|
return False
|
|
|
|
@classmethod
|
|
def get_command_arguments(cls, file_path: str) -> list[str]:
|
|
"""Return a list of arguments for the given optimizer library."""
|
|
return []
|
|
|
|
@classmethod
|
|
def process(cls, file_path: str):
|
|
args = [cls.library_name] + cls.get_command_arguments(file_path)
|
|
try:
|
|
subprocess.check_output(args, stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as exc:
|
|
logger.exception(
|
|
"Error optimizing %s with the '%s' library with error: %s",
|
|
file_path,
|
|
cls.library_name,
|
|
exc.output,
|
|
)
|