pyhw 0.7.4__py3-none-any.whl → 0.8.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. pyhw/__init__.py +1 -1
  2. pyhw/__main__.py +2 -2
  3. pyhw/backend/cpu/cpuBase.py +6 -3
  4. pyhw/backend/cpu/windows.py +48 -0
  5. pyhw/backend/gpu/gpuBase.py +8 -4
  6. pyhw/backend/gpu/windows.py +41 -0
  7. pyhw/backend/host/hostBase.py +5 -5
  8. pyhw/backend/host/hostInfo.py +17 -8
  9. pyhw/backend/host/windows.py +32 -1
  10. pyhw/backend/kernel/kernelBase.py +3 -2
  11. pyhw/backend/kernel/kernelInfo.py +6 -0
  12. pyhw/backend/kernel/windows.py +23 -1
  13. pyhw/backend/memory/memoryBase.py +8 -4
  14. pyhw/backend/memory/windows.py +36 -0
  15. pyhw/backend/nic/nicBase.py +8 -4
  16. pyhw/backend/nic/windows.py +44 -0
  17. pyhw/backend/npu/npuBase.py +8 -6
  18. pyhw/backend/npu/windows.py +40 -0
  19. pyhw/backend/os/osBase.py +6 -3
  20. pyhw/backend/os/osInfo.py +6 -0
  21. pyhw/backend/os/windows.py +35 -0
  22. pyhw/backend/shell/shellBase.py +4 -1
  23. pyhw/backend/shell/shellInfo.py +10 -0
  24. pyhw/backend/shell/unix.py +2 -10
  25. pyhw/backend/shell/windows.py +29 -0
  26. pyhw/backend/title/titleBase.py +2 -2
  27. pyhw/backend/title/titleInfo.py +9 -0
  28. pyhw/backend/title/unix.py +2 -9
  29. pyhw/backend/title/windows.py +10 -1
  30. pyhw/backend/uptime/linux.py +3 -3
  31. pyhw/backend/uptime/macos.py +3 -3
  32. pyhw/backend/uptime/uptimeBase.py +6 -3
  33. pyhw/backend/uptime/windows.py +49 -0
  34. pyhw/frontend/color/colorConfig.py +52 -0
  35. pyhw/frontend/logo/ascii/windows_10.pyhw +19 -0
  36. pyhw/frontend/logo/ascii/windows_11.pyhw +17 -0
  37. pyhw/frontend/logo/ascii/windows_2025.pyhw +17 -0
  38. pyhw/frontend/logo/ascii/windows_old.pyhw +16 -0
  39. pyhw/pyhwUtil/pyhwUtil.py +10 -3
  40. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/METADATA +6 -3
  41. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/RECORD +45 -31
  42. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/LICENSE +0 -0
  43. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/WHEEL +0 -0
  44. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/entry_points.txt +0 -0
  45. {pyhw-0.7.4.dist-info → pyhw-0.8.0.dist-info}/top_level.txt +0 -0
pyhw/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.7.4'
1
+ __version__ = '0.8.0'
pyhw/__main__.py CHANGED
@@ -17,8 +17,8 @@ from .pyhwUtil import getOS, selectOSLogo
17
17
 
18
18
  def main():
19
19
  current_os = getOS()
20
- if current_os not in ["linux", "macos", "freebsd"]:
21
- print(f"Only Linux, macOS, and FreeBSD is supported for now. Current os: {current_os}")
20
+ if current_os not in ["linux", "macos", "freebsd", "windows"]:
21
+ print(f"Only Linux, macOS, FreeBSD and Windows are supported for now. Current OS: {current_os}")
22
22
  return
23
23
  data = Data()
24
24
  data.title = TitleDetect(os=current_os).getTitle().title
@@ -1,6 +1,3 @@
1
- from .linux import CPUDetectLinux
2
- from .macos import CPUDetectMacOS
3
- from .bsd import CPUDetectBSD
4
1
  from ...pyhwException import OSUnsupportedException
5
2
 
6
3
 
@@ -10,10 +7,16 @@ class CPUDetect:
10
7
 
11
8
  def getCPUInfo(self):
12
9
  if self.OS == "linux":
10
+ from .linux import CPUDetectLinux
13
11
  return CPUDetectLinux().getCPUInfo()
14
12
  elif self.OS == "macos":
13
+ from .macos import CPUDetectMacOS
15
14
  return CPUDetectMacOS().getCPUInfo()
16
15
  elif self.OS == "freebsd":
16
+ from .bsd import CPUDetectBSD
17
17
  return CPUDetectBSD().getCPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import CPUDetectWindows
20
+ return CPUDetectWindows().getCPUInfo()
18
21
  else:
19
22
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,48 @@
1
+ import re
2
+ import os
3
+ import subprocess
4
+ from .cpuInfo import CPUInfo
5
+ import json
6
+
7
+
8
+ class CPUDetectWindows:
9
+ def __init__(self):
10
+ self.__cpuInfo = CPUInfo()
11
+
12
+ def getCPUInfo(self):
13
+ self.__getCPUInfo()
14
+ self.__modelClean()
15
+ if self.__cpuInfo.model == "":
16
+ self.__cpuInfo.model = "Unknown"
17
+ if self.__cpuInfo.model != "":
18
+ self.__cpuInfo.cpu = self.__cpuInfo.model
19
+ if self.__cpuInfo.cores != "":
20
+ self.__cpuInfo.cpu += f" ({self.__cpuInfo.cores})"
21
+ if self.__cpuInfo.frequency != "":
22
+ self.__cpuInfo.cpu += f" @ {self.__cpuInfo.frequency}"
23
+ return self.__cpuInfo
24
+
25
+ def __getCPUInfo(self):
26
+ COMMAND = "Get-CimInstance -ClassName Win32_Processor | Select-Object Name,NumberOfLogicalProcessors,MaxClockSpeed | ConvertTo-JSON"
27
+
28
+ try:
29
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
30
+ except subprocess.SubprocessError:
31
+ exit(-1)
32
+
33
+ res = json.loads(result.stdout)
34
+ name = res["Name"]
35
+ cores = res["NumberOfLogicalProcessors"]
36
+ frequency = round(int(res["MaxClockSpeed"]) / 1000.0, 2) # GHz
37
+ if "@" in name:
38
+ self.__cpuInfo.model = name.split("@")[0].strip()
39
+ else:
40
+ self.__cpuInfo.model = name
41
+ self.__cpuInfo.cores = str(cores)
42
+ self.__cpuInfo.frequency = f"{frequency:.2f} GHz"
43
+
44
+ def __modelClean(self):
45
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("(R)", "")
46
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("(TM)", "")
47
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("CPU ", "")
48
+
@@ -1,6 +1,4 @@
1
- from .linux import GPUDetectLinux
2
- from .macos import GPUDetectMacOS
3
- from .bsd import GPUDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class GPUDetect:
@@ -9,10 +7,16 @@ class GPUDetect:
9
7
 
10
8
  def getGPUInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import GPUDetectLinux
12
11
  return GPUDetectLinux().getGPUInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import GPUDetectMacOS
14
14
  return GPUDetectMacOS().getGPUInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import GPUDetectBSD
16
17
  return GPUDetectBSD().getGPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import GPUDetectWindows
