runtimepy 5.13.1__tar.gz → 5.13.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 (320) hide show
  1. {runtimepy-5.13.1/runtimepy.egg-info → runtimepy-5.13.3}/PKG-INFO +6 -6
  2. {runtimepy-5.13.1 → runtimepy-5.13.3}/README.md +2 -2
  3. {runtimepy-5.13.1 → runtimepy-5.13.3}/pyproject.toml +1 -1
  4. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/__init__.py +2 -2
  5. runtimepy-5.13.3/runtimepy/data/404.html +7 -0
  6. runtimepy-5.13.3/runtimepy/data/base.yaml +19 -0
  7. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/server_base.yaml +1 -17
  8. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/response.py +7 -0
  9. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/__init__.py +20 -1
  10. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/__init__.py +2 -0
  11. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/html.py +18 -2
  12. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/http/__init__.py +13 -7
  13. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/requirements.txt +1 -1
  14. {runtimepy-5.13.1 → runtimepy-5.13.3/runtimepy.egg-info}/PKG-INFO +6 -6
  15. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy.egg-info/SOURCES.txt +1 -0
  16. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy.egg-info/requires.txt +3 -3
  17. runtimepy-5.13.1/runtimepy/data/404.html +0 -6
  18. {runtimepy-5.13.1 → runtimepy-5.13.3}/LICENSE +0 -0
  19. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/__main__.py +0 -0
  20. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/app.py +0 -0
  21. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/__init__.py +0 -0
  22. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/__init__.py +0 -0
  23. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/array.py +0 -0
  24. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/base.py +0 -0
  25. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/command/__init__.py +0 -0
  26. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/command/parser.py +0 -0
  27. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/command/processor.py +0 -0
  28. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/command/result.py +0 -0
  29. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/create.py +0 -0
  30. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/file.py +0 -0
  31. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/sample.py +0 -0
  32. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/environment/telemetry.py +0 -0
  33. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/event/__init__.py +0 -0
  34. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/event/header.py +0 -0
  35. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/channel/registry.py +0 -0
  36. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/codec/__init__.py +0 -0
  37. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/codec/protocol/__init__.py +0 -0
  38. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/codec/protocol/base.py +0 -0
  39. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/codec/protocol/json.py +0 -0
  40. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/codec/system/__init__.py +0 -0
  41. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/__init__.py +0 -0
  42. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/all.py +0 -0
  43. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/arbiter.py +0 -0
  44. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/common.py +0 -0
  45. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/mtu.py +0 -0
  46. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/server.py +0 -0
  47. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/task.py +0 -0
  48. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/tftp.py +0 -0
  49. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/commands/tui.py +0 -0
  50. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/control/__init__.py +0 -0
  51. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/control/env/__init__.py +0 -0
  52. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/control/source.py +0 -0
  53. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/control/step.py +0 -0
  54. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/browser.yaml +0 -0
  55. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/css/bootstrap_extra.css +0 -0
  56. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/css/font.css +0 -0
  57. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/css/main.css +0 -0
  58. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/dummy_load.yaml +0 -0
  59. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/factories.yaml +0 -0
  60. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/favicon.ico +0 -0
  61. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/DataConnection.js +0 -0
  62. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/JsonConnection.js +0 -0
  63. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/audio.js +0 -0
  64. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/App.js +0 -0
  65. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/ChannelTable.js +0 -0
  66. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/DataConnection.js +0 -0
  67. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  68. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  69. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/Plot.js +0 -0
  70. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  71. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/PlotManager.js +0 -0
  72. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  73. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  74. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/PointManager.js +0 -0
  75. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/TabFilter.js +0 -0
  76. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/TabInterface.js +0 -0
  77. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  78. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/WindowHashManager.js +0 -0
  79. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  80. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/events.js +0 -0
  81. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/init.js +0 -0
  82. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/main.js +0 -0
  83. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/markdown_page.js +0 -0
  84. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/tab/env.js +0 -0
  85. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/tab/sound.js +0 -0
  86. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  87. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/unused/pyodide.js +0 -0
  88. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/util.js +0 -0
  89. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/js/worker.js +0 -0
  90. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/md/Connection.md +0 -0
  91. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/md/PeriodicTask.md +0 -0
  92. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/md/RuntimeStruct.md +0 -0
  93. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  94. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/md/SinusoidTask.md +0 -0
  95. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/sample_telemetry.yaml +0 -0
  96. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/BitFields.yaml +0 -0
  97. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/Channel.yaml +0 -0
  98. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  99. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  100. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  101. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +0 -0
  102. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  103. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/FindFile.yaml +0 -0
  104. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/PeerProcessConfig.yaml +0 -0
  105. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/RuntimeEnum.yaml +0 -0
  106. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  107. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/StructConfig.yaml +0 -0
  108. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  109. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  110. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/has_config.yaml +0 -0
  111. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/has_factory.yaml +0 -0
  112. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  113. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/has_name.yaml +0 -0
  114. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  115. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/server.yaml +0 -0
  116. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/server_dev.yaml +0 -0
  117. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/css/bootstrap-icons.min.css +0 -0
  118. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/css/bootstrap.min.css +0 -0
  119. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  120. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  121. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/js/bootstrap.bundle.min.js +0 -0
  122. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/js/webglplot.umd.min.js +0 -0
  123. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/1024x1024.png +0 -0
  124. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/128x128.png +0 -0
  125. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/16x16.png +0 -0
  126. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/1920x1920.png +0 -0
  127. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/24x24.png +0 -0
  128. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/256x256.png +0 -0
  129. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/32x32.png +0 -0
  130. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/512x512.png +0 -0
  131. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/png/chip-circle-bootstrap/64x64.png +0 -0
  132. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  133. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  134. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  135. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  136. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  137. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  138. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  139. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  140. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  141. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/static/woff2/README.md +0 -0
  142. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/data/tftp_server.yaml +0 -0
  143. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/dev_requirements.txt +0 -0
  144. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/entry.py +0 -0
  145. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/enum/__init__.py +0 -0
  146. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/enum/registry.py +0 -0
  147. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/enum/types.py +0 -0
  148. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mapping.py +0 -0
  149. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/message/__init__.py +0 -0
  150. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/message/handlers.py +0 -0
  151. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/message/interface.py +0 -0
  152. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/message/types.py +0 -0
  153. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/metrics/__init__.py +0 -0
  154. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/metrics/channel.py +0 -0
  155. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/metrics/connection.py +0 -0
  156. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/metrics/task.py +0 -0
  157. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/__init__.py +0 -0
  158. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/async_command.py +0 -0
  159. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/enum.py +0 -0
  160. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/environment.py +0 -0
  161. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/finalize.py +0 -0
  162. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/logging.py +0 -0
  163. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/psutil.py +0 -0
  164. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/regex.py +0 -0
  165. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/mixins/trig.py +0 -0
  166. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/__init__.py +0 -0
  167. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/apps/__init__.py +0 -0
  168. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/__init__.py +0 -0
  169. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/base.py +0 -0
  170. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/config/__init__.py +0 -0
  171. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/config/codec.py +0 -0
  172. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/config/util.py +0 -0
  173. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  174. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/factory/connection.py +0 -0
  175. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/factory/task.py +0 -0
  176. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  177. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  178. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/imports/util.py +0 -0
  179. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/info.py +0 -0
  180. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/result.py +0 -0
  181. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/struct/__init__.py +0 -0
  182. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/task.py +0 -0
  183. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  184. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/tcp/json.py +0 -0
  185. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/udp.py +0 -0
  186. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/arbiter/websocket.py +0 -0
  187. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/backoff.py +0 -0
  188. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/connection.py +0 -0
  189. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/factories/__init__.py +0 -0
  190. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/html/__init__.py +0 -0
  191. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/html/arbiter.py +0 -0
  192. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/html/bootstrap/__init__.py +0 -0
  193. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/html/bootstrap/elements.py +0 -0
  194. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/html/bootstrap/tabs.py +0 -0
  195. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/__init__.py +0 -0
  196. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/common.py +0 -0
  197. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/header.py +0 -0
  198. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/request_target.py +0 -0
  199. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/state.py +0 -0
  200. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/http/version.py +0 -0
  201. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/manager.py +0 -0
  202. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/mixin.py +0 -0
  203. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/mtu.py +0 -0
  204. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/base.py +0 -0
  205. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/create.py +0 -0
  206. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/elements.py +0 -0
  207. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/__init__.py +0 -0
  208. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/modal.py +0 -0
  209. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/settings.py +0 -0
  210. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  211. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/tab/base.py +0 -0
  212. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/tab/controls.py +0 -0
  213. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/tab/html.py +0 -0
  214. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/tab/message.py +0 -0
  215. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/env/widgets.py +0 -0
  216. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/files.py +0 -0
  217. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/landing_page.py +0 -0
  218. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/placeholder.py +0 -0
  219. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/pyodide.py +0 -0
  220. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/sound.py +0 -0
  221. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/app/tab.py +0 -0
  222. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/json.py +0 -0
  223. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/markdown.py +0 -0
  224. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/struct/__init__.py +0 -0
  225. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/websocket/__init__.py +0 -0
  226. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/server/websocket/state.py +0 -0
  227. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/ssl.py +0 -0
  228. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/stream/__init__.py +0 -0
  229. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/stream/base.py +0 -0
  230. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/stream/json/__init__.py +0 -0
  231. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/stream/string.py +0 -0
  232. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/__init__.py +0 -0
  233. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/connection.py +0 -0
  234. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/create.py +0 -0
  235. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/protocol.py +0 -0
  236. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/scpi/__init__.py +0 -0
  237. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/telnet/__init__.py +0 -0
  238. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/telnet/codes.py +0 -0
  239. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  240. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/__init__.py +0 -0
  241. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/connection.py +0 -0
  242. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/create.py +0 -0
  243. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/protocol.py +0 -0
  244. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/queue.py +0 -0
  245. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/tftp/__init__.py +0 -0
  246. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/tftp/base.py +0 -0
  247. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  248. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/tftp/enums.py +0 -0
  249. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/udp/tftp/io.py +0 -0
  250. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/util.py +0 -0
  251. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/websocket/__init__.py +0 -0
  252. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/net/websocket/connection.py +0 -0
  253. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/noise/__init__.py +0 -0
  254. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/__init__.py +0 -0
  255. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/array/__init__.py +0 -0
  256. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/base.py +0 -0
  257. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/bool.py +0 -0
  258. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/byte_order.py +0 -0
  259. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/evaluation.py +0 -0
  260. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/field/__init__.py +0 -0
  261. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/field/fields.py +0 -0
  262. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/field/manager/__init__.py +0 -0
  263. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/field/manager/base.py +0 -0
  264. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/float.py +0 -0
  265. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/int.py +0 -0
  266. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/scaling.py +0 -0
  267. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/serializable/__init__.py +0 -0
  268. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/serializable/base.py +0 -0
  269. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/serializable/fixed.py +0 -0
  270. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/serializable/framer.py +0 -0
  271. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/serializable/prefixed.py +0 -0
  272. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/string.py +0 -0
  273. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/__init__.py +0 -0
  274. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/base.py +0 -0
  275. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/bool.py +0 -0
  276. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/bounds.py +0 -0
  277. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/float.py +0 -0
  278. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/primitives/types/int.py +0 -0
  279. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/py.typed +0 -0
  280. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/registry/__init__.py +0 -0
  281. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/registry/bool.py +0 -0
  282. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/registry/item.py +0 -0
  283. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/registry/name.py +0 -0
  284. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/sample/__init__.py +0 -0
  285. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/sample/peer.py +0 -0
  286. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/sample/program.py +0 -0
  287. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/schemas.py +0 -0
  288. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/struct/__init__.py +0 -0
  289. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/subprocess/__init__.py +0 -0
  290. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/subprocess/interface.py +0 -0
  291. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/subprocess/peer.py +0 -0
  292. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/subprocess/program.py +0 -0
  293. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/subprocess/protocol.py +0 -0
  294. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/__init__.py +0 -0
  295. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/asynchronous.py +0 -0
  296. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/basic/__init__.py +0 -0
  297. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/basic/manager.py +0 -0
  298. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/basic/periodic.py +0 -0
  299. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/sample.py +0 -0
  300. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/task/trig/__init__.py +0 -0
  301. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/telemetry/__init__.py +0 -0
  302. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/telemetry/sample.py +0 -0
  303. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/__init__.py +0 -0
  304. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/channels/__init__.py +0 -0
  305. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/cursor.py +0 -0
  306. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/mixin.py +0 -0
  307. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/mock.py +0 -0
  308. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/tui/task.py +0 -0
  309. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/ui/__init__.py +0 -0
  310. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/ui/controls.py +0 -0
  311. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy/util.py +0 -0
  312. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy.egg-info/dependency_links.txt +0 -0
  313. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy.egg-info/entry_points.txt +0 -0
  314. {runtimepy-5.13.1 → runtimepy-5.13.3}/runtimepy.egg-info/top_level.txt +0 -0
  315. {runtimepy-5.13.1 → runtimepy-5.13.3}/setup.cfg +0 -0
  316. {runtimepy-5.13.1 → runtimepy-5.13.3}/setup.py +0 -0
  317. {runtimepy-5.13.1 → runtimepy-5.13.3}/tests/test_entry.py +0 -0
  318. {runtimepy-5.13.1 → runtimepy-5.13.3}/tests/test_mapping.py +0 -0
  319. {runtimepy-5.13.1 → runtimepy-5.13.3}/tests/test_resources.py +0 -0
  320. {runtimepy-5.13.1 → runtimepy-5.13.3}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.13.1
