runtimepy 5.6.0__py3-none-any.whl → 5.6.2__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=6c21c41096ed57b6c6469232c97787cd
4
+ # hash=1235bf277e55d05b2d6ff7a71b906c20
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.6.0"
13
+ VERSION = "5.6.2"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -53,6 +53,12 @@ class App {
53
53
  this.switchTab(hash.tab);
54
54
  }
55
55
 
56
+ /* Handle settings controls. */
57
+ loadSettings();
58
+
59
+ /* Handle individual settings. */
60
+ this.handleInitialMinTxPeriod();
61
+
56
62
  startMainLoop();
57
63
  }
58
64
  }, {once : true});
@@ -62,6 +68,33 @@ class App {
62
68
 
63
69
  bootstrap_init();
64
70
  }
71
+
72
+ handleInitialMinTxPeriod() {
73
+ if ("min-tx-period-ms" in settings) {
74
+ /* Set up event handle. */
75
+ setupCursorContext(settings["min-tx-period-ms"], (elem, down, move,
76
+ up) => {
77
+ setupCursorMove(
78
+ elem, down, move, up,
79
+ (event) => { this.updateMinTxPeriod(Number(event.target.value)); });
80
+ });
81
+
82
+ /* Set slider to correct value. */
83
+ settings["min-tx-period-ms"].value = hash.minTxPeriod;
84
+ settings["min-tx-period-ms"].title = hash.minTxPeriod;
85
+ }
86
+
87
+ this.updateMinTxPeriod();
88
+ }
89
+
90
+ updateMinTxPeriod(value) {
91
+ if (value || value === 0) {
92
+ hash.setMinTxPeriod(value);
93
+ settings["min-tx-period-ms"].title = value;
94
+ }
95
+ this.worker.postMessage(
96
+ {"event" : {"worker" : {"min-tx-period-ms" : hash.minTxPeriod}}});
97
+ }
65
98
  }
66
99
 
67
100
  function startMainLoop() {
@@ -152,8 +152,14 @@ class PlotDrawer {
152
152
  }
153
153
  }
154
154
 
155
+ /* Use underlying buffer capacity if it can be queried. */
156
+ let lineDepth = this.canvas.width;
157
+ if (key in this.channels) {
158
+ lineDepth = this.channels[key].buffer.capacity;
159
+ }
160
+
155
161
  this.lines[key] =
156
- new WebglPlotBundle.WebglLine(this.rgbaColors[key], this.canvas.width);
162
+ new WebglPlotBundle.WebglLine(this.rgbaColors[key], lineDepth);
157
163
  }
158
164
 
159
165
  updateLines() {
@@ -6,6 +6,8 @@ class PlotModalManager {
6
6
  this.body = this.container.querySelector(".modal-body");
7
7
  this.footer = this.container.querySelector(".modal-footer");
8
8
 
9
+ this.plotStatus = this.container.querySelector("#plot-status-inner");
10
+
9
11
  this.byEnv = {};
10
12
  }
11
13
 
@@ -34,7 +36,7 @@ class PlotModalManager {
34
36
  }
35
37
  }
36
38
 
37
- this.body.innerHTML = content;
39
+ this.plotStatus.innerHTML = content;
38
40
  }
39
41
  }
40
42
 
@@ -9,6 +9,7 @@ class WindowHashManager {
9
9
  this.channelsShown = true;
10
10
  this.plotChannels = {};
11
11
  this.filters = {};
12
+ this.minTxPeriod = 0.0;
12
13
  }
13
14
 
