portacode 1.4.13.dev10__py3-none-any.whl → 1.4.13.dev11__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.
portacode/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.4.13.dev10'
32
- __version_tuple__ = version_tuple = (1, 4, 13, 'dev10')
31
+ __version__ = version = '1.4.13.dev11'
32
+ __version_tuple__ = version_tuple = (1, 4, 13, 'dev11')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -33,10 +33,11 @@ _cpu_thread = None
33
33
  _cpu_lock = threading.Lock()
34
34
 
35
35
  # Cgroup v2 tracking
36
- _CGROUP_CONTROLLERS = Path("/sys/fs/cgroup/cgroup.controllers")
37
- _CGROUP_CPU_STAT = Path("/sys/fs/cgroup/cpu.stat")
38
- _CGROUP_CPU_MAX = Path("/sys/fs/cgroup/cpu.max")
36
+ _CGROUP_ROOT = Path("/sys/fs/cgroup")
37
+ _cgroup_path: Optional[Path] = None
39
38
  _cgroup_v2_supported: Optional[bool] = None
39
+ _CGROUP_CPU_STAT = "cpu.stat"
40
+ _CGROUP_CPU_MAX = "cpu.max"
40
41
  _last_cgroup_usage: Optional[int] = None
41
42
  _last_cgroup_time: Optional[float] = None
42
43
 
@@ -145,17 +146,54 @@ def _get_playwright_info() -> Dict[str, Any]:
145
146
  return result
146
147
 
147
148
 
149
+ def _resolve_cgroup_path() -> Path:
150
+ global _cgroup_path
151
+ if _cgroup_path is not None and _cgroup_path.exists():
152
+ return _cgroup_path
153
+ path = _CGROUP_ROOT
154
+ cgroup_file = Path("/proc/self/cgroup")
155
+ if cgroup_file.exists():
156
+ try:
157
+ contents = cgroup_file.read_text()
158
+ except OSError:
159
+ pass
160
+ else:
161
+ for line in contents.splitlines():
162
+ line = line.strip()
163
+ if not line:
164
+ continue
165
+ parts = line.split(":", 2)
166
+ if len(parts) < 3:
167
+ continue
168
+ rel_path = parts[-1].lstrip("/")
169
+ candidate = _CGROUP_ROOT / rel_path
170
+ # Fallback to root path if the relative path is empty
171
+ candidate = candidate if rel_path else _CGROUP_ROOT
172
+ if candidate.exists():
173
+ path = candidate
174
+ break
175
+ _cgroup_path = path
176
+ return _cgroup_path
177
+
178
+
179
+ def _cgroup_file(name: str) -> Path:
180
+ return _resolve_cgroup_path() / name
181
+
182
+
148
183
  def _detect_cgroup_v2() -> bool:
149
184
  global _cgroup_v2_supported
150
185
  if _cgroup_v2_supported is not None:
151
186
  return _cgroup_v2_supported
152
- _cgroup_v2_supported = _CGROUP_CONTROLLERS.exists() and _CGROUP_CPU_STAT.exists()
187
+ controllers = _cgroup_file("cgroup.controllers")
188
+ cpu_stat = _cgroup_file(_CGROUP_CPU_STAT)
189
+ _cgroup_v2_supported = controllers.exists() and cpu_stat.exists()
153
190
  return _cgroup_v2_supported
154
191
 
155
192
 
156
193
  def _read_cgroup_cpu_usage() -> Optional[int]:
194
+ path = _cgroup_file(_CGROUP_CPU_STAT)
157
195
  try:
158
- data = _CGROUP_CPU_STAT.read_text()
196
+ data = path.read_text()
159
197
  except (OSError, UnicodeDecodeError):
160
198
  return None
161
199
  for line in data.splitlines():
@@ -170,10 +208,11 @@ def _read_cgroup_cpu_usage() -> Optional[int]:
170
208
 
171
209
  def _read_cgroup_cpu_limit() -> Optional[float]:
172
210
  """Return the allowed CPU (cores) for this cgroup, if limited."""
173
- if not _CGROUP_CPU_MAX.exists():
211
+ path = _cgroup_file(_CGROUP_CPU_MAX)
212
+ if not path.exists():
174
213
  return None
175
214
  try:
176
- data = _CGROUP_CPU_MAX.read_text().strip()
215
+ data = path.read_text().strip()
177
216
  except (OSError, UnicodeDecodeError):
178
217
  return None
179
218
  parts = data.split()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.13.dev10
3
+ Version: 1.4.13.dev11
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -1,7 +1,7 @@
1
1
  portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
2
2
  portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
3
3
  portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
4
- portacode/_version.py,sha256=U2EKSWYRJkwX2iDCL-xl_a57oBp4wmZQrD95MJrxg_s,721
4
+ portacode/_version.py,sha256=zwvS40cTQ2CYGHeO6SJ3GHWy--a952mG3NF6DeJJHdA,721
5
5
  portacode/cli.py,sha256=mGLKoZ-T2FBF7IA9wUq0zyG0X9__-A1ao7gajjcVRH8,21828
6
6
  portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
7
7
  portacode/keypair.py,sha256=0OO4vHDcF1XMxCDqce61xFTlFwlTcmqe5HyGsXFEt7s,5838
@@ -25,7 +25,7 @@ portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2
25
25
  portacode/connection/handlers/proxmox_infra.py,sha256=v2IftCXnNO8ta8dWfdXf_eRBAeFO6YxkFTCSuTrp5ss,61134
26
26
  portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
27
27
  portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
28
- portacode/connection/handlers/system_handlers.py,sha256=mH3kxmOBInnnHtwwNHYjvU80U3Ok5TzpsGyIbSRA4QE,13579
28
+ portacode/connection/handlers/system_handlers.py,sha256=fr12QpOr_Z8KYGUU-AYrTQwRPAcrLK85hvj3SEq1Kw8,14757
29
29
  portacode/connection/handlers/tab_factory.py,sha256=yn93h6GASjD1VpvW1oqpax3EpoT0r7r97zFXxML1wdA,16173
30
30
  portacode/connection/handlers/terminal_handlers.py,sha256=HRwHW1GiqG1NtHVEqXHKaYkFfQEzCDDH6YIlHcb4XD8,11866
31
31
  portacode/connection/handlers/test_proxmox_infra.py,sha256=d6iBB4pwAqWWdEGRayLxDEexqCElbGZDJlCB4bXba24,682
@@ -65,7 +65,7 @@ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,3
65
65
  portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
66
66
  portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
67
67
  portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
68
- portacode-1.4.13.dev10.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
+ portacode-1.4.13.dev11.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
69
69
  test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
70
70
  test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
71
71
  test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
@@ -91,8 +91,8 @@ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-
91
91
  testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
92
92
  testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
93
93
  testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
94
- portacode-1.4.13.dev10.dist-info/METADATA,sha256=Wyj8cxL1Yfo287OncA94KT2rzqpDN4-QE67BBuB9agM,13052
95
- portacode-1.4.13.dev10.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
96
- portacode-1.4.13.dev10.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
- portacode-1.4.13.dev10.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
- portacode-1.4.13.dev10.dist-info/RECORD,,
94
+ portacode-1.4.13.dev11.dist-info/METADATA,sha256=4wB-lJZbvimQg_dd3hETH0i0Hl-7IXxHQN_Tb23ddQI,13052
95
+ portacode-1.4.13.dev11.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
96
+ portacode-1.4.13.dev11.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
+ portacode-1.4.13.dev11.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
+ portacode-1.4.13.dev11.dist-info/RECORD,,