20
+ return GPUDetectWindows().getGPUInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
22
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,41 @@
1
+ import subprocess
2
+ from .gpuInfo import GPUInfo
3
+ from ..cpu import CPUDetect
4
+ from ...pyhwUtil import getArch
5
+ import pypci
6
+
7
+
8
+ class GPUDetectWindows:
9
+ def __init__(self):
10
+ self.__gpuInfo = GPUInfo()
11
+
12
+ def getGPUInfo(self):
13
+ self.__getGPUInfo()
14
+ self.__sortGPUList()
15
+ return self.__gpuInfo
16
+
17
+ def __getGPUInfo(self):
18
+ gpu_devices = pypci.PCI().FindAllVGA()
19
+ if len(gpu_devices) == 0:
20
+ self.__handleNonePciDevices()
21
+ else:
22
+ for device in gpu_devices:
23
+ if device.subsystem_device_name != "":
24
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
25
+ else:
26
+ device_name = f"{device.vendor_name} {device.device_name}"
27
+ self.__gpuInfo.gpus.append(self.__gpuNameClean(device_name))
28
+ self.__gpuInfo.number += 1
29
+
30
+ def __handleNonePciDevices(self):
31
+ self.__gpuInfo.gpus.append("Not found")
32
+ self.__gpuInfo.number = 1
33
+
34
+ @staticmethod
35
+ def __gpuNameClean(gpu_name: str):
36
+ gpu_name_clean = gpu_name.replace("Corporation ", "")
37
+ return gpu_name_clean
38
+
39
+ def __sortGPUList(self):
40
+ self.__gpuInfo.gpus.sort()
41
+
@@ -1,7 +1,3 @@
1
- from .linux import HostDetectLinux
2
- from .macos import HostDetectMacOS
3
- from .windows import HostDetectWindows
4
- from .bsd import HostDetectBSD
5
1
  from ...pyhwException import OSUnsupportedException
6
2
 
7
3
 
@@ -11,12 +7,16 @@ class HostDetect:
11
7
 
12
8
  def getHostInfo(self):
13
9
  if self.OS == "linux":
10
+ from .linux import HostDetectLinux
14
11
  return HostDetectLinux().getHostInfo()
15
12
  elif self.OS == "macos":
13
+ from .macos import HostDetectMacOS
16
14
  return HostDetectMacOS().getHostInfo()
17
15
  elif self.OS == "freebsd":
16
+ from .bsd import HostDetectBSD
18
17
  return HostDetectBSD().getHostInfo()
19
18
  elif self.OS == "windows":
20
- pass
19
+ from .windows import HostDetectWindows
20
+ return HostDetectWindows().getHostInfo()
21
21
  else:
22
22
  raise OSUnsupportedException("Unsupported operating system")
@@ -3,11 +3,20 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class HostInfo:
6
- model = ""
7
- family = ""
8
- name = ""
9
- version = ""
10
- sku = ""
11
- serial = ""
12
- uuid = ""
13
- vendor = ""
6
+ """
7
+ HostInfo class to store host information.
8
+ """
9
+ def __init__(self):
10
+ """
11
+ Initialize HostInfo class, model attribute is required.
12
+ """
13
+ self.os = ""
14
+ self.model = ""
15
+ self.family = ""
16
+ self.name = ""
17
+ self.version = ""
18
+ self.sku = ""
19
+ self.serial = ""
20
+ self.uuid = ""
21
+ self.vendor = ""
22
+
@@ -1,5 +1,36 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
+ from ...pyhwUtil import getArch
5
+ from ...pyhwException import BackendException
6
+ from .hostInfo import HostInfo
7
+ import winreg
8
+
9
+
4
10
  class HostDetectWindows:
5
- pass
11
+ def __init__(self):
12
+ self._hostInfo = HostInfo()
13
+ self._arch = getArch()
14
+
15
+ def getHostInfo(self):
16
+ self._getModel()
17
+ return self._hostInfo
18
+
19
+ def _getModel(self):
20
+ try:
21
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\BIOS")
22
+ manufacturer, _ = winreg.QueryValueEx(key, "SystemManufacturer")
23
+ name, _ = winreg.QueryValueEx(key, "SystemProductName")
24
+ version, _ = winreg.QueryValueEx(key, "SystemVersion")
25
+ winreg.CloseKey(key)
26
+ except FileNotFoundError:
27
+ raise BackendException("Unable to retrieve system information.")
28
+ self._hostInfo.name = name
29
+ self._hostInfo.version = version
30
+ self._hostInfo.vendor = manufacturer
31
+ self.__handleVM()
32
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
33
+
34
+ def __handleVM(self):
35
+ if self._hostInfo.name.startswith("VMware"):
36
+ self._hostInfo.version = ""
@@ -1,4 +1,3 @@
1
- from .unix import KernelDetectUnix
2
1
  from ...pyhwException import OSUnsupportedException
3
2
 
4
3
 
@@ -8,8 +7,10 @@ class KernelDetect:
8
7
 
9
8
  def getKernelInfo(self):
10
9
  if self.OS in ["linux", "macos", "freebsd"]:
10
+ from .unix import KernelDetectUnix
11
11
  return KernelDetectUnix().getKernelInfo()
12
12
  elif self.OS == "windows":
13
- raise OSUnsupportedException("Unsupported operating system")
13
+ from .windows import KernelDetectWindows
14
+ return KernelDetectWindows().getKernelInfo()
14
15
  else:
15
16
  raise OSUnsupportedException("Unsupported operating system")
@@ -3,7 +3,13 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class KernelInfo:
6
+ """
7
+ Data class for storing kernel information.
8
+ """
6
9
  def __init__(self):
10
+ """
11
+ Initialize the data class, kernel attribute is required.
12
+ """
7
13
  self.name = ""
8
14
  self.version = ""
9
15
  self.machine = ""
@@ -1,7 +1,29 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
+ from .kernelInfo import KernelInfo
5
+ from ...pyhwException import BackendException
6
+ import platform
7
+ import winreg
4
8
 
5
9
 
6
10
  class KernelDetectWindows:
7
- pass
11
+ def __init__(self):
12
+ self.__kernelInfo = KernelInfo()
13
+
14
+ def getKernelInfo(self):
15
+ version = platform.version()
16
+ machine = platform.machine()
17
+ display = self.__get_windows_version()
18
+ self.__kernelInfo.kernel = f"{version} ({display}) {machine}"
19
+ return self.__kernelInfo
20
+
21
+ @staticmethod
22
+ def __get_windows_version():
23
+ try:
24
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
25
+ display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
26
+ winreg.CloseKey(key)
27
+ return str(display_version)
28
+ except:
29
+ raise BackendException("Unable to determine Windows kernel version.")
@@ -1,6 +1,4 @@
1
- from .linux import MemoryDetectLinux
2
- from .macos import MemoryDetectMacOS
3
- from .bsd import MemoryDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class MemoryDetect:
@@ -9,10 +7,16 @@ class MemoryDetect:
9
7
 
10
8
  def getMemoryInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import MemoryDetectLinux
12
11
  return MemoryDetectLinux().getMemoryInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import MemoryDetectMacOS
14
14
  return MemoryDetectMacOS().getMemoryInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import MemoryDetectBSD
16
17
  return MemoryDetectBSD().getMemoryInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import MemoryDetectWindows
20
+ return MemoryDetectWindows().getMemoryInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
22
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,36 @@
1
+ from ...pyhwException import BackendException
2
+ from .memoryInfo import MemoryInfo
3
+ import subprocess
4
+ import json
5
+
6
+
7
+ class MemoryDetectWindows:
8
+ def __init__(self):
9
+ self._memoryInfo = MemoryInfo()
10
+
11
+ def getMemoryInfo(self):
12
+ self._getMemory()
13
+ self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
14
+ return self._memoryInfo
15
+
16
+ def _getMemory(self):
17
+ COMMAND = 'Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object FreePhysicalMemory,TotalVisibleMemorySize | ConvertTo-JSON'
18
+ try:
19
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
20
+ except subprocess.SubprocessError:
21
+ raise BackendException("Failed to get memory information on Windows.")
22
+
23
+ res = json.loads(result.stdout)
24
+ free_memory = int(res['FreePhysicalMemory']) / 1024
25
+ total_memory = int(res['TotalVisibleMemorySize']) / 1024
26
+ used_memory = total_memory - free_memory
27
+ self._memoryInfo.total = round(total_memory, 2)
28
+ self._memoryInfo.available = round(free_memory, 2)
29
+ self._memoryInfo.used = round(used_memory, 2)
30
+
31
+
32
+
33
+
34
+
35
+
36
+
@@ -1,6 +1,4 @@
1
- from .linux import NICDetectLinux
2
- from .macos import NICDetectMacOS
3
- from .bsd import NICDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class NICDetect:
@@ -16,10 +14,16 @@ class NICDetect:
16
14
  :return: dataclass NICInfo, direct attr: nics
