runtimepy 5.8.1__py3-none-any.whl → 5.8.3__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.
runtimepy/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # =====================================
2
2
  # generator=datazen
3
3
  # version=3.1.4
4
- # hash=50f22b2d623cea7b3ea3eaf94b419b39
4
+ # hash=b65d0c030290cfc108e2e5e85293e331
5
5
  # =====================================
6
6
 
7
7
  """
@@ -10,7 +10,7 @@ Useful defaults and other package metadata.
10
10
 
11
11
  DESCRIPTION = "A framework for implementing Python services."
12
12
  PKG_NAME = "runtimepy"
13
- VERSION = "5.8.1"
13
+ VERSION = "5.8.3"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -1,5 +1,7 @@
1
1
  html {
2
2
  height: 100%;
3
+ width: 100%;
4
+ position: fixed;
3
5
  }
4
6
 
5
7
  body {
@@ -142,6 +142,9 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
142
142
  self._servers: list[_asyncio.Task[None]] = []
143
143
  self._servers_started = _asyncio.Semaphore(0)
144
144
 
145
+ # A copy of named port mappings (loaded via external config).
146
+ self._ports: dict[str, int] = {}
147
+
145
148
  self._init()
146
149
 
147
150
  def _init(self) -> None:
@@ -285,6 +288,7 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
285
288
  self._namespace,
286
289
  self.stop_sig,
287
290
  config if config is not None else self._config,
291
+ self._ports,
288
292
  self,
289
293
  tasks, # type: ignore
290
294
  self.task_manager,
@@ -139,6 +139,8 @@ class ConfigConnectionArbiter(_ImportConnectionArbiter):
139
139
 
140
140
  names = set()
141
141
 
142
+ self._ports = config.ports
143
+
142
144
  # Registier factories.
143
145
  for factory in config.factories:
144
146
  name = factory["name"]
@@ -151,7 +153,7 @@ class ConfigConnectionArbiter(_ImportConnectionArbiter):
151
153
  *factory.get("namespaces", []),
152
154
  **dict_resolve_env_vars(
153
155
  factory.get("kwargs", {}),
154
- env=config.ports, # type: ignore
156
+ env=self._ports, # type: ignore
155
157
  ),
156
158
  ), f"Couldn't register factory '{factory}'!"
157
159
  names.add(name)
@@ -163,17 +165,17 @@ class ConfigConnectionArbiter(_ImportConnectionArbiter):
163
165
 
164
166
  # Resolve any port variables that may have been used.
165
167
  args = list_resolve_env_vars(
166
- client.get("args", []), env=config.ports # type: ignore
168
+ client.get("args", []), env=self._ports # type: ignore
167
169
  )
168
170
  kwargs = dict_resolve_env_vars(
169
- client.get("kwargs", {}), env=config.ports # type: ignore
171
+ client.get("kwargs", {}), env=self._ports # type: ignore
170
172
  )
171
173
  kwargs.setdefault("markdown", client.get("markdown"))
172
174
 
173
175
  assert await self.factory_client(
174
176
  factory,
175
177
  name,
176
- *fix_args(args, config.ports),
178
+ *fix_args(args, self._ports),
177
179
  defer=client["defer"],
178
180
  # Perform some known fixes for common keyword arguments.
179
181
  **fix_kwargs(kwargs),
@@ -186,10 +188,10 @@ class ConfigConnectionArbiter(_ImportConnectionArbiter):
186
188
  assert await self.factory_server(
187
189
  factory,
188
190
  *list_resolve_env_vars(
189
- server.get("args", []), env=config.ports # type: ignore
191
+ server.get("args", []), env=self._ports # type: ignore
190
192
  ),
191
193
  **dict_resolve_env_vars(
192
- server.get("kwargs", {}), env=config.ports # type: ignore
194
+ server.get("kwargs", {}), env=self._ports # type: ignore
193
195
  ),
194
196
  ), f"Couldn't register a '{factory}' server!"
195
197
 
@@ -160,6 +160,7 @@ class AppInfo(_LoggerMixin):
160
160
 
161
161
  # Configuration data that may be specified in a configuration file.
162
162
  config: _JsonObject
163
+ ports: dict[str, int]
163
164
 
164
165
  tui: TuiMixin
165
166
 
@@ -186,6 +187,7 @@ class AppInfo(_LoggerMixin):
186
187
  self.names,
187
188
  self.stop,
188
189
  self.config,
190
+ self.ports,
189
191
  self.tui,
190
192
  self.tasks,
191
193
  self.task_manager,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: runtimepy
3
- Version: 5.8.1
3
+ Version: 5.8.3
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -17,11 +17,11 @@ Classifier: License :: OSI Approved :: MIT License
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: vcorelib>=3.4.7
21
20
  Requires-Dist: psutil
22
- Requires-Dist: aiofiles
23
21
  Requires-Dist: websockets
22
+ Requires-Dist: aiofiles
24
23
  Requires-Dist: svgen>=0.7.4
24
+ Requires-Dist: vcorelib>=3.4.7
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -45,11 +45,11 @@ Requires-Dist: uvloop; (sys_platform != "win32" and sys_platform != "cygwin") an
45
45
  =====================================
46
46
  generator=datazen
47
47
  version=3.1.4
48
- hash=de150fbd8ea83f317f485e01380215e6
48
+ hash=a0578deccfc29186901fc54d3849b52b
49
49
  =====================================
50
50
  -->
51
51
 
52
- # runtimepy ([5.8.1](https://pypi.org/project/runtimepy/))
52
+ # runtimepy ([5.8.3](https://pypi.org/project/runtimepy/))
53
53
 
54
54
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
55
55
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
@@ -1,4 +1,4 @@
1
- runtimepy/__init__.py,sha256=8olHidbM5qotaGKM8DOOAisxMfRw3tSbzSxQWpIh4p8,390
1
+ runtimepy/__init__.py,sha256=x_JJlvfTSZKskKnwxa2e-ZI9vcdDIWnwHFudFegBx8U,390
2
2
  runtimepy/__main__.py,sha256=OPAed6hggoQdw-6QAR62mqLC-rCkdDhOq0wyeS2vDRI,332
3
3
  runtimepy/app.py,sha256=sTvatbsGZ2Hdel36Si_WUbNMtg9CzsJyExr5xjIcxDE,970
4
4
  runtimepy/dev_requirements.txt,sha256=j0dh11ztJAzfaUL0iFheGjaZj9ppDzmTkclTT8YKO8c,230
@@ -53,7 +53,7 @@ runtimepy/data/server_dev.yaml,sha256=nQsPh7LuQig3pzHfdg_aD3yOUiCj1sKKfI-WwW3hXm
53
53
  runtimepy/data/tftp_server.yaml,sha256=-bFOWJSagI-fEQQcT8k7eDMJVfSPm2XAxLVG3dqUTa4,204
54
54
  runtimepy/data/css/bootstrap_extra.css,sha256=kJLOp8j-vRxnWzQOf_eOz4kL8Mbrwxuwk3YNh90HgWM,1907
55
55
  runtimepy/data/css/font.css,sha256=Pe82E66rNi-cwlQ-_1GHAuhPGu5L4x5KqgV0dbDe51w,977
56
- runtimepy/data/css/main.css,sha256=OSg5g7FYbjsHY7QNbFCTPAD1MlypeoYfaOyAfvnT2kI,680
56
+ runtimepy/data/css/main.css,sha256=kdqSsltzP78dgbiAQCTtsvK9p3kpbtQ809PD5tK9LVE,714
57
57
  runtimepy/data/js/DataConnection.js,sha256=DnX8FMehjJXqmI62UMYXSvl_XdfQMzq3XUDFbLu2GgI,98
58
58
  runtimepy/data/js/JsonConnection.js,sha256=rclZrbmWc_zSs6I_JhOgxnVPFIyPMo5WdjAe8alyZ3o,2729
59
59
  runtimepy/data/js/audio.js,sha256=bLkBqbeHMiGGidfL3iXjmVoF9seK-ZeZ3kwgOrcpgk4,1092
@@ -147,13 +147,13 @@ runtimepy/net/ssl.py,sha256=dj9uECPKDT5k-5vlR5I3Z7Go3WWZhbaJ9nb0rC3kJvg,854
147
147
  runtimepy/net/util.py,sha256=P6WnH4n8JJkEfKwepk1eP4lGPxWjqcFv0yL3N0mvtrw,5897
148
148
  runtimepy/net/apps/__init__.py,sha256=vjo7e19QXtJwe6V6B-QGvYiJveYobnYIfpkKZrnS17w,710
149
149
  runtimepy/net/arbiter/__init__.py,sha256=ptKF995rYKvkm4Mya92vA5QEDqcFq5NRD0IYGqZ6_do,740
150
- runtimepy/net/arbiter/base.py,sha256=w5IFDRU1Zfw7sfg0eS8hj7_Ip6bHHYQ4S212Ic-Kj-c,14817
151
- runtimepy/net/arbiter/info.py,sha256=tlzfbn3soyejArxfZ4lrLbaBVOjiz4nX52wa6XMfXuo,9684
150
+ runtimepy/net/arbiter/base.py,sha256=hggbHBWkuJaEkBTenlI2eCtTywhicvUpAIeI-PPYUkY,14958
151
+ runtimepy/net/arbiter/info.py,sha256=aMo4LvRAO7_4x1ff13yZCiI5qOUdzAk1yZZAbrQIOAc,9734
152
152
  runtimepy/net/arbiter/result.py,sha256=PHZo5qj4SI08ZeWPFk_8OZ1umI6L0dp5nJpjjS8QUpM,2871
153
153
  runtimepy/net/arbiter/task.py,sha256=APcc5QioAG8uueIzxJU-vktIn8Ys3yJd_CFlRWb6Ieo,795
154
154
  runtimepy/net/arbiter/udp.py,sha256=-ecHJs-utcsiTfr5wSb73hUUuYFBeRVT_D1znYp5q6A,893
155
155
  runtimepy/net/arbiter/websocket.py,sha256=vYTDA7sXMUTTqW3i1zTWUdaxGKxfrQcQoVSYZtmCvfQ,1524
156
- runtimepy/net/arbiter/config/__init__.py,sha256=m7g7nrOQuMuzc0qShJpqJ3fW55HpAuZl4Jn6D0etWBM,8475
156
+ runtimepy/net/arbiter/config/__init__.py,sha256=MuMeWKt_MqpQmMLpmugtvGFLpmZtXrNXlPKbMsjqZmI,8505
157
157
  runtimepy/net/arbiter/config/codec.py,sha256=TQj8UXEb1EvhiCqRdyq5BkeubMytEZAs9B4E5ZYsEuY,2511
158
158
  runtimepy/net/arbiter/config/util.py,sha256=MezLSil5mEwioI5kxDOZa9y118st1_t0El8DYH6hFU8,1254
159
159
  runtimepy/net/arbiter/factory/__init__.py,sha256=jC1szUYucH4Us3jbb0mhFgnklHlorya5DYGGw2pqfe4,334
@@ -284,9 +284,9 @@ runtimepy/tui/task.py,sha256=nUZo9fuOC-k1Wpqdzkv9v1tQirCI28fZVgcC13Ijvus,1093
284
284
  runtimepy/tui/channels/__init__.py,sha256=evDaiIn-YS9uGhdo8ZGtP9VK1ek6sr_P1nJ9JuSET0o,4536
285
285
  runtimepy/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
286
  runtimepy/ui/controls.py,sha256=yvT7h3thbYaitsakcIAJ90EwKzJ4b-jnc6p3UuVf_XE,1241
287
- runtimepy-5.8.1.dist-info/LICENSE,sha256=s2ILEylm2dAJJXL25nM92IWLRKmJW92zQRQe_cfdsHo,1071
288
- runtimepy-5.8.1.dist-info/METADATA,sha256=WcxigwsMCvTZAqJdUAdpYsDRt5qMvxyEbIoAN9ipIoA,9288
289
- runtimepy-5.8.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
290
- runtimepy-5.8.1.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
291
- runtimepy-5.8.1.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
292
- runtimepy-5.8.1.dist-info/RECORD,,
287
+ runtimepy-5.8.3.dist-info/LICENSE,sha256=s2ILEylm2dAJJXL25nM92IWLRKmJW92zQRQe_cfdsHo,1071
288
+ runtimepy-5.8.3.dist-info/METADATA,sha256=RanCiw2Z1cm7teWHWhcO0-UoTJeuLPeI19RLru_yfnc,9288
289
+ runtimepy-5.8.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
290
+ runtimepy-5.8.3.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
291
+ runtimepy-5.8.3.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
292
+ runtimepy-5.8.3.dist-info/RECORD,,