pyhw 0.13.2__py3-none-any.whl → 0.13.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pyhw/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '0.13.2'
1
+ __version__ = '0.13.4'
2
2
  __author__ = 'xiaoran007'
pyhw/__main__.py CHANGED
@@ -16,6 +16,7 @@ from .pyhwUtil import getOS, selectOSLogo
16
16
  from .pyhwUtil import ReleaseChecker
17
17
  from .frontend.color import colorPrefix, colorSuffix, ColorSet
18
18
  import multiprocessing
19
+ import argparse
19
20
 
20
21
 
21
22
  def check_release(release_dict):
@@ -76,7 +77,21 @@ def detect_npu(os, result_dict):
76
77
  result_dict["NPU"] = npu_info.npus
77
78
 
78
79
 
80
+ def print_version():
81
+ releaseChecker = ReleaseChecker()
82
+ print(f"pyhw v{releaseChecker.CurrentVersion}")
83
+
84
+
79
85
  def main():
86
+ parser = argparse.ArgumentParser(description='PyHw, a neofetch-like command line tool for fetching system information')
87
+ parser.add_argument('-v', '--version', action='store_true', help='Print version information and exit')
88
+
89
+ args = parser.parse_args()
90
+
91
+ if args.version:
92
+ print_version()
93
+ return
94
+
80
95
  current_os = getOS()
81
96
  if current_os not in ["linux", "macos", "freebsd", "windows"]:
82
97
  print(f"Only Linux, macOS, FreeBSD, and Windows are supported for now. Current OS: {current_os}")
pyhw/backend/cpu/linux.py CHANGED
@@ -48,7 +48,20 @@ class CPUDetectLinux:
48
48
  else:
49
49
  for line in cpu_info.split("\n"):
50
50
  if line.startswith("cpu MHz") or line.startswith("clock"):
51
- self.__cpuInfo.frequency = f"{round(float(line.split(':')[1].strip()) / 1000, 2)} Ghz" # Ghz
51
+ value_str = line.split(':')[1].strip()
52
+ try:
53
+ freq_value = float(value_str)
54
+ self.__cpuInfo.frequency = f"{round(freq_value / 1000, 2)} Ghz"
55
+ except ValueError:
56
+ match = re.search(r'(\d+(?:\.\d+)?)', value_str)
57
+ if match:
58
+ freq_value = float(match.group(1))
59
+ if 'MHz' in value_str:
60
+ self.__cpuInfo.frequency = f"{round(freq_value / 1000, 2)} Ghz"
61
+ elif 'GHz' in value_str:
62
+ self.__cpuInfo.frequency = f"{round(freq_value, 2)} Ghz"
63
+ else:
64
+ self.__cpuInfo.frequency = f"{round(freq_value / 1000, 2)} Ghz"
52
65
  break
53
66
 
54
67
  def __modelClean(self):
pyhw/backend/cpu/macos.py CHANGED
@@ -1,5 +1,7 @@
1
1
  from .cpuInfo import CPUInfo
2
2
  from ...pyhwUtil import sysctlGetString, sysctlGetInt, getArch
3
+ import ctypes
4
+ from pathlib import Path
3
5
 
4
6
 
5
7
  class CPUDetectMacOS:
@@ -11,11 +13,13 @@ class CPUDetectMacOS:
11
13
 
12
14
  def getCPUInfo(self):
13
15
  if self.__arch == "aarch64":
16
+ # For Apple Silicon Macs, we need to handle the CPU differently.
14
17
  self.__getCPUModel()
15
- self.__AppleSiliconBaseFrequency()
18
+ self.__AppleSiliconIOKitFrequency()
16
19
  self.__handleAppleSilicon()
17
20
  self.__cpuInfo.cpu = f"{self.__cpuInfo.model} ({self.__pCore}P, {self.__eCore}E) @ {self.__cpuInfo.frequency}"
18
21
  else:
22
+ # For Intel Macs, we can use sysctl to get the CPU information.
19
23
  self.__getCPUModel()
20
24
  self.__getCPUCores()
21
25
  self.__getCPUFrequency()