17
15
  """
18
16
  if self.OS == "linux":
17
+ from .linux import NICDetectLinux
19
18
  return NICDetectLinux().getNICInfo()
20
19
  elif self.OS == "macos":
20
+ from .macos import NICDetectMacOS
21
21
  return NICDetectMacOS().getNICInfo()
22
22
  elif self.OS == "freebsd":
23
+ from .bsd import NICDetectBSD
23
24
  return NICDetectBSD().getNICInfo()
25
+ elif self.OS == "windows":
26
+ from .windows import NICDetectWindows
27
+ return NICDetectWindows().getNICInfo()
24
28
  else:
25
- raise NotImplementedError("Unsupported operating system")
29
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,44 @@
1
+ import subprocess
2
+ from .nicInfo import NICInfo
3
+ from ...pyhwUtil import getArch
4
+ from ...pyhwException import BackendException
5
+ import pypci
6
+ import os
7
+
8
+
9
+ class NICDetectWindows:
10
+ def __init__(self):
11
+ self._nicInfo = NICInfo()
12
+
13
+ def getNICInfo(self):
14
+ self._getNICInfo()
15
+ self._sortNICList()
16
+ return self._nicInfo
17
+
18
+ def _getNICInfo(self):
19
+ nic_devices = pypci.PCI().FindAllNIC()
20
+ if len(nic_devices) == 0:
21
+ self.__handleNonePciDevices()
22
+ else:
23
+ for device in nic_devices:
24
+ if device.subsystem_device_name != "":
25
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
26
+ else:
27
+ device_name = f"{device.vendor_name} {device.device_name}"
28
+ self._nicInfo.nics.append(self._nicNameClean(device_name))
29
+ self._nicInfo.number += 1
30
+
31
+ def __handleNonePciDevices(self):
32
+ # need to update
33
+ self._nicInfo.nics.append("Not found")
34
+ self._nicInfo.number = 1
35
+
36
+ @staticmethod
37
+ def _nicNameClean(nic_name: str):
38
+ nic_name_clean = nic_name.replace("Corporation ", "")
39
+ return nic_name_clean
40
+
41
+ def _sortNICList(self):
42
+ return self._nicInfo.nics.sort()
43
+
44
+
@@ -1,6 +1,4 @@
1
- from .linux import NPUDetectLinux
2
- from .macos import NPUDetectMacOS
3
- from .bsd import NPUDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class NPUDetect:
@@ -9,12 +7,16 @@ class NPUDetect:
9
7
 
10
8
  def getNPUInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import NPUDetectLinux
12
11
  return NPUDetectLinux().getNPUInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import NPUDetectMacOS
14
14
  return NPUDetectMacOS().getNPUInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import NPUDetectBSD
16
17
  return NPUDetectBSD().getNPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import NPUDetectWindows
20
+ return NPUDetectWindows().getNPUInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
19
-
20
-
22
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,40 @@
1
+ from .npuInfo import NPUInfo
2
+ import pypci
3
+
4
+
5
+ class NPUDetectWindows:
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()
39
+
40
+
pyhw/backend/os/osBase.py CHANGED
@@ -1,6 +1,3 @@
1
- from .linux import OSDetectLinux
2
- from .macos import OSDetectMacOS
3
- from .bsd import OSDetectBSD
4
1
  from ...pyhwException import OSUnsupportedException
5
2
 
6
3
 
@@ -10,10 +7,16 @@ class OSDetect:
10
7
 
11
8
  def getOSInfo(self):
12
9
  if self.__OS == "linux":
10
+ from .linux import OSDetectLinux
13
11
  return OSDetectLinux().getOSInfo()
14
12
  elif self.__OS == "macos":
13
+ from .macos import OSDetectMacOS
15
14
  return OSDetectMacOS().getOSInfo()
16
15
  elif self.__OS == "freebsd":
16
+ from .bsd import OSDetectBSD
17
17
  return OSDetectBSD().getOSInfo()
18
+ elif self.__OS == "windows":
19
+ from .windows import OSDetectWindows
20
+ return OSDetectWindows().getOSInfo()
18
21
  else:
19
22
  raise OSUnsupportedException("Unsupported operating system")
pyhw/backend/os/osInfo.py CHANGED
@@ -3,7 +3,13 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class OSInfo:
6
+ """
7
+ Dataclass to hold the OS information
8
+ """
6
9
  def __init__(self):
10
+ """
11
+ Initialize the dataclass, prettyName and id attributes are required.
12
+ """
7
13
  self.prettyName = ""
8
14
  self.name = ""
9
15
  self.id = ""
@@ -0,0 +1,35 @@
1
+ from .osInfo import OSInfo
2
+ from ...pyhwException import BackendException
3
+ import platform
4
+ import winreg
5
+
6
+
7
+ class OSDetectWindows:
8
+ def __init__(self):
9
+ self._osInfo = OSInfo()
10
+
11
+ def getOSInfo(self):
12
+ system = platform.system()
13
+ release = platform.release()
14
+ edition = platform.win32_edition()
15
+ machine = platform.machine()
16
+ display = self.__get_windows_version()
17
+ self._osInfo.prettyName = f"{system} {release} {display} ({edition}) {machine}"
18
+ if release == "10":
19
+ self._osInfo.id = "windows_10"
20
+ elif release == "11":
21
+ self._osInfo.id = "windows_11"
22
+ else:
23
+ self._osInfo.id = "windows_old"
24
+ return self._osInfo
25
+
26
+ @staticmethod
27
+ def __get_windows_version():
28
+ try:
29
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
30
+ display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
31
+ winreg.CloseKey(key)
32
+ return str(display_version)
33
+ except:
34
+ raise BackendException("Unable to determine Windows kernel version.")
35
+
@@ -1,4 +1,3 @@
1
- from .unix import ShellDetectUnix
2
1
  from ...pyhwException import OSUnsupportedException
3
2
 
4
3
 
@@ -8,6 +7,10 @@ class ShellDetect:
8
7
 
9
8
  def getShellInfo(self):
10
9
  if self.OS in ["linux", "macos", "freebsd"]:
10
+ from .unix import ShellDetectUnix
11
11
  return ShellDetectUnix().getShellInfo()
12
+ elif self.OS == "windows":
13
+ from .windows import ShellDetectWindows
14
+ return ShellDetectWindows().getShellInfo()
12
15
  else:
13
16
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,10 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class ShellInfo:
6
+ def __init__(self):
7
+ self.shell = ""
8
+ self.version = ""
9
+ self.path = ""
10
+ self.info = ""
@@ -2,22 +2,14 @@
2
2
  In dev.
3
3
  """
4
4
  from ...pyhwUtil import getDocker
5
- from dataclasses import dataclass
5
+ from .shellInfo import ShellInfo
6
6
  import os
7
7
  import subprocess
8
8
 
9
9
 
10
- @dataclass
11
- class ShellInfoUnix:
12
- shell = ""
13
- version = ""
14
- path = ""
15
- info = ""
16
-
17
-
18
10
  class ShellDetectUnix:
19
11
  def __init__(self):
20
- self.__shellInfo = ShellInfoUnix()
12
+ self.__shellInfo = ShellInfo()
21
13
 
22
14
  def getShellInfo(self):
23
15
  if getDocker():
@@ -0,0 +1,29 @@
1
+ """
2
+ In dev.
3
+ """
4
+ from ...pyhwException import BackendException
5
+ from .shellInfo import ShellInfo
6
+ import json
7
+ import subprocess
8
+
9
+
10
+ class ShellDetectWindows:
11
+ def __init__(self):
12
+ self.__shellInfo = ShellInfo()
13
+
14
+ def getShellInfo(self):
15
+ COMMAND = "$PSVersionTable.PSVersion | ConvertTo-JSON"
16
+
17
+ try:
18
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
19
+ except subprocess.SubprocessError:
20
+ raise BackendException("Error running PowerShell command.")
21
+
22
+ res = json.loads(result.stdout)
23
+ major = res["Major"]
24
+ minor = res["Minor"]
25
+
26
+ self.__shellInfo.shell = "PowerShell"
27
+ self.__shellInfo.version = f"{major}.{minor}"
28
+ self.__shellInfo.info = f"PowerShell {major}.{minor}"
29
+ return self.__shellInfo
@@ -1,5 +1,3 @@
1
- from .unix import TitleDetectUnix
2
- from .windows import TitleDetectWindows
3
1
  from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
