runtimepy 5.9.1__tar.gz → 5.10.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 (302) hide show
  1. {runtimepy-5.9.1/runtimepy.egg-info → runtimepy-5.10.0}/PKG-INFO +6 -6
  2. {runtimepy-5.9.1 → runtimepy-5.10.0}/README.md +2 -2
  3. {runtimepy-5.9.1 → runtimepy-5.10.0}/pyproject.toml +1 -1
  4. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/__init__.py +2 -2
  5. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/dummy_load.yaml +1 -2
  6. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/factories.yaml +1 -0
  7. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/PeerProcessConfig.yaml +1 -2
  8. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/message/__init__.py +18 -2
  9. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/sample/program.py +5 -1
  10. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/subprocess/program.py +10 -8
  11. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/basic/periodic.py +8 -1
  12. {runtimepy-5.9.1 → runtimepy-5.10.0/runtimepy.egg-info}/PKG-INFO +6 -6
  13. {runtimepy-5.9.1 → runtimepy-5.10.0}/LICENSE +0 -0
  14. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/__main__.py +0 -0
  15. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/app.py +0 -0
  16. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/__init__.py +0 -0
  17. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/__init__.py +0 -0
  18. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/array.py +0 -0
  19. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/base.py +0 -0
  20. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/command/__init__.py +0 -0
  21. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/command/parser.py +0 -0
  22. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/command/processor.py +0 -0
  23. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/command/result.py +0 -0
  24. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/create.py +0 -0
  25. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/file.py +0 -0
  26. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/sample.py +0 -0
  27. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/environment/telemetry.py +0 -0
  28. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/event/__init__.py +0 -0
  29. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/event/header.py +0 -0
  30. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/channel/registry.py +0 -0
  31. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/codec/__init__.py +0 -0
  32. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/codec/protocol/__init__.py +0 -0
  33. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/codec/protocol/base.py +0 -0
  34. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/codec/protocol/json.py +0 -0
  35. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/codec/system/__init__.py +0 -0
  36. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/__init__.py +0 -0
  37. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/all.py +0 -0
  38. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/arbiter.py +0 -0
  39. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/common.py +0 -0
  40. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/mtu.py +0 -0
  41. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/server.py +0 -0
  42. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/task.py +0 -0
  43. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/tftp.py +0 -0
  44. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/commands/tui.py +0 -0
  45. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/control/__init__.py +0 -0
  46. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/control/env/__init__.py +0 -0
  47. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/control/source.py +0 -0
  48. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/control/step.py +0 -0
  49. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/404.html +0 -0
  50. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/browser.yaml +0 -0
  51. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/css/bootstrap_extra.css +0 -0
  52. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/css/font.css +0 -0
  53. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/css/main.css +0 -0
  54. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/favicon.ico +0 -0
  55. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/DataConnection.js +0 -0
  56. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/JsonConnection.js +0 -0
  57. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/audio.js +0 -0
  58. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/App.js +0 -0
  59. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/ChannelTable.js +0 -0
  60. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/DataConnection.js +0 -0
  61. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  62. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  63. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/Plot.js +0 -0
  64. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  65. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/PlotManager.js +0 -0
  66. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  67. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  68. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/PointManager.js +0 -0
  69. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/TabFilter.js +0 -0
  70. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/TabInterface.js +0 -0
  71. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  72. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/WindowHashManager.js +0 -0
  73. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  74. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/events.js +0 -0
  75. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/init.js +0 -0
  76. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/main.js +0 -0
  77. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/markdown_page.js +0 -0
  78. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/tab/env.js +0 -0
  79. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/tab/sound.js +0 -0
  80. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  81. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/unused/pyodide.js +0 -0
  82. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/util.js +0 -0
  83. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/js/worker.js +0 -0
  84. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/md/Connection.md +0 -0
  85. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/md/PeriodicTask.md +0 -0
  86. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/md/RuntimeStruct.md +0 -0
  87. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  88. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/md/SinusoidTask.md +0 -0
  89. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/sample_telemetry.yaml +0 -0
  90. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/BitFields.yaml +0 -0
  91. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/Channel.yaml +0 -0
  92. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  93. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  94. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  95. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +0 -0
  96. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  97. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/FindFile.yaml +0 -0
  98. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/RuntimeEnum.yaml +0 -0
  99. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  100. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/StructConfig.yaml +0 -0
  101. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  102. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  103. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/has_config.yaml +0 -0
  104. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/has_factory.yaml +0 -0
  105. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  106. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/has_name.yaml +0 -0
  107. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  108. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/server.yaml +0 -0
  109. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/server_base.yaml +0 -0
  110. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/server_dev.yaml +0 -0
  111. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  112. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  113. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  114. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  115. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  116. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  117. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  118. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  119. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  120. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/static/woff2/README.md +0 -0
  121. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/data/tftp_server.yaml +0 -0
  122. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/dev_requirements.txt +0 -0
  123. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/entry.py +0 -0
  124. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/enum/__init__.py +0 -0
  125. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/enum/registry.py +0 -0
  126. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/enum/types.py +0 -0
  127. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mapping.py +0 -0
  128. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/message/handlers.py +0 -0
  129. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/message/interface.py +0 -0
  130. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/message/types.py +0 -0
  131. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/metrics/__init__.py +0 -0
  132. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/metrics/channel.py +0 -0
  133. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/metrics/connection.py +0 -0
  134. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/metrics/task.py +0 -0
  135. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/__init__.py +0 -0
  136. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/async_command.py +0 -0
  137. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/enum.py +0 -0
  138. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/environment.py +0 -0
  139. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/finalize.py +0 -0
  140. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/logging.py +0 -0
  141. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/psutil.py +0 -0
  142. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/regex.py +0 -0
  143. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/mixins/trig.py +0 -0
  144. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/__init__.py +0 -0
  145. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/apps/__init__.py +0 -0
  146. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/__init__.py +0 -0
  147. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/base.py +0 -0
  148. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/config/__init__.py +0 -0
  149. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/config/codec.py +0 -0
  150. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/config/util.py +0 -0
  151. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  152. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/factory/connection.py +0 -0
  153. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/factory/task.py +0 -0
  154. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  155. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  156. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/imports/util.py +0 -0
  157. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/info.py +0 -0
  158. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/result.py +0 -0
  159. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/struct/__init__.py +0 -0
  160. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/task.py +0 -0
  161. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  162. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/tcp/json.py +0 -0
  163. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/udp.py +0 -0
  164. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/arbiter/websocket.py +0 -0
  165. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/backoff.py +0 -0
  166. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/connection.py +0 -0
  167. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/factories/__init__.py +0 -0
  168. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/html/__init__.py +0 -0
  169. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/html/arbiter.py +0 -0
  170. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/html/bootstrap/__init__.py +0 -0
  171. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/html/bootstrap/elements.py +0 -0
  172. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/html/bootstrap/tabs.py +0 -0
  173. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/__init__.py +0 -0
  174. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/common.py +0 -0
  175. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/header.py +0 -0
  176. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/request_target.py +0 -0
  177. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/response.py +0 -0
  178. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/state.py +0 -0
  179. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/http/version.py +0 -0
  180. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/manager.py +0 -0
  181. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/mixin.py +0 -0
  182. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/mtu.py +0 -0
  183. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/__init__.py +0 -0
  184. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/__init__.py +0 -0
  185. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/base.py +0 -0
  186. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/create.py +0 -0
  187. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/elements.py +0 -0
  188. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/__init__.py +0 -0
  189. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/modal.py +0 -0
  190. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/settings.py +0 -0
  191. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  192. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/tab/base.py +0 -0
  193. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/tab/controls.py +0 -0
  194. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/tab/html.py +0 -0
  195. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/tab/message.py +0 -0
  196. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/env/widgets.py +0 -0
  197. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/files.py +0 -0
  198. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/landing_page.py +0 -0
  199. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/placeholder.py +0 -0
  200. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/pyodide.py +0 -0
  201. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/sound.py +0 -0
  202. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/app/tab.py +0 -0
  203. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/html.py +0 -0
  204. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/json.py +0 -0
  205. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/struct/__init__.py +0 -0
  206. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/websocket/__init__.py +0 -0
  207. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/server/websocket/state.py +0 -0
  208. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/ssl.py +0 -0
  209. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/stream/__init__.py +0 -0
  210. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/stream/base.py +0 -0
  211. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/stream/json/__init__.py +0 -0
  212. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/stream/string.py +0 -0
  213. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/__init__.py +0 -0
  214. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/connection.py +0 -0
  215. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/create.py +0 -0
  216. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/http/__init__.py +0 -0
  217. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/protocol.py +0 -0
  218. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/scpi/__init__.py +0 -0
  219. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/telnet/__init__.py +0 -0
  220. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/telnet/codes.py +0 -0
  221. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  222. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/__init__.py +0 -0
  223. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/connection.py +0 -0
  224. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/create.py +0 -0
  225. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/protocol.py +0 -0
  226. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/queue.py +0 -0
  227. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/tftp/__init__.py +0 -0
  228. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/tftp/base.py +0 -0
  229. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  230. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/tftp/enums.py +0 -0
  231. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/udp/tftp/io.py +0 -0
  232. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/util.py +0 -0
  233. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/websocket/__init__.py +0 -0
  234. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/net/websocket/connection.py +0 -0
  235. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/noise/__init__.py +0 -0
  236. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/__init__.py +0 -0
  237. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/array/__init__.py +0 -0
  238. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/base.py +0 -0
  239. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/bool.py +0 -0
  240. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/byte_order.py +0 -0
  241. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/evaluation.py +0 -0
  242. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/field/__init__.py +0 -0
  243. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/field/fields.py +0 -0
  244. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/field/manager/__init__.py +0 -0
  245. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/field/manager/base.py +0 -0
  246. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/float.py +0 -0
  247. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/int.py +0 -0
  248. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/scaling.py +0 -0
  249. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/serializable/__init__.py +0 -0
  250. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/serializable/base.py +0 -0
  251. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/serializable/fixed.py +0 -0
  252. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/serializable/framer.py +0 -0
  253. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/serializable/prefixed.py +0 -0
  254. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/string.py +0 -0
  255. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/__init__.py +0 -0
  256. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/base.py +0 -0
  257. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/bool.py +0 -0
  258. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/bounds.py +0 -0
  259. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/float.py +0 -0
  260. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/primitives/types/int.py +0 -0
  261. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/py.typed +0 -0
  262. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/registry/__init__.py +0 -0
  263. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/registry/bool.py +0 -0
  264. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/registry/item.py +0 -0
  265. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/registry/name.py +0 -0
  266. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/requirements.txt +0 -0
  267. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/sample/__init__.py +0 -0
  268. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/sample/peer.py +0 -0
  269. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/schemas.py +0 -0
  270. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/struct/__init__.py +0 -0
  271. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/subprocess/__init__.py +0 -0
  272. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/subprocess/interface.py +0 -0
  273. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/subprocess/peer.py +0 -0
  274. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/subprocess/protocol.py +0 -0
  275. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/__init__.py +0 -0
  276. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/asynchronous.py +0 -0
  277. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/basic/__init__.py +0 -0
  278. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/basic/manager.py +0 -0
  279. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/sample.py +0 -0
  280. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/task/trig/__init__.py +0 -0
  281. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/telemetry/__init__.py +0 -0
  282. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/telemetry/sample.py +0 -0
  283. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/__init__.py +0 -0
  284. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/channels/__init__.py +0 -0
  285. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/cursor.py +0 -0
  286. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/mixin.py +0 -0
  287. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/mock.py +0 -0
  288. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/tui/task.py +0 -0
  289. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/ui/__init__.py +0 -0
  290. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/ui/controls.py +0 -0
  291. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy/util.py +0 -0
  292. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy.egg-info/SOURCES.txt +0 -0
  293. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy.egg-info/dependency_links.txt +0 -0
  294. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy.egg-info/entry_points.txt +0 -0
  295. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy.egg-info/requires.txt +3 -3
  296. {runtimepy-5.9.1 → runtimepy-5.10.0}/runtimepy.egg-info/top_level.txt +0 -0
  297. {runtimepy-5.9.1 → runtimepy-5.10.0}/setup.cfg +0 -0
  298. {runtimepy-5.9.1 → runtimepy-5.10.0}/setup.py +0 -0
  299. {runtimepy-5.9.1 → runtimepy-5.10.0}/tests/test_entry.py +0 -0
  300. {runtimepy-5.9.1 → runtimepy-5.10.0}/tests/test_mapping.py +0 -0
  301. {runtimepy-5.9.1 → runtimepy-5.10.0}/tests/test_resources.py +0 -0
  302. {runtimepy-5.9.1 → runtimepy-5.10.0}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: runtimepy