@@ -50,6 +54,21 @@ class CPUDetectMacOS:
50
54
  self.__pCore = pcore
51
55
  self.__eCore = ecore
52
56
 
57
+ def __AppleSiliconIOKitFrequency(self):
58
+ try:
59
+ package_root = Path(__file__).resolve().parent.parent.parent
60
+ lib = ctypes.CDLL(f"{package_root}/library/lib/iokitCPULib.dylib")
61
+ lib.get_apple_silicon_max_frequency.restype = ctypes.c_double
62
+ max_freq = lib.get_apple_silicon_max_frequency()
63
+ if max_freq != 0:
64
+ self.__cpuInfo.frequency = f"{max_freq:.2f} GHz"
65
+ else:
66
+ # If the IOKit library fails, we can fallback to the base frequency.
67
+ self.__AppleSiliconBaseFrequency()
68
+ except Exception as e:
69
+ # If the IOKit library fails, we can fallback to the base frequency.
70
+ self.__AppleSiliconBaseFrequency()
71
+
53
72
  def __AppleSiliconBaseFrequency(self):
54
73
  # see https://en.wikipedia.org/wiki/Apple_silicon#M_series for more details.
55
74
  # https://eclecticlight.co/2025/01/20/what-are-cpu-core-frequencies-in-apple-silicon-macs/
@@ -66,7 +85,7 @@ class CPUDetectMacOS:
66
85
  "Apple M3 Pro": "4.05 GHz",
67
86
  "Apple M3 Max": "4.05 GHz",
68
87
  "Apple M3 Ultra": "4.05 GHz", # Need more info
69
- "Apple M4": "4.40 GHz",
88
+ "Apple M4": "4.46 GHz",
70
89
  "Apple M4 Pro": "4.51 GHz",
71
90
  "Apple M4 Max": "4.51 GHz"
72
91
  }
pyhw/backend/gpu/linux.py CHANGED
@@ -39,6 +39,10 @@ class GPUDetectLinux:
39
39
  device_name = f"{device.vendor_name} {device.device_name} [{device.subsystem_device_name}] {core_print}"
40
40
  else:
41
41
  device_name = f"{device.vendor_name} {device.device_name} {core_print}"
42
+
43
+ if not device_name.strip():
44
+ device_name = f"{device.class_name}"
45
+
42
46
  self.__gpuInfo.gpus.append(self.__gpuNameClean(device_name))
43
47
  self.__gpuInfo.number += 1
44
48
 
@@ -41,7 +41,7 @@ class HostDetectLinux:
41
41
  self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
42
42
  except FileNotFoundError:
43
43
  pass
44
- elif self._arch in ["aarch64", "arm32", "riscv64"]:
44
+ elif self._arch in ["aarch64", "arm32", "riscv64", "ppc64le", "mips64"]:
45
45
  # try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
46
46
  if os.path.exists("/sys/devices/virtual/dmi/id"):
47
47
  try:
pyhw/backend/os/macos.py CHANGED
@@ -10,14 +10,15 @@ class OSDetectMacOS:
10
10
  self.__ProductVersion = ""
11
11
  self.__BuildVersion = ""
12
12
  self.__VersionName = ""
13
+ self.__Arch = self.__handleOSArch()
13
14
 
14
15
  def getOSInfo(self):
15
16
  self.__getOS()
16
17
  self.__handelOSName()
17
18
  if self.__VersionName != "":
18
- self.__osInfo.prettyName = f"{self.__ProductName} {self.__VersionName} {self.__ProductVersion} {self.__BuildVersion} {getArch()}"
19
+ self.__osInfo.prettyName = f"{self.__ProductName} {self.__VersionName} {self.__ProductVersion} {self.__BuildVersion} {self.__Arch}"
19
20
  else:
20
- self.__osInfo.prettyName = f"{self.__ProductName} {self.__ProductVersion} {self.__BuildVersion} {getArch()}"
21
+ self.__osInfo.prettyName = f"{self.__ProductName} {self.__ProductVersion} {self.__BuildVersion} {self.__Arch}"
21
22
  self.__osInfo.id = "macOS"
22
23
  return self.__osInfo
23
24
 
