runtimepy 5.15.7__tar.gz → 5.16.0__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 (329) hide show
  1. {runtimepy-5.15.7/runtimepy.egg-info → runtimepy-5.16.0}/PKG-INFO +21 -22
  2. {runtimepy-5.15.7 → runtimepy-5.16.0}/README.md +18 -19
  3. {runtimepy-5.15.7 → runtimepy-5.16.0}/pyproject.toml +1 -1
  4. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/__init__.py +2 -2
  5. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/protocol/receiver.py +7 -1
  6. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/arbiter.py +3 -4
  7. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/css/main.css +2 -0
  8. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/message/interface.py +5 -1
  9. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/base.py +13 -4
  10. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/info.py +13 -6
  11. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/connection.py +2 -1
  12. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/response.py +18 -4
  13. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/__init__.py +15 -3
  14. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/http/__init__.py +5 -5
  15. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/websocket/connection.py +1 -3
  16. {runtimepy-5.15.7 → runtimepy-5.16.0/runtimepy.egg-info}/PKG-INFO +21 -22
  17. {runtimepy-5.15.7 → runtimepy-5.16.0}/LICENSE +0 -0
  18. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/__main__.py +0 -0
  19. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/app.py +0 -0
  20. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/__init__.py +0 -0
  21. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/__init__.py +0 -0
  22. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/array.py +0 -0
  23. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/base.py +0 -0
  24. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/command/__init__.py +0 -0
  25. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/command/parser.py +0 -0
  26. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/command/processor.py +0 -0
  27. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/command/result.py +0 -0
  28. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/create.py +0 -0
  29. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/file.py +0 -0
  30. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/sample.py +0 -0
  31. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/environment/telemetry.py +0 -0
  32. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/event/__init__.py +0 -0
  33. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/event/header.py +0 -0
  34. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/channel/registry.py +0 -0
  35. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/__init__.py +0 -0
  36. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/protocol/__init__.py +0 -0
  37. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/protocol/base.py +0 -0
  38. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/protocol/json.py +0 -0
  39. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/codec/system/__init__.py +0 -0
  40. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/__init__.py +0 -0
  41. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/all.py +0 -0
  42. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/common.py +0 -0
  43. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/mtu.py +0 -0
  44. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/server.py +0 -0
  45. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/task.py +0 -0
  46. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/tftp.py +0 -0
  47. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/commands/tui.py +0 -0
  48. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/control/__init__.py +0 -0
  49. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/control/env/__init__.py +0 -0
  50. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/control/source.py +0 -0
  51. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/control/step.py +0 -0
  52. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/404.md +0 -0
  53. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/base.yaml +0 -0
  54. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/browser.yaml +0 -0
  55. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/css/bootstrap_extra.css +0 -0
  56. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/css/font.css +0 -0
  57. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/dummy_load.yaml +0 -0
  58. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/factories.yaml +0 -0
  59. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/favicon.ico +0 -0
  60. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/DataConnection.js +0 -0
  61. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/JsonConnection.js +0 -0
  62. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/audio.js +0 -0
  63. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/App.js +0 -0
  64. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/ChannelTable.js +0 -0
  65. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/DataConnection.js +0 -0
  66. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  67. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  68. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/Plot.js +0 -0
  69. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  70. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/PlotManager.js +0 -0
  71. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  72. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  73. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/PointManager.js +0 -0
  74. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/TabFilter.js +0 -0
  75. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/TabInterface.js +0 -0
  76. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  77. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/WindowHashManager.js +0 -0
  78. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  79. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/events.js +0 -0
  80. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/init.js +0 -0
  81. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/main.js +0 -0
  82. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/markdown_page.js +0 -0
  83. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/sample.js +0 -0
  84. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/tab/env.js +0 -0
  85. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/tab/sound.js +0 -0
  86. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  87. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/unused/pyodide.js +0 -0
  88. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/util.js +0 -0
  89. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/js/worker.js +0 -0
  90. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/md/Connection.md +0 -0
  91. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/md/PeriodicTask.md +0 -0
  92. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/md/RuntimeStruct.md +0 -0
  93. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  94. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/md/SinusoidTask.md +0 -0
  95. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/sample_telemetry.yaml +0 -0
  96. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/BitFields.yaml +0 -0
  97. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/Button.yaml +0 -0
  98. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/Channel.yaml +0 -0
  99. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  100. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  101. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  102. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +0 -0
  103. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  104. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/FindFile.yaml +0 -0
  105. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/PeerProcessConfig.yaml +0 -0
  106. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/RuntimeEnum.yaml +0 -0
  107. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  108. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/StructConfig.yaml +0 -0
  109. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  110. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/TwoTupleArray.yaml +0 -0
  111. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  112. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_buttons.yaml +0 -0
  113. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_config.yaml +0 -0
  114. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_factory.yaml +0 -0
  115. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  116. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_name.yaml +0 -0
  117. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  118. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/schemas/has_views.yaml +0 -0
  119. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/server.yaml +0 -0
  120. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/server_base.yaml +0 -0
  121. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/server_dev.yaml +0 -0
  122. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/css/bootstrap-icons.min.css +0 -0
  123. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/css/bootstrap.min.css +0 -0
  124. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  125. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  126. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/js/bootstrap.bundle.min.js +0 -0
  127. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/js/webglplot.umd.min.js +0 -0
  128. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/1024x1024.png +0 -0
  129. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/128x128.png +0 -0
  130. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/16x16.png +0 -0
  131. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/1920x1920.png +0 -0
  132. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/24x24.png +0 -0
  133. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/256x256.png +0 -0
  134. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/32x32.png +0 -0
  135. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/512x512.png +0 -0
  136. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/png/chip-circle-bootstrap/64x64.png +0 -0
  137. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  138. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/svg/outline-dark.svg +0 -0
  139. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/svg/outline-light.svg +0 -0
  140. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  141. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  142. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  143. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  144. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  145. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  146. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  147. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  148. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/static/woff2/README.md +0 -0
  149. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/data/tftp_server.yaml +0 -0
  150. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/dev_requirements.txt +0 -0
  151. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/entry.py +0 -0
  152. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/enum/__init__.py +0 -0
  153. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/enum/registry.py +0 -0
  154. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/enum/types.py +0 -0
  155. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mapping.py +0 -0
  156. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/message/__init__.py +0 -0
  157. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/message/handlers.py +0 -0
  158. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/message/types.py +0 -0
  159. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/metrics/__init__.py +0 -0
  160. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/metrics/channel.py +0 -0
  161. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/metrics/connection.py +0 -0
  162. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/metrics/task.py +0 -0
  163. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/__init__.py +0 -0
  164. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/async_command.py +0 -0
  165. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/enum.py +0 -0
  166. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/environment.py +0 -0
  167. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/finalize.py +0 -0
  168. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/logging.py +0 -0
  169. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/psutil.py +0 -0
  170. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/regex.py +0 -0
  171. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/mixins/trig.py +0 -0
  172. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/__init__.py +0 -0
  173. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/apps/__init__.py +0 -0
  174. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/__init__.py +0 -0
  175. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/config/__init__.py +0 -0
  176. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/config/codec.py +0 -0
  177. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/config/util.py +0 -0
  178. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  179. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/factory/connection.py +0 -0
  180. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/factory/task.py +0 -0
  181. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  182. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  183. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/imports/util.py +0 -0
  184. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/result.py +0 -0
  185. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/struct/__init__.py +0 -0
  186. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/task.py +0 -0
  187. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  188. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/tcp/json.py +0 -0
  189. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/udp.py +0 -0
  190. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/arbiter/websocket.py +0 -0
  191. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/backoff.py +0 -0
  192. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/factories/__init__.py +0 -0
  193. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/html/__init__.py +0 -0
  194. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/html/arbiter.py +0 -0
  195. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/html/bootstrap/__init__.py +0 -0
  196. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/html/bootstrap/elements.py +0 -0
  197. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/html/bootstrap/tabs.py +0 -0
  198. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/__init__.py +0 -0
  199. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/common.py +0 -0
  200. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/header.py +0 -0
  201. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/request_target.py +0 -0
  202. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/state.py +0 -0
  203. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/http/version.py +0 -0
  204. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/manager.py +0 -0
  205. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/mixin.py +0 -0
  206. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/mtu.py +0 -0
  207. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/__init__.py +0 -0
  208. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/base.py +0 -0
  209. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/create.py +0 -0
  210. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/elements.py +0 -0
  211. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/__init__.py +0 -0
  212. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/modal.py +0 -0
  213. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/settings.py +0 -0
  214. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  215. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/tab/base.py +0 -0
  216. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/tab/controls.py +0 -0
  217. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/tab/html.py +0 -0
  218. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/tab/message.py +0 -0
  219. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/env/widgets.py +0 -0
  220. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/files.py +0 -0
  221. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/landing_page.py +0 -0
  222. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/placeholder.py +0 -0
  223. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/pyodide.py +0 -0
  224. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/sound.py +0 -0
  225. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/app/tab.py +0 -0
  226. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/html.py +0 -0
  227. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/json.py +0 -0
  228. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/markdown.py +0 -0
  229. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/mux.py +0 -0
  230. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/struct/__init__.py +0 -0
  231. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/websocket/__init__.py +0 -0
  232. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/server/websocket/state.py +0 -0
  233. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/ssl.py +0 -0
  234. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/stream/__init__.py +0 -0
  235. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/stream/base.py +0 -0
  236. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/stream/json/__init__.py +0 -0
  237. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/stream/string.py +0 -0
  238. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/__init__.py +0 -0
  239. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/connection.py +0 -0
  240. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/create.py +0 -0
  241. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/protocol.py +0 -0
  242. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/scpi/__init__.py +0 -0
  243. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/telnet/__init__.py +0 -0
  244. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/telnet/codes.py +0 -0
  245. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  246. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/__init__.py +0 -0
  247. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/connection.py +0 -0
  248. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/create.py +0 -0
  249. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/protocol.py +0 -0
  250. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/queue.py +0 -0
  251. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/tftp/__init__.py +0 -0
  252. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/tftp/base.py +0 -0
  253. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  254. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/tftp/enums.py +0 -0
  255. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/udp/tftp/io.py +0 -0
  256. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/util.py +0 -0
  257. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/net/websocket/__init__.py +0 -0
  258. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/noise/__init__.py +0 -0
  259. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/__init__.py +0 -0
  260. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/array/__init__.py +0 -0
  261. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/base.py +0 -0
  262. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/bool.py +0 -0
  263. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/byte_order.py +0 -0
  264. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/evaluation.py +0 -0
  265. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/field/__init__.py +0 -0
  266. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/field/fields.py +0 -0
  267. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/field/manager/__init__.py +0 -0
  268. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/field/manager/base.py +0 -0
  269. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/float.py +0 -0
  270. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/int.py +0 -0
  271. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/scaling.py +0 -0
  272. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/serializable/__init__.py +0 -0
  273. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/serializable/base.py +0 -0
  274. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/serializable/fixed.py +0 -0
  275. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/serializable/framer.py +0 -0
  276. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/serializable/prefixed.py +0 -0
  277. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/string.py +0 -0
  278. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/__init__.py +0 -0
  279. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/base.py +0 -0
  280. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/bool.py +0 -0
  281. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/bounds.py +0 -0
  282. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/float.py +0 -0
  283. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/primitives/types/int.py +0 -0
  284. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/py.typed +0 -0
  285. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/registry/__init__.py +0 -0
  286. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/registry/bool.py +0 -0
  287. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/registry/item.py +0 -0
  288. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/registry/name.py +0 -0
  289. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/requirements.txt +0 -0
  290. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/sample/__init__.py +0 -0
  291. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/sample/peer.py +0 -0
  292. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/sample/program.py +0 -0
  293. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/schemas.py +0 -0
  294. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/struct/__init__.py +0 -0
  295. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/subprocess/__init__.py +0 -0
  296. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/subprocess/interface.py +0 -0
  297. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/subprocess/peer.py +0 -0
  298. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/subprocess/program.py +0 -0
  299. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/subprocess/protocol.py +0 -0
  300. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/__init__.py +0 -0
  301. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/asynchronous.py +0 -0
  302. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/basic/__init__.py +0 -0
  303. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/basic/manager.py +0 -0
  304. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/basic/periodic.py +0 -0
  305. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/sample.py +0 -0
  306. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/task/trig/__init__.py +0 -0
  307. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/telemetry/__init__.py +0 -0
  308. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/telemetry/sample.py +0 -0
  309. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/__init__.py +0 -0
  310. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/channels/__init__.py +0 -0
  311. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/cursor.py +0 -0
  312. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/mixin.py +0 -0
  313. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/mock.py +0 -0
  314. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/tui/task.py +0 -0
  315. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/ui/__init__.py +0 -0
  316. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/ui/button.py +0 -0
  317. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/ui/controls.py +0 -0
  318. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy/util.py +0 -0
  319. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy.egg-info/SOURCES.txt +0 -0
  320. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy.egg-info/dependency_links.txt +0 -0
  321. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy.egg-info/entry_points.txt +0 -0
  322. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy.egg-info/requires.txt +2 -2
  323. {runtimepy-5.15.7 → runtimepy-5.16.0}/runtimepy.egg-info/top_level.txt +0 -0
  324. {runtimepy-5.15.7 → runtimepy-5.16.0}/setup.cfg +0 -0
  325. {runtimepy-5.15.7 → runtimepy-5.16.0}/setup.py +0 -0
  326. {runtimepy-5.15.7 → runtimepy-5.16.0}/tests/test_entry.py +0 -0
  327. {runtimepy-5.15.7 → runtimepy-5.16.0}/tests/test_mapping.py +0 -0
  328. {runtimepy-5.15.7 → runtimepy-5.16.0}/tests/test_resources.py +0 -0
  329. {runtimepy-5.15.7 → runtimepy-5.16.0}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.15.7