3
- Version: 5.9.1
3
+ Version: 5.10.0
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -17,11 +17,11 @@ Classifier: License :: OSI Approved :: MIT License
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: websockets
21
- Requires-Dist: psutil
22
20
  Requires-Dist: svgen>=0.7.4
23
- Requires-Dist: aiofiles
21
+ Requires-Dist: websockets
24
22
  Requires-Dist: vcorelib>=3.5.1
23
+ Requires-Dist: aiofiles
24
+ Requires-Dist: psutil
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -49,11 +49,11 @@ Dynamic: requires-python
49
49
  =====================================
50
50
  generator=datazen
51
51
  version=3.1.4
52
- hash=f3a77d6dfc0bda171a9716c3731531c5
52
+ hash=cbacac02049e2f568e5ebad3cc428033
53
53
  =====================================
54
54
  -->
55
55
 
56
- # runtimepy ([5.9.1](https://pypi.org/project/runtimepy/))
56
+ # runtimepy ([5.10.0](https://pypi.org/project/runtimepy/))
57
57
 
58
58
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
59
59
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
@@ -2,11 +2,11 @@
2
2
  =====================================
3
3
  generator=datazen
4
4
  version=3.1.4
5
- hash=f3a77d6dfc0bda171a9716c3731531c5
5
+ hash=cbacac02049e2f568e5ebad3cc428033
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.9.1](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.10.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/vkottler/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.9.1"
7
+ version = "5.10.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.1.4
4
- # hash=47ca3ea38190cecfff6abaeec5ce0939
4
+ # hash=a9a53fbeb974140d3611fecadbce5da4
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.9.1"
13
+ VERSION = "5.10.0"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -98,10 +98,9 @@ processes:
98
98
 
99
99
  # The peer itself runs an arbiter process.
100
100
  config:
101
+ config: *cfg
101
102
  includes:
102
103
  - package://runtimepy/server.yaml
103
-
104
104
  app: runtimepy.sample.program.run
105
- config: *cfg
106
105
 
107
106
  program: runtimepy.sample.program.SampleProgram
@@ -45,6 +45,7 @@ factories:
45
45
 
46
46
  # Useful subprocess peer interfaces.
47
47
  - {name: runtimepy.sample.peer.SamplePeer}
48
+ - {name: runtimepy.subprocess.peer.RuntimepyPeer}
48
49
 
49
50
  ports:
50
51
  # Reserve ports for JSON listeners.
@@ -5,8 +5,7 @@ includes:
5
5
  - has_config.yaml
6
6
  - has_markdown.yaml
7
7
 
8
- required: [program]
9
-
10
8
  properties:
11
9
  program:
12
10
  type: string
11
+ default: runtimepy.subprocess.program.PeerProgram
@@ -4,7 +4,7 @@ A module implementing a message-stream processing interface.
4
4
 
5
5
  # built-in
6
6
  from io import BytesIO as _BytesIO
7
- from json import dumps, loads
7
+ from json import JSONEncoder, dumps, loads
8
8
  from typing import Any
9
9
  from typing import Iterator as _Iterator
10
10
 
@@ -18,6 +18,18 @@ from runtimepy.primitives.byte_order import DEFAULT_BYTE_ORDER, ByteOrder
18
18
  JsonMessage = dict[str, Any]
19
19
 
20
20
 
21
+ class StrFallbackJSONEncoder(JSONEncoder):
22
+ """Custom JSON encoder."""
23
+
24
+ def default(self, o):
25
+ """Use a string conversion if necessary."""
26
+
27
+ try:
28
+ return super().default(o)
29
+ except TypeError:
30
+ return str(o)
31
+
32
+
21
33
  class MessageProcessor:
22
34
  """A class for parsing size-delimited messages."""
23
35
 
@@ -48,7 +60,11 @@ class MessageProcessor:
48
60
 
49
61
  def encode_json(self, stream: _BytesIO, data: JsonMessage) -> None:
50
62
  """Encode a message as JSON."""
51
- self.encode(stream, dumps(data, separators=(",", ":")))
63
+
64
+ self.encode(
65
+ stream,
66
+ dumps(data, cls=StrFallbackJSONEncoder, separators=(",", ":")),
67
+ )
52
68
 
53
69
  def messages(self, data: bytes) -> _Iterator[JsonMessage]:
54
70
  """Iterate over incoming messages."""
@@ -9,13 +9,15 @@ import asyncio
9
9
  from vcorelib.math import RateLimiter
10
10
 
11
11
  # internal
12
- from runtimepy.net.arbiter.info import AppInfo
12
+ from runtimepy.net.arbiter.info import AppInfo, SampleStruct
13
13
  from runtimepy.subprocess.program import PeerProgram
14
14
 
15
15
 
16
16
  class SampleProgram(PeerProgram):
17
17
  """A sample peer program."""
18
18
 
19
+ struct_type = SampleStruct
20
+
19
21
  stderr_task: asyncio.Task[None]
20
22
 
21
23
  async def log_message_sender(
@@ -91,4 +93,6 @@ async def run(app: AppInfo) -> int:
91
93
 
92
94
  await prog.wait_json({"a": 1, "b": 2, "c": 3})
93
95
 
96
+ await app.stop.wait()
97
+
94
98
  return 0
@@ -20,7 +20,7 @@ from vcorelib.paths.context import tempfile
20
20
  from runtimepy.metrics.channel import ChannelMetrics
21
21
  from runtimepy.mixins.psutil import PsutilMixin
22
22
  from runtimepy.net.arbiter import ConnectionArbiter
23
- from runtimepy.net.arbiter.info import RuntimeStruct, SampleStruct
23
+ from runtimepy.net.arbiter.info import RuntimeStruct
24
24
  from runtimepy.subprocess.interface import RuntimepyPeerInterface
25
25
 
26
26
  T = TypeVar("T", bound="PeerProgram")
@@ -34,7 +34,7 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
34
34
  stream_output: BinaryIO
35
35
  stream_metrics: ChannelMetrics
36
36
 
37
- struct_type: Type[RuntimeStruct] = SampleStruct
37
+ struct_type: Type[RuntimeStruct] = RuntimeStruct
38
38
 
39
39
  got_eof: asyncio.Event
40
40
 
@@ -71,7 +71,7 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
71
71
  prev_poll_time = loop.time()
72
72
 
73
73
  with suppress(asyncio.CancelledError):
74
- while True:
74
+ while not self.got_eof.is_set():
75
75
  # Perform heartbeat.
76
76
  if self._peer_env_event.is_set():
77
77
  self.stderr_metrics.update(self.stream_metrics)
@@ -90,6 +90,8 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
90
90
  async def io_task(self, buffer: BinaryIO) -> None:
91
91
  """Run this peer program's main loop."""
92
92
 
93
+ self.got_eof.clear()
94
+
93
95
  # Allow polling stdin.
94
96
  if hasattr(os, "set_blocking"):
95
97
  getattr(os, "set_blocking")(buffer.fileno(), False)
@@ -97,7 +99,7 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
97
99
  accumulator = 0
98
100
 
99
101
  with suppress(asyncio.CancelledError):
100
- while True:
102
+ while not self.got_eof.is_set():
101
103
  data: bytes = buffer.read(1)
102
104
  if data is None:
103
105
  await asyncio.sleep(self.poll_period_s)
@@ -148,7 +150,7 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
148
150
  with tempfile(suffix=".json") as config_path:
149
151
  arbiter = ConnectionArbiter(stop_sig=self.got_eof)
150
152
  ARBITER.encode(config_path, self.struct.config)
151
- await arbiter.load_configs([config_path], wait_for_stop=True)
153
+ await arbiter.load_configs([config_path])
152
154
 
153
155
  await arbiter.app()
154
156
 
@@ -210,9 +212,9 @@ class PeerProgram(RuntimepyPeerInterface, PsutilMixin):
210
212
  # Don't respond to keyboard interrupt.
211
213
  signal.signal(signal.SIGINT, signal.SIG_IGN)
212
214
 
213
- async with cls.running(name, config, argv) as (io_task, main_task, _):
214
- await main_task
215
- await io_task
215
+ async with cls.running(name, config, argv) as (_, main_task, peer):
216
+ with peer.log_time("Main task context", reminder=True):
217
+ await main_task
216
218
 
217
219
  async def poll_handler(self) -> None:
218
220
  """Handle a 'poll' message."""
@@ -32,6 +32,7 @@ from runtimepy.mixins.logging import LoggerMixinLevelControl
32
32
  from runtimepy.primitives import Bool as _Bool
33
33
  from runtimepy.primitives import Double as _Double
34
34
  from runtimepy.primitives import Float as _Float
35
+ from runtimepy.primitives.evaluation import EvalResult as _EvalResult
35
36
  from runtimepy.ui.controls import Controlslike
36
37
 
37
38
 
@@ -136,6 +137,12 @@ class PeriodicTask(
136
137
  self._enabled.clear()
137
138
  return result
138
139
 
140
+ async def wait_for_disable(
141
+ self, timeout: float, value: bool = False
142
+ ) -> _EvalResult:
143
+ """Wait for a task to become disabled."""
144
+ return await self._enabled.wait_for_state(value, timeout)
145
+
139
146
  async def wait_iterations(self, timeout: float, count: int = 1) -> bool:
140
147
  """Wait for a task to complete a certain number of iterations."""
141
148
 
@@ -179,7 +186,7 @@ class PeriodicTask(
179
186
 
180
187
  # Check this synchronously. This may not be suitable for tasks
181
188
  # with long periods.
182
- if stop_sig is not None:
189
+ if self._enabled and stop_sig is not None:
183
190
  self._enabled.raw.value = not stop_sig.is_set()
184
191
 
185
192
  if self._enabled:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: runtimepy
3
- Version: 5.9.1
3
+ Version: 5.10.0
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -17,11 +17,11 @@ Classifier: License :: OSI Approved :: MIT License
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: websockets
21
- Requires-Dist: psutil
22
20
  Requires-Dist: svgen>=0.7.4
23
- Requires-Dist: aiofiles
21
+ Requires-Dist: websockets
24
22
  Requires-Dist: vcorelib>=3.5.1
23
+ Requires-Dist: aiofiles
24
+ Requires-Dist: psutil
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -49,11 +49,11 @@ Dynamic: requires-python
49
49
  =====================================
50
50
  generator=datazen
51
51
  version=3.1.4
52
- hash=f3a77d6dfc0bda171a9716c3731531c5
52
+ hash=cbacac02049e2f568e5ebad3cc428033
53
53
  =====================================
54
54
  -->
55
55
 
56
- # runtimepy ([5.9.1](https://pypi.org/project/runtimepy/))
56
+ # runtimepy ([5.10.0](https://pypi.org/project/runtimepy/))
57
57
 
58
58
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
59
59
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
File without changes
File without changes
File without changes