@@ -51,3 +52,11 @@ class OSDetectMacOS:
51
52
  version_name = macOSVersionMap.get(major, "")
52
53
  if version_name != "":
53
54
  self.__VersionName = version_name
55
+
56
+ @staticmethod
57
+ def __handleOSArch():
58
+ arch = getArch()
59
+ if arch == "aarch64":
60
+ return "arm64"
61
+ else:
62
+ return arch
Binary file
@@ -0,0 +1,15 @@
1
+ import ctypes
2
+
3
+
4
+ def main():
5
+ lib = ctypes.CDLL(f"../lib/iokitCPULib.dylib")
6
+ lib.get_apple_silicon_max_frequency.restype = ctypes.c_double
7
+ max_freq = lib.get_apple_silicon_max_frequency()
8
+ print(max_freq)
9
+ # gpus = host_info.decode('utf-8').split("; ")
10
+
11
+
12
+ if __name__ == "__main__":
13
+ main()
14
+
15
+
pyhw/pyhwUtil/pyhwUtil.py CHANGED
@@ -5,7 +5,7 @@ from dataclasses import dataclass
5
5
  import subprocess
6
6
 
7
7
 
8
- def getOS():
8
+ def getOS() -> str:
9
9
  """
10
10
  Get the os type in lower case.
11
11
  :return: str, os type, value in [windows, linux, macos, freebsd, unknown].
@@ -23,10 +23,10 @@ def getOS():
23
23
  return "unknown"
24
24
 
25
25
 
26
- def getArch():
26
+ def getArch() -> str:
27
27
  """
28
28
  Get the machine architecture.
29
- :return: str, value in [x86_64, x86, aarch64, arm32, riscv64, s390x, ppc64le].
29
+ :return: str, value in [x86_64, x86, aarch64, arm32, riscv64, s390x, ppc64le, mips64].
30
30
  """
31
31
  arch = platform.machine()
32
32
  if arch == "x86_64" or arch == "AMD64" or arch == "amd64":
@@ -43,6 +43,8 @@ def getArch():
43
43
  return "s390x"
44
44
  elif arch == "ppc64le":
45
45
  return "ppc64le"
46
+ elif arch == "mips64":
47
+ return "mips64"
46
48
  else:
47
49
  return "unknown"
48
50
 
@@ -157,7 +159,7 @@ class DataStringProcessor:
157
159
  return ret_str
158
160
 
159
161
 
160
- def createDataString(data: Data):
162
+ def createDataString(data: Data) -> str:
161
163
  data_string_processor = DataStringProcessor(data)
162
164
  data_string = ""
163
165
  data_string += data_string_processor.getTitle()
@@ -175,7 +177,7 @@ def createDataString(data: Data):
175
177
  return data_string
176
178
 
177
179
 
178
- def createDataStringOld(data: Data):
180
+ def createDataStringOld(data: Data) -> str:
179
181
  data_string = ""
180
182
  data_string += f" {data.title}\n"
181
183
  data_string += f" {'-'*len(data.title)}\n"
@@ -195,7 +197,7 @@ def createDataStringOld(data: Data):
195
197
  return data_string
196
198
 
197
199
 
198
- def selectOSLogo(os_id: str):
200
+ def selectOSLogo(os_id: str) -> str:
199
201
  """
200
202
  Select the logo based on the os id and terminal size.
201
203
  :param os_id: str, os id.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyhw
3
- Version: 0.13.2
3
+ Version: 0.13.4
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.5
16
+ Requires-Dist: pypci-ng>=0.2.6
17
17
  Dynamic: license-file
18
18
 
19
19
  # PyHw, a neofetch-like system information fetching tool
