runtimepy 5.15.7__tar.gz → 5.15.8__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.15.8}/PKG-INFO +6 -6
  2. {runtimepy-5.15.7 → runtimepy-5.15.8}/README.md +2 -2
  3. {runtimepy-5.15.7 → runtimepy-5.15.8}/pyproject.toml +1 -1
  4. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/__init__.py +2 -2
  5. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/response.py +18 -4
  6. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/__init__.py +15 -3
  7. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/http/__init__.py +5 -5
  8. {runtimepy-5.15.7 → runtimepy-5.15.8/runtimepy.egg-info}/PKG-INFO +6 -6
  9. {runtimepy-5.15.7 → runtimepy-5.15.8}/LICENSE +0 -0
  10. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/__main__.py +0 -0
  11. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/app.py +0 -0
  12. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/__init__.py +0 -0
  13. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/__init__.py +0 -0
  14. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/array.py +0 -0
  15. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/base.py +0 -0
  16. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/command/__init__.py +0 -0
  17. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/command/parser.py +0 -0
  18. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/command/processor.py +0 -0
  19. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/command/result.py +0 -0
  20. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/create.py +0 -0
  21. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/file.py +0 -0
  22. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/sample.py +0 -0
  23. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/environment/telemetry.py +0 -0
  24. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/event/__init__.py +0 -0
  25. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/event/header.py +0 -0
  26. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/channel/registry.py +0 -0
  27. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/__init__.py +0 -0
  28. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/protocol/__init__.py +0 -0
  29. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/protocol/base.py +0 -0
  30. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/protocol/json.py +0 -0
  31. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/protocol/receiver.py +0 -0
  32. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/codec/system/__init__.py +0 -0
  33. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/__init__.py +0 -0
  34. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/all.py +0 -0
  35. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/arbiter.py +0 -0
  36. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/common.py +0 -0
  37. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/mtu.py +0 -0
  38. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/server.py +0 -0
  39. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/task.py +0 -0
  40. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/tftp.py +0 -0
  41. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/commands/tui.py +0 -0
  42. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/control/__init__.py +0 -0
  43. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/control/env/__init__.py +0 -0
  44. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/control/source.py +0 -0
  45. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/control/step.py +0 -0
  46. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/404.md +0 -0
  47. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/base.yaml +0 -0
  48. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/browser.yaml +0 -0
  49. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/css/bootstrap_extra.css +0 -0
  50. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/css/font.css +0 -0
  51. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/css/main.css +0 -0
  52. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/dummy_load.yaml +0 -0
  53. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/factories.yaml +0 -0
  54. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/favicon.ico +0 -0
  55. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/DataConnection.js +0 -0
  56. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/JsonConnection.js +0 -0
  57. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/audio.js +0 -0
  58. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/App.js +0 -0
  59. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/ChannelTable.js +0 -0
  60. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/DataConnection.js +0 -0
  61. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  62. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  63. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/Plot.js +0 -0
  64. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  65. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/PlotManager.js +0 -0
  66. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  67. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  68. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/PointManager.js +0 -0
  69. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/TabFilter.js +0 -0
  70. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/TabInterface.js +0 -0
  71. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  72. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/WindowHashManager.js +0 -0
  73. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  74. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/events.js +0 -0
  75. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/init.js +0 -0
  76. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/main.js +0 -0
  77. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/markdown_page.js +0 -0
  78. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/sample.js +0 -0
  79. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/tab/env.js +0 -0
  80. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/tab/sound.js +0 -0
  81. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  82. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/unused/pyodide.js +0 -0
  83. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/util.js +0 -0
  84. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/js/worker.js +0 -0
  85. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/md/Connection.md +0 -0
  86. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/md/PeriodicTask.md +0 -0
  87. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/md/RuntimeStruct.md +0 -0
  88. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  89. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/md/SinusoidTask.md +0 -0
  90. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/sample_telemetry.yaml +0 -0
  91. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/BitFields.yaml +0 -0
  92. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/Button.yaml +0 -0
  93. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/Channel.yaml +0 -0
  94. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  95. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  96. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  97. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +0 -0
  98. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  99. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/FindFile.yaml +0 -0
  100. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/PeerProcessConfig.yaml +0 -0
  101. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/RuntimeEnum.yaml +0 -0
  102. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  103. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/StructConfig.yaml +0 -0
  104. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  105. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/TwoTupleArray.yaml +0 -0
  106. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  107. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_buttons.yaml +0 -0
  108. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_config.yaml +0 -0
  109. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_factory.yaml +0 -0
  110. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  111. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_name.yaml +0 -0
  112. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  113. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/schemas/has_views.yaml +0 -0
  114. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/server.yaml +0 -0
  115. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/server_base.yaml +0 -0
  116. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/server_dev.yaml +0 -0
  117. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/css/bootstrap-icons.min.css +0 -0
  118. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/css/bootstrap.min.css +0 -0
  119. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  120. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  121. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/js/bootstrap.bundle.min.js +0 -0
  122. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/js/webglplot.umd.min.js +0 -0
  123. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/1024x1024.png +0 -0
  124. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/128x128.png +0 -0
  125. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/16x16.png +0 -0
  126. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/1920x1920.png +0 -0
  127. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/24x24.png +0 -0
  128. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/256x256.png +0 -0
  129. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/32x32.png +0 -0
  130. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/512x512.png +0 -0
  131. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/png/chip-circle-bootstrap/64x64.png +0 -0
  132. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  133. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/svg/outline-dark.svg +0 -0
  134. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/svg/outline-light.svg +0 -0
  135. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  136. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  137. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  138. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  139. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  140. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  141. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  142. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  143. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/static/woff2/README.md +0 -0
  144. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/data/tftp_server.yaml +0 -0
  145. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/dev_requirements.txt +0 -0
  146. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/entry.py +0 -0
  147. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/enum/__init__.py +0 -0
  148. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/enum/registry.py +0 -0
  149. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/enum/types.py +0 -0
  150. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mapping.py +0 -0
  151. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/message/__init__.py +0 -0
  152. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/message/handlers.py +0 -0
  153. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/message/interface.py +0 -0
  154. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/message/types.py +0 -0
  155. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/metrics/__init__.py +0 -0
  156. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/metrics/channel.py +0 -0
  157. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/metrics/connection.py +0 -0
  158. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/metrics/task.py +0 -0
  159. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/__init__.py +0 -0
  160. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/async_command.py +0 -0
  161. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/enum.py +0 -0
  162. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/environment.py +0 -0
  163. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/finalize.py +0 -0
  164. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/logging.py +0 -0
  165. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/psutil.py +0 -0
  166. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/regex.py +0 -0
  167. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/mixins/trig.py +0 -0
  168. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/__init__.py +0 -0
  169. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/apps/__init__.py +0 -0
  170. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/__init__.py +0 -0
  171. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/base.py +0 -0
  172. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/config/__init__.py +0 -0
  173. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/config/codec.py +0 -0
  174. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/config/util.py +0 -0
  175. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  176. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/factory/connection.py +0 -0
  177. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/factory/task.py +0 -0
  178. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  179. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  180. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/imports/util.py +0 -0
  181. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/info.py +0 -0
  182. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/result.py +0 -0
  183. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/struct/__init__.py +0 -0
  184. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/task.py +0 -0
  185. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  186. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/tcp/json.py +0 -0
  187. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/udp.py +0 -0
  188. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/arbiter/websocket.py +0 -0
  189. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/backoff.py +0 -0
  190. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/connection.py +0 -0
  191. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/factories/__init__.py +0 -0
  192. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/html/__init__.py +0 -0
  193. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/html/arbiter.py +0 -0
  194. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/html/bootstrap/__init__.py +0 -0
  195. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/html/bootstrap/elements.py +0 -0
  196. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/html/bootstrap/tabs.py +0 -0
  197. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/__init__.py +0 -0
  198. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/common.py +0 -0
  199. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/header.py +0 -0
  200. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/request_target.py +0 -0
  201. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/state.py +0 -0
  202. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/http/version.py +0 -0
  203. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/manager.py +0 -0
  204. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/mixin.py +0 -0
  205. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/mtu.py +0 -0
  206. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/__init__.py +0 -0
  207. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/base.py +0 -0
  208. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/create.py +0 -0
  209. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/elements.py +0 -0
  210. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/__init__.py +0 -0
  211. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/modal.py +0 -0
  212. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/settings.py +0 -0
  213. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  214. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/tab/base.py +0 -0
  215. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/tab/controls.py +0 -0
  216. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/tab/html.py +0 -0
  217. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/tab/message.py +0 -0
  218. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/env/widgets.py +0 -0
  219. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/files.py +0 -0
  220. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/landing_page.py +0 -0
  221. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/placeholder.py +0 -0
  222. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/pyodide.py +0 -0
  223. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/sound.py +0 -0
  224. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/app/tab.py +0 -0
  225. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/html.py +0 -0
  226. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/json.py +0 -0
  227. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/markdown.py +0 -0
  228. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/mux.py +0 -0
  229. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/struct/__init__.py +0 -0
  230. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/websocket/__init__.py +0 -0
  231. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/server/websocket/state.py +0 -0
  232. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/ssl.py +0 -0
  233. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/stream/__init__.py +0 -0
  234. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/stream/base.py +0 -0
  235. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/stream/json/__init__.py +0 -0
  236. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/stream/string.py +0 -0
  237. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/__init__.py +0 -0
  238. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/connection.py +0 -0
  239. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/create.py +0 -0
  240. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/protocol.py +0 -0
  241. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/scpi/__init__.py +0 -0
  242. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/telnet/__init__.py +0 -0
  243. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/telnet/codes.py +0 -0
  244. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  245. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/__init__.py +0 -0
  246. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/connection.py +0 -0
  247. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/create.py +0 -0
  248. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/protocol.py +0 -0
  249. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/queue.py +0 -0
  250. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/tftp/__init__.py +0 -0
  251. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/tftp/base.py +0 -0
  252. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  253. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/tftp/enums.py +0 -0
  254. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/udp/tftp/io.py +0 -0
  255. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/util.py +0 -0
  256. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/websocket/__init__.py +0 -0
  257. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/net/websocket/connection.py +0 -0
  258. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/noise/__init__.py +0 -0
  259. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/__init__.py +0 -0
  260. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/array/__init__.py +0 -0
  261. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/base.py +0 -0
  262. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/bool.py +0 -0
  263. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/byte_order.py +0 -0
  264. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/evaluation.py +0 -0
  265. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/field/__init__.py +0 -0
  266. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/field/fields.py +0 -0
  267. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/field/manager/__init__.py +0 -0
  268. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/field/manager/base.py +0 -0
  269. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/float.py +0 -0
  270. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/int.py +0 -0
  271. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/scaling.py +0 -0
  272. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/serializable/__init__.py +0 -0
  273. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/serializable/base.py +0 -0
  274. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/serializable/fixed.py +0 -0
  275. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/serializable/framer.py +0 -0
  276. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/serializable/prefixed.py +0 -0
  277. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/string.py +0 -0
  278. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/__init__.py +0 -0
  279. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/base.py +0 -0
  280. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/bool.py +0 -0
  281. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/bounds.py +0 -0
  282. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/float.py +0 -0
  283. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/primitives/types/int.py +0 -0
  284. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/py.typed +0 -0
  285. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/registry/__init__.py +0 -0
  286. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/registry/bool.py +0 -0
  287. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/registry/item.py +0 -0
  288. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/registry/name.py +0 -0
  289. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/requirements.txt +0 -0
  290. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/sample/__init__.py +0 -0
  291. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/sample/peer.py +0 -0
  292. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/sample/program.py +0 -0
  293. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/schemas.py +0 -0
  294. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/struct/__init__.py +0 -0
  295. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/subprocess/__init__.py +0 -0
  296. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/subprocess/interface.py +0 -0
  297. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/subprocess/peer.py +0 -0
  298. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/subprocess/program.py +0 -0
  299. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/subprocess/protocol.py +0 -0
  300. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/__init__.py +0 -0
  301. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/asynchronous.py +0 -0
  302. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/basic/__init__.py +0 -0
  303. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/basic/manager.py +0 -0
  304. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/basic/periodic.py +0 -0
  305. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/sample.py +0 -0
  306. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/task/trig/__init__.py +0 -0
  307. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/telemetry/__init__.py +0 -0
  308. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/telemetry/sample.py +0 -0
  309. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/__init__.py +0 -0
  310. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/channels/__init__.py +0 -0
  311. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/cursor.py +0 -0
  312. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/mixin.py +0 -0
  313. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/mock.py +0 -0
  314. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/tui/task.py +0 -0
  315. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/ui/__init__.py +0 -0
  316. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/ui/button.py +0 -0
  317. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/ui/controls.py +0 -0
  318. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy/util.py +0 -0
  319. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy.egg-info/SOURCES.txt +0 -0
  320. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy.egg-info/dependency_links.txt +0 -0
  321. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy.egg-info/entry_points.txt +0 -0
  322. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy.egg-info/requires.txt +3 -3
  323. {runtimepy-5.15.7 → runtimepy-5.15.8}/runtimepy.egg-info/top_level.txt +0 -0
  324. {runtimepy-5.15.7 → runtimepy-5.15.8}/setup.cfg +0 -0
  325. {runtimepy-5.15.7 → runtimepy-5.15.8}/setup.py +0 -0
  326. {runtimepy-5.15.7 → runtimepy-5.15.8}/tests/test_entry.py +0 -0
  327. {runtimepy-5.15.7 → runtimepy-5.15.8}/tests/test_mapping.py +0 -0
  328. {runtimepy-5.15.7 → runtimepy-5.15.8}/tests/test_resources.py +0 -0
  329. {runtimepy-5.15.7 → runtimepy-5.15.8}/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.15.8
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/libre-embedded/runtimepy
6
6
  Author: Libre Embedded