@@ -9,8 +7,10 @@ class TitleDetect:
9
7
 
10
8
  def getTitle(self):
11
9
  if self.OS in ["linux", "macos", "freebsd"]:
10
+ from .unix import TitleDetectUnix
12
11
  return TitleDetectUnix().getTitle()
13
12
  elif self.OS == "windows":
13
+ from .windows import TitleDetectWindows
14
14
  return TitleDetectWindows().getTitle()
15
15
  else:
16
16
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,9 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class TitleInfo:
6
+ def __init__(self):
7
+ self.username = ""
8
+ self.hostname = ""
9
+ self.title = ""
@@ -2,19 +2,12 @@
2
2
  In dev.
3
3
  """
4
4
  import subprocess
5
- from dataclasses import dataclass
6
-
7
-
8
- @dataclass
9
- class TitleInfoUnix:
10
- username = ""
11
- hostname = ""
12
- title = ""
5
+ from .titleInfo import TitleInfo
13
6
 
14
7
 
15
8
  class TitleDetectUnix:
16
9
  def __init__(self):
17
- self.__titleInfo = TitleInfoUnix()
10
+ self.__titleInfo = TitleInfo()
18
11
 
19
12
  def getTitle(self):
20
13
  self.__getTitle()
@@ -1,8 +1,17 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
+ from .titleInfo import TitleInfo
5
+ import getpass
6
+ import platform
4
7
 
5
8
 
6
9
  class TitleDetectWindows:
10
+ def __init__(self):
11
+ self.__titleInfo = TitleInfo()
12
+
7
13
  def getTitle(self):
8
- pass
14
+ self.__titleInfo.username = getpass.getuser()
15
+ self.__titleInfo.hostname = platform.node()
16
+ self.__titleInfo.title = f"{self.__titleInfo.username}@{self.__titleInfo.hostname}"
17
+ return self.__titleInfo
@@ -24,8 +24,8 @@ class UptimeDetectLinux:
24
24
  seconds = int(seconds)
25
25
  if days == 0:
26
26
  if hours == 0:
27
- self.__uptimeInfo.uptime = f"{minutes} min {seconds} sec"
27
+ self.__uptimeInfo.uptime = f"{minutes} mins {seconds} secs"
28
28
  else:
29
- self.__uptimeInfo.uptime = f"{hours} hours {minutes} min {seconds} sec"
29
+ self.__uptimeInfo.uptime = f"{hours} hours {minutes} mins {seconds} secs"
30
30
  else:
31
- self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} min {seconds} sec"
31
+ self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {seconds} secs"
@@ -22,11 +22,11 @@ class UptimeDetectMacOS:
22
22
  seconds = int(seconds)
23
23
  if days == 0:
24
24
  if hours == 0:
25
- self._uptimeInfo.uptime = f"{minutes} min {seconds} sec"
25
+ self._uptimeInfo.uptime = f"{minutes} mins {seconds} secs"
26
26
  else:
27
- self._uptimeInfo.uptime = f"{hours} hours {minutes} min {seconds} sec"
27
+ self._uptimeInfo.uptime = f"{hours} hours {minutes} mins {seconds} secs"
28
28
  else:
29
- self._uptimeInfo.uptime = f"{days} days {hours} hours {minutes} min {seconds} sec"
29
+ self._uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {seconds} secs"
30
30
  return self._uptimeInfo
31
31
 
32
32
  def _getUptime(self):
@@ -1,6 +1,3 @@
1
- from .linux import UptimeDetectLinux
2
- from .macos import UptimeDetectMacOS
3
- from .bsd import UptimeDetectBSD
4
1
  from ...pyhwException import OSUnsupportedException
5
2
 
6
3
 
@@ -17,10 +14,16 @@ class UptimeDetect:
17
14
  :return: dataclass UptimeInfo, direct attr: uptime
18
15
  """
19
16
  if self.OS == "linux":
17
+ from .linux import UptimeDetectLinux
20
18
  return UptimeDetectLinux().getUptimeInfo()
21
19
  elif self.OS == "macos":
20
+ from .macos import UptimeDetectMacOS
22
21
  return UptimeDetectMacOS().getUptimeInfo()
23
22
  elif self.OS == "freebsd":
23
+ from .bsd import UptimeDetectBSD
24
24
  return UptimeDetectBSD().getUptimeInfo()
25
+ elif self.OS == "windows":
26
+ from .windows import UptimeDetectWindows
27
+ return UptimeDetectWindows().getUptimeInfo()
25
28
  else:
26
29
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,49 @@
1
+ from ...pyhwException import BackendException
2
+ from .uptimeInfo import UptimeInfo
3
+ import subprocess
4
+ import json
5
+ import re
6
+ from datetime import datetime
7
+
8
+
9
+ class UptimeDetectWindows:
10
+ def __init__(self):
11
+ self.__uptimeInfo = UptimeInfo()
12
+
13
+ def getUptimeInfo(self):
14
+ self.__getUptime()
15
+ return self.__uptimeInfo
16
+
17
+ def __getUptime(self):
18
+ COMMAND = 'Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object LastBootUpTime | ConvertTo-JSON'
19
+ try:
20
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
21
+ except subprocess.SubprocessError:
22
+ raise BackendException("Error while getting system uptime")
23
+
24
+ res = json.loads(result.stdout)
25
+ timestamp_str = res['LastBootUpTime']
26
+ match = re.search(r'\d+', timestamp_str)
27
+
28
+ if match:
29
+ timestamp_ms = int(match.group(0))
30
+ last_boot_time = datetime.utcfromtimestamp(timestamp_ms / 1000)
31
+ current_time = datetime.utcnow()
32
+ uptime = current_time - last_boot_time
33
+ days = uptime.days
34
+ seconds = uptime.seconds
35
+ hours = seconds // 3600
36
+ minutes = (seconds % 3600) // 60
37
+ secs = (seconds % 3600) % 60
38
+
39
+ if days == 0:
40
+ if hours == 0:
41
+ self.__uptimeInfo.uptime = f"{minutes} mins {secs} secs"
42
+ else:
43
+ self.__uptimeInfo.uptime = f"{hours} hours {minutes} mins {secs} secs"
44
+ else:
45
+ self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} mins {secs} secs"
46
+ else:
47
+ raise BackendException("Error while getting system uptime")
48
+
49
+
@@ -33,6 +33,14 @@ class ColorConfigSet:
33
33
  return ColorConfigSetC.centos
34
34
  elif self.__os_name == "freebsd":
35
35
  return ColorConfigSetF.freebsd
36
+ elif self.__os_name == "windows_old":
37
+ return ColorConfigSetW.windows_old
38
+ elif self.__os_name == "windows_10":
39
+ return ColorConfigSetW.windows_10
40
+ elif self.__os_name == "windows_11":
41
+ return ColorConfigSetW.windows_11
42
+ elif self.__os_name == "windows_2025":
43
+ return ColorConfigSetW.windows_2025
36
44
  else:
37
45
  return ColorConfigSetL.linux # default to Linux
38
46
 
@@ -176,3 +184,47 @@ class ColorConfigSetU:
176
184
  "colorKeys": ColorSet.COLOR_FG_RED,
177
185
  "colorTitle": ColorSet.COLOR_FG_RED
178
186
  }
