runtimepy 5.15.2__tar.gz → 5.15.3__tar.gz

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.
Files changed (324) hide show
  1. {runtimepy-5.15.2/runtimepy.egg-info → runtimepy-5.15.3}/PKG-INFO +5 -5
  2. {runtimepy-5.15.2 → runtimepy-5.15.3}/README.md +2 -2
  3. {runtimepy-5.15.2 → runtimepy-5.15.3}/pyproject.toml +1 -1
  4. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/__init__.py +2 -2
  5. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/command/__init__.py +35 -0
  6. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/dummy_load.yaml +4 -0
  7. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +10 -0
  8. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/base.py +8 -0
  9. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/config/__init__.py +3 -0
  10. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/config/codec.py +5 -0
  11. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/__init__.py +11 -6
  12. {runtimepy-5.15.2 → runtimepy-5.15.3/runtimepy.egg-info}/PKG-INFO +5 -5
  13. {runtimepy-5.15.2 → runtimepy-5.15.3}/LICENSE +0 -0
  14. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/__main__.py +0 -0
  15. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/app.py +0 -0
  16. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/__init__.py +0 -0
  17. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/__init__.py +0 -0
  18. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/array.py +0 -0
  19. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/base.py +0 -0
  20. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/command/parser.py +0 -0
  21. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/command/processor.py +0 -0
  22. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/command/result.py +0 -0
  23. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/create.py +0 -0
  24. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/file.py +0 -0
  25. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/sample.py +0 -0
  26. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/environment/telemetry.py +0 -0
  27. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/event/__init__.py +0 -0
  28. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/event/header.py +0 -0
  29. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/channel/registry.py +0 -0
  30. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/__init__.py +0 -0
  31. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/protocol/__init__.py +0 -0
  32. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/protocol/base.py +0 -0
  33. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/protocol/json.py +0 -0
  34. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/protocol/receiver.py +0 -0
  35. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/codec/system/__init__.py +0 -0
  36. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/__init__.py +0 -0
  37. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/all.py +0 -0
  38. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/arbiter.py +0 -0
  39. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/common.py +0 -0
  40. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/mtu.py +0 -0
  41. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/server.py +0 -0
  42. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/task.py +0 -0
  43. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/tftp.py +0 -0
  44. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/commands/tui.py +0 -0
  45. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/control/__init__.py +0 -0
  46. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/control/env/__init__.py +0 -0
  47. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/control/source.py +0 -0
  48. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/control/step.py +0 -0
  49. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/404.md +0 -0
  50. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/base.yaml +0 -0
  51. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/browser.yaml +0 -0
  52. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/css/bootstrap_extra.css +0 -0
  53. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/css/font.css +0 -0
  54. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/css/main.css +0 -0
  55. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/factories.yaml +0 -0
  56. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/favicon.ico +0 -0
  57. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/DataConnection.js +0 -0
  58. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/JsonConnection.js +0 -0
  59. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/audio.js +0 -0
  60. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/App.js +0 -0
  61. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/ChannelTable.js +0 -0
  62. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/DataConnection.js +0 -0
  63. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  64. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  65. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/Plot.js +0 -0
  66. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  67. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/PlotManager.js +0 -0
  68. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  69. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  70. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/PointManager.js +0 -0
  71. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/TabFilter.js +0 -0
  72. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/TabInterface.js +0 -0
  73. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  74. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/WindowHashManager.js +0 -0
  75. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  76. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/events.js +0 -0
  77. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/init.js +0 -0
  78. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/main.js +0 -0
  79. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/markdown_page.js +0 -0
  80. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/sample.js +0 -0
  81. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/tab/env.js +0 -0
  82. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/tab/sound.js +0 -0
  83. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  84. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/unused/pyodide.js +0 -0
  85. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/util.js +0 -0
  86. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/js/worker.js +0 -0
  87. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/md/Connection.md +0 -0
  88. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/md/PeriodicTask.md +0 -0
  89. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/md/RuntimeStruct.md +0 -0
  90. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  91. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/md/SinusoidTask.md +0 -0
  92. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/sample_telemetry.yaml +0 -0
  93. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/BitFields.yaml +0 -0
  94. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/Channel.yaml +0 -0
  95. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  96. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  97. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  98. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  99. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/FindFile.yaml +0 -0
  100. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/PeerProcessConfig.yaml +0 -0
  101. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/RuntimeEnum.yaml +0 -0
  102. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  103. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/StructConfig.yaml +0 -0
  104. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  105. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  106. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/has_config.yaml +0 -0
  107. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/has_factory.yaml +0 -0
  108. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  109. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/has_name.yaml +0 -0
  110. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  111. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/server.yaml +0 -0
  112. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/server_base.yaml +0 -0
  113. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/server_dev.yaml +0 -0
  114. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/css/bootstrap-icons.min.css +0 -0
  115. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/css/bootstrap.min.css +0 -0
  116. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  117. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  118. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/js/bootstrap.bundle.min.js +0 -0
  119. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/js/webglplot.umd.min.js +0 -0
  120. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/1024x1024.png +0 -0
  121. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/128x128.png +0 -0
  122. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/16x16.png +0 -0
  123. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/1920x1920.png +0 -0
  124. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/24x24.png +0 -0
  125. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/256x256.png +0 -0
  126. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/32x32.png +0 -0
  127. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/512x512.png +0 -0
  128. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/png/chip-circle-bootstrap/64x64.png +0 -0
  129. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  130. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/svg/outline-dark.svg +0 -0
  131. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/svg/outline-light.svg +0 -0
  132. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  133. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  134. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  135. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  136. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  137. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  138. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  139. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  140. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/static/woff2/README.md +0 -0
  141. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/data/tftp_server.yaml +0 -0
  142. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/dev_requirements.txt +0 -0
  143. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/entry.py +0 -0
  144. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/enum/__init__.py +0 -0
  145. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/enum/registry.py +0 -0
  146. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/enum/types.py +0 -0
  147. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mapping.py +0 -0
  148. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/message/__init__.py +0 -0
  149. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/message/handlers.py +0 -0
  150. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/message/interface.py +0 -0
  151. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/message/types.py +0 -0
  152. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/metrics/__init__.py +0 -0
  153. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/metrics/channel.py +0 -0
  154. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/metrics/connection.py +0 -0
  155. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/metrics/task.py +0 -0
  156. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/__init__.py +0 -0
  157. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/async_command.py +0 -0
  158. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/enum.py +0 -0
  159. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/environment.py +0 -0
  160. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/finalize.py +0 -0
  161. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/logging.py +0 -0
  162. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/psutil.py +0 -0
  163. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/regex.py +0 -0
  164. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/mixins/trig.py +0 -0
  165. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/__init__.py +0 -0
  166. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/apps/__init__.py +0 -0
  167. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/__init__.py +0 -0
  168. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/config/util.py +0 -0
  169. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  170. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/factory/connection.py +0 -0
  171. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/factory/task.py +0 -0
  172. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  173. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  174. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/imports/util.py +0 -0
  175. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/info.py +0 -0
  176. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/result.py +0 -0
  177. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/struct/__init__.py +0 -0
  178. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/task.py +0 -0
  179. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  180. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/tcp/json.py +0 -0
  181. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/udp.py +0 -0
  182. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/arbiter/websocket.py +0 -0
  183. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/backoff.py +0 -0
  184. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/connection.py +0 -0
  185. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/factories/__init__.py +0 -0
  186. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/html/__init__.py +0 -0
  187. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/html/arbiter.py +0 -0
  188. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/html/bootstrap/__init__.py +0 -0
  189. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/html/bootstrap/elements.py +0 -0
  190. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/html/bootstrap/tabs.py +0 -0
  191. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/__init__.py +0 -0
  192. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/common.py +0 -0
  193. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/header.py +0 -0
  194. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/request_target.py +0 -0
  195. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/response.py +0 -0
  196. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/state.py +0 -0
  197. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/http/version.py +0 -0
  198. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/manager.py +0 -0
  199. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/mixin.py +0 -0
  200. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/mtu.py +0 -0
  201. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/__init__.py +0 -0
  202. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/base.py +0 -0
  203. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/create.py +0 -0
  204. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/elements.py +0 -0
  205. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/__init__.py +0 -0
  206. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/modal.py +0 -0
  207. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/settings.py +0 -0
  208. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  209. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/tab/base.py +0 -0
  210. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/tab/controls.py +0 -0
  211. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/tab/html.py +0 -0
  212. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/tab/message.py +0 -0
  213. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/env/widgets.py +0 -0
  214. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/files.py +0 -0
  215. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/landing_page.py +0 -0
  216. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/placeholder.py +0 -0
  217. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/pyodide.py +0 -0
  218. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/sound.py +0 -0
  219. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/app/tab.py +0 -0
  220. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/html.py +0 -0
  221. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/json.py +0 -0
  222. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/markdown.py +0 -0
  223. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/mux.py +0 -0
  224. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/struct/__init__.py +0 -0
  225. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/websocket/__init__.py +0 -0
  226. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/server/websocket/state.py +0 -0
  227. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/ssl.py +0 -0
  228. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/stream/__init__.py +0 -0
  229. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/stream/base.py +0 -0
  230. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/stream/json/__init__.py +0 -0
  231. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/stream/string.py +0 -0
  232. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/__init__.py +0 -0
  233. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/connection.py +0 -0
  234. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/create.py +0 -0
  235. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/http/__init__.py +0 -0
  236. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/protocol.py +0 -0
  237. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/scpi/__init__.py +0 -0
  238. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/telnet/__init__.py +0 -0
  239. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/telnet/codes.py +0 -0
  240. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  241. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/__init__.py +0 -0
  242. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/connection.py +0 -0
  243. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/create.py +0 -0
  244. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/protocol.py +0 -0
  245. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/queue.py +0 -0
  246. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/tftp/__init__.py +0 -0
  247. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/tftp/base.py +0 -0
  248. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  249. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/tftp/enums.py +0 -0
  250. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/udp/tftp/io.py +0 -0
  251. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/util.py +0 -0
  252. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/websocket/__init__.py +0 -0
  253. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/net/websocket/connection.py +0 -0
  254. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/noise/__init__.py +0 -0
  255. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/__init__.py +0 -0
  256. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/array/__init__.py +0 -0
  257. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/base.py +0 -0
  258. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/bool.py +0 -0
  259. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/byte_order.py +0 -0
  260. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/evaluation.py +0 -0
  261. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/field/__init__.py +0 -0
  262. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/field/fields.py +0 -0
  263. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/field/manager/__init__.py +0 -0
  264. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/field/manager/base.py +0 -0
  265. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/float.py +0 -0
  266. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/int.py +0 -0
  267. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/scaling.py +0 -0
  268. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/serializable/__init__.py +0 -0
  269. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/serializable/base.py +0 -0
  270. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/serializable/fixed.py +0 -0
  271. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/serializable/framer.py +0 -0
  272. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/serializable/prefixed.py +0 -0
  273. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/string.py +0 -0
  274. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/__init__.py +0 -0
  275. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/base.py +0 -0
  276. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/bool.py +0 -0
  277. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/bounds.py +0 -0
  278. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/float.py +0 -0
  279. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/primitives/types/int.py +0 -0
  280. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/py.typed +0 -0
  281. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/registry/__init__.py +0 -0
  282. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/registry/bool.py +0 -0
  283. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/registry/item.py +0 -0
  284. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/registry/name.py +0 -0
  285. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/requirements.txt +0 -0
  286. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/sample/__init__.py +0 -0
  287. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/sample/peer.py +0 -0
  288. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/sample/program.py +0 -0
  289. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/schemas.py +0 -0
  290. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/struct/__init__.py +0 -0
  291. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/subprocess/__init__.py +0 -0
  292. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/subprocess/interface.py +0 -0
  293. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/subprocess/peer.py +0 -0
  294. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/subprocess/program.py +0 -0
  295. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/subprocess/protocol.py +0 -0
  296. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/__init__.py +0 -0
  297. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/asynchronous.py +0 -0
  298. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/basic/__init__.py +0 -0
  299. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/basic/manager.py +0 -0
  300. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/basic/periodic.py +0 -0
  301. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/sample.py +0 -0
  302. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/task/trig/__init__.py +0 -0
  303. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/telemetry/__init__.py +0 -0
  304. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/telemetry/sample.py +0 -0
  305. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/__init__.py +0 -0
  306. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/channels/__init__.py +0 -0
  307. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/cursor.py +0 -0
  308. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/mixin.py +0 -0
  309. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/mock.py +0 -0
  310. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/tui/task.py +0 -0
  311. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/ui/__init__.py +0 -0
  312. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/ui/controls.py +0 -0
  313. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy/util.py +0 -0
  314. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy.egg-info/SOURCES.txt +0 -0
  315. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy.egg-info/dependency_links.txt +0 -0
  316. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy.egg-info/entry_points.txt +0 -0
  317. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy.egg-info/requires.txt +2 -2
  318. {runtimepy-5.15.2 → runtimepy-5.15.3}/runtimepy.egg-info/top_level.txt +0 -0
  319. {runtimepy-5.15.2 → runtimepy-5.15.3}/setup.cfg +0 -0
  320. {runtimepy-5.15.2 → runtimepy-5.15.3}/setup.py +0 -0
  321. {runtimepy-5.15.2 → runtimepy-5.15.3}/tests/test_entry.py +0 -0
  322. {runtimepy-5.15.2 → runtimepy-5.15.3}/tests/test_mapping.py +0 -0
  323. {runtimepy-5.15.2 → runtimepy-5.15.3}/tests/test_resources.py +0 -0
  324. {runtimepy-5.15.2 → runtimepy-5.15.3}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.15.2