@@ -30,6 +30,8 @@ Dynamic: license-file
30
30
  ![Static Badge](https://img.shields.io/badge/aarch64-blue)
31
31
  ![Static Badge](https://img.shields.io/badge/arm32-yellow)
32
32
  ![Static Badge](https://img.shields.io/badge/riscv64-%238A2BE2)
33
+ ![Static Badge](https://img.shields.io/badge/ppc64-orange)
34
+ ![Static Badge](https://img.shields.io/badge/s390x-red)
33
35
 
34
36
 
35
37
  PyHw, a neofetch-like command line tool for fetching system information but written mostly in Python.
@@ -1,26 +1,26 @@
1
- pyhw/__init__.py,sha256=lkC619ezbIHQYm9kYLwX2NkXYhmeQLX1Xqaf1Wb5wPw,49
2
- pyhw/__main__.py,sha256=oZpFtvSyYTM8cMsulvi51zJV0gtmw3OCQVdgoaHbtxc,4977
1
+ pyhw/__init__.py,sha256=xxFswf8enN7kuEArYcxekQu970GRlfaYc-8QMH6xuEk,49
2
+ pyhw/__main__.py,sha256=iy1nzJ7Z4wB_bMyDGOZgTUZZmOoAru7CxSzpm9SMNbs,5431
3
3
  pyhw/backend/__init__.py,sha256=X1D1D28lSojDrUzUolgJvmbuctwBh_UxG3FwUeL8adA,51
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
7
  pyhw/backend/cpu/cpuBase.py,sha256=2YAOz1K8VLKtLY7iYBxUV9Ikuf4I4d4YivocvZDrdUU,748
8
8
  pyhw/backend/cpu/cpuInfo.py,sha256=A_nNGElq9W7oZ5DFJowLdFBE0ZvXKr5h29E6TGAvbRc,251
9
- pyhw/backend/cpu/linux.py,sha256=6xvRASlykSA3KzlK3CLK8JPT9NS6XMWj1gxIgVItkRE,3492
10
- pyhw/backend/cpu/macos.py,sha256=Mzo-4xBebu-o0p92CYCfdu_k93oLafvs6QExhosywko,3112
9
+ pyhw/backend/cpu/linux.py,sha256=GrSeBqa25Br4GVXiqhlLS0OuWyNEVPvfNJbIgSPMonQ,4284
10
+ pyhw/backend/cpu/macos.py,sha256=6t8OMvBJsOennwg_0F1zqWY5tzvavflvCou2q6NyPkI,4058
11
11
  pyhw/backend/cpu/windows.py,sha256=j9lkOL_zrnOAzr--GoFwMHEVqlE_vuO_wKnE0CgISdw,1702
12
12
  pyhw/backend/gpu/__init__.py,sha256=EpMjPvUaXt0LTNMvGmB8WgXbUB9keCxuOhu8NT3Re6o,56
13
13
  pyhw/backend/gpu/bsd.py,sha256=ladMMIlTwb6Z1ETCLFII--lkeLCp50Wb7WFrlOXa5DQ,123
14
14
  pyhw/backend/gpu/gpuBase.py,sha256=ZPT9o7PhYpzlwign0GsCT519F9DGx-1UEMVVOM8MV_k,748
15
15
  pyhw/backend/gpu/gpuInfo.py,sha256=d_z_z5DiZAg85wP0VOBQEU0QHdaK3qFqA2Tp9Eq8-Zs,133
16
- pyhw/backend/gpu/linux.py,sha256=DQMayZINcQLJe4_Gm_SYWhG8gL1T0YcyP97TfEwYVis,3010
16
+ pyhw/backend/gpu/linux.py,sha256=2UaTih2JrUKA5K-ZYZdx6oXdBHW3zkt1bnD9ZV5PKcg,3113
17
17
  pyhw/backend/gpu/macos.py,sha256=s-GZk_Q7K58nSOYuOIAYLRvLafwHyQtsWrPVe3CuXac,4068
18
18
  pyhw/backend/gpu/windows.py,sha256=9VlObAdcOXJyFFxHKHSnFdL07xiGZHNHwn6C843TfNg,1170
19
19
  pyhw/backend/host/__init__.py,sha256=OmlSGjg3crlFcGz2FhBDyd35R7H0rriy3eq57y8h0_s,59
20
20
  pyhw/backend/host/bsd.py,sha256=xePlHfVYv7PSWMU1a7mTbMK3mzl2ssttkI13Xi5s00w,381
21
21
  pyhw/backend/host/hostBase.py,sha256=gM49SY6rEaxec_0bUOMk7QlEfR7vjfWp3BXEUqgdncc,762
22
22
  pyhw/backend/host/hostInfo.py,sha256=YUISVT-tumsU4M_b6tmeAq5-RBrW0K0c4_WoyR7xTeA,451
23
- pyhw/backend/host/linux.py,sha256=xvbZrwlKN--tKMf4_YyN20cGTSIcV5yLG3Gez7M15Pk,3157
23
+ pyhw/backend/host/linux.py,sha256=_vzNTkmY3Vo3jZZmnYZ4iwTbuW_Hlp-C0EjKmm8A4yk,3178
24
24
  pyhw/backend/host/macos.py,sha256=VYuO6zpEmBfII9FGLtqa10m-YwxrdCCSSsYp9G9AtWw,16275
25
25
  pyhw/backend/host/windows.py,sha256=RRsR8Ejlym66uJ3FopOCcPzZAkDKQu3Inq4KJ8kl0SI,1165
26
26
  pyhw/backend/kernel/__init__.py,sha256=fGjwjpOhwA_PnsWbwoq102hwhTay2ufYKaTqxjSV2-I,65
@@ -52,7 +52,7 @@ pyhw/backend/npu/windows.py,sha256=jyTZiSqKzfyKRbzS-SgGxx0dKoHwo8gr8BlwBlxR58o,1
52
52
  pyhw/backend/os/__init__.py,sha256=RMKN332tsAhn_EiReoCq9NOmp4po5uZyaGNzpKS_ZZs,54
53
53
  pyhw/backend/os/bsd.py,sha256=RtRh_8tKHCVikGwhKGXSDqM9sqbCJJQehJMEmZ9kJOs,130
54
54
  pyhw/backend/os/linux.py,sha256=SbwNLMAUr3exJY54nmSuVkZAtOxWDVFNsS55pAO8x4k,1937
55
- pyhw/backend/os/macos.py,sha256=WsB0y1Q5cmT4RMLyMGffJFoHHIkdQ6ZKZM09_rMC854,1905
55
+ pyhw/backend/os/macos.py,sha256=zlqXhX8Hjh7rkeFwgcT8ekXzTGa_1R6nYjgFkQrpcTk,2118
56
56
  pyhw/backend/os/osBase.py,sha256=2zaOGhaXLrNJS9-9qR4hH9_uFTgA2Sv4ab7YZvNVFaE,744
57
57
  pyhw/backend/os/osInfo.py,sha256=NEr76aicI9N3SFrwi1skcpUEjzsyCryTjdE9X1nBjBM,536
58
58
  pyhw/backend/os/windows.py,sha256=4qTYaQY19BiCIpmtHkp53yvChuYzlDmynbgICwHyfl8,1468
@@ -103,22 +103,23 @@ pyhw/frontend/logo/ascii/windows_10.pyhw,sha256=jv5pzZs_CdOzpeTjyXfXJWcTQwK-J0LN
103
103
  pyhw/frontend/logo/ascii/windows_11.pyhw,sha256=VuQTzbBabaEQhm2JBVhy6Ja6lClUGacQsaiNUih9nhU,656
104
104
  pyhw/frontend/logo/ascii/windows_2025.pyhw,sha256=o8eWsiyhNpDoEjiWFiBMfkd-8MdIslGc1Jpm85LU4P8,643
105
105
  pyhw/frontend/logo/ascii/windows_old.pyhw,sha256=AMsvWAZ50HM8lweWEmzDWbRNDGkKFJo9qLY_VRKrciY,580
106
- pyhw/library/lib/iokitCPULib.dylib,sha256=gLi_HpkmNrzfOnyDxtzzmy65PxlC56g2LcS1l056PHQ,173320
106
+ pyhw/library/lib/iokitCPULib.dylib,sha256=uMDDaijZGvTNkdT0ccQ55SDO4rRrzj8GSbrDMKeLAZ0,34280
107
107
  pyhw/library/lib/iokitGPULib.dylib,sha256=6xigd40YGEz9lHUfq_6qpTswz2st-4I9bW6j8ssg29s,155224
108
108
  pyhw/library/lib/iokitHostLib.dylib,sha256=MKxyKUkD4IZomP4exATikWx2SxqSDqQx4FEuIkFAEnc,149912
109
109
  pyhw/library/lib/nvmlGPULib_amd64.so,sha256=lrkxeJjChUs8oVhaw_uMeXKbUJp24KroQ_hhcLtHfTg,12784
110
110
  pyhw/library/lib/nvmlGPULib_arm64.so,sha256=DFIYqNcuRxiZ8_jrYoaRB3Dx9GrY7UBXscwXQvV4k3I,13528
111
+ pyhw/library/test/iokitCPULibTest.py,sha256=BrhMypgfJTeMectpDc9Tmwzp8gYwYAcowaTFf72LlLE,311
111
112
  pyhw/library/test/iokitHostLibTest.py,sha256=oz5x1g4WMdoikU3Eo6zoxcHZ4e-UMRhXg0C0Lflo-ac,272
112
113
  pyhw/library/test/nvmlGPULibTest.py,sha256=F4AjQGZDNj29fRtxvy41zCSFi2Eirp0CQSYuxuw0n60,785
113
114
  pyhw/pyhwException/__init__.py,sha256=juw4PdgPa-eLy0y678BQ7_Ck-BJa-P0LHyKCGePazb8,221
114
115
  pyhw/pyhwException/pyhwException.py,sha256=wxuzFQa9g7XB1q9TUKO_55lw7wMEJMpzG8w1GVTFVa0,197
115
116
  pyhw/pyhwUtil/__init__.py,sha256=n3jWo-q-jSouXvUHMg45DOHS5xLRG64E02A9rDQb44M,323
116
117
  pyhw/pyhwUtil/cliUtil.py,sha256=_zNrhzQvrtqUp6xyZ0JTs_KyL1wvLji-nBmU65XA1aI,2342
117
- pyhw/pyhwUtil/pyhwUtil.py,sha256=_eUOHcuUqPHYuecDf0nEdF2GRuRJhW99MqYSJyZ4KUA,8270
118
+ pyhw/pyhwUtil/pyhwUtil.py,sha256=V3M6X9eTirwnwwRiSJaLUWrZKZYMbRihARJVQc879P8,8364
118
119
  pyhw/pyhwUtil/sysctlUtil.py,sha256=S-rUvqi7ZrMyMouIhxlyHEQ4agM7sCT1Y7uzs3Hu5-o,841
119
- pyhw-0.13.2.dist-info/licenses/LICENSE,sha256=hJs6RBqSVCexbTsalkMLNFI5t06kekQEsSVaOt_-yLs,1497
120
- pyhw-0.13.2.dist-info/METADATA,sha256=cAE_w8oLoPkVi2nHwVzuwivcaDcdORqED8y5u8NS7D0,7600
121
- pyhw-0.13.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
- pyhw-0.13.2.dist-info/entry_points.txt,sha256=q-AB8im_QahpmNrmy4aPTJRGi0LlbNlnI3kF7s6pKss,44
123
- pyhw-0.13.2.dist-info/top_level.txt,sha256=7Inxvxt1TngEricKZEex9_WJZS3DbKYFUXDz4v5WHYU,5
124
- pyhw-0.13.2.dist-info/RECORD,,
120
+ pyhw-0.13.4.dist-info/licenses/LICENSE,sha256=hJs6RBqSVCexbTsalkMLNFI5t06kekQEsSVaOt_-yLs,1497
121
+ pyhw-0.13.4.dist-info/METADATA,sha256=BSaBljX207vWEU7JcnZVurvQDGfaA7hALkbUfRk5j94,7715
122
+ pyhw-0.13.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
+ pyhw-0.13.4.dist-info/entry_points.txt,sha256=q-AB8im_QahpmNrmy4aPTJRGi0LlbNlnI3kF7s6pKss,44
124
+ pyhw-0.13.4.dist-info/top_level.txt,sha256=7Inxvxt1TngEricKZEex9_WJZS3DbKYFUXDz4v5WHYU,5
125
+ pyhw-0.13.4.dist-info/RECORD,,
File without changes