187
+
188
+
189
+ @dataclass
190
+ class ColorConfigSetW:
191
+ windows_old = {
192
+ "colors": [
193
+ ColorSet.COLOR_FG_RED,
194
+ ColorSet.COLOR_FG_GREEN,
195
+ ColorSet.COLOR_FG_BLUE,
196
+ ColorSet.COLOR_FG_YELLOW
197
+ ],
198
+ "colorKeys": ColorSet.COLOR_FG_BLUE,
199
+ "colorTitle": ColorSet.COLOR_FG_GREEN
200
+ }
201
+ windows_10 = {
202
+ "colors": [
203
+ ColorSet.COLOR_FG_CYAN,
204
+ ColorSet.COLOR_FG_CYAN,
205
+ ColorSet.COLOR_FG_CYAN,
206
+ ColorSet.COLOR_FG_CYAN
207
+ ],
208
+ "colorKeys": ColorSet.COLOR_FG_YELLOW,
209
+ "colorTitle": ColorSet.COLOR_FG_GREEN
210
+ }
211
+ windows_11 = {
212
+ "colors": [
213
+ ColorSet.COLOR_FG_BLUE,
214
+ ColorSet.COLOR_FG_BLUE,
215
+ ColorSet.COLOR_FG_BLUE,
216
+ ColorSet.COLOR_FG_BLUE
217
+ ],
218
+ "colorKeys": ColorSet.COLOR_FG_YELLOW,
219
+ "colorTitle": ColorSet.COLOR_FG_CYAN
220
+ }
221
+ windows_2025 = {
222
+ "colors": [
223
+ ColorSet.COLOR_FG_BLUE,
224
+ ColorSet.COLOR_FG_BLUE,
225
+ ColorSet.COLOR_FG_BLUE,
226
+ ColorSet.COLOR_FG_BLUE
227
+ ],
228
+ "colorKeys": ColorSet.COLOR_FG_YELLOW,
229
+ "colorTitle": ColorSet.COLOR_FG_CYAN
230
+ }
@@ -0,0 +1,19 @@
1
+ $2..,
2
+ ....,,:;+ccllll
3
+ $1 ...,,+:; $2cllllllllllllllllll
4
+ $1,cclllllllllll $2lllllllllllllllllll
5
+ $1llllllllllllll $2lllllllllllllllllll
6
+ $1llllllllllllll $2lllllllllllllllllll
7
+ $1llllllllllllll $2lllllllllllllllllll
8
+ $1llllllllllllll $2lllllllllllllllllll
9
+ $1llllllllllllll $2lllllllllllllllllll
10
+
11
+ $3llllllllllllll $4lllllllllllllllllll
12
+ $3llllllllllllll $4lllllllllllllllllll
13
+ $3llllllllllllll $4lllllllllllllllllll
14
+ $3llllllllllllll $4lllllllllllllllllll
15
+ $3llllllllllllll $4lllllllllllllllllll
16
+ $3`'ccllllllllll $4lllllllllllllllllll
17
+ $3 `' \*:: $4:ccllllllllllllllll
18
+ ````''*::cll
19
+ ``
@@ -0,0 +1,17 @@
1
+ $1///////////////// $2/////////////////
2
+ $1///////////////// $2/////////////////
3
+ $1///////////////// $2/////////////////
4
+ $1///////////////// $2/////////////////
5
+ $1///////////////// $2/////////////////
6
+ $1///////////////// $2/////////////////
7
+ $1///////////////// $2/////////////////
8
+ $1///////////////// $2/////////////////
9
+
10
+ $3///////////////// $4/////////////////
11
+ $3///////////////// $4/////////////////
12
+ $3///////////////// $4/////////////////
13
+ $3///////////////// $4/////////////////
14
+ $3///////////////// $4/////////////////
15
+ $3///////////////// $4/////////////////
16
+ $3///////////////// $4/////////////////
17
+ $3///////////////// $4/////////////////
@@ -0,0 +1,17 @@
1
+ $1 ##%%%%%%%%% $2%%%%%%%%%##
2
+ $1 ###%%%%%%%%%% $2%%%%%%%%%%###
3
+ $1 ####%%%%%%%%%%% $2%%%%%%%%%%%####
4
+ $1 ##%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%##
5
+ $1#%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%#
6
+ $1%%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%%
7
+ $1%%%%%%%%%%%%%%%%% $2%%%%%%%%%%%%%%%%%
8
+ $1%%%%%%%%%%%%%%%%% $2#%%%%%%%%%%%%%%%%
9
+
10
+ $3%%%%%%%%%%%%%%%%% $4#%%%%%%%%%%%%%%%%
11
+ $3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%%
12
+ $3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%%
13
+ $3%%%%%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%%#
14
+ $3 ###%%%%%%%%%%%%% $4%%%%%%%%%%%%%%%##
15
+ $3 ####%%%%%%%%%%% $4%%%%%%%%%%%#%####
16
+ $3 ##%#%%%%%%%%% $4%%%%%%%%%%%######
17
+ $3 ##%%%%%%%%% $4%%%%%%%%%########
@@ -0,0 +1,16 @@
1
+ $1 ,.=:!!t3Z3z.,
2
+ :tt:::tt333EE3
3
+ $1 Et:::ztt33EEEL$2 @Ee., ..,
4
+ $1 ;tt:::tt333EE7$2 ;EEEEEEttttt33#
5
+ $1 :Et:::zt333EEQ.$2 $EEEEEttttt33QL
6
+ $1 it::::tt333EEF$2 @EEEEEEttttt33F
7
+ $1 ;3=*^```"*4EEV$2 :EEEEEEttttt33@.
8
+ $3 ,.=::::!t=., $1`$2 @EEEEEEtttz33QF
9
+ $3 ;::::::::zt33)$2 "4EEEtttji3P*
10
+ $3 :t::::::::tt33.$4:Z3z..$2 ``$4 ,..g.
11
+ $3 i::::::::zt33F$4 AEEEtttt::::ztF
12
+ $3 ;:::::::::t33V$4 ;EEEttttt::::t3
13
+ $3 E::::::::zt33L$4 @EEEtttt::::z3F
14
+ $3{3=*^```"*4E3)$4 ;EEEtttt:::::tZ`
15
+ $3 `$4 :EEEEtttt::::z7
16
+ "VEzjt:;;z>*`
pyhw/pyhwUtil/pyhwUtil.py CHANGED
@@ -173,8 +173,10 @@ def createDataStringOld(data: Data):
173
173
 
174
174
  @dataclass
175
175
  class SupportedOS:
176
- ColorConfig = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd"]
177
- AsciiLogo = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd"]
176
+ ColorConfig = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd",
177
+ "windows_old", "windows_10", "windows_11", "windows_2025"]
178
+ AsciiLogo = ["armbian", "arch", "alpine", "centos", "debian", "fedora", "macOS", "raspbian", "ubuntu", "freebsd",
179
+ "windows_old", "windows_10", "windows_11", "windows_2025"]
178
180
 
179
181
 
180
182
  def selectOSLogo(os_id: str):
@@ -183,8 +185,13 @@ def selectOSLogo(os_id: str):
183
185
  :param os_id: str, os id.
184
186
  :return: str, logo id.
