pyhw 0.1.3b0__tar.gz → 0.2.1b0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. {pyhw-0.1.3b0/src/pyhw.egg-info → pyhw-0.2.1b0}/PKG-INFO +22 -3
  2. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/README.md +19 -2
  3. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/pyproject.toml +3 -1
  4. pyhw-0.2.1b0/src/pyhw/__main__.py +39 -0
  5. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/cpu/cpuBase.py +3 -0
  6. pyhw-0.2.1b0/src/pyhw/backend/cpu/cpuInfo.py +13 -0
  7. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/cpu/linux.py +5 -11
  8. pyhw-0.2.1b0/src/pyhw/backend/cpu/macos.py +69 -0
  9. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/gpu/gpuBase.py +3 -0
  10. pyhw-0.2.1b0/src/pyhw/backend/gpu/gpuInfo.py +8 -0
  11. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/gpu/linux.py +3 -9
  12. pyhw-0.2.1b0/src/pyhw/backend/gpu/macos.py +63 -0
  13. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/host/hostBase.py +1 -1
  14. pyhw-0.2.1b0/src/pyhw/backend/host/hostInfo.py +13 -0
  15. pyhw-0.2.1b0/src/pyhw/backend/host/linux.py +51 -0
  16. pyhw-0.2.1b0/src/pyhw/backend/host/macos.py +269 -0
  17. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/kernel/kernelBase.py +4 -4
  18. pyhw-0.2.1b0/src/pyhw/backend/kernel/kernelInfo.py +10 -0
  19. pyhw-0.1.3b0/src/pyhw/backend/kernel/linux.py → pyhw-0.2.1b0/src/pyhw/backend/kernel/unix.py +3 -14
  20. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/memory/linux.py +2 -10
  21. pyhw-0.2.1b0/src/pyhw/backend/memory/macos.py +56 -0
  22. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/memory/memoryBase.py +3 -0
  23. pyhw-0.2.1b0/src/pyhw/backend/memory/memoryInfo.py +10 -0
  24. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/os/linux.py +2 -17
  25. pyhw-0.2.1b0/src/pyhw/backend/os/macos.py +36 -0
  26. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/os/osBase.py +3 -0
  27. pyhw-0.2.1b0/src/pyhw/backend/os/osInfo.py +17 -0
  28. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/uptime/linux.py +5 -10
  29. pyhw-0.2.1b0/src/pyhw/backend/uptime/macos.py +40 -0
  30. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/uptime/uptimeBase.py +3 -0
  31. pyhw-0.2.1b0/src/pyhw/backend/uptime/uptimeInfo.py +7 -0
  32. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/frontendBase.py +1 -1
  33. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/pyhwUtil/__init__.py +2 -1
  34. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/pyhwUtil/pyhwUtil.py +22 -14
  35. pyhw-0.2.1b0/src/pyhw/pyhwUtil/sysctlUtil.py +37 -0
  36. {pyhw-0.1.3b0 → pyhw-0.2.1b0/src/pyhw.egg-info}/PKG-INFO +22 -3
  37. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw.egg-info/SOURCES.txt +15 -3
  38. pyhw-0.1.3b0/src/pyhw/__main__.py +0 -37
  39. pyhw-0.1.3b0/src/pyhw/backend/host/linux.py +0 -50
  40. pyhw-0.1.3b0/src/pyhw/backend/host/macos.py +0 -5
  41. pyhw-0.1.3b0/src/pyhw/backend/kernel/macos.py +0 -7
  42. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/LICENSE +0 -0
  43. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/MANIFEST.in +0 -0
  44. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/setup.cfg +0 -0
  45. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/__init__.py +0 -0
  46. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/__init__.py +0 -0
  47. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/backendBase.py +0 -0
  48. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/cpu/__init__.py +0 -0
  49. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/gpu/__init__.py +0 -0
  50. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/host/__init__.py +0 -0
  51. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/host/windows.py +0 -0
  52. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/kernel/__init__.py +0 -0
  53. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/kernel/windows.py +0 -0
  54. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/memory/__init__.py +0 -0
  55. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/metal/t.py +0 -0
  56. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/os/__init__.py +0 -0
  57. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/shell/__init__.py +0 -0
  58. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/shell/shellBase.py +0 -0
  59. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/shell/unix.py +0 -0
  60. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/title/__init__.py +0 -0
  61. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/title/titleBase.py +0 -0
  62. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/title/unix.py +0 -0
  63. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/title/windows.py +0 -0
  64. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/backend/uptime/__init__.py +0 -0
  65. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/__init__.py +0 -0
  66. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/color/__init__.py +0 -0
  67. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/color/colorConfig.py +0 -0
  68. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/color/colorSet.py +0 -0
  69. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/color/colorUtil.py +0 -0
  70. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/__init__.py +0 -0
  71. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/debian.pyhw +0 -0
  72. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/fedora.pyhw +0 -0
  73. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/fedora_small.pyhw +0 -0
  74. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/linux.pyhw +0 -0
  75. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/macOS.pyhw +0 -0
  76. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/ubuntu.pyhw +0 -0
  77. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/ascii/ubuntu_small.pyhw +0 -0
  78. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/frontend/logo/logoBase.py +0 -0
  79. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/macos.py +0 -0
  80. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/pyhwException/__init__.py +0 -0
  81. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw/pyhwException/pyhwException.py +0 -0
  82. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw.egg-info/dependency_links.txt +0 -0
  83. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw.egg-info/entry_points.txt +0 -0
  84. {pyhw-0.1.3b0 → pyhw-0.2.1b0}/src/pyhw.egg-info/top_level.txt +0 -0
