pyhw 0.15.1__tar.gz → 0.15.3__tar.gz

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.
Files changed (138) hide show
  1. {pyhw-0.15.1/src/pyhw.egg-info → pyhw-0.15.3}/PKG-INFO +2 -2
  2. {pyhw-0.15.1 → pyhw-0.15.3}/pyproject.toml +2 -2
  3. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/__init__.py +1 -1
  4. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/bsd.py +3 -3
  5. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/linux.py +3 -3
  6. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/macos.py +3 -3
  7. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/windows.py +3 -3
  8. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/frontendBase.py +76 -15
  9. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/lib/iokitCPULib.dylib +0 -0
  10. pyhw-0.15.3/src/pyhw/library/lib/iokitGPULib.dylib +0 -0
  11. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/lib/iokitHostLib.dylib +0 -0
  12. pyhw-0.15.3/src/pyhw/library/lib/iokitNICLib.dylib +0 -0
  13. {pyhw-0.15.1 → pyhw-0.15.3/src/pyhw.egg-info}/PKG-INFO +2 -2
  14. pyhw-0.15.3/src/pyhw.egg-info/requires.txt +1 -0
  15. pyhw-0.15.1/src/pyhw/library/lib/iokitGPULib.dylib +0 -0
  16. pyhw-0.15.1/src/pyhw/library/lib/iokitNICLib.dylib +0 -0
  17. pyhw-0.15.1/src/pyhw.egg-info/requires.txt +0 -1
  18. {pyhw-0.15.1 → pyhw-0.15.3}/LICENSE +0 -0
  19. {pyhw-0.15.1 → pyhw-0.15.3}/README.md +0 -0
  20. {pyhw-0.15.1 → pyhw-0.15.3}/setup.cfg +0 -0
  21. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/__main__.py +0 -0
  22. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/__init__.py +0 -0
  23. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/backendBase.py +0 -0
  24. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/__init__.py +0 -0
  25. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/bsd.py +0 -0
  26. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/cpuBase.py +0 -0
  27. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/cpuInfo.py +0 -0
  28. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/linux.py +0 -0
  29. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/macos.py +0 -0
  30. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/cpu/windows.py +0 -0
  31. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/__init__.py +0 -0
  32. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/bsd.py +0 -0
  33. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/gpuBase.py +0 -0
  34. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/gpuInfo.py +0 -0
  35. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/linux.py +0 -0
  36. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/macos.py +0 -0
  37. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/gpu/windows.py +0 -0
  38. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/__init__.py +0 -0
  39. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/bsd.py +0 -0
  40. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/hostBase.py +0 -0
  41. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/hostInfo.py +0 -0
  42. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/linux.py +0 -0
  43. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/macos.py +0 -0
  44. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/host/windows.py +0 -0
  45. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/kernel/__init__.py +0 -0
  46. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/kernel/kernelBase.py +0 -0
  47. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/kernel/kernelInfo.py +0 -0
  48. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/kernel/unix.py +0 -0
  49. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/kernel/windows.py +0 -0
  50. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/__init__.py +0 -0
  51. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/memoryBase.py +0 -0
  52. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/memory/memoryInfo.py +0 -0
  53. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/__init__.py +0 -0
  54. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/bsd.py +0 -0
  55. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/linux.py +0 -0
  56. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/macos.py +0 -0
  57. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/nicBase.py +0 -0
  58. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/nicInfo.py +0 -0
  59. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/nic/windows.py +0 -0
  60. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/__init__.py +0 -0
  61. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/bsd.py +0 -0
  62. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/linux.py +0 -0
  63. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/macos.py +0 -0
  64. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/npuBase.py +0 -0
  65. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/npuInfo.py +0 -0
  66. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/npu/windows.py +0 -0
  67. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/__init__.py +0 -0
  68. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/bsd.py +0 -0
  69. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/linux.py +0 -0
  70. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/macos.py +0 -0
  71. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/osBase.py +0 -0
  72. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/osInfo.py +0 -0
  73. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/os/windows.py +0 -0
  74. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/shell/__init__.py +0 -0
  75. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/shell/shellBase.py +0 -0
  76. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/shell/shellInfo.py +0 -0
  77. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/shell/unix.py +0 -0
  78. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/shell/windows.py +0 -0
  79. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/title/__init__.py +0 -0
  80. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/title/titleBase.py +0 -0
  81. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/title/titleInfo.py +0 -0
  82. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/title/unix.py +0 -0
  83. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/title/windows.py +0 -0
  84. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/__init__.py +0 -0
  85. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/bsd.py +0 -0
  86. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/linux.py +0 -0
  87. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/macos.py +0 -0
  88. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/uptimeBase.py +0 -0
  89. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/uptimeInfo.py +0 -0
  90. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/backend/uptime/windows.py +0 -0
  91. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/__init__.py +0 -0
  92. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/color/__init__.py +0 -0
  93. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/color/colorConfig.py +0 -0
  94. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/color/colorSet.py +0 -0
  95. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/color/colorUtil.py +0 -0
  96. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/__init__.py +0 -0
  97. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/alpine.pyhw +0 -0
  98. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/arch.pyhw +0 -0
  99. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/armbian.pyhw +0 -0
  100. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/centos.pyhw +0 -0
  101. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/debian.pyhw +0 -0
  102. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/fedora.pyhw +0 -0
  103. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/fedora_small.pyhw +0 -0
  104. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/freebsd.pyhw +0 -0
  105. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/kali.pyhw +0 -0
  106. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/linux.pyhw +0 -0
  107. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/linuxmint.pyhw +0 -0
  108. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/macOS.pyhw +0 -0
  109. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/opensuse-leap.pyhw +0 -0
  110. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/opensuse-tumbleweed.pyhw +0 -0
  111. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/raspbian.pyhw +0 -0
  112. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/rhel.pyhw +0 -0
  113. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/ubuntu.pyhw +0 -0
  114. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/ubuntu_small.pyhw +0 -0
  115. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/windows_10.pyhw +0 -0
  116. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/windows_11.pyhw +0 -0
  117. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/windows_2025.pyhw +0 -0
  118. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/ascii/windows_old.pyhw +0 -0
  119. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/frontend/logo/logoBase.py +0 -0
  120. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/lib/nvmlGPULib_amd64.so +0 -0
  121. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/lib/nvmlGPULib_arm64.so +0 -0
  122. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/test/iokitCPULibTest.py +0 -0
  123. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/test/iokitGPULibTest.py +0 -0
  124. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/test/iokitHostLibTest.py +0 -0
  125. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/test/iokitNICLibTest.py +0 -0
  126. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/library/test/nvmlGPULibTest.py +0 -0
  127. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwException/__init__.py +0 -0
  128. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwException/pyhwException.py +0 -0
  129. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwUtil/__init__.py +0 -0
  130. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwUtil/cliUtil.py +0 -0
  131. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwUtil/pciUtil.py +0 -0
  132. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwUtil/pyhwUtil.py +0 -0
  133. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw/pyhwUtil/sysctlUtil.py +0 -0
  134. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw.egg-info/SOURCES.txt +0 -0
  135. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw.egg-info/dependency_links.txt +0 -0
  136. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw.egg-info/entry_points.txt +0 -0
  137. {pyhw-0.15.1 → pyhw-0.15.3}/src/pyhw.egg-info/top_level.txt +0 -0
  138. {pyhw-0.15.1 → pyhw-0.15.3}/test/test_cliUtil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyhw
3
- Version: 0.15.1
3
+ Version: 0.15.3
4
4
  Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
5
5
  Author: Xiao Ran
6
6
  Maintainer-email: Xiao Ran <xiaoran.007@icloud.com>
@@ -13,7 +13,7 @@ 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.2.7
16
+ Requires-Dist: pypci-ng>=0.3.0
17
17
  Dynamic: license-file
18
18
 
19
19
  # PyHw, a neofetch-like system information fetching tool
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyhw"
7
- version = "0.15.1"
7
+ version = "0.15.3"
8
8
  description = "PyHw, a neofetch-like command line tool for fetching system information but written mostly in python."
9
9
  keywords = ["neofetch", "system information", "command line tool", "python", "hardware information", "fastfetch", "fetching"]
10
10
  authors = [
@@ -17,7 +17,7 @@ readme = "README.md"
17
17
  license = "BSD-3-Clause"
18
18
  requires-python = ">=3.9"
19
19
  dependencies = [
20
- "pypci-ng>=0.2.7"
20
+ "pypci-ng>=0.3.0"
21
21
  ]
22
22
  classifiers = [
23
23
  "Development Status :: 4 - Beta",
@@ -1,2 +1,2 @@
1
- __version__ = '0.15.1'
1
+ __version__ = '0.15.3'
2
2
  __author__ = 'xiaoran007'
@@ -12,9 +12,9 @@ class MemoryDetectBSD(MemoryDetectLinux):
12
12
 
13
13
  def getMemoryInfo(self):
14
14
  self.__getMemorySysctl()
15
- self._memoryInfo.total = self.__physical_memory / 1024 / 1024 # Convert bytes to MiB
16
- self._memoryInfo.used = (self.__physical_memory - self.__free_memory) / 1024 / 1024 # Convert bytes to MiB
17
- self._memoryInfo.memory = f"{round(self._memoryInfo.used, 2)} MiB / {round(self._memoryInfo.total, 2)} MiB"
15
+ self._memoryInfo.total = self.__physical_memory / 1024 / 1024 / 1024 # Convert bytes to GiB
16
+ self._memoryInfo.used = (self.__physical_memory - self.__free_memory) / 1024 / 1024 / 1024 # Convert bytes to GiB
17
+ self._memoryInfo.memory = f"{round(self._memoryInfo.used, 2)} GiB / {round(self._memoryInfo.total, 2)} GiB"
18
18
  return self._memoryInfo
19
19
 
20
20
  def __getMemorySysctl(self):
@@ -7,7 +7,7 @@ class MemoryDetectLinux:
7
7
 
8
8
  def getMemoryInfo(self):
9
9
  self._getMemory()
10
- self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
10
+ self._memoryInfo.memory = f"{self._memoryInfo.used} GiB / {self._memoryInfo.total} GiB"
11
11
  return self._memoryInfo
12
12
 
13
13
  def _getMemory(self):
@@ -15,9 +15,9 @@ class MemoryDetectLinux:
15
15
  with open("/proc/meminfo", "r") as file:
16
16
  for line in file:
17
17
  if line.startswith("MemTotal:"):
18
- self._memoryInfo.total = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
18
+ self._memoryInfo.total = round(float(line.split(":")[1].strip()[:-3]) / 1024 / 1024, 2)
19
19
  elif line.startswith("MemAvailable:"):
20
- self._memoryInfo.available = round(float(line.split(":")[1].strip()[:-3]) / 1024, 2)
20
+ self._memoryInfo.available = round(float(line.split(":")[1].strip()[:-3]) / 1024 / 1024, 2)
21
21
  self._memoryInfo.used = round(self._memoryInfo.total - self._memoryInfo.available, 2)
22
22
  except FileNotFoundError:
23
23
  pass
@@ -19,9 +19,9 @@ class MemoryDetectMacOS:
19
19
 
20
20
  def getMemoryInfo(self):
21
21
  self.__getMemory()
22
- self.__memoryInfo.total = self.__mem_total / 1024 / 1024 # Convert bytes to MiB
23
- self.__memoryInfo.used = self.__mem_used / 1024 / 1024 # Convert bytes to MiB
24
- self.__memoryInfo.memory = f"{round(self.__memoryInfo.used, 2)} MiB / {round(self.__memoryInfo.total, 2)} MiB"
22
+ self.__memoryInfo.total = self.__mem_total / 1024 / 1024 / 1024 # Convert bytes to GiB
23
+ self.__memoryInfo.used = self.__mem_used / 1024 / 1024 / 1024 # Convert bytes to GiB
24
+ self.__memoryInfo.memory = f"{self.__memoryInfo.used:.2f} GiB / {self.__memoryInfo.total:.2f} GiB"
25
25
  return self.__memoryInfo
26
26
 
27
27
  def __getMemory(self):
@@ -10,7 +10,7 @@ class MemoryDetectWindows:
10
10
 
11
11
  def getMemoryInfo(self):
12
12
  self._getMemory()
13
- self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
13
+ self._memoryInfo.memory = f"{self._memoryInfo.used} GiB / {self._memoryInfo.total} GiB"
14
14
  return self._memoryInfo
15
15
 
16
16
  def _getMemory(self):
@@ -21,8 +21,8 @@ class MemoryDetectWindows:
21
21
  raise BackendException("Failed to get memory information on Windows.")
22
22
 
23
23
  res = json.loads(result.stdout)
24
- free_memory = int(res['FreePhysicalMemory']) / 1024
25
- total_memory = int(res['TotalVisibleMemorySize']) / 1024
24
+ free_memory = int(res['FreePhysicalMemory']) / 1024 / 1024
25
+ total_memory = int(res['TotalVisibleMemorySize']) / 1024 / 1024
26
26
  used_memory = total_memory - free_memory
27
27
  self._memoryInfo.total = round(total_memory, 2)
28
28
  self._memoryInfo.available = round(free_memory, 2)
@@ -4,6 +4,7 @@ from ..pyhwUtil import getOS
4
4
  from ..pyhwException import BackendException
5
5
  import subprocess
6
6
  import re
7
+ import os
7
8
 
8
9
 
9
10
  class Printer:
@@ -40,31 +41,91 @@ class Printer:
40
41
  print("\n".join(self.__combined_lines))
41
42
 
42
43
  def __dropLongString(self):
43
- # Need more accurate way to drop long strings
44
- if getOS() == "linux":
44
+ """
45
+ Truncate lines that exceed terminal width, accounting for ANSI escape sequences.
46
+ ANSI escape sequences don't contribute to visible width but are counted by len().
47
+ Enabled on both Linux and macOS.
48
+ """
49
+ if getOS() in ["linux", "macos"]:
45
50
  fixed_lines = list()
46
51
  for line in self.__combined_lines:
47
- if len(line) > self.__columns+20:
48
- fixed_lines.append(line[:self.__columns+20])
52
+ visible_length = self.__getVisibleLength(line)
53
+ if visible_length > self.__columns:
54
+ truncated_line = self.__truncateToWidth(line, self.__columns)
55
+ fixed_lines.append(truncated_line)
49
56
  else:
50
57
  fixed_lines.append(line)
51
58
  self.__combined_lines = fixed_lines
52
59
  else:
53
60
  pass
54
61
 
62
+ @staticmethod
63
+ def __getVisibleLength(text: str) -> int:
64
+ """
65
+ Calculate the visible length of a string, excluding ANSI escape sequences.
66
+ ANSI codes follow the pattern: \033[...m
67
+ """
68
+ ansi_pattern = re.compile(r'\033\[[0-9;]*m')
69
+ clean_text = ansi_pattern.sub('', text)
70
+ return len(clean_text)
71
+
72
+ @staticmethod
73
+ def __truncateToWidth(text: str, max_width: int) -> str:
74
+ """
75
+ Truncate a string to a maximum visible width while preserving ANSI escape sequences.
76
+ Ensures proper color reset at the end if truncated.
77
+ """
78
+ ansi_pattern = re.compile(r'(\033\[[0-9;]*m)')
79
+ parts = ansi_pattern.split(text)
80
+
81
+ result = []
82
+ visible_count = 0
83
+
84
+ for part in parts:
85
+ if ansi_pattern.match(part):
86
+ result.append(part)
87
+ else:
88
+ remaining = max_width - visible_count
89
+ if remaining <= 0:
90
+ break
91
+ if len(part) <= remaining:
92
+ result.append(part)
93
+ visible_count += len(part)
94
+ else:
95
+ result.append(part[:remaining])
96
+ visible_count += remaining
97
+ break
98
+
99
+ truncated = ''.join(result)
100
+ if not truncated.endswith('\033[0m'):
101
+ truncated += '\033[0m'
102
+
103
+ return truncated
104
+
55
105
  @staticmethod
56
106
  def __getColumns() -> int:
57
- if getOS() == "linux":
58
- try:
59
- result = subprocess.run(['stty', 'size'], capture_output=True, text=True)
60
- _, columns_str = result.stdout.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
107
+ try:
108
+ columns = os.get_terminal_size().columns
109
+ return columns
110
+ except (OSError, AttributeError):
111
+ pass
112
+
113
+ try:
114
+ result = subprocess.run(['stty', 'size'], capture_output=True, text=True, check=True)
115
+ _, columns_str = result.stdout.strip().split()
116
+ columns = int(columns_str)
117
+ return columns
118
+ except (subprocess.CalledProcessError, ValueError, FileNotFoundError):
119
+ pass
120
+
121
+ try:
122
+ columns = int(os.environ.get('COLUMNS', 0))
123
+ if columns > 0:
124
+ return columns
125
+ except (ValueError, TypeError):
126
+ pass
127
+
128
+ return 80
68
129
 
69
130
  def __LogoPreprocess(self):
70
131
  global_color = self.__config.get("colors")[0]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyhw
3
- Version: 0.15.1
3
+ Version: 0.15.3
4
4
  Summary: PyHw, a neofetch-like command line tool for fetching system information but written mostly in python.
5
5
  Author: Xiao Ran
6
6
  Maintainer-email: Xiao Ran <xiaoran.007@icloud.com>
@@ -13,7 +13,7 @@ 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.2.7
16
+ Requires-Dist: pypci-ng>=0.3.0
17
17
  Dynamic: license-file
18
18
 
19
19
  # PyHw, a neofetch-like system information fetching tool
@@ -0,0 +1 @@
1
+ pypci-ng>=0.3.0
@@ -1 +0,0 @@
1
- pypci-ng>=0.2.7
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes