pyhw 0.2.0b0__py3-none-any.whl → 0.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyhw/__init__.py +1 -1
- pyhw/__main__.py +10 -3
- pyhw/backend/backendBase.py +2 -0
- pyhw/backend/cpu/bsd.py +12 -0
- pyhw/backend/cpu/cpuBase.py +3 -0
- pyhw/backend/cpu/linux.py +26 -0
- pyhw/backend/cpu/macos.py +3 -1
- pyhw/backend/gpu/bsd.py +7 -0
- pyhw/backend/gpu/gpuBase.py +3 -0
- pyhw/backend/gpu/linux.py +20 -11
- pyhw/backend/gpu/macos.py +54 -17
- pyhw/backend/host/bsd.py +13 -0
- pyhw/backend/host/hostBase.py +3 -0
- pyhw/backend/host/linux.py +48 -21
- pyhw/backend/host/macos.py +11 -1
- pyhw/backend/kernel/kernelBase.py +1 -3
- pyhw/backend/memory/bsd.py +11 -0
- pyhw/backend/memory/linux.py +8 -8
- pyhw/backend/memory/memoryBase.py +3 -0
- pyhw/backend/nic/__init__.py +4 -0
- pyhw/backend/nic/bsd.py +7 -0
- pyhw/backend/nic/linux.py +58 -0
- pyhw/backend/nic/macos.py +27 -0
- pyhw/backend/nic/nicBase.py +25 -0
- pyhw/backend/nic/nicInfo.py +8 -0
- pyhw/backend/npu/__init__.py +5 -0
- pyhw/backend/npu/bsd.py +6 -0
- pyhw/backend/npu/linux.py +38 -0
- pyhw/backend/npu/macos.py +65 -0
- pyhw/backend/npu/npuBase.py +20 -0
- pyhw/backend/npu/npuInfo.py +10 -0
- pyhw/backend/os/bsd.py +7 -0
- pyhw/backend/os/linux.py +20 -15
- pyhw/backend/os/macos.py +21 -3
- pyhw/backend/os/osBase.py +3 -0
- pyhw/backend/shell/shellBase.py +1 -1
- pyhw/backend/shell/unix.py +20 -2
- pyhw/backend/title/titleBase.py +1 -1
- pyhw/backend/uptime/bsd.py +7 -0
- pyhw/backend/uptime/macos.py +12 -12
- pyhw/backend/uptime/uptimeBase.py +3 -0
- pyhw/frontend/color/colorConfig.py +70 -1
- pyhw/frontend/frontendBase.py +41 -2
- pyhw/frontend/logo/ascii/alpine.pyhw +6 -0
- pyhw/frontend/logo/ascii/arch.pyhw +19 -0
- pyhw/frontend/logo/ascii/armbian.pyhw +14 -0
- pyhw/frontend/logo/ascii/centos.pyhw +19 -0
- pyhw/frontend/logo/ascii/freebsd.pyhw +15 -0
- pyhw/frontend/logo/ascii/raspbian.pyhw +10 -0
- pyhw/library/lib/iokitGPULib.dylib +0 -0
- pyhw/pyhwUtil/__init__.py +2 -2
- pyhw/pyhwUtil/pyhwUtil.py +137 -4
- pyhw-0.7.4.dist-info/METADATA +135 -0
- pyhw-0.7.4.dist-info/RECORD +99 -0
- {pyhw-0.2.0b0.dist-info → pyhw-0.7.4.dist-info}/WHEEL +1 -1
- pyhw/macos.py +0 -146
- pyhw-0.2.0b0.dist-info/METADATA +0 -50
- pyhw-0.2.0b0.dist-info/RECORD +0 -75
- {pyhw-0.2.0b0.dist-info → pyhw-0.7.4.dist-info}/LICENSE +0 -0
- {pyhw-0.2.0b0.dist-info → pyhw-0.7.4.dist-info}/entry_points.txt +0 -0
- {pyhw-0.2.0b0.dist-info → pyhw-0.7.4.dist-info}/top_level.txt +0 -0
pyhw/backend/npu/bsd.py
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
from .npuInfo import NPUInfo
|
2
|
+
import pypci
|
3
|
+
|
4
|
+
|
5
|
+
class NPUDetectLinux:
|
6
|
+
def __init__(self):
|
7
|
+
self._npuInfo = NPUInfo()
|
8
|
+
|
9
|
+
def getNPUInfo(self):
|
10
|
+
self._getNPUInfo()
|
11
|
+
self._sortNPUList()
|
12
|
+
return self._npuInfo
|
13
|
+
|
14
|
+
def _getNPUInfo(self):
|
15
|
+
npu_devices = pypci.PCI().FindAllNPU()
|
16
|
+
if len(npu_devices) == 0:
|
17
|
+
self._handleNonePciDevices()
|
18
|
+
else:
|
19
|
+
for device in npu_devices:
|
20
|
+
if device.subsystem_device_name != "":
|
21
|
+
device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
|
22
|
+
else:
|
23
|
+
device_name = f"{device.vendor_name} {device.device_name}"
|
24
|
+
self._npuInfo.npus.append(self._npuNameClean(device_name))
|
25
|
+
self._npuInfo.number += 1
|
26
|
+
|
27
|
+
def _handleNonePciDevices(self):
|
28
|
+
# Place Holder for unknown NPU
|
29
|
+
self._npuInfo.number = 1
|
30
|
+
self._npuInfo.npus.append("Not found")
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def _npuNameClean(npu_name: str):
|
34
|
+
npu_name_clean = npu_name.replace("Corporation ", "")
|
35
|
+
return npu_name_clean
|
36
|
+
|
37
|
+
def _sortNPUList(self):
|
38
|
+
self._npuInfo.npus.sort()
|
@@ -0,0 +1,65 @@
|
|
1
|
+
from .npuInfo import NPUInfo
|
2
|
+
from ...pyhwUtil import getArch, getOS
|
3
|
+
import json
|
4
|
+
import subprocess
|
5
|
+
from ..cpu import CPUDetect
|
6
|
+
|
7
|
+
|
8
|
+
class NPUDetectMacOS:
|
9
|
+
def __init__(self):
|
10
|
+
self.__npuInfo = NPUInfo()
|
11
|
+
self.__arch = getArch()
|
12
|
+
|
13
|
+
def getNPUInfo(self):
|
14
|
+
self.__npuInfo.npus.append(self.__getNPUbyModelName())
|
15
|
+
self.__npuInfo.number += 1
|
16
|
+
# if self.__arch == "aarch64":
|
17
|
+
# self.__getNPUAppleSilicon()
|
18
|
+
# else: # Does not consider powerPC based Macs.
|
19
|
+
# self.__getNPUIntel()
|
20
|
+
return self.__npuInfo
|
21
|
+
|
22
|
+
def __getNPUAppleSilicon(self):
|
23
|
+
# Place holder
|
24
|
+
self.__npuInfo.npus.append("Apple Neural Engine [SOC Integrated]")
|
25
|
+
self.__npuInfo.number += 1
|
26
|
+
|
27
|
+
def __getNPUIntel(self):
|
28
|
+
# Place holder
|
29
|
+
self.__npuInfo.npus.append("Not Found")
|
30
|
+
self.__npuInfo.number += 1
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def __handleVendor(vendor):
|
34
|
+
if vendor == "sppci_vendor_Apple":
|
35
|
+
return "Apple"
|
36
|
+
elif vendor == "sppci_vendor_intel":
|
37
|
+
return "Intel"
|
38
|
+
elif vendor == "sppci_vendor_amd":
|
39
|
+
return "AMD"
|
40
|
+
else:
|
41
|
+
return vendor
|
42
|
+
|
43
|
+
@staticmethod
|
44
|
+
def __getNPUbyModelName():
|
45
|
+
# Placeholder
|
46
|
+
# see https://apple.fandom.com/wiki/Neural_Engine for more details.
|
47
|
+
model_name = CPUDetect(os=getOS()).getCPUInfo().model
|
48
|
+
npu = {
|
49
|
+
"Apple M1": "Apple Neural Engine 16 Core [SOC Integrated]",
|
50
|
+
"Apple M1 Pro": "Apple Neural Engine 16 Core [SOC Integrated]",
|
51
|
+
"Apple M1 Max": "Apple Neural Engine 16 Core [SOC Integrated]",
|
52
|
+
"Apple M1 Ultra": "Apple Neural Engine 32 Core [SOC Integrated]",
|
53
|
+
"Apple M2": "Apple Neural Engine 16 Core [SOC Integrated]",
|
54
|
+
"Apple M2 Pro": "Apple Neural Engine 16 Core [SOC Integrated]",
|
55
|
+
"Apple M2 Max": "Apple Neural Engine 16 Core [SOC Integrated]",
|
56
|
+
"Apple M2 Ultra": "Apple Neural Engine 32 Core [SOC Integrated]",
|
57
|
+
"Apple M3": "Apple Neural Engine 16 Core [SOC Integrated]",
|
58
|
+
"Apple M3 Pro": "Apple Neural Engine 16 Core [SOC Integrated]",
|
59
|
+
"Apple M3 Max": "Apple Neural Engine 16 Core [SOC Integrated]",
|
60
|
+
"Apple M4": "Apple Neural Engine 16 Core [SOC Integrated]",
|
61
|
+
"Apple M4 Pro": "Apple Neural Engine 16 Core [SOC Integrated]",
|
62
|
+
"Apple M4 Max": "Apple Neural Engine 16 Core [SOC Integrated]"
|
63
|
+
}
|
64
|
+
return npu.get(model_name, "Not Found")
|
65
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
from .linux import NPUDetectLinux
|
2
|
+
from .macos import NPUDetectMacOS
|
3
|
+
from .bsd import NPUDetectBSD
|
4
|
+
|
5
|
+
|
6
|
+
class NPUDetect:
|
7
|
+
def __init__(self, os):
|
8
|
+
self.OS = os
|
9
|
+
|
10
|
+
def getNPUInfo(self):
|
11
|
+
if self.OS == "linux":
|
12
|
+
return NPUDetectLinux().getNPUInfo()
|
13
|
+
elif self.OS == "macos":
|
14
|
+
return NPUDetectMacOS().getNPUInfo()
|
15
|
+
elif self.OS == "freebsd":
|
16
|
+
return NPUDetectBSD().getNPUInfo()
|
17
|
+
else:
|
18
|
+
raise NotImplementedError("Unsupported operating system")
|
19
|
+
|
20
|
+
|
pyhw/backend/os/bsd.py
ADDED
pyhw/backend/os/linux.py
CHANGED
@@ -6,42 +6,47 @@ from .osInfo import OSInfo
|
|
6
6
|
|
7
7
|
class OSDetectLinux:
|
8
8
|
def __init__(self):
|
9
|
-
self.
|
9
|
+
self._osInfo = OSInfo()
|
10
10
|
|
11
11
|
def getOSInfo(self):
|
12
12
|
"""
|
13
13
|
Detects the os distribution and its version.
|
14
14
|
:return: dataclass OSInfoLinux, direct attrs: prettyName
|
15
15
|
"""
|
16
|
-
self.
|
17
|
-
|
16
|
+
self._getOSInfo()
|
17
|
+
self._handleArmbian()
|
18
|
+
return self._osInfo
|
18
19
|
|
19
|
-
def
|
20
|
+
def _getOSInfo(self):
|
20
21
|
try:
|
21
22
|
with open("/etc/os-release", "r") as f:
|
22
23
|
for line in f:
|
23
24
|
key, value = line.strip().split("=")
|
24
25
|
if key == "PRETTY_NAME":
|
25
|
-
self.
|
26
|
+
self._osInfo.prettyName = value.strip('"')
|
26
27
|
elif key == "NAME":
|
27
|
-
self.
|
28
|
+
self._osInfo.name = value.strip('"')
|
28
29
|
elif key == "ID":
|
29
|
-
self.
|
30
|
+
self._osInfo.id = value.strip('"')
|
30
31
|
elif key == "ID_LIKE":
|
31
|
-
self.
|
32
|
+
self._osInfo.idLike = value.strip('"')
|
32
33
|
elif key == "VARIANT":
|
33
|
-
self.
|
34
|
+
self._osInfo.variant = value.strip('"')
|
34
35
|
elif key == "VARIANT_ID":
|
35
|
-
self.
|
36
|
+
self._osInfo.variantID = value.strip('"')
|
36
37
|
elif key == "VERSION":
|
37
|
-
self.
|
38
|
+
self._osInfo.version = value.strip('"')
|
38
39
|
elif key == "VERSION_ID":
|
39
|
-
self.
|
40
|
+
self._osInfo.versionID = value.strip('"')
|
40
41
|
elif key == "VERSION_CODENAME":
|
41
|
-
self.
|
42
|
+
self._osInfo.versionCodename = value.strip('"')
|
42
43
|
elif key == "CODE_NAME":
|
43
|
-
self.
|
44
|
+
self._osInfo.codeName = value.strip('"')
|
44
45
|
elif key == "BUILD_ID":
|
45
|
-
self.
|
46
|
+
self._osInfo.buildID = value.strip('"')
|
46
47
|
except Exception:
|
47
48
|
pass
|
49
|
+
|
50
|
+
def _handleArmbian(self):
|
51
|
+
if "Armbian" in self._osInfo.prettyName or "armbian" in self._osInfo.prettyName:
|
52
|
+
self._osInfo.id = "armbian"
|
pyhw/backend/os/macos.py
CHANGED
@@ -13,7 +13,11 @@ class OSDetectMacOS:
|
|
13
13
|
|
14
14
|
def getOSInfo(self):
|
15
15
|
self.__getOS()
|
16
|
-
self.
|
16
|
+
self.__handelOSName()
|
17
|
+
if self.__VersionName != "":
|
18
|
+
self.__osInfo.prettyName = f"{self.__ProductName} {self.__VersionName} {self.__ProductVersion} {self.__BuildVersion} {getArch()}"
|
19
|
+
else:
|
20
|
+
self.__osInfo.prettyName = f"{self.__ProductName} {self.__ProductVersion} {self.__BuildVersion} {getArch()}"
|
17
21
|
self.__osInfo.id = "macOS"
|
18
22
|
return self.__osInfo
|
19
23
|
|
@@ -32,5 +36,19 @@ class OSDetectMacOS:
|
|
32
36
|
self.__BuildVersion = sw_ver.split(":")[1].strip()
|
33
37
|
|
34
38
|
def __handelOSName(self):
|
35
|
-
#
|
36
|
-
|
39
|
+
# Only supports modern macOS
|
40
|
+
macOSVersionMap = {
|
41
|
+
"11": "Big Sur",
|
42
|
+
"12": "Monterey",
|
43
|
+
"13": "Ventura",
|
44
|
+
"14": "Sonoma",
|
45
|
+
"15": "Sequoia"
|
46
|
+
}
|
47
|
+
if "." in self.__ProductVersion:
|
48
|
+
major = self.__ProductVersion.split(".")[0]
|
49
|
+
else:
|
50
|
+
major = self.__ProductVersion
|
51
|
+
version_name = macOSVersionMap.get(major, "")
|
52
|
+
if version_name != "":
|
53
|
+
self.__VersionName = version_name
|
54
|
+
|
pyhw/backend/os/osBase.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
from .linux import OSDetectLinux
|
2
2
|
from .macos import OSDetectMacOS
|
3
|
+
from .bsd import OSDetectBSD
|
3
4
|
from ...pyhwException import OSUnsupportedException
|
4
5
|
|
5
6
|
|
@@ -12,5 +13,7 @@ class OSDetect:
|
|
12
13
|
return OSDetectLinux().getOSInfo()
|
13
14
|
elif self.__OS == "macos":
|
14
15
|
return OSDetectMacOS().getOSInfo()
|
16
|
+
elif self.__OS == "freebsd":
|
17
|
+
return OSDetectBSD().getOSInfo()
|
15
18
|
else:
|
16
19
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/shell/shellBase.py
CHANGED
@@ -7,7 +7,7 @@ class ShellDetect:
|
|
7
7
|
self.OS = os
|
8
8
|
|
9
9
|
def getShellInfo(self):
|
10
|
-
if self.OS
|
10
|
+
if self.OS in ["linux", "macos", "freebsd"]:
|
11
11
|
return ShellDetectUnix().getShellInfo()
|
12
12
|
else:
|
13
13
|
raise OSUnsupportedException("Unsupported operating system")
|
pyhw/backend/shell/unix.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""
|
2
2
|
In dev.
|
3
3
|
"""
|
4
|
+
from ...pyhwUtil import getDocker
|
4
5
|
from dataclasses import dataclass
|
5
6
|
import os
|
6
7
|
import subprocess
|
@@ -19,7 +20,10 @@ class ShellDetectUnix:
|
|
19
20
|
self.__shellInfo = ShellInfoUnix()
|
20
21
|
|
21
22
|
def getShellInfo(self):
|
22
|
-
|
23
|
+
if getDocker():
|
24
|
+
self.__getShellDocker()
|
25
|
+
else:
|
26
|
+
self.__getShell()
|
23
27
|
self.__getVersion()
|
24
28
|
self.__shellInfo.info = self.__shellInfo.shell + " " + self.__shellInfo.version
|
25
29
|
return self.__shellInfo
|
@@ -31,6 +35,19 @@ class ShellDetectUnix:
|
|
31
35
|
self.__shellInfo.shell = shell_env.split("/")[-1]
|
32
36
|
self.__shellInfo.path = shell_env
|
33
37
|
|
38
|
+
def __getShellDocker(self):
|
39
|
+
try:
|
40
|
+
with open("/etc/passwd", "r") as f:
|
41
|
+
for line in f:
|
42
|
+
if line.startswith("root:"):
|
43
|
+
root_shell = line.strip().split(":")[-1]
|
44
|
+
break
|
45
|
+
except:
|
46
|
+
root_shell = ""
|
47
|
+
if root_shell != "":
|
48
|
+
self.__shellInfo.shell = root_shell.split("/")[-1]
|
49
|
+
self.__shellInfo.path = root_shell
|
50
|
+
|
34
51
|
def __getVersion(self):
|
35
52
|
shell = self.__shellInfo.shell
|
36
53
|
if shell != "":
|
@@ -39,7 +56,7 @@ class ShellDetectUnix:
|
|
39
56
|
elif shell == "bash":
|
40
57
|
try:
|
41
58
|
result = subprocess.run(["bash", "-c", "echo $BASH_VERSION"], capture_output=True, text=True)
|
42
|
-
self.__shellInfo.version = result.stdout.strip()
|
59
|
+
self.__shellInfo.version = result.stdout.strip().split("(")[0]
|
43
60
|
except subprocess.SubprocessError:
|
44
61
|
pass
|
45
62
|
elif shell == "zsh":
|
@@ -54,3 +71,4 @@ class ShellDetectUnix:
|
|
54
71
|
|
55
72
|
|
56
73
|
|
74
|
+
|
pyhw/backend/title/titleBase.py
CHANGED
@@ -8,7 +8,7 @@ class TitleDetect:
|
|
8
8
|
self.OS = os
|
9
9
|
|
10
10
|
def getTitle(self):
|
11
|
-
if self.OS
|
11
|
+
if self.OS in ["linux", "macos", "freebsd"]:
|
12
12
|
return TitleDetectUnix().getTitle()
|
13
13
|
elif self.OS == "windows":
|
14
14
|
return TitleDetectWindows().getTitle()
|
pyhw/backend/uptime/macos.py
CHANGED
@@ -6,13 +6,13 @@ import subprocess
|
|
6
6
|
|
7
7
|
class UptimeDetectMacOS:
|
8
8
|
def __init__(self):
|
9
|
-
self.
|
10
|
-
self.
|
11
|
-
self.
|
9
|
+
self._uptimeInfo = UptimeInfo()
|
10
|
+
self._boot_time = 0
|
11
|
+
self._now = 0
|
12
12
|
|
13
13
|
def getUptimeInfo(self):
|
14
|
-
self.
|
15
|
-
uptime_seconds = self.
|
14
|
+
self._getUptime()
|
15
|
+
uptime_seconds = self._now - self._boot_time
|
16
16
|
hours, remainder = divmod(uptime_seconds, 3600)
|
17
17
|
minutes, seconds = divmod(remainder, 60)
|
18
18
|
days, hours = divmod(hours, 24)
|
@@ -22,19 +22,19 @@ class UptimeDetectMacOS:
|
|
22
22
|
seconds = int(seconds)
|
23
23
|
if days == 0:
|
24
24
|
if hours == 0:
|
25
|
-
self.
|
25
|
+
self._uptimeInfo.uptime = f"{minutes} min {seconds} sec"
|
26
26
|
else:
|
27
|
-
self.
|
27
|
+
self._uptimeInfo.uptime = f"{hours} hours {minutes} min {seconds} sec"
|
28
28
|
else:
|
29
|
-
self.
|
30
|
-
return self.
|
29
|
+
self._uptimeInfo.uptime = f"{days} days {hours} hours {minutes} min {seconds} sec"
|
30
|
+
return self._uptimeInfo
|
31
31
|
|
32
|
-
def
|
32
|
+
def _getUptime(self):
|
33
33
|
result = sysctlGetString("kern.boottime")
|
34
34
|
match = re.search(r'sec = (\d+),', result)
|
35
35
|
if match:
|
36
|
-
self.
|
36
|
+
self._boot_time = int(match.group(1))
|
37
37
|
else:
|
38
38
|
return
|
39
|
-
self.
|
39
|
+
self._now = int(subprocess.check_output(["date", "+%s"]).decode().strip())
|
40
40
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from .linux import UptimeDetectLinux
|
2
2
|
from .macos import UptimeDetectMacOS
|
3
|
+
from .bsd import UptimeDetectBSD
|
3
4
|
from ...pyhwException import OSUnsupportedException
|
4
5
|
|
5
6
|
|
@@ -19,5 +20,7 @@ class UptimeDetect:
|
|
19
20
|
return UptimeDetectLinux().getUptimeInfo()
|
20
21
|
elif self.OS == "macos":
|
21
22
|
return UptimeDetectMacOS().getUptimeInfo()
|
23
|
+
elif self.OS == "freebsd":
|
24
|
+
return UptimeDetectBSD().getUptimeInfo()
|
22
25
|
else:
|
23
26
|
raise OSUnsupportedException("Unsupported operating system")
|
@@ -21,13 +21,62 @@ class ColorConfigSet:
|
|
21
21
|
return ColorConfigSetU.ubuntu
|
22
22
|
elif self.__os_name == "ubuntu_small":
|
23
23
|
return ColorConfigSetU.ubuntu_small
|
24
|
+
elif self.__os_name == "raspbian":
|
25
|
+
return ColorConfigSetR.raspbian
|
26
|
+
elif self.__os_name == "armbian":
|
27
|
+
return ColorConfigSetA.armbian
|
28
|
+
elif self.__os_name == "alpine":
|
29
|
+
return ColorConfigSetA.alpine
|
30
|
+
elif self.__os_name == "arch":
|
31
|
+
return ColorConfigSetA.arch
|
32
|
+
elif self.__os_name == "centos":
|
33
|
+
return ColorConfigSetC.centos
|
34
|
+
elif self.__os_name == "freebsd":
|
35
|
+
return ColorConfigSetF.freebsd
|
24
36
|
else:
|
25
37
|
return ColorConfigSetL.linux # default to Linux
|
26
38
|
|
27
39
|
|
28
40
|
@dataclass
|
29
41
|
class ColorConfigSetA:
|
30
|
-
|
42
|
+
armbian = {
|
43
|
+
"colors": [
|
44
|
+
ColorSet.COLOR_FG_RED
|
45
|
+
],
|
46
|
+
"colorKeys": ColorSet.COLOR_FG_YELLOW,
|
47
|
+
"colorTitle": ColorSet.COLOR_FG_YELLOW
|
48
|
+
}
|
49
|
+
alpine = {
|
50
|
+
"colors": [
|
51
|
+
ColorSet.COLOR_FG_BLUE,
|
52
|
+
ColorSet.COLOR_FG_WHITE
|
53
|
+
],
|
54
|
+
"colorKeys": ColorSet.COLOR_FG_MAGENTA,
|
55
|
+
"colorTitle": ColorSet.COLOR_FG_BLUE
|
56
|
+
}
|
57
|
+
arch = {
|
58
|
+
"colors": [
|
59
|
+
ColorSet.COLOR_FG_CYAN,
|
60
|
+
ColorSet.COLOR_FG_CYAN
|
61
|
+
],
|
62
|
+
"colorKeys": ColorSet.COLOR_FG_CYAN,
|
63
|
+
"colorTitle": ColorSet.COLOR_FG_CYAN
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
@dataclass
|
68
|
+
class ColorConfigSetC:
|
69
|
+
centos = {
|
70
|
+
"colors": [
|
71
|
+
ColorSet.COLOR_FG_YELLOW,
|
72
|
+
ColorSet.COLOR_FG_GREEN,
|
73
|
+
ColorSet.COLOR_FG_BLUE,
|
74
|
+
ColorSet.COLOR_FG_MAGENTA,
|
75
|
+
ColorSet.COLOR_FG_WHITE
|
76
|
+
],
|
77
|
+
"colorKeys": ColorSet.COLOR_FG_GREEN,
|
78
|
+
"colorTitle": ColorSet.COLOR_FG_YELLOW
|
79
|
+
}
|
31
80
|
|
32
81
|
|
33
82
|
@dataclass
|
@@ -60,6 +109,14 @@ class ColorConfigSetF:
|
|
60
109
|
"colorKeys": ColorSet.COLOR_FG_BLUE,
|
61
110
|
"colorTitle": ColorSet.COLOR_FG_BLUE
|
62
111
|
}
|
112
|
+
freebsd = {
|
113
|
+
"colors": [
|
114
|
+
ColorSet.COLOR_FG_WHITE,
|
115
|
+
ColorSet.COLOR_FG_RED
|
116
|
+
],
|
117
|
+
"colorKeys": ColorSet.COLOR_FG_RED,
|
118
|
+
"colorTitle": ColorSet.COLOR_FG_RED
|
119
|
+
}
|
63
120
|
|
64
121
|
|
65
122
|
@dataclass
|
@@ -90,6 +147,18 @@ class ColorConfigSetM:
|
|
90
147
|
}
|
91
148
|
|
92
149
|
|
150
|
+
@dataclass
|
151
|
+
class ColorConfigSetR:
|
152
|
+
raspbian = {
|
153
|
+
"colors": [
|
154
|
+
ColorSet.COLOR_FG_RED,
|
155
|
+
ColorSet.COLOR_FG_GREEN
|
156
|
+
],
|
157
|
+
"colorKeys": ColorSet.COLOR_FG_RED,
|
158
|
+
"colorTitle": ColorSet.COLOR_FG_GREEN
|
159
|
+
}
|
160
|
+
|
161
|
+
|
93
162
|
@dataclass
|
94
163
|
class ColorConfigSetU:
|
95
164
|
ubuntu = {
|
pyhw/frontend/frontendBase.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
from .logo import Logo
|
2
2
|
from .color import ColorConfigSet, colorPrefix, colorSuffix, ColorSet
|
3
|
+
from ..pyhwUtil import getOS
|
4
|
+
from ..pyhwException import BackendException
|
5
|
+
import os
|
3
6
|
import re
|
4
7
|
|
5
8
|
|
@@ -16,6 +19,7 @@ class Printer:
|
|
16
19
|
self.__combined_lines = []
|
17
20
|
self.__logo_color_indexes = {}
|
18
21
|
self.__reg = r'\$(\d)'
|
22
|
+
self.__columns = self.__getColumns()
|
19
23
|
|
20
24
|
def cPrint(self):
|
21
25
|
self.__LogoPreprocess()
|
@@ -29,10 +33,39 @@ class Printer:
|
|
29
33
|
self.__combined_lines.append(logo_line)
|
30
34
|
|
31
35
|
for data_line in self.__processed_data_lines[len(self.__processed_logo_lines):]:
|
32
|
-
self.__combined_lines.append(" " * max_len_logo + data_line)
|
36
|
+
self.__combined_lines.append(" " * (max_len_logo + 1) + data_line)
|
37
|
+
|
38
|
+
self.__dropLongString()
|
33
39
|
|
34
40
|
print("\n".join(self.__combined_lines))
|
35
41
|
|
42
|
+
def __dropLongString(self):
|
43
|
+
# Need more accurate way to drop long strings
|
44
|
+
if getOS() == "linux":
|
45
|
+
fixed_lines = list()
|
46
|
+
for line in self.__combined_lines:
|
47
|
+
if len(line) > self.__columns+20:
|
48
|
+
fixed_lines.append(line[:self.__columns+20])
|
49
|
+
else:
|
50
|
+
fixed_lines.append(line)
|
51
|
+
self.__combined_lines = fixed_lines
|
52
|
+
else:
|
53
|
+
pass
|
54
|
+
|
55
|
+
|
56
|
+
@staticmethod
|
57
|
+
def __getColumns() -> int:
|
58
|
+
if getOS() == "linux":
|
59
|
+
try:
|
60
|
+
_, columns_str = os.popen('stty size', 'r').read().split()
|
61
|
+
columns = int(columns_str)
|
62
|
+
except:
|
63
|
+
columns = 80 # default terminal size is 80 columns
|
64
|
+
else:
|
65
|
+
# macOS default terminal size is 80 columns
|
66
|
+
columns = 80
|
67
|
+
return columns
|
68
|
+
|
36
69
|
def __LogoPreprocess(self):
|
37
70
|
global_color = self.__config.get("colors")[0]
|
38
71
|
for logo_line in self.__logo_lines:
|
@@ -63,7 +96,13 @@ class Printer:
|
|
63
96
|
self.__data_lines[0].split("@")[1] + colorSuffix())
|
64
97
|
self.__processed_data_lines.append(colorSuffix() + self.__data_lines[1])
|
65
98
|
for data_line in self.__data_lines[2:]:
|
66
|
-
|
99
|
+
try:
|
100
|
+
spl = data_line.split(": ")
|
101
|
+
name = spl[0]
|
102
|
+
value = "".join(spl[1:])
|
103
|
+
except:
|
104
|
+
print(data_line)
|
105
|
+
raise BackendException("Invalid data format")
|
67
106
|
self.__processed_data_lines.append(colorPrefix(ColorSet.COLOR_MODE_BOLD) + colorPrefix(keys_color) + name + ": " + colorSuffix() + value)
|
68
107
|
|
69
108
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
▄
|
2
|
+
▟█▙
|
3
|
+
▟███▙
|
4
|
+
▟█████▙
|
5
|
+
▟███████▙
|
6
|
+
▂▔▀▜██████▙
|
7
|
+
▟██▅▂▝▜█████▙
|
8
|
+
▟█████████████▙
|
9
|
+
▟███████████████▙
|
10
|
+
▟█████████████████▙
|
11
|
+
▟███████████████████▙
|
12
|
+
$2 ▟█████████▛▀▀▜████████▙
|
13
|
+
▟████████▛ ▜███████▙
|
14
|
+
▟█████████ ████████▙
|
15
|
+
▟██████████ █████▆▅▄▃▂
|
16
|
+
▟██████████▛ ▜█████████▙
|
17
|
+
▟██████▀▀▀ ▀▀██████▙
|
18
|
+
▟███▀▘ ▝▀███▙
|
19
|
+
▟▛▀ ▀▜▙
|
@@ -0,0 +1,14 @@
|
|
1
|
+
█ █ █ █ █ █ █ █ █ █ █
|
2
|
+
███████████████████████
|
3
|
+
▄▄██ ██▄▄
|
4
|
+
▄▄██ ███████████ ██▄▄
|
5
|
+
▄▄██ ██ ██ ██▄▄
|
6
|
+
▄▄██ ██ ██ ██▄▄
|
7
|
+
▄▄██ ██ ██ ██▄▄
|
8
|
+
▄▄██ █████████████ ██▄▄
|
9
|
+
▄▄██ ██ ██ ██▄▄
|
10
|
+
▄▄██ ██ ██ ██▄▄
|
11
|
+
▄▄██ ██ ██ ██▄▄
|
12
|
+
▄▄██ ██▄▄
|
13
|
+
███████████████████████
|
14
|
+
█ █ █ █ █ █ █ █ █ █ █
|
@@ -0,0 +1,19 @@
|
|
1
|
+
..
|
2
|
+
.PLTJ.
|
3
|
+
<><><><>
|
4
|
+
$2KKSSV' 4KKK $1LJ$4 KKKL.'VSSKK
|
5
|
+
$2KKV' 4KKKKK $1LJ$4 KKKKAL 'VKK
|
6
|
+
$2V' ' 'VKKKK $1LJ$4 KKKKV' ' 'V
|
7
|
+
$2.4MA.' 'VKK $1LJ$4 KKV' '.4Mb.
|
8
|
+
$4. $2KKKKKA.' 'V $1LJ$4 V' '.4KKKKK $3.
|
9
|
+
$4.4D $2KKKKKKKA.'' $1LJ$4 ''.4KKKKKKK $3FA.
|
10
|
+
$4<QDD ++++++++++++ $3++++++++++++ GFD>
|
11
|
+
'$4VD $3KKKKKKKK'.. $2LJ $1..'KKKKKKKK $3FV
|
12
|
+
$4' $3VKKKKK'. .4 $2LJ $1K. .'KKKKKV $3'
|
13
|
+
$3'VK'. .4KK $2LJ $1KKA. .'KV'
|
14
|
+
$3A. . .4KKKK $2LJ $1KKKKA. . .4
|
15
|
+
$3KKA. 'KKKKK $2LJ $1KKKKK' .4KK
|
16
|
+
$3KKSSA. VKKK $2LJ $1KKKV .4SSKK
|
17
|
+
$2<><><><>
|
18
|
+
$2'MKKM'
|
19
|
+
$2''
|