@@ -1,10 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyhw
3
- Version: 0.1.3b0
3
+ Version: 0.2.1b0
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
7
7
  Project-URL: homepage, https://github.com/xiaoran007/pyhw
8
+ Keywords: neofetch,system information,command line tool,python,hardware information,fastfetch,fetching
9
+ Classifier: Development Status :: 4 - Beta
8
10
  Classifier: Programming Language :: Python :: 3
9
11
  Classifier: License :: OSI Approved :: BSD License
10
12
  Classifier: Operating System :: OS Independent
@@ -13,19 +15,36 @@ Description-Content-Type: text/markdown
13
15
  License-File: LICENSE
14
16
 
15
17
  # PyHw
16
- 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 part of the linux systems are supported. macOS support will be added soon.
18
+ ![PyPI - Downloads](https://img.shields.io/pypi/dw/pyhw?label=PyPI)
19
+ ![PyPI - Version](https://img.shields.io/pypi/v/pyhw?label=version)
17
20
 
18
- 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 🤔)
21
+ ![Static Badge](https://img.shields.io/badge/macOS-brightgreen)
22
+ ![Static Badge](https://img.shields.io/badge/Linux-blue)
23
+
24
+
25
+ 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 part of the linux systems and macOS are supported.**
26
+
27
+ 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 🤔).
19
28
 
20
29
  There are already a lot of similar tools so you can choose any of them; they're all essentially no different. If you want to try this tool, just install it directly by pip.
21
30
  ```shell
22
31
  pip install pyhw
23
32
  ```
33
+ To upgrade pyhw:
34
+ ```shell
35
+ pip install pyhw --upgrade
36
+ ```
24
37
  You can then use this tool directly from the command line with the following command, just like neofetch.
25
38
  ```shell
26
39
  pyhw
27
40
  ```
28
41
 
42
+ ## Supported (Tested) OS
43
+ * macOS arm64, x86_64
44
+ * debian-based distro x86_64
45
+ * RaspberryPi OS arm64
46
+
47
+
29
48
  ## Build from source
30
49
  ### Build tools
31
50
  Make sure the following Python build tools are already installed.
@@ -1,17 +1,34 @@
1
1
  # PyHw
2
- 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 part of the linux systems are supported. macOS support will be added soon.
2
+ ![PyPI - Downloads](https://img.shields.io/pypi/dw/pyhw?label=PyPI)
3
+ ![PyPI - Version](https://img.shields.io/pypi/v/pyhw?label=version)
3
4
 
4
- 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 🤔)
5
+ ![Static Badge](https://img.shields.io/badge/macOS-brightgreen)
6
+ ![Static Badge](https://img.shields.io/badge/Linux-blue)
7
+
8
+
9
+ 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 part of the linux systems and macOS are supported.**
10
+
11
+ 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 🤔).
5
12
 
6
13
  There are already a lot of similar tools so you can choose any of them; they're all essentially no different. If you want to try this tool, just install it directly by pip.
7
14
  ```shell
8
15
  pip install pyhw
9
16
  ```
17
+ To upgrade pyhw:
18
+ ```shell
19
+ pip install pyhw --upgrade
20
+ ```
10
21
  You can then use this tool directly from the command line with the following command, just like neofetch.
11
22
  ```shell
12
23
  pyhw
13
24
  ```
14
25
 
26
+ ## Supported (Tested) OS
27
+ * macOS arm64, x86_64
28
+ * debian-based distro x86_64
29
+ * RaspberryPi OS arm64
30
+
31
+
15
32
  ## Build from source
16
33
  ### Build tools
17
34
  Make sure the following Python build tools are already installed.
@@ -4,8 +4,9 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyhw"
7
- version = "0.1.3b"
7
+ version = "0.2.1b"
8
8
  description = "PyHw, a neofetch-like command line tool for fetching system information but written mostly in python."
9
+ keywords = ["neofetch", "system information", "command line tool", "python", "hardware information", "fastfetch", "fetching"]
9
10
  authors = [
10
11
  { name = "Xiao Ran", email = "xiaoran.007@icloud.com" }
11
12
  ]
@@ -13,6 +14,7 @@ readme = "README.md"
13
14
  license = {text = "BSD-3-Clause"}
14
15
  requires-python = ">=3.9"
15
16
  classifiers = [
17
+ "Development Status :: 4 - Beta",
16
18
  "Programming Language :: Python :: 3",
17
19
  "License :: OSI Approved :: BSD License",
18
20
  "Operating System :: OS Independent"
@@ -0,0 +1,39 @@
1
+ from .frontend import Printer
2
+ from .backend import Data
3
+ from .backend.title import TitleDetect
4
+ from .backend.host import HostDetect
5
+ from .backend.kernel import KernelDetect
6
+ from .backend.shell import ShellDetect
7
+ from .backend.uptime import UptimeDetect
8
+ from .backend.os import OSDetect
9
+ from .backend.cpu import CPUDetect
10
+ from .backend.gpu import GPUDetect
11
+ from .backend.memory import MemoryDetect
12
+ from .pyhwUtil import createDataString
13
+ from .pyhwUtil import getOS, selectOSLogo
14
+
15
+
16
+ def main():
17
+ current_os = getOS()
18
+ print("This is a test version of PyHw. Currently, it only supports Linux and macOS.")
19
+ if current_os != "linux" and current_os != "macos":
20
+ print(f"Only Linux and macOS is supported for now. Current os: {current_os}")
21
+ return
22
+ data = Data()
23
+ data.title = TitleDetect(os=current_os).getTitle().title
24
+ data.Host = HostDetect(os=current_os).getHostInfo().model
25
+ data.Kernel = KernelDetect(os=current_os).getKernelInfo().kernel
26
+ data.Shell = ShellDetect(os=current_os).getShellInfo().info
27
+ data.Uptime = UptimeDetect(os=current_os).getUptime().uptime
28
+ data.OS = OSDetect(os=current_os).getOSInfo().prettyName
29
+ data.CPU = CPUDetect(os=current_os).getCPUInfo().cpu
30
+ gpu_info = GPUDetect(os=current_os).getGPUInfo()
31
+ if gpu_info.number > 0:
32
+ data.GPU = gpu_info.gpus
33
+ data.Memory = MemoryDetect(os=current_os).getMemoryInfo().memory
34
+
35
+ Printer(logo_os=selectOSLogo(OSDetect(os=current_os).getOSInfo().id), data=createDataString(data)).cPrint()
36
+
37
+
38
+ if __name__ == "__main__":
39
+ main()
@@ -1,4 +1,5 @@
1
1
  from .linux import CPUDetectLinux
2
+ from .macos import CPUDetectMacOS
2
3
  from ...pyhwException import OSUnsupportedException
3
4
 
4
5
 
@@ -9,5 +10,7 @@ class CPUDetect:
9
10
  def getCPUInfo(self):
10
11
  if self.OS == "linux":
11
12
  return CPUDetectLinux().getCPUInfo()
13
+ elif self.OS == "macos":
14
+ return CPUDetectMacOS().getCPUInfo()
12
15
  else:
13
16
  raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,13 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class CPUInfo:
6
+ """
7
+ Class to store CPU information. Print key: cpu
8
+ """
9
+ def __init__(self):
10
+ self.cpu = ""
11
+ self.model = ""
12
+ self.cores = ""
13
+ self.frequency = ""
@@ -1,23 +1,17 @@
1
- from dataclasses import dataclass
2
1
  import re
3
2
  import os
4
-
5
-
6
- @dataclass
7
- class CPUInfoLinux:
8
- cpu = ""
9
- model = ""
10
- cores = ""
11
- frequency = ""
3
+ from .cpuInfo import CPUInfo
12
4
 
13
5
 
14
6
  class CPUDetectLinux:
15
7
  def __init__(self):
16
- self.__cpuInfo = CPUInfoLinux()
8
+ self.__cpuInfo = CPUInfo()
17
9
 
18
10
  def getCPUInfo(self):
19
11
  self.__getCPUInfo()
20
12
  self.__modelClean()
13
+ if self.__cpuInfo.model == "":
14
+ self.__cpuInfo.model = "Unknown"
21
15
  if self.__cpuInfo.model != "":
22
16
  self.__cpuInfo.cpu = self.__cpuInfo.model
23
17
  if self.__cpuInfo.cores != "":
@@ -53,7 +47,7 @@ class CPUDetectLinux:
53
47
  else:
54
48
  for line in cpu_info.split("\n"):
55
49
  if line.startswith("cpu MHz") or line.startswith("clock"):
56
- self.__cpuInfo.frequency = float(line.split(":")[1].strip()) / 1000 # Ghz
50
+ self.__cpuInfo.frequency = f"{round(float(line.split(':')[1].strip()) / 1000, 2)} Ghz" # Ghz
57
51
  break
58
52
 
59
53
  def __modelClean(self):
@@ -0,0 +1,69 @@
1
+ from .cpuInfo import CPUInfo
2
+ from ...pyhwUtil import sysctlGetString, sysctlGetInt, getArch
3
+
4
+
5
+ class CPUDetectMacOS:
6
+ def __init__(self):
7
+ self.__cpuInfo = CPUInfo()
8
+ self.__arch = getArch()
9
+ self.__pCore = 0
10
+ self.__eCore = 0
11
+
12
+ def getCPUInfo(self):
13
+ if self.__arch == "aarch64":
14
+ self.__getCPUModel()
15
+ self.__AppleSiliconBaseFrequency()
16
+ self.__handleAppleSilicon()
17
+ self.__cpuInfo.cpu = f"{self.__cpuInfo.model} ({self.__pCore}P, {self.__eCore}E) @ {self.__cpuInfo.frequency}"
18
+ else:
19
+ self.__getCPUModel()
20
+ self.__getCPUCores()
21
+ self.__getCPUFrequency()
22
+ # need test on Intel Macs.
23
+ self.__cpuInfo.cpu = f"{self.__cpuInfo.model.replace('CPU', f'({self.__cpuInfo.cores})')}"
24
+ return self.__cpuInfo
25
+
26
+ def __getCPUModel(self):
27
+ model = sysctlGetString("machdep.cpu.brand_string")
28
+ model = model.replace("(R)", "")
29
+ model = model.replace("(TM)", "")
30
+ self.__cpuInfo.model = model
31
+
32
+ def __getCPUCores(self):
33
+ cores = sysctlGetString("hw.logicalcpu_max")
34
+ self.__cpuInfo.cores = cores
35
+
36
+ def __getCPUFrequency(self):
37
+ # sysctl doesn't provide the exact CPU frequency on Apple Silicon Macs, there are some indirect methods
38
+ # to get the CPU frequency, but can not integrate with Python directly.
39
+ # C-Based helper module will be added later.
40
+ # See https://github.com/fastfetch-cli/fastfetch/blob/dev/src/detection/cpu/cpu_apple.c for more details.
41
+ freq = sysctlGetString("hw.cpufrequency")
42
+ self.__cpuInfo.frequency = freq
43
+
44
+ def __handleAppleSilicon(self):
45
+ nlevels = sysctlGetInt("hw.nperflevels")
46
+ if nlevels is not None and nlevels == 2: # currently, Apple Silicon chip only has 2 performance levels.
47
+ pcore = sysctlGetInt("hw.perflevel0.logicalcpu_max") # level 0 is P-core
48
+ ecore = sysctlGetInt("hw.perflevel1.logicalcpu_max") # level 1 is E-core
49
+ if pcore is not None and ecore is not None:
50
+ self.__pCore = pcore
51
+ self.__eCore = ecore
52
+
53
+ def __AppleSiliconBaseFrequency(self):
54
+ # see https://en.wikipedia.org/wiki/Apple_silicon#M_series for more details.
55
+ freq = {
56
+ "Apple M1": "2.30 GHz",
57
+ "Apple M1 Pro": "2.32 GHz",
58
+ "Apple M1 Max": "2.32 GHz",
59
+ "Apple M1 Ultra": "2.32 GHz",
60
+ "Apple M2": "3.50 GHz",
61
+ "Apple M2 Pro": "3.50 GHz",
62
+ "Apple M2 Max": "3.69 GHz",
63
+ "Apple M2 Ultra": "3.70 Ghz",
64
+ "Apple M3": "4.05 GHz",
65
+ "Apple M3 Pro": "4.05 GHz",
66
+ "Apple M3 Max": "4.05 GHz",
67
+ "Apple M4": "4.40 GHz"
68
+ }
69
+ self.__cpuInfo.frequency = freq.get(self.__cpuInfo.model, "Unknown")
@@ -1,4 +1,5 @@
1
1
  from .linux import GPUDetectLinux
2
+ from .macos import GPUDetectMacOS
2
3
 
3
4
 
4
5
  class GPUDetect:
@@ -8,5 +9,7 @@ class GPUDetect:
8
9
  def getGPUInfo(self):
9
10
  if self.OS == "linux":
10
11
  return GPUDetectLinux().getGPUInfo()
12
+ elif self.OS == "macos":
13
+ return GPUDetectMacOS().getGPUInfo()
11
14
  else:
12
15
  raise NotImplementedError("Unsupported operating system")
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class GPUInfo:
6
+ def __init__(self):
7
+ self.number = 0
8
+ self.gpus = []
@@ -1,18 +1,12 @@
1
1
  import subprocess
2
- from dataclasses import dataclass
2
+ from .gpuInfo import GPUInfo
3
3
  from ..cpu import CPUDetect
4
4
  from ...pyhwUtil import getArch
5
5
 
6
6
 
7
- @dataclass
8
- class GPUInfoLinux:
9
- number = 0
10
- gpus = []
11
-
12
-
13
7
  class GPUDetectLinux:
14
8
  def __init__(self):
15
- self.__gpuInfo = GPUInfoLinux()
9
+ self.__gpuInfo = GPUInfo()
16
10
 
17
11
  def getGPUInfo(self):
18
12
  self.__getGPUInfo()
@@ -37,7 +31,7 @@ class GPUDetectLinux:
37
31
  # if detector can't find any VGA/Display/3D GPUs, assume the host is a sbc device, this function is a placeholder for a more advanced method.
38
32
  if getArch() == "aarch64" or getArch() == "arm32":
39
33
  self.__gpuInfo.number = 1
40
- self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model} (SOC Integrated Graphics)")
34
+ self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model} [SOC Integrated]")
41
35
  else:
42
36
  self.__gpuInfo.number = 1
43
37
  self.__gpuInfo.gpus.append("Not found")
@@ -0,0 +1,63 @@
1
+ from .gpuInfo import GPUInfo
2
+ from ...pyhwUtil import getArch
3
+ import json
4
+ import subprocess
5
+
6
+
7
+ class GPUDetectMacOS:
8
+ def __init__(self):
9
+ self.__gpuInfo = GPUInfo()
10
+ self.__arch = getArch()
11
+
12
+ def getGPUInfo(self):
13
+ if self.__arch == "aarch64":
14
+ self.__getGPUAppleSilicon()
15
+ else: # Does not consider powerPC based Macs.
16
+ self.__getGPUIntel()
17
+ return self.__gpuInfo
18
+
19
+ def __getGPUAppleSilicon(self):
20
+ gpus = list()
21
+ try:
22
+ gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
23
+ if 'SPDisplaysDataType' in gpu_info_dict:
24
+ gpus = gpu_info_dict['SPDisplaysDataType']
25
+ self.__gpuInfo.number = len(gpus)
26
+ else:
27
+ pass
28
+ except Exception:
29
+ return
30
+
31
+ for gpu in gpus:
32
+ self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} ({gpu.get("sppci_cores")} cores) [SOC Integrated]')
33
+
34
+ def __getGPUIntel(self):
35
+ gpus = list()
36
+ try:
37
+ gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
38
+ if 'SPDisplaysDataType' in gpu_info_dict:
39
+ gpus = gpu_info_dict['SPDisplaysDataType']
40
+ self.__gpuInfo.number = len(gpus)
41
+ else:
42
+ pass
43
+ except Exception:
44
+ return
45
+
46
+ for gpu in gpus:
47
+ if self.__handleVendor(gpu.get("spdisplays_vendor")) == "Intel": # Integrated GPU
48
+ self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} [CPU Integrated]')
49
+ elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "AMD": # dGPU
50
+ self.__gpuInfo.gpus.append(f'{gpu.get("sppci_model")} [Discrete]')
51
+ elif self.__handleVendor(gpu.get("spdisplays_vendor")) == "Nvidia": # Since current macOS does not support NVIDIA GPUs, this condition is not applicable
52
+ pass
53
+
54
+ @staticmethod
55
+ def __handleVendor(vendor):
56
+ if vendor == "sppci_vendor_Apple":
57
+ return "Apple"
58
+ elif vendor == "sppci_vendor_intel":
59
+ return "Intel"
60
+ elif vendor == "sppci_vendor_amd":
61
+ return "AMD"
62
+ else:
63
+ return vendor
@@ -12,7 +12,7 @@ class HostDetect:
12
12
  if self.OS == "linux":
13
13
  return HostDetectLinux().getHostInfo()
14
14
  elif self.OS == "macos":
15
- pass
15
+ return HostDetectMacOS().getHostInfo()
16
16
  elif self.OS == "windows":
17
17
  pass
18
18
  else:
@@ -0,0 +1,13 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class HostInfo:
6
+ model = ""
7
+ family = ""
8
+ name = ""
9
+ version = ""
10
+ sku = ""
11
+ serial = ""
12
+ uuid = ""
13
+ vendor = ""
@@ -0,0 +1,51 @@
1
+ """
2
+ In dev.
3
+ """
4
+ from ...pyhwUtil import getArch
5
+ from .hostInfo import HostInfo
6
+ import os
7
+
8
+
9
+ class HostDetectLinux:
10
+ def __init__(self):
11
+ self.__hostInfo = HostInfo()
12
+ self.__arch = getArch()
13
+
14
+ def getHostInfo(self):
15
+ self.__getModel()
16
+ return self.__hostInfo
17
+
18
+ def __getModel(self):
19
+ if self.__arch in ["x86_64", "x86"]:
20
+ try:
21
+ with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
22
+ self.__hostInfo.name = f.read().strip()
23
+ with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
24
+ self.__hostInfo.version = f.read().strip()
25
+ self.__hostInfo.model = self.__hostInfo.name + " " + self.__hostInfo.version
26
+ except FileNotFoundError:
27
+ pass
28
+ elif self.__arch in ["aarch64", "arm32"]:
29
+ # try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
30
+ if os.path.exists("/sys/devices/virtual/dmi/id"):
31
+ try:
32
+ with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
33
+ self.__hostInfo.name = f.read().strip()
34
+ with open("/sys/devices/virtual/dmi/id/product_version", "r") as f:
35
+ self.__hostInfo.version = f.read().strip()
36
+ self.__hostInfo.model = self.__hostInfo.name + " " + self.__hostInfo.version
37
+ except FileNotFoundError:
38
+ pass
39
+ else:
40
+ # some single board computers may not have dmi folder, try to find model name in device tree.
41
+ try:
42
+ with open("/sys/firmware/devicetree/base/model", "r") as f:
43
+ self.__hostInfo.model = f.read().strip()
44
+ except FileNotFoundError:
45
+ pass
46
+
47
+ def __getHostFamily(self):
48
+ pass
49
+
50
+ def __getHostProductName(self):
51
+ pass