mirror of
https://github.com/HorlogeSkynet/archey4
synced 2025-04-16 16:00:13 +02:00
87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
"""
|
|
Output class file.
|
|
It supports entries lazy-insertion, logo detection, and final printing.
|
|
"""
|
|
|
|
import sys
|
|
from subprocess import check_output
|
|
|
|
import distro
|
|
|
|
from archey.constants import COLOR_DICT, LOGOS_DICT, Colors
|
|
from archey.configuration import Configuration
|
|
from archey.distributions import Distributions
|
|
|
|
|
|
class Output:
|
|
"""
|
|
This is the object handling output entries populating.
|
|
It also handles the logo choice based on some system detections.
|
|
"""
|
|
def __init__(self):
|
|
# First we check whether the Kernel has been compiled as a WSL.
|
|
if 'microsoft' in check_output(['uname', '-r'], universal_newlines=True).lower():
|
|
self._distribution = Distributions.WINDOWS
|
|
else:
|
|
try:
|
|
self._distribution = Distributions(distro.id())
|
|
except ValueError:
|
|
# See <https://www.freedesktop.org/software/systemd/man/os-release.html#ID_LIKE=>.
|
|
for distro_like in distro.like().split(' '):
|
|
try:
|
|
self._distribution = Distributions(distro_like)
|
|
except ValueError:
|
|
continue
|
|
break
|
|
else:
|
|
# Well, we didn't match anything so let's fall-back to default `Linux`.
|
|
self._distribution = Distributions.LINUX
|
|
|
|
# Fetch the colors palette related to this distribution.
|
|
self._colors_palette = COLOR_DICT[self._distribution]
|
|
|
|
# If `os-release`'s `ANSI_COLOR` option is set, honor it.
|
|
# See <https://www.freedesktop.org/software/systemd/man/os-release.html#ANSI_COLOR=>.
|
|
ansi_color = distro.os_release_attr('ansi_color')
|
|
if ansi_color and Configuration().get('colors_palette')['honor_ansi_color']:
|
|
# Replace each Archey integrated colors by `ANSI_COLOR`.
|
|
self._colors_palette = len(self._colors_palette) * \
|
|
[Colors.escape_code_from_attrs(ansi_color)]
|
|
|
|
# Each class output will be added in the list below afterwards
|
|
self._results = []
|
|
|
|
def append(self, key, value):
|
|
"""Append a pre-formatted entry to the final output content"""
|
|
self._results.append(
|
|
'{color}{key}:{clear} {value}'.format(
|
|
color=self._colors_palette[0],
|
|
key=key,
|
|
clear=Colors.CLEAR,
|
|
value=value
|
|
)
|
|
)
|
|
|
|
def output(self):
|
|
"""
|
|
Finally render the output entries.
|
|
It handles text centering additionally to value and colors replacing.
|
|
"""
|
|
# Let's center the entries according to the logo (handles odd numbers)
|
|
self._results[0:0] = [''] * ((18 - len(self._results)) // 2)
|
|
self._results.extend([''] * (18 - len(self._results)))
|
|
|
|
try:
|
|
print(
|
|
LOGOS_DICT[self._distribution].format(
|
|
c=self._colors_palette,
|
|
r=self._results
|
|
) + str(Colors.CLEAR)
|
|
)
|
|
except UnicodeError:
|
|
print(
|
|
'Your locale or TTY does not seem to support UTF8 encoding.\n'
|
|
'Please disable Unicode within your configuration file.',
|
|
file=sys.stderr
|
|
)
|