14
15
  tabClick(event) {
@@ -160,8 +161,13 @@ class WindowHashManager {
160
161
  for (let item of split) {
161
162
  if (item.includes("=")) {
162
163
  let keyVal = item.split("=");
163
- if (keyVal.length == 2 && keyVal[0] == "filter" && keyVal[1]) {
164
- this.updateTabFilter(keyVal[1]);
164
+ if (keyVal.length == 2) {
165
+ if (keyVal[0] == "filter" && keyVal[1]) {
166
+ this.updateTabFilter(keyVal[1]);
167
+ }
168
+ if (keyVal[0] == "min-tx-period-ms") {
169
+ this.minTxPeriod = Number(keyVal[1]);
170
+ }
165
171
  }
166
172
  }
167
173
  }
@@ -176,6 +182,11 @@ class WindowHashManager {
176
182
  return result;
177
183
  }
178
184
 
185
+ setMinTxPeriod(value) {
186
+ this.minTxPeriod = value;
187
+ this.update();
188
+ }
189
+
179
190
  buildHash() {
180
191
  let hash = this.tab;
181
192
 
@@ -189,6 +200,10 @@ class WindowHashManager {
189
200
  hash += ",hide-channels"
190
201
  }
191
202
 
203
+ if (this.minTxPeriod != 0.0) {
204
+ hash += `,min-tx-period-ms=${this.minTxPeriod}`;
205
+ }
206
+
192
207
  for (let tab in tabs) {
193
208
  let firstChan = true;
194
209
 
runtimepy/data/js/init.js CHANGED
@@ -46,3 +46,15 @@ function setupCursorMove(elem, down, move, up, handleMove) {
46
46
  function randomHexColor() {
47
47
  return "#" + (Math.random() * 0xFFFFFF << 0).toString(16).padStart(6, "0");
48
48
  }
49
+
50
+ /* Load settings control mappings. */
51
+ let settings = {};
52
+
53
+ function loadSettings() {
54
+ for (const key of ["min-tx-period-ms"]) {
55
+ let elem = document.getElementById(`setting-${key}`);
56
+ if (elem) {
57
+ settings[key] = elem;
58
+ }
59
+ }
60
+ }
@@ -13,11 +13,16 @@ function create_connections(config) {
13
13
 
14
14
  const plots = new PlotManager();
15
15
 
16
+ /* Used to control messaging rate with server. */
17
+ let minTxPeriod = 0.0;
18
+
16
19
  async function message(data) {
17
20
  if ("plot" in data) {
18
21
  /* Forward the 'name' field. */
19
22
  data["plot"]["name"] = data["name"];
20
23
  await plots.handleMessage(data["plot"]);
24
+ } else if ("min-tx-period-ms" in data) {
25
+ minTxPeriod = data["min-tx-period-ms"];
21
26
  } else {
22
27
  console.log(`Message for worker:`);
23
28
  console.log(data);
@@ -38,9 +43,14 @@ async function start(config) {
38
43
  onmessage = async (event) => {
39
44
  /* Handle messages meant for this thread. */
40
45
  if ("event" in event.data && "worker" in event.data["event"]) {
46
+ let data = event.data["event"]["worker"];
47
+
41
48
  /* Forward the 'name' field. */
42
- event.data["event"]["worker"]["name"] = event.data["name"];
43
- await message(event.data["event"]["worker"]);
49
+ if ("name" in event.data) {
50
+ data["name"] = event.data["name"];
51
+ }
52
+
53
+ await message(data);
44
54
  }
45
55
  /* Forward all other messages to the server. */
46
56
  else {
@@ -63,13 +73,18 @@ async function start(config) {
63
73
  /* Tell main thread we're ready to go. */
64
74
  postMessage(0);
65
75
 
76
+ let messageTxTime = 0.0;
77
+
66
78
  /* Set up the main request-animation-frame loop. */
67
79
  function render(time) {
68
80
  /* Render plot. */
69
81
  plots.render(time);
70
82
 
71
83
  /* Keep the server synchronized with frames. */
72
- conns["json"].send_json({"ui" : {"time" : time}});
84
+ if (messageTxTime + minTxPeriod <= time) {
85
+ conns["json"].send_json({"ui" : {"time" : time}});
86
+ messageTxTime = time;
87
+ }
73
88
 
74
89
  requestAnimationFrame(render);
75
90
  }
@@ -11,6 +11,7 @@ from runtimepy.net.arbiter.info import AppInfo
11
11
  from runtimepy.net.server.app.bootstrap.elements import input_box
12
12
  from runtimepy.net.server.app.bootstrap.tabs import TabbedContent
13
13
  from runtimepy.net.server.app.env.modal import Modal
14
+ from runtimepy.net.server.app.env.settings import plot_settings
14
15
  from runtimepy.net.server.app.env.tab import ChannelEnvironmentTab
15
16
  from runtimepy.net.server.app.placeholder import dummy_tabs, under_construction
16
17
  from runtimepy.net.server.app.sound import SoundTab
@@ -85,8 +86,7 @@ def channel_environments(app: AppInfo, tabs: TabbedContent) -> None:
85
86
  )
86
87
 
87
88
  # Plot settings modal.
88
- plot_settings = Modal(tabs, name="plot", icon="graph-up")
89
- under_construction(plot_settings.footer)
89
+ plot_settings(tabs)
90
90
 
91
91
  # Experimental features.
92
92
  if app.config_param("experimental", False):
@@ -0,0 +1,59 @@
1
+ """
2
+ A module implementing an application-settings modal.
3
+ """
4
+
5
+ # third-party
6
+ from svgen.element.html import div
7
+
8
+ # internal
9
+ from runtimepy.net.server.app.bootstrap.elements import flex, slider
10
+ from runtimepy.net.server.app.bootstrap.tabs import TabbedContent
11
+ from runtimepy.net.server.app.env.modal import Modal
12
+ from runtimepy.net.server.app.placeholder import under_construction
13
+
14
+
15
+ def plot_settings(tabs: TabbedContent) -> None:
16
+ """Create the plot settings modal."""
17
+
18
+ modal = Modal(tabs, name="plot", icon="graph-up")
19
+ under_construction(modal.footer)
20
+
21
+ div(tag="h1", text="settings", parent=modal.body)
22
+ div(tag="hr", parent=modal.body)
23
+
24
+ div(tag="h2", text="plot status", parent=modal.body)
25
+ div(id="plot-status-inner", parent=modal.body)
26
+ div(tag="hr", parent=modal.body)
27
+
28
+ div(tag="h2", text="minimum transmit period (ms)", parent=modal.body)
29
+
30
+ div(
31
+ tag="p",
32
+ text=(
33
+ "Can be used to throttle the rate of "
34
+ "client <-> server communication. Use the 'ui' tab's metrics to "
35
+ "determine performance impact. Note that only this browser tab's "
36
+ "messaging rate can be controlled (not other connected clients')."
37
+ ),
38
+ parent=modal.body,
39
+ )
40
+
41
+ container = flex(parent=modal.body)
42
+
43
+ div(
44
+ text="0 ms ('high', run at native refresh rate)",
45
+ parent=container,
46
+ class_str="text-nowrap text-primary",
47
+ )
48
+
49
+ slider(
50
+ 0, 100, 100, parent=container, value=0, id="setting-min-tx-period-ms"
51
+ ).add_class("ms-3 me-3")
52
+
53
+ div(
54
+ text="100 ms ('low', 10 Hz)",
55
+ parent=container,
56
+ class_str="text-nowrap text-primary",
57
+ )
58
+
59
+ div(tag="hr", parent=modal.body)
@@ -167,16 +167,12 @@ class TcpConnection(_Connection, _TransportMixin):
167
167
  )
168
168
  async with server:
169
169
  for socket in server.sockets:
170
- sockname = socket.getsockname()
171
170
  LOG.info(
172
- "Started %s%s server listening on '%s%s' (%s%s:%d).",
171
+ "Started %s%s server listening on '%s%s'.",
173
172
  "secure " if is_ssl else "",
174
173
  cls.log_alias,
175
174
  cls.get_log_prefix(is_ssl=is_ssl),
176
175
  _sockname(socket),
177
- cls.get_log_prefix(is_ssl=is_ssl),
178
- sockname[0] if sockname[0] != "0.0.0.0" else "localhost",
179
- sockname[1],
180
176
  )
181
177
  yield server
182
178
 
runtimepy/net/util.py CHANGED
@@ -134,15 +134,24 @@ def normalize_host(
134
134
  return IPv6Host(*args) # type: ignore
135
135
 
136
136
 
137
+ USE_FQDN = {"::", "0.0.0.0"}
138
+
139
+
137
140
  @cache
138
141
  def hostname(ip_address: str) -> str:
139
142
  """
140
143
  Attempt to get a string hostname for a string IP address argument that
141
144
  'gethostbyaddr' accepts. Otherwise return the original string
142
145
  """
146
+
143
147
  result = ip_address
144
- with _suppress(_socket.herror, OSError):
145
- result = _socket.gethostbyaddr(ip_address)[0]
148
+
149
+ if ip_address in USE_FQDN:
150
+ result = _socket.getfqdn()
151
+ else:
152
+ with _suppress(_socket.herror, OSError):
153
+ result = _socket.gethostbyaddr(ip_address)[0]
154
+
146
155
  return result
147
156
 
148
157
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: runtimepy
3
- Version: 5.6.0
3
+ Version: 5.6.2
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -18,8 +18,8 @@ Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: websockets
21
- Requires-Dist: vcorelib >=3.3.1
22
21
  Requires-Dist: psutil
22
+ Requires-Dist: vcorelib >=3.3.1
23
23
  Requires-Dist: svgen >=0.6.8
24
24
  Provides-Extra: test
25
25
  Requires-Dist: pylint ; extra == 'test'
@@ -44,11 +44,11 @@ Requires-Dist: uvloop ; (sys_platform != "win32" and sys_platform != "cygwin") a
44
44
  =====================================
45
45
  generator=datazen
46
46
  version=3.1.4
47
- hash=cd04f0ce079f8c60bc93c7f1d098316b
47
+ hash=9f2d1e2482b007a02c8b96d7f36d557d
48
48
  =====================================
49
49
  -->
50
50
 
51
- # runtimepy ([5.6.0](https://pypi.org/project/runtimepy/))
51
+ # runtimepy ([5.6.2](https://pypi.org/project/runtimepy/))
52
52
 
53
53
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
54
54
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
@@ -165,8 +165,10 @@ options:
165
165
  ```
166
166
  $ ./venv3.12/bin/runtimepy server -h
167
167
 
168
- usage: runtimepy server [-h] [-i] [-w] [--no-poller] [--host HOST] [-p PORT]
169
- [-u] [-l]
168
+ usage: runtimepy server [-h] [-i] [-w] [--no-poller] [--cafile CAFILE]
169
+ [--capath CAPATH] [--cadata CADATA]
170
+ [--certfile CERTFILE] [--keyfile KEYFILE]
171
+ [--host HOST] [-p PORT] [-u] [-l]
170
172
  factory [configs ...]
171
173
 
172
174
  positional arguments:
@@ -181,6 +183,11 @@ options:
181
183
  ensure that a 'wait_for_stop' application method is
182
184
  run last
183
185
  --no-poller don't run a connection-metrics poller task
186
+ --cafile CAFILE passed directly to instantiation
187
+ --capath CAPATH passed directly to instantiation
188
+ --cadata CADATA passed directly to instantiation
189
+ --certfile CERTFILE passed directly to instantiation
190
+ --keyfile KEYFILE passed directly to instantiation
184
191
  --host HOST host address to listen on (default: '0.0.0.0')
185
192
  -p PORT, --port PORT port to listen on (default: 0)
186
193
  -u, --udp whether or not this is a UDP-based server (otherwise
@@ -1,4 +1,4 @@
1
- runtimepy/__init__.py,sha256=I77rsBqYyHVXsW8K5PAegQGJjSX43TwuCmBNnqki_Hk,390
1
+ runtimepy/__init__.py,sha256=Q0y1I1SVWq4T5yKpUPEHxmlBHy-86vB4FVVbH2dxN5A,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
@@ -56,25 +56,25 @@ runtimepy/data/js/DataConnection.js,sha256=DnX8FMehjJXqmI62UMYXSvl_XdfQMzq3XUDFb
56
56
  runtimepy/data/js/JsonConnection.js,sha256=rclZrbmWc_zSs6I_JhOgxnVPFIyPMo5WdjAe8alyZ3o,2729
57
57
  runtimepy/data/js/audio.js,sha256=bLkBqbeHMiGGidfL3iXjmVoF9seK-ZeZ3kwgOrcpgk4,1092
58
58
  runtimepy/data/js/events.js,sha256=rgz3Q_8J6sfU_7Sa7fG1mZD0pQ4S3vwN2mqcvQfePkM,554
59
- runtimepy/data/js/init.js,sha256=q1SfcbC0RKr-a3z48PLC1usdAj9dh1_EMw5sJvvQKGs,1279
59
+ runtimepy/data/js/init.js,sha256=IeFqfab7CM2-Z4fIbyGaUD4M2orUT8uLwcVlleQqXzg,1522
60
60
  runtimepy/data/js/main.js,sha256=r0P_0xx5Czd1jfTjsB-tLfwhp4iPNoajlYC858u0ltc,211
61
61
  runtimepy/data/js/util.js,sha256=ymYV3xenF3LZ5fw6ACXFnqHiNhFzf9uS7UUal_KsXr0,1376
62
- runtimepy/data/js/worker.js,sha256=Yz9VEbE1I1gMrw-Zt7VB3RoII_xHWrS6_nhESEf5c6Q,2128
63
- runtimepy/data/js/classes/App.js,sha256=5dQ2_M_23WRfO3MtQ_3imy_oBNnGcS2uWY3g9PS6fJI,2392
62
+ runtimepy/data/js/worker.js,sha256=V9deGAynjvUr1D-WGi3wUW8rxoaNLvBvayMoLFZk3w0,2444
63
+ runtimepy/data/js/classes/App.js,sha256=nnY42Q3tlNzf8JZtuGKyxJZLLNMfResdww8svOQMC3U,3402
64
64
  runtimepy/data/js/classes/ChannelTable.js,sha256=V9g4_6N1i7ci7FkhP9eBd9ENbkSBusO5AvWuIEHUKk8,2634
65
65
  runtimepy/data/js/classes/DataConnection.js,sha256=DnX8FMehjJXqmI62UMYXSvl_XdfQMzq3XUDFbLu2GgI,98
66
66
  runtimepy/data/js/classes/JsonConnection.js,sha256=vgQ3bGvVU5dNXn_uwvH7HjOQm0PwUSx0239Vfi7h1vE,2858
67
67
  runtimepy/data/js/classes/OverlayManager.js,sha256=9JCo1_O7Gqjfrim4StWW_6JsRIC8rUgE071SHc_Gi1I,3333
68
68
  runtimepy/data/js/classes/Plot.js,sha256=44DUxvmOe2cqKRjrk91Abo-myxWWFAFUDsZb05F4rrA,1979
69
- runtimepy/data/js/classes/PlotDrawer.js,sha256=DIRCwFt_lXSMB7GFrl6Y6y5Z74A291YUmmrXSNPuVhw,4830
69
+ runtimepy/data/js/classes/PlotDrawer.js,sha256=Wkjoh3oNux8NsVDXUHy1nKOxmtGwbLNKXG9zowi4QUk,5017
70
70
  runtimepy/data/js/classes/PlotManager.js,sha256=tGnqFP_d5Z9Hn20OQfgu-h0DKM5zhD91whG0pF7_VFk,4973
71
- runtimepy/data/js/classes/PlotModalManager.js,sha256=N313qUvzoJa2TI_aQjdllWK0Ii365spmbaUO4kxZj6s,847
71
+ runtimepy/data/js/classes/PlotModalManager.js,sha256=lEbACLC5VzV-aSAb7G-WacmLLf_IRx7-pNJs9lL8bvY,928
72
72
  runtimepy/data/js/classes/PointBuffer.js,sha256=iVtq_q5gBaV9IVX55pHVjQdMJ4phJ6QTdAiM7EZrLRA,5061
73
73
  runtimepy/data/js/classes/PointManager.js,sha256=0lr2AReLdDNrY47UuOjjCRDPMiSRsOVggFHDPf8V-6Y,460
74
74
  runtimepy/data/js/classes/TabFilter.js,sha256=FygFFmWa1IRQ0DZlrOscdrkz6W3VkG87nHSud56kCzI,1185
75
75
  runtimepy/data/js/classes/TabInterface.js,sha256=i-dM_FpRsp_hJEh6CdtSY8hiTS6-KZx5dkOYXD_crh0,12084
76
76
  runtimepy/data/js/classes/UnitSystem.js,sha256=ys4OMabq47k_VvJpRItm82U0IequDvx3ysRJOQzDf94,906
77
- runtimepy/data/js/classes/WindowHashManager.js,sha256=TqRATCUv9D55LiatIhIMgFpVu7D8ZgVp5IpQlu4cHrE,5899
77
+ runtimepy/data/js/classes/WindowHashManager.js,sha256=aQcdUwWw-Ksp-ffywOlv64TdG6R-UrP4DVGLrGIi8QQ,6253
78
78
  runtimepy/data/js/classes/WorkerInterface.js,sha256=qARPW1CUDnHnVFVE8UjqKq74QfommCLwd6nisy-ayOw,346
79
79
  runtimepy/data/js/tab/env.js,sha256=MB79l3XyXKELWRqHcTnwWHiwdiceLHl1N_s-mS33pyU,22
80
80
  runtimepy/data/js/tab/sound.js,sha256=RSKp0AXM_zGOCsUvIT-BUjIzOE7Dp5NHiQG4fy7gBgY,1388
@@ -125,7 +125,7 @@ runtimepy/net/manager.py,sha256=-M-ZSB9izay6HK1ytTayAYnSHYAz34dcwxaiNhC4lWg,4264
125
125
  runtimepy/net/mixin.py,sha256=5UlFK4lRrJ2O0nEUuScGbkYd4-El-RruFt_UcQR0aic,3039
126
126
  runtimepy/net/mtu.py,sha256=XnLXAFMsDxK1Lj5v_zgWaBrC3lNqf81DkbDc6hpMdmI,3495
127
127
  runtimepy/net/ssl.py,sha256=dj9uECPKDT5k-5vlR5I3Z7Go3WWZhbaJ9nb0rC3kJvg,854
128
- runtimepy/net/util.py,sha256=foXz7ZZDFpc7_vazzKT304Edgf7sOXj3NrDOY87kNsU,5779
128
+ runtimepy/net/util.py,sha256=P6WnH4n8JJkEfKwepk1eP4lGPxWjqcFv0yL3N0mvtrw,5897
129
129
  runtimepy/net/apps/__init__.py,sha256=vjo7e19QXtJwe6V6B-QGvYiJveYobnYIfpkKZrnS17w,710
130
130
  runtimepy/net/arbiter/__init__.py,sha256=ptKF995rYKvkm4Mya92vA5QEDqcFq5NRD0IYGqZ6_do,740
131
131
  runtimepy/net/arbiter/base.py,sha256=WRbgavarmOx6caQJmfI03udZvNC7o298uOhOsN-lp2E,14658
@@ -170,8 +170,9 @@ runtimepy/net/server/app/tab.py,sha256=4jhw71LfA23wT9m9e5ofw-tBXYW6xky4tGwBOlGkO
170
170
  runtimepy/net/server/app/bootstrap/__init__.py,sha256=ONhwx68piWjsrf88FMpda84TWSPqgi-RZCBuWCci_ak,1444
171
171
  runtimepy/net/server/app/bootstrap/elements.py,sha256=uWcaVBdrZvL3_lNZ13jQ8AfPN5f4ye2feZN7ve9RDnM,3868
172
172
  runtimepy/net/server/app/bootstrap/tabs.py,sha256=0azUtpZTO80kjhX65vU3K5QfW4cwK7ULixqM8O0FgKQ,4179
173
- runtimepy/net/server/app/env/__init__.py,sha256=oZPKZ6aCjG6eSZ3fVs0Q8oJrUTnEUifG8ihuByGdFw8,3221
173
+ runtimepy/net/server/app/env/__init__.py,sha256=SbIgHg2KQtYSLnHPQzHpK1--f_xl4ASFVTvx-TIDJUw,3202
174
174
  runtimepy/net/server/app/env/modal.py,sha256=d7OdKVJfKXnOkDhvsF2nQmTfZHAdx70wbK2pGlNIcEQ,1753
175
+ runtimepy/net/server/app/env/settings.py,sha256=M0DFibrzF5-nxZ8udKMi503HiTZWIQNbzj_t9TWi34Q,1720
175
176
  runtimepy/net/server/app/env/widgets.py,sha256=_kNvPl7MXnZOiwTjoZiU2hfuSjkLnRUrORTVDi3w7Ls,5312
176
177
  runtimepy/net/server/app/env/tab/__init__.py,sha256=stTVKyHljLQWnnhxkWPwa7bLdZtjhiMFbiVFgbiYaFI,647
177
178
  runtimepy/net/server/app/env/tab/base.py,sha256=uBPpOeqI23341IezIQcGvJciPfIL2P5qQgbZ74aQRKA,991
@@ -186,7 +187,7 @@ runtimepy/net/stream/base.py,sha256=Dg4vcR0n9y2122AyJ-9W-jkEhNla_EHO-DqJJPfGD4k,
186
187
  runtimepy/net/stream/string.py,sha256=61mgserU3p6j5gAcK0oe0aKqL6vDh7NtgJvbPoiAUPM,784
187
188
  runtimepy/net/stream/json/__init__.py,sha256=h--C_9moW92TC_e097FRRXcg8GJ6VVbMLXl1cICknys,2508
188
189
  runtimepy/net/tcp/__init__.py,sha256=OOWohegpoioSTf8M7uDf-4EV1IDungz7-U19L_2yW4I,250
189
- runtimepy/net/tcp/connection.py,sha256=od9hFj-zZWPfyQ4lQ47nTUE8tA1ZnhIAF0ps9s6BBHk,8820
190
+ runtimepy/net/tcp/connection.py,sha256=izRVSZdrhkk21javEdJB2BJTPmiz87_DoUE1oKuQq58,8596
190
191
  runtimepy/net/tcp/create.py,sha256=zZsRs5KYpO3bNGh-DwEOEzjUDE4ixj-UBHYgZ0GvC7c,2013
191
192
  runtimepy/net/tcp/protocol.py,sha256=vEnIX3gUX2nrw9ofT_e4KYU4VY2k4WP0WuOi4eE_OOQ,1444
192
193
  runtimepy/net/tcp/http/__init__.py,sha256=4ZSM-Fma_IpmDNCu5E3VBPRrVxOjPgKpKAS3uag1V1I,5657
@@ -262,9 +263,9 @@ runtimepy/tui/task.py,sha256=nUZo9fuOC-k1Wpqdzkv9v1tQirCI28fZVgcC13Ijvus,1093
262
263
  runtimepy/tui/channels/__init__.py,sha256=evDaiIn-YS9uGhdo8ZGtP9VK1ek6sr_P1nJ9JuSET0o,4536
263
264
  runtimepy/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
264
265
  runtimepy/ui/controls.py,sha256=yvT7h3thbYaitsakcIAJ90EwKzJ4b-jnc6p3UuVf_XE,1241
265
- runtimepy-5.6.0.dist-info/LICENSE,sha256=okYCYhGsx_BlzvFdoNVBVpw_Cfb4SOqHA_VAARml4Hc,1071
266
- runtimepy-5.6.0.dist-info/METADATA,sha256=7HqQbErEKuufEXCpMUpmGACLaX_sMahCQ4qpPGTFZlY,8851
267
- runtimepy-5.6.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
268
- runtimepy-5.6.0.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
269
- runtimepy-5.6.0.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
270
- runtimepy-5.6.0.dist-info/RECORD,,
266
+ runtimepy-5.6.2.dist-info/LICENSE,sha256=okYCYhGsx_BlzvFdoNVBVpw_Cfb4SOqHA_VAARml4Hc,1071
267
+ runtimepy-5.6.2.dist-info/METADATA,sha256=B_mPsk9FJ97LMuB8ybZw-lDB5bXX7Pzk2RV1eQVut4I,9280
268
+ runtimepy-5.6.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
269
+ runtimepy-5.6.2.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
270
+ runtimepy-5.6.2.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
271
+ runtimepy-5.6.2.dist-info/RECORD,,