3
+ Version: 5.13.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: psutil
21
20
  Requires-Dist: aiofiles
22
- Requires-Dist: svgen>=0.7.12
21
+ Requires-Dist: psutil
23
22
  Requires-Dist: websockets
24
- Requires-Dist: vcorelib>=3.5.1
23
+ Requires-Dist: svgen>=0.7.12
24
+ Requires-Dist: vcorelib>=3.5.8
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=69775d79c8c13f44e0ac000acdeb93e2
54
+ hash=7dce65a7ea83c118cf5fa28ddbfd533f
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.13.1](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.13.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=69775d79c8c13f44e0ac000acdeb93e2
5
+ hash=7dce65a7ea83c118cf5fa28ddbfd533f
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.13.1](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.13.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.13.1"
7
+ version = "5.13.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=25280d90363095aa6b5717f2105ff685
4
+ # hash=940af0fb662bf9b9e98e5ce5df85b4b2
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.13.1"
13
+ VERSION = "5.13.3"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -0,0 +1,7 @@
1
+ <!doctype html><html lang=en><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Libre Embedded - Home
2
+ </title><meta http-equiv=Cache-Control content="public"><link rel=icon href=/favicon.ico><meta name=description content="Libre Embedded Engineering Technologies LLC is an engineering consultancy and product development company. This page was rendered from Markdown by runtimepy/5.13.3."><style>@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Regular.woff2)}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Bold.woff2);font-weight:700}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-BoldItalic.woff2);font-weight:700;font-style:italic}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Italic.woff2);font-style:italic}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Regular.woff2)}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Bold.woff2);font-weight:700}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-BoldItalic.woff2);font-weight:700;font-style:italic}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Italic.woff2);font-style:italic}</style><link rel=stylesheet href=/static/css/bootstrap-icons.min.css></link>
3
+ <link href=/static/css/bootstrap.min.css rel=stylesheet crossorigin=anonymous></link><style>html{height:100%;width:100%;position:fixed}body{height:100%;margin:0;overflow:hidden}body>:first-child{height:100%}#runtimepy{height:100%}#runtimepy-tabs{width:min-content}#runtimepy-splash{position:fixed;top:0;left:0;width:100vw;height:100vh;opacity:1}.click-plot{cursor:pointer}.stale{color:var(--bs-warning-text-emphasis)!important}.slider{min-width:8em}.toggle-value{}.window-button{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-link-hover-color)!important}:focus{outline:none}.flex-column-scroll-bodge{height:100%;flex-wrap:nowrap;overflow-y:scroll;flex-shrink:0}.scroll{overflow:scroll}.tab-content-bodge{width:100%;height:100%}.button-bodge{text-align:left}.collapsing{transition:none!important}.tab-pane.fade{transition:none!important}.modal.fade{transition:none!important}.modal-dialog{width:80%;max-width:80%}.table{margin-bottom:0;width:auto}.table-container{overflow-x:scroll;min-height:fit-content}.channel-column{overflow-y:scroll;overflow-x:hidden;flex-grow:0;flex-shrink:0;max-width:75%}.channel-value{min-width:10em}.table>tbody>tr>td{vertical-align:middle}.collapse:not(.show){display:none!important}select.form-select{width:min-content}select.form-select:hover{cursor:pointer}textarea.text-logs{min-height:10em!important;padding-top:0!important;padding-bottom:0!important;border-top:0}.vertical-divider{flex-basis:.75em;flex-grow:0;flex-shrink:0}pre{color:var(--bs-code-color)}.vertical-divider:hover{cursor:col-resize;background-color:var(--bs-highlight-bg)!important}button:hover{background-color:var(--bs-tertiary-bg)}.channel-value-input{width:6em}:root,[data-bs-theme=dark],[data-bs-theme=light]{--bs-font-sans-serif:CascadiaCode, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:CascadiaMono, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}</style><div id=runtimepy class="d-flex bg-body align-items-start" data-bs-theme=dark><div class="bg-dark-subtle d-flex h-100 flex-column"><button type=button id=theme-button title="change theme button" class="btn btn-secondary rounded-0 font-monospace button-bodge text-nowrap has-tooltip" data-bs-title="Toggle light/dark." data-bs-placement=right>
4
+ <i class="bi bi-lightbulb"></i>
5
+ </button>
6
+ <a href="?print=true"><button type=button id=print-button title="print-view button" class="btn btn-secondary rounded-0 font-monospace button-bodge text-nowrap has-tooltip" data-bs-title="Printer-friendly view." data-bs-placement=right>
7
+ <i class="bi bi-printer"></i></button></a></div><div class="h-100 flex-grow-1 justify-content-between text-body d-flex overflow-y-auto flex-column"><div></div><div class="justify-content-between d-flex flex-row"><div></div><div class="text-body p-3 pb-0"><h1><a href=/><img alt=logo src=/static/png/chip-circle-bootstrap/128x128.png></a> Resource Not Found (404) <a href=/><img alt=logo src=/static/png/chip-circle-bootstrap/128x128.png></a></h1><p>(<a href=/>home</a>)</div><div></div></div><div></div></div></div><script>function worker_config(e){let t={},s="runtimepy_websocket",n="ws";location.protocol.includes("https")&&(s="runtimepy_secure_websocket",n+="s");let o=e.config.ports;for(let r in o){let i=o[r],a=e.config.websocket_hostname||window.location.hostname;i.name.includes(s)&&(i.name.includes("data")?t.data=`${n}://${a}:`+i.port:t.json=`${n}://${a}:`+i.port)}return t}let tabFilter=void 0;function bootstrap_init(){const t=document.querySelectorAll(".has-tooltip"),n=[...t].map(e=>new bootstrap.Tooltip(e));let e=document.getElementById("runtimepy-tabs");e&&(tabFilter=new TabFilter(e))}let lightMode=!1;function lightDarkClick(){lightMode=!lightMode,document.getElementById("runtimepy").setAttribute("data-bs-theme",lightMode?"light":"dark"),window.location.hash=lightMode?"#light-mode":""}window.onload=()=>{let e=document.getElementById("theme-button");if(e&&e.addEventListener("click",lightDarkClick),window.location.hash){let t=window.location.hash.slice(1).split(",");t.includes("light-mode")&&e.click()}bootstrap_init()}</script><script src=/static/js/bootstrap.bundle.min.js crossorigin=anonymous></script>
@@ -0,0 +1,19 @@
1
+ ---
2
+ includes:
3
+ - package://runtimepy/factories.yaml
4
+
5
+ init:
6
+ - runtimepy.net.arbiter.housekeeping.init
7
+
8
+ config:
9
+ # Default redirects.
10
+ http_redirects:
11
+ "/": "/index.html"
12
+ "/index.html": "/app.html"
13
+
14
+ # Serve these applications by default at these paths.
15
+ http_app_paths: ["/app.html"]
16
+
17
+ # Handles config["http_app_prefixes"].
18
+ config_builders:
19
+ - runtimepy.net.html.arbiter.web_app_paths
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  includes:
3
- - package://runtimepy/factories.yaml
3
+ - package://runtimepy/base.yaml
4
4
 
5
5
  ports:
6
6
  - {name: runtimepy_http_server, type: tcp}
@@ -10,22 +10,6 @@ ports:
10
10
  structs:
11
11
  - {name: ui, factory: ui_state}
12
12
 
13
- init:
14
- - runtimepy.net.arbiter.housekeeping.init
15
-
16
- config:
17
- # Default redirects.
18
- http_redirects:
19
- "/": "/index.html"
20
- "/index.html": "/app.html"
21
-
22
- # Serve these applications by default at these paths.
23
- http_app_paths: ["/app.html"]
24
-
25
- # Handles config["http_app_prefixes"].
26
- config_builders:
27
- - runtimepy.net.html.arbiter.web_app_paths
28
-
29
13
  servers:
30
14
  - factory: runtimepy_http
31
15
  kwargs: {port: "$runtimepy_http_server"}
@@ -88,6 +88,13 @@ class ResponseHeader(HeadersMixin):
88
88
  self.headers,
89
89
  )
90
90
 
91
+ def static_resource(
92
+ self, value: str = "public, max-age=31536000, immutable"
93
+ ) -> None:
94
+ """Set headers for static resources."""
95
+
96
+ self["Cache-Control"] = value
97
+
91
98
 
92
99
  class AsyncResponse:
93
100
  """
@@ -55,6 +55,12 @@ class RuntimepyServerConnection(HttpConnection):
55
55
  class_paths: list[Pathlike] = [Path(), package_data_dir()]
56
56
  class_redirect_paths: dict[Path, Union[str, Path]] = {}
57
57
 
58
+ # Set these to control meta attributes.
59
+ metadata: dict[str, Optional[str]] = {
60
+ "title": HttpConnection.identity,
61
+ "description": None,
62
+ }
63
+
58
64
  def add_path(self, path: Pathlike, front: bool = False) -> None:
59
65
  """Add a path."""
60
66
 
@@ -145,7 +151,16 @@ class RuntimepyServerConnection(HttpConnection):
145
151
  ) -> bytes:
146
152
  """Return rendered markdown content."""
147
153
 
148
- document = get_html()
154
+ meta: dict[str, str] = type(self).metadata.copy() # type: ignore
155
+
156
+ meta.setdefault("description", "")
157
+ meta["description"] += (
158
+ " This page was rendered from "
159
+ f"Markdown by {HttpConnection.identity}."
160
+ )
161
+
162
+ document = get_html(**meta)
163
+
149
164
  with IndentedFileWriter.string() as writer:
150
165
  writer.write_markdown(content, **kwargs)
151
166
  full_markdown_page(
@@ -222,6 +237,8 @@ class RuntimepyServerConnection(HttpConnection):
222
237
 
223
238
  self.logger.info("Serving '%s' (MIME: %s)", candidate, mime)
224
239
 
240
+ response.static_resource()
241
+
225
242
  # Return the file data.
226
243
  result = AsyncResponse(candidate)
227
244
  break
@@ -306,6 +323,7 @@ class RuntimepyServerConnection(HttpConnection):
306
323
  # Handle favicon (for browser clients).
307
324
  if path.startswith("/favicon"):
308
325
  response["Content-Type"] = "image/x-icon"
326
+ response.static_resource()
309
327
  return self.favicon_data
310
328
 
311
329
  # Try serving a file and handling redirects.
@@ -336,6 +354,7 @@ class RuntimepyServerConnection(HttpConnection):
336
354
  response,
337
355
  request_data,
338
356
  default_app=type(self).default_app,
357
+ **type(self).metadata,
339
358
  )
340
359
 
341
360
  if populated:
@@ -68,6 +68,8 @@ async def setup(app: AppInfo) -> int:
68
68
  )
69
69
  )
70
70
 
71
+ RuntimepyServerConnection.metadata.update(app.config_param("html", {}))
72
+
71
73
  # Default application (environment tabs).
72
74
  html_app = create_app(app, getattr(_import_module(module), method))
73
75
  target: str
@@ -24,19 +24,32 @@ HtmlApps = dict[str, HtmlApp]
24
24
  def get_html(
25
25
  title: str = HttpConnection.identity,
26
26
  cache_control: str = "public",
27
+ description: str = None,
27
28
  **kwargs,
28
29
  ) -> Html:
29
30
  """Get a default HTML document."""
30
31
 
31
32
  elem = Html(title, **kwargs)
32
33
 
33
- elem.children.append(
34
+ elem.head.children.append(
34
35
  Element(
35
36
  tag="meta",
36
37
  attrib={"http-equiv": "Cache-Control", "content": cache_control},
37
38
  )
38
39
  )
39
40
 
41
+ elem.head.children.append(
42
+ Element(tag="link", rel="icon", href="/favicon.ico")
43
+ )
44
+
45
+ if description:
46
+ elem.head.children.append(
47
+ Element(
48
+ tag="meta",
49
+ attrib={"name": "description", "content": description},
50
+ )
51
+ )
52
+
40
53
  return elem
41
54
 
42
55
 
@@ -47,6 +60,7 @@ async def html_handler(
47
60
  response: ResponseHeader,
48
61
  request_data: Optional[bytes],
49
62
  default_app: HtmlApp = None,
63
+ **kwargs,
50
64
  ) -> bool:
51
65
  """Render an HTML document in response to an HTTP request."""
52
66
 
@@ -56,6 +70,8 @@ async def html_handler(
56
70
  # Create the application.
57
71
  app = apps.get(request.target.path, default_app)
58
72
  if app is not None:
59
- (await app(get_html(), request, response, request_data)).render(stream)
73
+ (
74
+ await app(get_html(**kwargs), request, response, request_data)
75
+ ).render(stream)
60
76
 
61
77
  return app is not None
@@ -52,10 +52,13 @@ def to_json(response: HttpResponse) -> Any:
52
52
  )
53
53
 
54
54
 
55
+ IDENTITY = f"{PKG_NAME}/{VERSION}"
56
+
57
+
55
58
  class HttpConnection(_TcpConnection):
56
59
  """A class implementing a basic HTTP interface."""
57
60
 
58
- identity = f"{PKG_NAME}/{VERSION}"
61
+ identity = IDENTITY
59
62
 
60
63
  expecting_response: bool
61
64
 
@@ -65,6 +68,12 @@ class HttpConnection(_TcpConnection):
65
68
  # runtime don't need additional initialization.
66
69
  handlers: HttpRequestHandlers = {}
67
70
 
71
+ headers: dict[str, str] = {
72
+ "Server": PKG_NAME,
73
+ "X-Content-Type-Options": "nosniff",
74
+ "Cache-Control": "public",
75
+ }
76
+
68
77
  def init(self) -> None:
69
78
  """Initialize this instance."""
70
79
 
@@ -125,12 +134,9 @@ class HttpConnection(_TcpConnection):
125
134
  f"No handler for {request_header.method} requests."
126
135
  )
127
136
 
128
- # Set boilerplate header data.
129
-
130
- # webhint suggestions
131
- # response["server"] = self.identity
132
- response["server"] = PKG_NAME
133
- response["X-Content-Type-Options"] = "nosniff"
137
+ for key, value in type(self).headers.items():
138
+ if response.get(key) is None:
139
+ response[key] = value
134
140
 
135
141
  return result
136
142
 
@@ -1,5 +1,5 @@
1
1
  aiofiles
2
- vcorelib>=3.5.1
2
+ vcorelib>=3.5.8
3
3
  svgen>=0.7.12
4
4
  websockets
5
5
  psutil
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.13.1
3
+ Version: 5.13.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: psutil
21
20
  Requires-Dist: aiofiles
22
- Requires-Dist: svgen>=0.7.12
21
+ Requires-Dist: psutil
23
22
  Requires-Dist: websockets
24
- Requires-Dist: vcorelib>=3.5.1
23
+ Requires-Dist: svgen>=0.7.12
24
+ Requires-Dist: vcorelib>=3.5.8
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=69775d79c8c13f44e0ac000acdeb93e2
54
+ hash=7dce65a7ea83c118cf5fa28ddbfd533f
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.13.1](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.13.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)
@@ -52,6 +52,7 @@ runtimepy/control/source.py
52
52
  runtimepy/control/step.py
53
53
  runtimepy/control/env/__init__.py
54
54
  runtimepy/data/404.html
55
+ runtimepy/data/base.yaml
55
56
  runtimepy/data/browser.yaml
56
57
  runtimepy/data/dummy_load.yaml
57
58
  runtimepy/data/factories.yaml
@@ -1,8 +1,8 @@
1
- psutil
2
1
  aiofiles
3
- svgen>=0.7.12
2
+ psutil
4
3
  websockets
5
- vcorelib>=3.5.1
4
+ svgen>=0.7.12
5
+ vcorelib>=3.5.8
6
6
 
7
7
  [test]
8
8
  pylint
@@ -1,6 +0,0 @@
1
- <html lang=en><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>runtimepy/5.12.0</title><style>@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Regular.woff2)}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Bold.woff2);font-weight:700}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-BoldItalic.woff2);font-weight:700;font-style:italic}@font-face{font-family:CascadiaCode;src:url(/static/woff2/CascadiaCode-Italic.woff2);font-style:italic}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Regular.woff2)}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Bold.woff2);font-weight:700}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-BoldItalic.woff2);font-weight:700;font-style:italic}@font-face{font-family:CascadiaMono;src:url(/static/woff2/CascadiaMono-Italic.woff2);font-style:italic}</style><link rel=stylesheet href=/static/css/bootstrap-icons.min.css></link>
2
- <link href=/static/css/bootstrap.min.css rel=stylesheet crossorigin=anonymous></link><style>html{height:100%;width:100%;position:fixed}body{height:100%;margin:0;overflow:hidden}body>:first-child{height:100%}#runtimepy{height:100%}#runtimepy-tabs{width:min-content}#runtimepy-splash{position:fixed;top:0;left:0;width:100vw;height:100vh;opacity:1}.click-plot{cursor:pointer}.stale{color:var(--bs-warning-text-emphasis)!important}.slider{min-width:8em}.toggle-value{}.window-button{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-link-hover-color)!important}canvas:focus{outline:none}.flex-column-scroll-bodge{height:100%;flex-wrap:nowrap;overflow-y:scroll;flex-shrink:0}.scroll{overflow:scroll}.tab-content-bodge{width:100%;height:100%}.button-bodge{text-align:left}.collapsing{transition:none!important}.tab-pane.fade{transition:none!important}.modal.fade{transition:none!important}.modal-dialog{width:80%;max-width:80%}.table{margin-bottom:0;width:auto}.table-container{overflow-x:scroll;min-height:fit-content}.channel-column{overflow-y:scroll;overflow-x:hidden;flex-grow:0;flex-shrink:0;max-width:75%}.channel-value{min-width:10em}.table>tbody>tr>td{vertical-align:middle}.collapse:not(.show){display:none!important}select.form-select{width:min-content}select.form-select:hover{cursor:pointer}textarea.text-logs{min-height:10em!important;padding-top:0!important;padding-bottom:0!important;border-top:0}.vertical-divider{flex-basis:.75em;flex-grow:0;flex-shrink:0}pre{color:var(--bs-code-color)}.vertical-divider:hover{cursor:col-resize;background-color:var(--bs-highlight-bg)!important}button:hover{background-color:var(--bs-tertiary-bg)}.channel-value-input{width:6em}:root,[data-bs-theme=dark],[data-bs-theme=light]{--bs-font-sans-serif:CascadiaCode, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:CascadiaMono, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}</style><div id=runtimepy class="align-items-start d-flex bg-body" data-bs-theme=dark><div class="d-flex h-100 bg-dark-subtle flex-column"><button type=button id=theme-button class="btn btn-secondary rounded-0 font-monospace button-bodge text-nowrap has-tooltip" data-bs-title=" Toggle light/dark." data-bs-placement=right>
3
- <i class="bi bi-lightbulb"></i>
4
- </button>
5
- <a href="?print=true"><button type=button id=print-button class="btn btn-secondary rounded-0 font-monospace button-bodge text-nowrap has-tooltip" data-bs-title="Printer-friendly view." data-bs-placement=right>
6
- <i class="bi bi-printer"></i></button></a></div><div class="d-flex h-100 justify-content-between flex-grow-1 flex-column overflow-y-auto text-body"><div></div><div class="d-flex flex-row justify-content-between"><div></div><div class="text-body p-3 pb-0"><h1><a href=/><img alt=logo src=/static/png/chip-circle-bootstrap/128x128.png></a> Resource Not Found (404) <a href=/><img alt=logo src=/static/png/chip-circle-bootstrap/128x128.png></a></h1><p>(<a href=/>home</a>)</div><div></div></div><div></div></div></div><script>function worker_config(e){let t={},s="runtimepy_websocket",n="ws";location.protocol.includes("https")&&(s="runtimepy_secure_websocket",n+="s");let o=e.config.ports;for(let r in o){let i=o[r],a=e.config.websocket_hostname||window.location.hostname;i.name.includes(s)&&(i.name.includes("data")?t.data=`${n}://${a}:`+i.port:t.json=`${n}://${a}:`+i.port)}return t}let tabFilter=void 0;function bootstrap_init(){const t=document.querySelectorAll(".has-tooltip"),n=[...t].map(e=>new bootstrap.Tooltip(e));let e=document.getElementById("runtimepy-tabs");e&&(tabFilter=new TabFilter(e))}let lightMode=!1;function lightDarkClick(){lightMode=!lightMode,document.getElementById("runtimepy").setAttribute("data-bs-theme",lightMode?"light":"dark"),window.location.hash=lightMode?"#light-mode":""}window.onload=()=>{let e=document.getElementById("theme-button");if(e&&e.addEventListener("click",lightDarkClick),window.location.hash){let t=window.location.hash.slice(1).split(",");t.includes("light-mode")&&e.click()}bootstrap_init()}</script><script src=/static/js/bootstrap.bundle.min.js crossorigin=anonymous></script>
File without changes
File without changes