185
187
  """
186
- if getOS() == "macos":
188
+ if getOS() == "macos": # macOS does not have small logo
187
189
  return os_id
190
+ if getOS() == "windows": # windows does not have small logo
191
+ if os_id in SupportedOS.ColorConfig and os_id in SupportedOS.AsciiLogo:
192
+ return os_id
193
+ else:
194
+ return "windows_11"
188
195
  if os_id in SupportedOS.ColorConfig and os_id in SupportedOS.AsciiLogo:
189
196
  pass
190
197
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyhw
3
- Version: 0.7.4
3
+ Version: 0.8.0
4
4
  Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
5
5
  Author-email: Xiao Ran <xiaoran.007@icloud.com>
6
6
  License: BSD-3-Clause
@@ -13,21 +13,23 @@ Classifier: Operating System :: OS Independent
13
13
  Requires-Python: >=3.9
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: pypci-ng>=0.0.10
16
+ Requires-Dist: pypci-ng>=0.1.2
17
17
 
18
18
  # PyHw
19
19
  [![Downloads](https://static.pepy.tech/badge/pyhw)](https://pepy.tech/project/pyhw)
20
20
  ![PyPI - Version](https://img.shields.io/pypi/v/pyhw?label=version)
21
+ ![Static Badge](https://img.shields.io/badge/Python-3.9%2B-green)
21
22
 
22
23
  ![Static Badge](https://img.shields.io/badge/macOS-11%2B-green)
23
24
  ![Static Badge](https://img.shields.io/badge/Linux-blue)
24
25
  ![Static Badge](https://img.shields.io/badge/FreeBSD-red)
26
+ ![Static Badge](https://img.shields.io/badge/Windows-yellow)
25
27
 
26
28
  ![Static Badge](https://img.shields.io/badge/amd64-green)
27
29
  ![Static Badge](https://img.shields.io/badge/arm-blue)
28
30
 
29
31
 
30
- PyHw, a neofetch-like command line tool for fetching system information but written mostly in Python. **Currently, this project is still in the initial stage, only Linux, macOS, and FreeBSD are supported.**
32
+ PyHw, a neofetch-like command line tool for fetching system information but written mostly in Python. **Currently, this project is still in the initial stage, only Linux, macOS, FreeBSD and Windows are supported.**
31
33
 
32
34
  This project is a Python reimplementation of [neofetch](https://github.com/dylanaraps/neofetch) and references the [fastfetch](https://github.com/fastfetch-cli/fastfetch) project for logo style settings. Since this project is implemented in Python, it will be easier to maintain and extend than bash and c implementation. Also, this project only relies on the Python standard library, so you can run it on any device that has a Python environment (I hope so 🤔).
33
35
 
@@ -96,6 +98,7 @@ This is due to the fact that system python is not supposed to be managed by pip.
96
98
  * macOS arm64, x86_64
97
99
  * Linux arm64, x86_64
98
100
  * FreeBSD arm64
101
+ * Windows 10 X86_64
99
102
 
100
103
  ## Add Logo
101
104
  1. Create a file named **\<os>.pyhw** in **logo/ascii** folder
@@ -1,73 +1,83 @@
1
- pyhw/__init__.py,sha256=lBlBxbnftiADKPpC3XRA3jUPjRsVclCd3P95aQ33p_g,22
2
- pyhw/__main__.py,sha256=A0t0jkcwdTXd6ca7POUfm8krjCn2FQaXTIss5gNmNcI,1775
1
+ pyhw/__init__.py,sha256=27YY3zFpeaDh6JoC40AqkjBrn68SqFlsWZzjZtw5jwU,22
2
+ pyhw/__main__.py,sha256=AYSSricHPScjYNF-LgFHfQUqKcxq8FruDW2a89FAXfA,1795
3
3
  pyhw/backend/__init__.py,sha256=knn_3Yroow1h0dqdrozk3zyy3vz-kQyNBRjR6OLmVoY,50
4
4
  pyhw/backend/backendBase.py,sha256=mloo8mPEbgbIdmyQ3I4vdEXMSSjxWi_wnwACmzvHbEo,506
5
5
  pyhw/backend/cpu/__init__.py,sha256=5YfANJVRwNwTRodG0ENOgusrdN592aaSnfq5ok4dKTo,56
6
6
  pyhw/backend/cpu/bsd.py,sha256=Ls97NAsvZGVJj3_fBUcYXjY2gsZvFKhXYtkTHxVVXSs,288
7
- pyhw/backend/cpu/cpuBase.py,sha256=u9kQORv8RJ9BLjG219wNTgBAivHy_lUll4Bkk6TBlXY,576
7
+ pyhw/backend/cpu/cpuBase.py,sha256=2YAOz1K8VLKtLY7iYBxUV9Ikuf4I4d4YivocvZDrdUU,748
8
8
  pyhw/backend/cpu/cpuInfo.py,sha256=A_nNGElq9W7oZ5DFJowLdFBE0ZvXKr5h29E6TGAvbRc,251
9
9
  pyhw/backend/cpu/linux.py,sha256=zJ2cOwQHtolJrMMY1WXVbLLIRNPxeClUgzLAAkd7As4,3346
10
10
  pyhw/backend/cpu/macos.py,sha256=pacU-yT7q-HKerkh2Q0BSdzSY6dKzHfSnRZBmimqqXk,2953
11
+ pyhw/backend/cpu/windows.py,sha256=A3oIvVUVMGPEqiM9QBiK0OwElcEf1LDhNi_23AimooQ,1723
11
12
  pyhw/backend/gpu/__init__.py,sha256=EpMjPvUaXt0LTNMvGmB8WgXbUB9keCxuOhu8NT3Re6o,56
12
13
  pyhw/backend/gpu/bsd.py,sha256=hNFiCek770CXOh3DK3I3-g272-a1S5D7LolGJBsLXaU,124
13
- pyhw/backend/gpu/gpuBase.py,sha256=DyY1bVrsaWczkbrrN6J7kG-Kh9yic3Lqww8yLZNCet8,521
14
+ pyhw/backend/gpu/gpuBase.py,sha256=ZPT9o7PhYpzlwign0GsCT519F9DGx-1UEMVVOM8MV_k,748
14
15
  pyhw/backend/gpu/gpuInfo.py,sha256=d_z_z5DiZAg85wP0VOBQEU0QHdaK3qFqA2Tp9Eq8-Zs,133
15
16
  pyhw/backend/gpu/linux.py,sha256=E-evoL-spQbHB8JvbZXSq5ypc2SeePVUPnhEQrSPQpg,1619
16
17
  pyhw/backend/gpu/macos.py,sha256=SmTqqTrIMRW-GVPmDs8xAiOX7HsCjrGh9qkxLQCdvO8,3850
18
+ pyhw/backend/gpu/windows.py,sha256=Hv-vtWQGKv6_Nxc8raEBq7NNm5TR6xg6x6BK3Aa2uP4,1249
17
19
  pyhw/backend/host/__init__.py,sha256=Efaj7-Oya7H8HdpZHQCLrwn-mcfPb-d6yfh4dzsE_7I,58
18
20
  pyhw/backend/host/bsd.py,sha256=9gKnM6yysHBKwS3EQvb0pCeylh3dzHvoEuPe14zo9wQ,382
19
- pyhw/backend/host/hostBase.py,sha256=Dt3zZjkL6iUM9eOKkPUBAZ_2Lx-GQSIjsQhkLmjCUAk,678
20
- pyhw/backend/host/hostInfo.py,sha256=Xvz0LugPiCSWMkcDsp4p2rrojYFZauL6Q-gCZ6NLz5k,184
21
+ pyhw/backend/host/hostBase.py,sha256=gM49SY6rEaxec_0bUOMk7QlEfR7vjfWp3BXEUqgdncc,762
22
+ pyhw/backend/host/hostInfo.py,sha256=grz15M2t3f_enqQvc7Qn6HlEfYwa66bu2NYvm8VpJ-g,452
21
23
  pyhw/backend/host/linux.py,sha256=vGIl1b61vB-uilPk6awPOIWRaxnIsR43L20sNHeM5bI,2824
22
24
  pyhw/backend/host/macos.py,sha256=KW-EJK9g1xHNrFsVxJv5GPLpc_ZevX0Zv1WjZUzRkzo,15369
23
- pyhw/backend/host/windows.py,sha256=rjDJaIs-5zspzFsNCMCh6m2yZXEXI0vccqeBpmAdEBk,53
25
+ pyhw/backend/host/windows.py,sha256=qn2QiTK2wIijyyw_QKdiSizY3teyS-9RNBu5RxEPRSw,1185
24
26
  pyhw/backend/kernel/__init__.py,sha256=fGjwjpOhwA_PnsWbwoq102hwhTay2ufYKaTqxjSV2-I,65
25
- pyhw/backend/kernel/kernelBase.py,sha256=ZUj5wqar9mLUlIYrTDzyCWjrwzGtP6WJIIAXy5v1zhM,490
26
- pyhw/backend/kernel/kernelInfo.py,sha256=QQYni0IVeFZ2IVNDC06U728Q01Rq3R6qRDYCxMjtJrY,189
27
+ pyhw/backend/kernel/kernelBase.py,sha256=3ZmkRkvwoWk3R-by2cgBlZnMSQzVjTC8Owmv53Pm4II,539
28
+ pyhw/backend/kernel/kernelInfo.py,sha256=Nkumd0McbimCjc7yJrvz6bcwpWu1Tdo_LKomjZr7Jgk,341
27
29
  pyhw/backend/kernel/unix.py,sha256=XDV2GIjamERcmlrQFaKFZY-OJO1xj76Im_7lmg2uFzo,1192
28
- pyhw/backend/kernel/windows.py,sha256=lxZ7T9Ea0Qbq3pf_TjSAHSM2YTozC6ivv7dKdLOTl3s,58
30
+ pyhw/backend/kernel/windows.py,sha256=RY0Cwwn_eJP4iP43gHLjcQzhwwdU4yc2NGLDajbmtvI,900
29
31
  pyhw/backend/memory/__init__.py,sha256=zGBWxfPAAk8ivCBWPLJIpuD-lB7wUJT3x8u2jHiAoCY,65
30
32
  pyhw/backend/memory/bsd.py,sha256=GKTCs6RocdoWj-5ZZRMB4xAWGWljor6leuwX-L-7bW0,251
31
33
  pyhw/backend/memory/linux.py,sha256=kxP0LxXdTWYRtu9nDyKqZeIzZrQI84kVOPMeN1GwSOo,917
32
34
  pyhw/backend/memory/macos.py,sha256=ur2HxmmmVkXmaxEcw_otphifVp_csfNMJdgt-idCq7M,2770
33
- pyhw/backend/memory/memoryBase.py,sha256=wl6zN3-U_jRNsaWM9szWPvWjiq3Ca8Rcm-aMRdAJge8,554
35
+ pyhw/backend/memory/memoryBase.py,sha256=trubcJ_7JD_FnrKefUycPFd4OZMFj3Rk75ih5YVsSXg,790
34
36
  pyhw/backend/memory/memoryInfo.py,sha256=OQF165uEyuapAsi7cKacQYDRnKdrQHeldfyFwzS9N2g,186
37
+ pyhw/backend/memory/windows.py,sha256=T_yWJCu-joWvXXuaIgnMRGaDtsp-frQD_cx8IFVgdpA,1208
35
38
  pyhw/backend/metal/t.py,sha256=52yv-JoXNfaIOfcxEEidIg0MoyFtzWvTRm550kQKPZA,391
36
39
  pyhw/backend/nic/__init__.py,sha256=eP4eOYIvMF3LcTf954hJa6TnB8R4Qahss2g-UcgypKY,57
37
40
  pyhw/backend/nic/bsd.py,sha256=lIXnPqzSA2qexUt0P9OHMmxoI5c5XBi2V80RY9S0wsM,135
38
41
  pyhw/backend/nic/linux.py,sha256=3H91Nw87frzZA4P6Q5GbjHSaI7q4Q5-v6R8BgdvplgQ,1976
39
42
  pyhw/backend/nic/macos.py,sha256=63gZjSmUGwGqfs41IWrEXmSz9O8eQy4G5oql3JLZmoo,855
40
- pyhw/backend/nic/nicBase.py,sha256=cT_rxqIEcvvKFsvjKlkCJ8RIfp7QHxDE9_SImXDae0s,735
43
+ pyhw/backend/nic/nicBase.py,sha256=Kng5qoe7FHcnQaf6S-LUe_HyOaBJe0L1SVstdIQ_WJY,962
41
44
  pyhw/backend/nic/nicInfo.py,sha256=wuBuL-aIzD441IUDPGz5e0xctcZ-opdpgqkVxgbvZLg,133
45
+ pyhw/backend/nic/windows.py,sha256=c67JwHARtPxNsZ-0_MVKUfc7DwpsRVn7kiHdx_NyDn8,1297
42
46
  pyhw/backend/npu/__init__.py,sha256=PgLKbwpgT5vw9xpa294Zxb94McyxNXW46_vMbT2Iqyc,58
43
47
  pyhw/backend/npu/bsd.py,sha256=eKkOWZ4MBybR_KOGGcsWUpzCGgghhvuBy5VNsnEE8cI,134
44
48
  pyhw/backend/npu/linux.py,sha256=mXHSYRION3pghwk6_4vgHxjSkNxI68ksGLkFZstR0mc,1192
45
49
  pyhw/backend/npu/macos.py,sha256=c-iSmGfBWYeoh7nXuCFmPlVH6bc6sil_yRsAlabl93k,2513
46
- pyhw/backend/npu/npuBase.py,sha256=qiioBmHDeh2Et1F7lwmNight-2W32C0VmMtx2DIOCz4,523
50
+ pyhw/backend/npu/npuBase.py,sha256=1cVWRmr8g-mDXrJAx2cUO4qWZft2TtT7L2-HzRot2nI,748
47
51
  pyhw/backend/npu/npuInfo.py,sha256=82dK6XvW_XKw4O5-RfR4-qQRR7Plh8qqJLj0YDzISmU,135
52
+ pyhw/backend/npu/windows.py,sha256=Z2v5CORSa1ap66k48G7uVLbon3zaoT4ug5sX2_rt6vM,1196
48
53
  pyhw/backend/os/__init__.py,sha256=rPHQYdQK3qU6ZwwodqVoEWeqBnKffXlJyi4k3-8ViPY,53
49
54
  pyhw/backend/os/bsd.py,sha256=5Q30mkFKdhuup1dRjTEVN58MEGcj7JzbUzh40ld6C14,131
50
55
  pyhw/backend/os/linux.py,sha256=U7dIOKZaG5MSw0S65hAfDfFaBMvbwSCHFIHTwckU9iI,1957
51
56
  pyhw/backend/os/macos.py,sha256=DwgpwRD1a2oTANR_XL3kkMzNawqrt23F79dqBw3ULK8,1906
52
- pyhw/backend/os/osBase.py,sha256=IiyrA5IEtlcaR-xigi8SxD70BimFKCBMjgF0MLihSOk,573
53
- pyhw/backend/os/osInfo.py,sha256=iLPc7INFHH3izascwooj4JBVgvBsSgVPXWBlFXG47mQ,378
57
+ pyhw/backend/os/osBase.py,sha256=2zaOGhaXLrNJS9-9qR4hH9_uFTgA2Sv4ab7YZvNVFaE,744
58
+ pyhw/backend/os/osInfo.py,sha256=NEr76aicI9N3SFrwi1skcpUEjzsyCryTjdE9X1nBjBM,536
59
+ pyhw/backend/os/windows.py,sha256=WyUhkO9loIqwiZ_ezI6J2JHL4A2xzQAuTzkO1ZOStr4,1149
54
60
  pyhw/backend/shell/__init__.py,sha256=SeQ7OLNSl_V1JCCWnJGjLilAWiSe9e5kgsMEt63TMS0,62
55
- pyhw/backend/shell/shellBase.py,sha256=U4HPg_iWhAqaLceBnEVMHFj4A-FNYu7JjsQyi2seEU4,377
56
- pyhw/backend/shell/unix.py,sha256=Vt2wSxAIrzN679v0MjJwBoK6L12OqZOichociFZ9lw8,2109
61
+ pyhw/backend/shell/shellBase.py,sha256=829rchiqXfyA-oKT81mkGGoKBjZflM5NHIRs0_ZSwaY,531
62
+ pyhw/backend/shell/shellInfo.py,sha256=pU32_Akg0TDVFprTfPYaOKWcFkijJkm0FOowfILNRKk,184
63
+ pyhw/backend/shell/unix.py,sha256=qTP3Mk8prI2lnQmUJ41G1Fgu1l8nGn9PB3pyBoewtJg,2010
64
+ pyhw/backend/shell/windows.py,sha256=_Ou4QFkS-_K8xMjxw9X3N0t5duZCa3LnMhft_aiPuE0,854
57
65
  pyhw/backend/title/__init__.py,sha256=l6_WqreSBeK7krapCrbrr4ndnydrXB1aZ50Ve-beV_w,62
58
- pyhw/backend/title/titleBase.py,sha256=nzHcVJqAMZqWJP101YWgRwilSiZ_hHiK-jiI90Pm3r8,495
59
- pyhw/backend/title/unix.py,sha256=9B-zLE8yhlWBnJ-6Aa-DmFmgMV9KdvvNU40drJIaNck,837
60
- pyhw/backend/title/windows.py,sha256=5bXR6yxHk3diVx92sjxPeD6fUVR5sKZJG3K4aM3CGn8,82
66
+ pyhw/backend/title/titleBase.py,sha256=RVWwtTea8G1MutrN3Ttkjky9wwVtRxnHIsOJKpBbvF8,519
67
+ pyhw/backend/title/titleInfo.py,sha256=lUsbQNx80MLHuSCgMzWhc72mj0ykcRuWngn9wydYSos,166
68
+ pyhw/backend/title/unix.py,sha256=XEjPbnbygxs1qDv79kdaGHFGU_8elW7Q2kvpbYWo0P8,747
69
+ pyhw/backend/title/windows.py,sha256=XcW_M5a31zCo11FylOn0R-J0fQGnWZr8n75YJraJlZM,427
61
70
  pyhw/backend/uptime/__init__.py,sha256=X8RVhHWmHpyey0C4gcmrt_u1cHKowhAQRDMAxY3i7p0,65
62
71
  pyhw/backend/uptime/bsd.py,sha256=XdLIvivr78Pr8PqSwQG3eLvjjaM52nK5QcWrwtuNZlg,147
63
- pyhw/backend/uptime/linux.py,sha256=Sh05CgUjAOzPM8LSoZf4fCU-Cl5pwhSJSC7XJ-jFaHU,1027
64
- pyhw/backend/uptime/macos.py,sha256=Io-JrFjmRWHgB7uh4mBTV4rnfJuUvepGh2uiKNhUZcc,1293
65
- pyhw/backend/uptime/uptimeBase.py,sha256=PB0SWpsZyNz5GL5n39rC7DDSpKVAlH2K2eKqOuiEfy0,778
72
+ pyhw/backend/uptime/linux.py,sha256=m9NmnVeQV8ZwRbytQ0gsrkY6UqhuCoMkdc3QQX4v8nI,1033
73
+ pyhw/backend/uptime/macos.py,sha256=sVLmtLgOC7CDBVrfCBKCVApSUmbHEbd6BK3yRgzNzWQ,1299
74
+ pyhw/backend/uptime/uptimeBase.py,sha256=HVRFZHO-2F_UKH0ti9wR16iHCH7Q8dga0HfxFxUEUck,959
66
75
  pyhw/backend/uptime/uptimeInfo.py,sha256=TobPEV3MBT3Fiv3W6TOzD3a4MNW-vz2Oi_Trlcihu7k,114
76
+ pyhw/backend/uptime/windows.py,sha256=fRj218K9gx2Ffg8_dEjWyaFrqFl-niiPHvJjwJhfGeM,1744
67
77
  pyhw/frontend/__init__.py,sha256=xgv_iVv9w4cLXklbdtFWXu7J7KJxBCUw-ZcUQb_abFc,57
68
78
  pyhw/frontend/frontendBase.py,sha256=rPAf7tE1u8uGgZ-mDTOw_O2S2-YsevEzGJsq34eJlXQ,4957
69
79
  pyhw/frontend/color/__init__.py,sha256=xk511qWwdYWEVjk_zOaC4fs81HtwR4ELr3wi1tTL824,191
70
- pyhw/frontend/color/colorConfig.py,sha256=6VADbaM_xwlYF4Ds38xvmRgxVSDWBB71WWDFhiLrQaI,4650
80
+ pyhw/frontend/color/colorConfig.py,sha256=hvpA9R4ajAbqZ0bVq5hOs0PXtTF00ViZ_qXLbBJ1DWU,6225
71
81
  pyhw/frontend/color/colorSet.py,sha256=spH8PlRu7capouf-yUgDHgoPCnM5aJ_ncascISZfz2g,1421
72
82
  pyhw/frontend/color/colorUtil.py,sha256=VhcPmAJmXGIiRBfVZE2jg_iy-SfbxqwOSvkRz-nbUOQ,94
73
83
  pyhw/frontend/logo/__init__.py,sha256=mozEarHueBUgtDHKSd-RDaFysMLUiW3VQ8KcBtlKGCI,47
@@ -85,15 +95,19 @@ pyhw/frontend/logo/ascii/macOS.pyhw,sha256=HBGROtBb7wrNtRqAQ9ND7zxK0l17BRsmpgc2d
85
95
  pyhw/frontend/logo/ascii/raspbian.pyhw,sha256=jEl6WMKF-FGx359ipQ1kzweUJS-NuauYQCFaYime4PQ,159
86
96
  pyhw/frontend/logo/ascii/ubuntu.pyhw,sha256=l-Q0PfutxXYMwTojqeiM88063x4V0RBkZUHmi6YdsNc,833
87
97
  pyhw/frontend/logo/ascii/ubuntu_small.pyhw,sha256=Xf8LSZdZUu9aEG3efhb1FUlUEuJ-3UztcIOJISpKhPw,229
98
+ pyhw/frontend/logo/ascii/windows_10.pyhw,sha256=jv5pzZs_CdOzpeTjyXfXJWcTQwK-J0LNlnyj_sJcuOI,706
99
+ pyhw/frontend/logo/ascii/windows_11.pyhw,sha256=VuQTzbBabaEQhm2JBVhy6Ja6lClUGacQsaiNUih9nhU,656
100
+ pyhw/frontend/logo/ascii/windows_2025.pyhw,sha256=o8eWsiyhNpDoEjiWFiBMfkd-8MdIslGc1Jpm85LU4P8,643
101
+ pyhw/frontend/logo/ascii/windows_old.pyhw,sha256=AMsvWAZ50HM8lweWEmzDWbRNDGkKFJo9qLY_VRKrciY,580
88
102
  pyhw/library/lib/iokitGPULib.dylib,sha256=DcJ0GZY79gTFckLFYtZgeKn1T0NFvdO_k_ccCa7od5Y,154808
89
103
  pyhw/pyhwException/__init__.py,sha256=8JsFvtF13g0Y5t4z9fRndDXtfCzuBM59jDf6PhWSFSk,220
90
104
  pyhw/pyhwException/pyhwException.py,sha256=wxuzFQa9g7XB1q9TUKO_55lw7wMEJMpzG8w1GVTFVa0,197
91
105
  pyhw/pyhwUtil/__init__.py,sha256=diIqlNUBfuHu-2VAOJk5nipGLafnWxR3chAAOmX8QRo,250
92
- pyhw/pyhwUtil/pyhwUtil.py,sha256=6aKYh7sEPkqrfevckJO7MGmehGwgu_QVniFjVOw4dYk,6297
106
+ pyhw/pyhwUtil/pyhwUtil.py,sha256=h3XsZFGwzkW75kj853IWVlxwDz8R8A3UR-bxju95aeY,6703
93
107
  pyhw/pyhwUtil/sysctlUtil.py,sha256=S-rUvqi7ZrMyMouIhxlyHEQ4agM7sCT1Y7uzs3Hu5-o,841
94
- pyhw-0.7.4.dist-info/LICENSE,sha256=hJs6RBqSVCexbTsalkMLNFI5t06kekQEsSVaOt_-yLs,1497
95
- pyhw-0.7.4.dist-info/METADATA,sha256=uRpLICG3Fl7YN7ofwJBnoD38B_D9T2_jE7yxN6Ive7M,5791
96
- pyhw-0.7.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
97
- pyhw-0.7.4.dist-info/entry_points.txt,sha256=q-AB8im_QahpmNrmy4aPTJRGi0LlbNlnI3kF7s6pKss,44
98
- pyhw-0.7.4.dist-info/top_level.txt,sha256=7Inxvxt1TngEricKZEex9_WJZS3DbKYFUXDz4v5WHYU,5
99
- pyhw-0.7.4.dist-info/RECORD,,
108
+ pyhw-0.8.0.dist-info/LICENSE,sha256=hJs6RBqSVCexbTsalkMLNFI5t06kekQEsSVaOt_-yLs,1497
109
+ pyhw-0.8.0.dist-info/METADATA,sha256=2jICwuL3kDvCFc1aJN67Hk3YFGHqQSOjpZkyAAYk5c0,5945
110
+ pyhw-0.8.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
111
+ pyhw-0.8.0.dist-info/entry_points.txt,sha256=q-AB8im_QahpmNrmy4aPTJRGi0LlbNlnI3kF7s6pKss,44
112
+ pyhw-0.8.0.dist-info/top_level.txt,sha256=7Inxvxt1TngEricKZEex9_WJZS3DbKYFUXDz4v5WHYU,5
113
+ pyhw-0.8.0.dist-info/RECORD,,
File without changes
File without changes