3
+ Version: 5.15.3
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/libre-embedded/runtimepy
6
6
  Author: Libre Embedded
@@ -17,11 +17,11 @@ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
+ Requires-Dist: websockets
21
+ Requires-Dist: vcorelib>=3.6.3
20
22
  Requires-Dist: svgen>=0.8.0
21
23
  Requires-Dist: aiofiles
22
24
  Requires-Dist: psutil
23
- Requires-Dist: vcorelib>=3.6.3
24
- Requires-Dist: websockets
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -51,11 +51,11 @@ Dynamic: requires-python
51
51
  =====================================
52
52
  generator=datazen
53
53
  version=3.2.3
54
- hash=f1c75c9b812e8ff29fdda46f58009aef
54
+ hash=ed2f5b3731ba189c4a3ec2f2252b622e
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.15.2](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.15.3](https://pypi.org/project/runtimepy/))
59
59
 
60
60
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
61
61
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
@@ -2,11 +2,11 @@
2
2
  =====================================
3
3
  generator=datazen
4
4
  version=3.2.3
5
- hash=f1c75c9b812e8ff29fdda46f58009aef
5
+ hash=ed2f5b3731ba189c4a3ec2f2252b622e
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.15.2](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.15.3](https://pypi.org/project/runtimepy/))
10
10
 
11
11
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
12
12
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta:__legacy__"
4
4
 
5
5
  [project]
6
6
  name = "runtimepy"
7
- version = "5.15.2"
7
+ version = "5.15.3"
8
8
  description = "A framework for implementing Python services."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,7 +1,7 @@
1
1
  # =====================================
2
2
  # generator=datazen
3
3
  # version=3.2.3
4
- # hash=839ec3c3fa52de16f775789c0d38bf3e
4
+ # hash=f5155e85b2694b012648fdbe9c12b1cd
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.15.2"
13
+ VERSION = "5.15.3"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -12,7 +12,9 @@ from typing import Any, Iterator, Optional, cast
12
12
 
13
13
  # third-party
14
14
  from vcorelib import DEFAULT_ENCODING
15
+ from vcorelib.dict import GenericStrDict
15
16
  from vcorelib.io import ARBITER, JsonObject
17
+ from vcorelib.io.bus import BUS
16
18
  from vcorelib.logging import DEFAULT_TIME_FORMAT, LoggerMixin
17
19
  from vcorelib.math import default_time_ns, nano_str
18
20
  from vcorelib.names import name_search
@@ -25,6 +27,7 @@ from runtimepy.channel.environment.command.processor import (
25
27
  CommandHook,
26
28
  EnvironmentMap,
27
29
  )
30
+ from runtimepy.channel.environment.command.result import CommandResult
28
31
  from runtimepy.channel.registry import ParsedEvent
29
32
  from runtimepy.mapping import DEFAULT_PATTERN
30
33
 
@@ -243,6 +246,38 @@ GLOBAL = GlobalEnvironment()
243
246
  ENVIRONMENTS = GLOBAL
244
247
 
245
248
 
249
+ def global_command(env: str, value: str) -> Optional[CommandResult]:
250
+ """Handle a global command."""
251
+
252
+ result = None
253
+ if env in GLOBAL:
254
+ result = GLOBAL[env].command(value)
255
+ else:
256
+ GLOBAL.logger.error(
257
+ "Couldn't run command env='%s' value='%s'.", env, value
258
+ )
259
+ return result
260
+
261
+
262
+ def global_commands(*cmds: tuple[str, str]) -> None:
263
+ """Handle a global command."""
264
+ for env, value in cmds:
265
+ global_command(env, value)
266
+
267
+
268
+ async def global_command_bus(payload: GenericStrDict) -> None:
269
+ """Handle a bus message."""
270
+
271
+ if "env" in payload and "value" in payload:
272
+ global_command(payload["env"], payload["value"])
273
+ elif "cmds" in payload:
274
+ global_commands(*payload["cmds"])
275
+
276
+
277
+ BUS.register_ro("command", global_command_bus)
278
+ BUS.register_ro("cmd", global_command_bus)
279
+
280
+
246
281
  def clear_env() -> None:
247
282
  """Reset the global environment mapping."""
248
283
  GLOBAL.clear()
@@ -107,3 +107,7 @@ processes:
107
107
  app: runtimepy.sample.program.run
108
108
 
109
109
  program: runtimepy.sample.program.SampleProgram
110
+
111
+ commands:
112
+ - [udp_json_client, "set log_level warning"]
113
+ - [proc1.peer, "set log_level warning"]
@@ -26,6 +26,16 @@ properties:
26
26
  items:
27
27
  $ref: package://runtimepy/schemas/StructConfig.yaml
28
28
 
29
+ commands:
30
+ type: array
31
+ items:
32
+ type: array
33
+ minItems: 2
34
+ maxItems: 2
35
+ items:
36
+ - type: string
37
+ - type: string
38
+
29
39
  tasks:
30
40
  type: array
31
41
  items:
@@ -26,6 +26,7 @@ from vcorelib.namespace import NamespaceMixin as _NamespaceMixin
26
26
  from runtimepy.channel.environment.command import (
27
27
  clear_env,
28
28
  env_json_data,
29
+ global_commands,
29
30
  register_env,
30
31
  )
31
32
  from runtimepy.net.arbiter.housekeeping import housekeeping
@@ -145,6 +146,8 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
145
146
  # A copy of named port mappings (loaded via external config).
146
147
  self._ports: dict[str, int] = {}
147
148
 
149
+ self._commands: list[tuple[str, str]] = []
150
+
148
151
  self._init()
149
152
 
150
153
  def _init(self) -> None:
@@ -318,6 +321,11 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
318
321
 
319
322
  # Run initialization methods.
320
323
  result = await self._run_apps_list(self._inits, info)
324
+
325
+ # Run commands.
326
+ await _asyncio.sleep(0)
327
+ global_commands(*self._commands)
328
+
321
329
  if result == 0:
322
330
  # Get application methods.
323
331
  apps = self._apps
@@ -245,5 +245,8 @@ class ConfigConnectionArbiter(_ImportConnectionArbiter):
245
245
  assert "root" not in config.config, config.config
246
246
  config.config["root"] = root
247
247
 
248
+ # Register commands.
249
+ self._commands = config.commands
250
+
248
251
 
249
252
  ConfigConnectionArbiter.add_search_package(PKG_NAME)
@@ -71,6 +71,11 @@ class ConnectionArbiterConfig(_RuntimepyDictCodec):
71
71
 
72
72
  self.directory = _Path(str(data.get("directory", ".")))
73
73
 
74
+ self.commands: list[tuple[str, str]] = data.get( # type: ignore
75
+ "commands",
76
+ [],
77
+ )
78
+
74
79
  def asdict(self) -> _JsonObject:
75
80
  """Obtain a dictionary representing this instance."""
76
81
  return self.data
@@ -18,7 +18,7 @@ from vcorelib.paths import Pathlike, find_file, normalize
18
18
 
19
19
  # internal
20
20
  from runtimepy import DEFAULT_EXT, PKG_NAME
21
- from runtimepy.channel.environment.command import GLOBAL
21
+ from runtimepy.channel.environment.command import GLOBAL, global_command
22
22
  from runtimepy.net.html import full_markdown_page
23
23
  from runtimepy.net.http.header import RequestHeader
24
24
  from runtimepy.net.http.request_target import PathMaybeQuery
@@ -270,17 +270,22 @@ class RuntimepyServerConnection(HttpConnection):
270
270
  response_data["success"] = False
271
271
  response_data["message"] = "No command executed."
272
272
 
273
- if not args or args[0] not in GLOBAL:
273
+ def cmd_usage() -> None:
274
+ """Set usage information for the response."""
274
275
  response_data["usage"] = (
275
276
  "/<environment (arg0)>/<arg1>[/.../<argN>]"
276
277
  )
277
278
  response_data["environments"] = list(GLOBAL)
278
279
 
279
- # Run command.
280
+ if args:
281
+ result = global_command(args[0], " ".join(args[1:]))
282
+ if result is None:
283
+ cmd_usage()
284
+ else:
285
+ response_data["success"] = result.success
286
+ response_data["message"] = str(result)
280
287
  else:
281
- result = GLOBAL[args[0]].command(" ".join(args[1:]))
282
- response_data["success"] = result.success
283
- response_data["message"] = str(result)
288
+ cmd_usage()
284
289
 
285
290
  # Send response.
286
291
  encode_json(stream, response, response_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.15.2
3
+ Version: 5.15.3
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/libre-embedded/runtimepy
6
6
  Author: Libre Embedded
@@ -17,11 +17,11 @@ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
+ Requires-Dist: websockets
21
+ Requires-Dist: vcorelib>=3.6.3
20
22
  Requires-Dist: svgen>=0.8.0
21
23
  Requires-Dist: aiofiles
22
24
  Requires-Dist: psutil
23
- Requires-Dist: vcorelib>=3.6.3
24
- Requires-Dist: websockets
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -51,11 +51,11 @@ Dynamic: requires-python
51
51
  =====================================
52
52
  generator=datazen
53
53
  version=3.2.3
54
- hash=f1c75c9b812e8ff29fdda46f58009aef
54
+ hash=ed2f5b3731ba189c4a3ec2f2252b622e
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.15.2](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.15.3](https://pypi.org/project/runtimepy/))
59
59
 
60
60
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
61
61
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
File without changes
File without changes