mirror of
https://github.com/HorlogeSkynet/archey4
synced 2024-11-21 20:00:12 +01:00
121b1cc796
Co-authored-by: Michael Bromilow <12384431+ingrinder@users.noreply.github.com> Co-authored-by: Samuel FORESTIER <samuel+dev@forestier.app>
56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
"""Entry base class"""
|
|
|
|
import logging
|
|
from abc import ABC as AbstractBaseClass
|
|
from abc import abstractmethod
|
|
from typing import Optional
|
|
|
|
from archey.configuration import Configuration
|
|
|
|
|
|
class Entry(AbstractBaseClass):
|
|
"""Module base class"""
|
|
|
|
_ICON: Optional[str] = None
|
|
_PRETTY_NAME: Optional[str] = None
|
|
|
|
def __new__(cls, *_, **kwargs):
|
|
"""Hook object instantiation to handle our particular `disabled` config field"""
|
|
if kwargs.get("options", {}).pop("disabled", False):
|
|
return None
|
|
|
|
return super().__new__(cls)
|
|
|
|
@abstractmethod
|
|
def __init__(self, name: Optional[str] = None, value=None, options: Optional[dict] = None):
|
|
configuration = Configuration()
|
|
|
|
# Each entry will have always have the following attributes...
|
|
# `name`: key (defaults to the instantiated entry class name);
|
|
# `value`: value of entry as an appropriate object;
|
|
# `options`: configuration options *specific* to an entry instance;
|
|
self.name = name or self._PRETTY_NAME or self.__class__.__name__
|
|
self.value = value
|
|
self.options = options or {}
|
|
|
|
# optionally prepend entry name with an icon
|
|
icon = self.options.get("icon", self._ICON)
|
|
if icon is not None and configuration.get("entries_icon"):
|
|
self.name = f"{icon} {self.name}"
|
|
|
|
# Propagates a reference to default strings specified in `Configuration`.
|
|
self._default_strings = configuration.get("default_strings")
|
|
|
|
# Provision a logger for each entry.
|
|
self._logger = logging.getLogger(self.__module__)
|
|
|
|
def output(self, output) -> None:
|
|
"""Output the results to output. Can be overridden by subclasses."""
|
|
if self.value:
|
|
# Let's assume we can just use `__str__` on the object in value,
|
|
# and create a single-line output with it.
|
|
output.append(self.name, str(self.value))
|
|
else:
|
|
# If the value is "falsy" leave a generic "Not detected" message for this entry.
|
|
output.append(self.name, self._default_strings.get("not_detected"))
|