@@ -17,11 +17,11 @@ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: websockets
21
- Requires-Dist: svgen>=0.8.0
20
+ Requires-Dist: psutil
22
21
  Requires-Dist: vcorelib>=3.6.4
22
+ Requires-Dist: svgen>=0.8.0
23
+ Requires-Dist: websockets
23
24
  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"
@@ -51,11 +51,11 @@ Dynamic: requires-python
51
51
  =====================================
52
52
  generator=datazen
53
53
  version=3.2.3
54
- hash=fd0b9f87927033d8ee2eb5448d8aec76
54
+ hash=c354cb6439439285d244ad2bdcc32cc8
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.15.7](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.15.8](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=fd0b9f87927033d8ee2eb5448d8aec76
5
+ hash=c354cb6439439285d244ad2bdcc32cc8
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.15.7](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.15.8](https://pypi.org/project/runtimepy/))
10
10
 
11
11
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
12
12
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta:__legacy__"
4
4
 
5
5
  [project]
6
6
  name = "runtimepy"
7
- version = "5.15.7"
7
+ version = "5.15.8"
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=be3f79364e840f1950bc121205810f02
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.15.8"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.15.7
3
+ Version: 5.15.8
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/libre-embedded/runtimepy
6
6
  Author: Libre Embedded
@@ -17,11 +17,11 @@ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: websockets
21
- Requires-Dist: svgen>=0.8.0
20
+ Requires-Dist: psutil
22
21
  Requires-Dist: vcorelib>=3.6.4
22
+ Requires-Dist: svgen>=0.8.0
23
+ Requires-Dist: websockets
23
24
  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"
@@ -51,11 +51,11 @@ Dynamic: requires-python
51
51
  =====================================
52
52
  generator=datazen
53
53
  version=3.2.3
54
- hash=fd0b9f87927033d8ee2eb5448d8aec76
54
+ hash=c354cb6439439285d244ad2bdcc32cc8
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.15.7](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.15.8](https://pypi.org/project/runtimepy/))
59
59
 
60
60
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
61
61
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
File without changes
File without changes