3
+ Version: 5.16.0
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
20
  Requires-Dist: svgen>=0.8.0
22
- Requires-Dist: vcorelib>=3.6.4
23
21
  Requires-Dist: aiofiles
22
+ Requires-Dist: vcorelib>=3.6.4
24
23
  Requires-Dist: psutil
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=fd0b9f87927033d8ee2eb5448d8aec76
54
+ hash=ebb0bba9899d4baf7ce73b082f5e384e
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.15.7](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.16.0](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)
@@ -89,7 +89,7 @@ This package is tested on the following platforms:
89
89
  # Command-line Options
90
90
 
91
91
  ```
92
- $ ./venv3.12/bin/runtimepy -h
92
+ $ ./venv3.13/bin/runtimepy -h
93
93
 
94
94
  usage: runtimepy [-h] [--version] [-v] [-q] [--curses] [--no-uvloop] [-C DIR]
95
95
  {arbiter,mtu,server,task,tftp,tui,noop} ...
@@ -103,7 +103,7 @@ options:
103
103
  -q, --quiet set to reduce output
104
104
  --curses whether or not to use curses.wrapper when starting
105
105
  --no-uvloop whether or not to disable uvloop as event loop driver
106
- -C DIR, --dir DIR execute from a specific directory
106
+ -C, --dir DIR execute from a specific directory
107
107
 
108
108
  commands:
109
109
  {arbiter,mtu,server,task,tftp,tui,noop}
@@ -123,7 +123,7 @@ commands:
123
123
  ### `arbiter`
124
124
 
125
125
  ```
126
- $ ./venv3.12/bin/runtimepy arbiter -h
126
+ $ ./venv3.13/bin/runtimepy arbiter -h
127
127
 
128
128
  usage: runtimepy arbiter [-h] [-i] [-w] [--no-poller] configs [configs ...]
129
129
 
@@ -144,7 +144,7 @@ options:
144
144
  ### `mtu`
145
145
 
146
146
  ```
147
- $ ./venv3.12/bin/runtimepy mtu -h
147
+ $ ./venv3.13/bin/runtimepy mtu -h
148
148
 
149
149
  usage: runtimepy mtu [-h] [--probe-size PROBE_SIZE] [--fallback FALLBACK] [-t]
150
150
  destination [destination ...]
@@ -165,7 +165,7 @@ options:
165
165
  ### `server`
166
166
 
167
167
  ```
168
- $ ./venv3.12/bin/runtimepy server -h
168
+ $ ./venv3.13/bin/runtimepy server -h
169
169
 
170
170
  usage: runtimepy server [-h] [-i] [-w] [--no-poller] [--cafile CAFILE]
171
171
  [--capath CAPATH] [--cadata CADATA]
@@ -191,7 +191,7 @@ options:
191
191
  --certfile CERTFILE passed directly to instantiation
192
192
  --keyfile KEYFILE passed directly to instantiation
193
193
  --host HOST host address to listen on (default: '0.0.0.0')
194
- -p PORT, --port PORT port to listen on (default: 0)
194
+ -p, --port PORT port to listen on (default: 0)
195
195
  -u, --udp whether or not this is a UDP-based server (otherwise
196
196
  it must be a TCP-based server)
197
197
  -l, --loopback if true a client of the same connection type is added
@@ -201,7 +201,7 @@ options:
201
201
  ### `task`
202
202
 
203
203
  ```
204
- $ ./venv3.12/bin/runtimepy task -h
204
+ $ ./venv3.13/bin/runtimepy task -h
205
205
 
206
206
  usage: runtimepy task [-h] [-i] [-w] [--no-poller] [-r RATE]
207
207
  factory [configs ...]
@@ -218,14 +218,14 @@ options:
218
218
  ensure that a 'wait_for_stop' application method is
219
219
  run last
220
220
  --no-poller don't run a connection-metrics poller task
221
- -r RATE, --rate RATE rate (in Hz) that the task should run (default: 10)
221
+ -r, --rate RATE rate (in Hz) that the task should run (default: 10)
222
222
 
223
223
  ```
224
224
 
225
225
  ### `tftp`
226
226
 
227
227
  ```
228
- $ ./venv3.12/bin/runtimepy tftp -h
228
+ $ ./venv3.13/bin/runtimepy tftp -h
229
229
 
230
230
  usage: runtimepy tftp [-h] [-p PORT] [-m MODE] [-t TIMEOUT] [-r REEMIT]
231
231
  {read,write} host our_file [their_file]
@@ -238,28 +238,27 @@ positional arguments:
238
238
 
239
239
  options:
240
240
  -h, --help show this help message and exit
241
- -p PORT, --port PORT port to message (default: 69)
242
- -m MODE, --mode MODE tftp mode to use (default: octet)
243
- -t TIMEOUT, --timeout TIMEOUT
241
+ -p, --port PORT port to message (default: 69)
242
+ -m, --mode MODE tftp mode to use (default: octet)
243
+ -t, --timeout TIMEOUT
244
244
  timeout for each step
245
- -r REEMIT, --reemit REEMIT
246
- transmit period for each step
245
+ -r, --reemit REEMIT transmit period for each step
247
246
 
248
247
  ```
249
248
 
250
249
  ### `tui`
251
250
 
252
251
  ```
253
- $ ./venv3.12/bin/runtimepy tui -h
252
+ $ ./venv3.13/bin/runtimepy tui -h
254
253
 
255
254
  usage: runtimepy tui [-h] [-i ITERATIONS] [-r RATE]
256
255
 
257
256
  options:
258
257
  -h, --help show this help message and exit
259
- -i ITERATIONS, --iterations ITERATIONS
258
+ -i, --iterations ITERATIONS
260
259
  maximum number of program iterations (if greater than
261
260
  zero, default: 0)
262
- -r RATE, --rate RATE frequency (in Hz) to run the interface (default: 60.0
261
+ -r, --rate RATE frequency (in Hz) to run the interface (default: 60.0
263
262
  Hz)
264
263
 
265
264
  ```
@@ -2,11 +2,11 @@
2
2
  =====================================
3
3
  generator=datazen
4
4
  version=3.2.3
5
- hash=fd0b9f87927033d8ee2eb5448d8aec76
5
+ hash=ebb0bba9899d4baf7ce73b082f5e384e
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.15.7](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.16.0](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)
@@ -40,7 +40,7 @@ This package is tested on the following platforms:
40
40
  # Command-line Options
41
41
 
42
42
  ```
43
- $ ./venv3.12/bin/runtimepy -h
43
+ $ ./venv3.13/bin/runtimepy -h
44
44
 
45
45
  usage: runtimepy [-h] [--version] [-v] [-q] [--curses] [--no-uvloop] [-C DIR]
46
46
  {arbiter,mtu,server,task,tftp,tui,noop} ...
@@ -54,7 +54,7 @@ options:
54
54
  -q, --quiet set to reduce output
55
55
  --curses whether or not to use curses.wrapper when starting
56
56
  --no-uvloop whether or not to disable uvloop as event loop driver
57
- -C DIR, --dir DIR execute from a specific directory
57
+ -C, --dir DIR execute from a specific directory
58
58
 
59
59
  commands:
60
60
  {arbiter,mtu,server,task,tftp,tui,noop}
@@ -74,7 +74,7 @@ commands:
74
74
  ### `arbiter`
75
75
 
76
76
  ```
77
- $ ./venv3.12/bin/runtimepy arbiter -h
77
+ $ ./venv3.13/bin/runtimepy arbiter -h
78
78
 
79
79
  usage: runtimepy arbiter [-h] [-i] [-w] [--no-poller] configs [configs ...]
80
80
 
@@ -95,7 +95,7 @@ options:
95
95
  ### `mtu`
96
96
 
97
97
  ```
98
- $ ./venv3.12/bin/runtimepy mtu -h
98
+ $ ./venv3.13/bin/runtimepy mtu -h
99
99
 
100
100
  usage: runtimepy mtu [-h] [--probe-size PROBE_SIZE] [--fallback FALLBACK] [-t]
101
101
  destination [destination ...]
@@ -116,7 +116,7 @@ options:
116
116
  ### `server`
117
117
 
118
118
  ```
119
- $ ./venv3.12/bin/runtimepy server -h
119
+ $ ./venv3.13/bin/runtimepy server -h
120
120
 
121
121
  usage: runtimepy server [-h] [-i] [-w] [--no-poller] [--cafile CAFILE]
122
122
  [--capath CAPATH] [--cadata CADATA]
@@ -142,7 +142,7 @@ options:
142
142
  --certfile CERTFILE passed directly to instantiation
143
143
  --keyfile KEYFILE passed directly to instantiation
144
144
  --host HOST host address to listen on (default: '0.0.0.0')
145
- -p PORT, --port PORT port to listen on (default: 0)
145
+ -p, --port PORT port to listen on (default: 0)
146
146
  -u, --udp whether or not this is a UDP-based server (otherwise
147
147
  it must be a TCP-based server)
148
148
  -l, --loopback if true a client of the same connection type is added
@@ -152,7 +152,7 @@ options:
152
152
  ### `task`
153
153
 
154
154
  ```
155
- $ ./venv3.12/bin/runtimepy task -h
155
+ $ ./venv3.13/bin/runtimepy task -h
156
156
 
157
157
  usage: runtimepy task [-h] [-i] [-w] [--no-poller] [-r RATE]
158
158
  factory [configs ...]
@@ -169,14 +169,14 @@ options:
169
169
  ensure that a 'wait_for_stop' application method is
170
170
  run last
171
171
  --no-poller don't run a connection-metrics poller task
172
- -r RATE, --rate RATE rate (in Hz) that the task should run (default: 10)
172
+ -r, --rate RATE rate (in Hz) that the task should run (default: 10)
173
173
 
174
174
  ```
175
175
 
176
176
  ### `tftp`
177
177
 
178
178
  ```
179
- $ ./venv3.12/bin/runtimepy tftp -h
179
+ $ ./venv3.13/bin/runtimepy tftp -h
180
180
 
181
181
  usage: runtimepy tftp [-h] [-p PORT] [-m MODE] [-t TIMEOUT] [-r REEMIT]
182
182
  {read,write} host our_file [their_file]
@@ -189,28 +189,27 @@ positional arguments:
189
189
 
190
190
  options:
191
191
  -h, --help show this help message and exit
192
- -p PORT, --port PORT port to message (default: 69)
193
- -m MODE, --mode MODE tftp mode to use (default: octet)
194
- -t TIMEOUT, --timeout TIMEOUT
192
+ -p, --port PORT port to message (default: 69)
193
+ -m, --mode MODE tftp mode to use (default: octet)
194
+ -t, --timeout TIMEOUT
195
195
  timeout for each step
196
- -r REEMIT, --reemit REEMIT
197
- transmit period for each step
196
+ -r, --reemit REEMIT transmit period for each step
198
197
 
199
198
  ```
200
199
 
201
200
  ### `tui`
202
201
 
203
202
  ```
204
- $ ./venv3.12/bin/runtimepy tui -h
203
+ $ ./venv3.13/bin/runtimepy tui -h
205
204
 
206
205
  usage: runtimepy tui [-h] [-i ITERATIONS] [-r RATE]
207
206
 
208
207
  options:
209
208
  -h, --help show this help message and exit
210
- -i ITERATIONS, --iterations ITERATIONS
209
+ -i, --iterations ITERATIONS
211
210
  maximum number of program iterations (if greater than
212
211
  zero, default: 0)
213
- -r RATE, --rate RATE frequency (in Hz) to run the interface (default: 60.0
212
+ -r, --rate RATE frequency (in Hz) to run the interface (default: 60.0
214
213
  Hz)
215
214
 
216
215
  ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta:__legacy__"
4
4
 
5
5
  [project]
6
6
  name = "runtimepy"
7
- version = "5.15.7"
7
+ version = "5.16.0"
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=7591d3ee09b156575678bdf806e1b5c7
4
+ # hash=d903df789fdb4c76fdf462319413ca2c
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.7"
13
+ VERSION = "5.16.0"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -21,6 +21,10 @@ NonStructHandler = Callable[[BytesIO], bool]
21
21
  NON_STRUCT_ID = 0
22
22
 
23
23
 
24
+ def null_struct_handler(_: Protocol) -> None:
25
+ """Takes no action."""
26
+
27
+
24
28
  class StructReceiver(LoggerMixin):
25
29
  """A class for sending and receiving struct messages."""
26
30
 
@@ -44,7 +48,9 @@ class StructReceiver(LoggerMixin):
44
48
  assert self.non_struct_handler is None
45
49
  self.non_struct_handler = handler
46
50
 
47
- def add_handler(self, identifier: int, handler: StructHandler) -> None:
51
+ def add_handler(
52
+ self, identifier: int, handler: StructHandler = null_struct_handler
53
+ ) -> None:
48
54
  """Add a struct message handler."""
49
55
 
50
56
  assert identifier not in self.handlers
@@ -30,7 +30,9 @@ async def entry(
30
30
 
31
31
  await arbiter.load_configs(args.configs, wait_for_stop=args.wait_for_stop)
32
32
 
33
- return await arbiter.app()
33
+ if args.init_only:
34
+ stop_sig.set()
35
+ return await arbiter.app(clear_stop_sig=not args.init_only)
34
36
 
35
37
 
36
38
  def app(args: _Namespace) -> int:
@@ -38,9 +40,6 @@ def app(args: _Namespace) -> int:
38
40
 
39
41
  stop_sig = _asyncio.Event()
40
42
 
41
- if args.init_only:
42
- stop_sig.set()
43
-
44
43
  result = _run_handle_stop(
45
44
  stop_sig,
46
45
  entry(stop_sig, args, window=args.window),
@@ -19,6 +19,8 @@ body > :first-child {
19
19
 
20
20
  #runtimepy-tabs {
21
21
  width: min-content;
22
+ max-width: 30vw;
23
+ overflow: hidden;
22
24
  }
23
25
 
24
26
  #runtimepy-splash {
@@ -342,7 +342,11 @@ class JsonMessageInterface:
342
342
  target = self.targets.evaluate(key)
343
343
  if target:
344
344
  assert target.data is not None
345
- key, handler, kind = target.data
345
+ ( # pylint: disable=unpacking-non-sequence
346
+ key,
347
+ handler,
348
+ kind,
349
+ ) = target.data
346
350
 
347
351
  # Use target resolution data (if any) as a base.
348
352
  with_sub_data = copy(
@@ -237,9 +237,10 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
237
237
  self._register_connection(value, key)
238
238
 
239
239
  # Ensure connections are all initialized.
240
- await _asyncio.gather(
241
- *(x.initialized.wait() for x in self._connections.values())
242
- )
240
+ with self.log_time("Connection initialization", reminder=True):
241
+ await _asyncio.gather(
242
+ *(x.initialized.wait() for x in self._connections.values())
243
+ )
243
244
 
244
245
  async def _build_structs(self, info: AppInfo) -> None:
245
246
  """Build structs."""
@@ -362,6 +363,7 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
362
363
  app: NetworkApplicationlike = None,
363
364
  check_connections: bool = True,
364
365
  config: _JsonObject = None,
366
+ clear_stop_sig: bool = True,
365
367
  ) -> int:
366
368
  """
367
369
  Ensures connections are given a chance to initialize, run the
@@ -372,6 +374,9 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
372
374
  info: Optional[AppInfo] = None
373
375
 
374
376
  try:
377
+ if clear_stop_sig:
378
+ self.stop_sig.clear()
379
+
375
380
  async with _AsyncExitStack() as stack:
376
381
  result, info = await self._main(
377
382
  stack,
@@ -462,6 +467,7 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
462
467
  app: NetworkApplicationlike = None,
463
468
  check_connections: bool = True,
464
469
  config: _JsonObject = None,
470
+ clear_stop_sig: bool = False,
465
471
  ) -> int:
466
472
  """
467
473
  Run the application alongside the connection manager and server tasks.
@@ -472,7 +478,10 @@ class BaseConnectionArbiter(_NamespaceMixin, _LoggerMixin, TuiMixin):
472
478
 
473
479
  # Run application.
474
480
  result = await self._entry(
475
- app=app, check_connections=check_connections, config=config
481
+ app=app,
482
+ check_connections=check_connections,
483
+ config=config,
484
+ clear_stop_sig=clear_stop_sig,
476
485
  )
477
486
 
478
487
  # Shutdown any pending tasks.
@@ -69,7 +69,10 @@ class RuntimeStruct(RuntimeStructBase):
69
69
  final_poll = False
70
70
 
71
71
  def init_env(self) -> None:
72
- """Initialize this sample environment."""
72
+ """Initialize this environment."""
73
+
74
+ async def async_init_env(self) -> None:
75
+ """Initialize this environment."""
73
76
 
74
77
  @contextmanager
75
78
  def _final_poll(self) -> _Iterator[None]:
@@ -101,14 +104,18 @@ class RuntimeStruct(RuntimeStructBase):
101
104
  if ProtocolFactory in factory.__bases__:
102
105
  self.recv = factory.singleton()
103
106
  byte_order = self.recv.byte_order
104
- with self.env.names_pushed("rx"):
107
+ if self.config.get("control", True):
108
+ with self.env.names_pushed("rx"):
109
+ self.env.register_protocol(self.recv, False)
110
+
111
+ self.send = factory.instance()
112
+ with self.env.names_pushed("tx"):
113
+ self.env.register_protocol(self.send, True)
114
+ else:
105
115
  self.env.register_protocol(self.recv, False)
106
116
 
107
- self.send = factory.instance()
108
- with self.env.names_pushed("tx"):
109
- self.env.register_protocol(self.send, True)
110
-
111
117
  self.init_env()
118
+ await self.async_init_env()
112
119
  self.update_byte_order(byte_order, **kwargs)
113
120
 
114
121
  def update_byte_order(self, byte_order: ByteOrder, **kwargs) -> None:
@@ -43,6 +43,7 @@ class Connection(
43
43
  byte_order: ByteOrder = DEFAULT_BYTE_ORDER
44
44
 
45
45
  default_auto_restart = False
46
+ ignore_stop_sig = False
46
47
 
47
48
  def __init__(
48
49
  self,
@@ -300,7 +301,7 @@ class Connection(
300
301
  )
301
302
 
302
303
  # Allow a stop signal to also disable the connection.
303
- if stop_sig is not None:
304
+ if stop_sig is not None and not self.ignore_stop_sig:
304
305
  self._tasks.append(_asyncio.create_task(self._wait_sig(stop_sig)))
305
306
 
306
307
  self.exited.clear()
@@ -3,11 +3,12 @@ A module implementing HTTP-response interfaces.
3
3
  """
4
4
 
5
5
  # built-in
6
+ from abc import ABC, abstractmethod
6
7
  import http
7
8
  from io import StringIO
8
9
  import logging
9
10
  from pathlib import Path
10
- from typing import AsyncIterator, cast
11
+ from typing import AsyncIterator, Optional, cast
11
12
 
12
13
  # third-party
13
14
  import aiofiles
@@ -96,19 +97,32 @@ class ResponseHeader(HeadersMixin):
96
97
  self["Cache-Control"] = value
97
98
 
98
99
 
99
- class AsyncResponse:
100
+ class AsyncResponse(ABC):
101
+ """Interface for asynchronous responses."""
102
+
103
+ @abstractmethod
104
+ async def size(self) -> Optional[int]:
105
+ """Get this response's size."""
106
+
107
+ @abstractmethod
108
+ async def process(self) -> AsyncIterator[bytes]:
109
+ """Yield chunks to write asynchronously."""
110
+ yield bytes() # pragma: nocover
111
+
112
+
113
+ class AsyncFile(AsyncResponse):
100
114
  """
101
115
  A class facilitating asynchronous server responses for e.g.
102
116
  file-system files.
103
117
  """
104
118
 
105
- def __init__(self, path: Path, chunk_size: int = 1024) -> None:
119
+ def __init__(self, path: Path, chunk_size: int = 4096) -> None:
106
120
  """Initialize this instance."""
107
121
 
108
122
  self.path = path
109
123
  self.chunk_size = chunk_size
110
124
 
111
- async def size(self) -> int:
125
+ async def size(self) -> Optional[int]:
112
126
  """Get this response's size."""
113
127
  return cast(int, await aiofiles.os.path.getsize(self.path))
114
128
 
@@ -8,7 +8,7 @@ from io import StringIO
8
8
  import logging
9
9
  import mimetypes
10
10
  from pathlib import Path
11
- from typing import Any, Optional, TextIO, Union
11
+ from typing import Any, Awaitable, Callable, Optional, TextIO, Union
12
12
  from urllib.parse import urlencode
13
13
 
14
14
  # third-party
@@ -22,7 +22,7 @@ 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
25
- from runtimepy.net.http.response import AsyncResponse, ResponseHeader
25
+ from runtimepy.net.http.response import AsyncFile, ResponseHeader
26
26
  from runtimepy.net.server.html import HtmlApp, HtmlApps, get_html, html_handler
27
27
  from runtimepy.net.server.json import encode_json, json_handler
28
28
  from runtimepy.net.server.markdown import DIR_FILE, markdown_for_dir
@@ -41,11 +41,17 @@ def package_data_dir() -> Path:
41
41
  return result.parent
42
42
 
43
43
 
44
+ CustomAsync = Callable[
45
+ [ResponseHeader, RequestHeader, Optional[bytearray]], Awaitable[HttpResult]
46
+ ]
47
+
48
+
44
49
  class RuntimepyServerConnection(HttpConnection):
45
50
  """A class implementing a server-connection interface for this package."""
46
51
 
47
52
  # Can register application methods to URL paths.
48
53
  apps: HtmlApps = {"/mux.html": mux_app}
54
+ custom: dict[str, CustomAsync] = {}
49
55
  default_app: Optional[HtmlApp] = None
50
56
 
51
57
  # Can load additional data into this dictionary for easy HTTP access.
@@ -245,7 +251,7 @@ class RuntimepyServerConnection(HttpConnection):
245
251
  response.static_resource()
246
252
 
247
253
  # Return the file data.
248
- result = AsyncResponse(candidate)
254
+ result = AsyncFile(candidate)
249
255
  break
250
256
 
251
257
  # Handle a directory as a last resort.
@@ -335,6 +341,12 @@ class RuntimepyServerConnection(HttpConnection):
335
341
  response.static_resource()
336
342
  return self.favicon_data
337
343
 
344
+ # Check for a custom handler.
345
+ if path in self.custom:
346
+ return await self.custom[path](
347
+ response, request, request_data
348
+ )
349
+
338
350
  # Try serving a file and handling redirects.
339
351
  for handler in [self.try_redirect, self.try_file]:
340
352
  result = await handler(
@@ -173,13 +173,13 @@ class HttpConnection(_TcpConnection):
173
173
  ) -> None:
174
174
  """Send a request or response to a request."""
175
175
 
176
- # Set content length.
177
- header["content-length"] = "0"
178
-
176
+ size = None
179
177
  if isinstance(data, AsyncResponse):
180
- header["content-length"] = str(await data.size())
178
+ size = await data.size()
181
179
  elif data is not None:
182
- header["content-length"] = str(len(data))
180
+ size = len(data)
181
+ if size is not None:
182
+ header["content-length"] = str(size)
183
183
 
184
184
  self.send_binary(bytes(header))
185
185
 
@@ -104,9 +104,7 @@ class WebsocketConnection(Connection):
104
104
 
105
105
  async def _send_binay_message(self, data: BinaryMessage) -> None:
106
106
  """Send a binary message."""
107
- await self._handle_connection_closed(
108
- self.protocol.send(data), # type: ignore
109
- )
107
+ await self._handle_connection_closed(self.protocol.send(data))
110
108
  self.metrics.tx.increment(len(data))
111
109
 
112
110
  async def close(self) -> None: