opengris-scaler 1.12.9__tar.gz → 1.12.12__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.

Potentially problematic release.


This version of opengris-scaler might be problematic. Click here for more details.

Files changed (351) hide show
  1. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/CONTRIBUTING.md +2 -1
  2. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/PKG-INFO +3 -1
  3. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/README.md +2 -0
  4. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/index.rst +1 -0
  5. opengris_scaler-1.12.12/docs/source/tutorials/development.rst +193 -0
  6. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/tutorials/features.rst +22 -0
  7. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/client.py +26 -3
  8. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/object_storage_server.py +12 -8
  9. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/CMakeLists.txt +0 -2
  10. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/object_storage_server.cpp +2 -0
  11. opengris_scaler-1.12.12/scaler/version.txt +1 -0
  12. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor/processor.py +6 -0
  13. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor_holder.py +2 -0
  14. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor_manager.py +3 -0
  15. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/worker.py +1 -0
  16. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_client.py +8 -0
  17. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_nested_task.py +34 -0
  18. opengris_scaler-1.12.9/scaler/version.txt +0 -1
  19. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.clang-format +0 -0
  20. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/3rd-party-libraries-compile/action.yml +0 -0
  21. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/3rd-party-libraries-download/action.yml +0 -0
  22. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/3rd-party-libraries-install/action.yml +0 -0
  23. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/compile-libraries/action.yml +0 -0
  24. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/create-artifacts/action.yml +0 -0
  25. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/harden-check/action.yml +0 -0
  26. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/publish-doc/action.yml +0 -0
  27. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/run-linter/action.yml +0 -0
  28. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/run-test/action.yml +0 -0
  29. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/actions/setup-env/action.yml +0 -0
  30. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/dependabot.yml +0 -0
  31. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/build-and-test.yml +0 -0
  32. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/codeql.yml +0 -0
  33. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/dependency-review.yml +0 -0
  34. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/publish-artifact.yml +0 -0
  35. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/publish-documentation.yml +0 -0
  36. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.github/workflows/scorecard.yml +0 -0
  37. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/.gitignore +0 -0
  38. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/CMakeLists.txt +0 -0
  39. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/CMakePresets.json +0 -0
  40. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/LICENSE +0 -0
  41. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/LICENSE.spdx +0 -0
  42. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/NOTICE +0 -0
  43. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/benchmarks/dask_local_test.py +0 -0
  44. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/benchmarks/dask_remote_test.py +0 -0
  45. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/benchmarks/scaler_test.py +0 -0
  46. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/.gitignore +0 -0
  47. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/Makefile +0 -0
  48. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/make.bat +0 -0
  49. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/requirements_docs.txt +0 -0
  50. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/_static/style.css +0 -0
  51. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/_templates/layout.html +0 -0
  52. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/conf.py +0 -0
  53. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/tutorials/configuration.rst +0 -0
  54. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/tutorials/examples.rst +0 -0
  55. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/tutorials/images/architecture.png +0 -0
  56. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/docs/source/tutorials/quickstart.rst +0 -0
  57. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/downloaded/capnproto-c++-1.1.0.tar.gz +0 -0
  58. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/CMakeLists.txt +0 -0
  59. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/downloaded_data.csv +0 -0
  60. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/implied_volatility.py +0 -0
  61. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/pillow.py +0 -0
  62. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/requirements_applications.txt +0 -0
  63. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/timeseries.py +0 -0
  64. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/applications/yfinance_historical_price.py +0 -0
  65. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/CMakeLists.txt +0 -0
  66. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/CMakeLists.txt +0 -0
  67. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/automated_echo_client.cpp +0 -0
  68. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/echo_client.cpp +0 -0
  69. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/echo_server.cpp +0 -0
  70. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/pingpong.cpp +0 -0
  71. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/pub_server.cpp +0 -0
  72. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/remove_iosocket.cpp +0 -0
  73. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/sub_client.cpp +0 -0
  74. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/cpp/ymq/timestamp.cpp +0 -0
  75. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/disconnect_client.py +0 -0
  76. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/graphtask_client.py +0 -0
  77. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/graphtask_nested_client.py +0 -0
  78. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/images/cat_1.jpg +0 -0
  79. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/images/cat_2.jpg +0 -0
  80. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/map_client.py +0 -0
  81. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/nested_client.py +0 -0
  82. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/readme.md +0 -0
  83. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/send_object_client.py +0 -0
  84. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/simple_client.py +0 -0
  85. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/examples/task_capabilities.py +0 -0
  86. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/pyproject.toml +0 -0
  87. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/renovate.json +0 -0
  88. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_cluster.py +0 -0
  89. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_object_storage_server.py +0 -0
  90. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_scheduler.py +0 -0
  91. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_top.py +0 -0
  92. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_webui.py +0 -0
  93. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_worker_adapter_native.py +0 -0
  94. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/run_worker_adapter_symphony.py +0 -0
  95. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/CMakeLists.txt +0 -0
  96. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/__init__.py +0 -0
  97. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/about.py +0 -0
  98. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/__init__.py +0 -0
  99. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/__init__.py +0 -0
  100. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/client_agent.py +0 -0
  101. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/disconnect_manager.py +0 -0
  102. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/future_manager.py +0 -0
  103. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/heartbeat_manager.py +0 -0
  104. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/mixins.py +0 -0
  105. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/object_manager.py +0 -0
  106. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/agent/task_manager.py +0 -0
  107. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/future.py +0 -0
  108. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/object_buffer.py +0 -0
  109. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/object_reference.py +0 -0
  110. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/serializer/__init__.py +0 -0
  111. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/serializer/default.py +0 -0
  112. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/client/serializer/mixins.py +0 -0
  113. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/cluster/__init__.py +0 -0
  114. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/cluster/cluster.py +0 -0
  115. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/cluster/combo.py +0 -0
  116. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/cluster/object_storage_server.py +0 -0
  117. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/cluster/scheduler.py +0 -0
  118. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/__init__.py +0 -0
  119. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/defaults.py +0 -0
  120. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/loader.py +0 -0
  121. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/mixins.py +0 -0
  122. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/__init__.py +0 -0
  123. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/cluster.py +0 -0
  124. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/native_worker_adapter.py +0 -0
  125. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/object_storage_server.py +0 -0
  126. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/scheduler.py +0 -0
  127. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/symphony_worker_adapter.py +0 -0
  128. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/top.py +0 -0
  129. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/section/webui.py +0 -0
  130. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/types/__init__.py +0 -0
  131. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/types/object_storage_server.py +0 -0
  132. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/types/worker.py +0 -0
  133. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/config/types/zmq.py +0 -0
  134. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/__init__.py +0 -0
  135. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/cluster.py +0 -0
  136. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/scheduler.py +0 -0
  137. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/top.py +0 -0
  138. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/webui.py +0 -0
  139. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/worker_adapter_native.py +0 -0
  140. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/entry_points/worker_adapter_symphony.py +0 -0
  141. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/__init__.py +0 -0
  142. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/async_binder.py +0 -0
  143. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/async_connector.py +0 -0
  144. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/async_object_storage_connector.py +0 -0
  145. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/mixins.py +0 -0
  146. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/sync_connector.py +0 -0
  147. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/sync_object_storage_connector.py +0 -0
  148. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/sync_subscriber.py +0 -0
  149. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/utility.py +0 -0
  150. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/CMakeLists.txt +0 -0
  151. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/__init__.py +0 -0
  152. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/_ymq.pyi +0 -0
  153. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/bytes.h +0 -0
  154. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/common.h +0 -0
  155. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/configuration.h +0 -0
  156. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/epoll_context.cpp +0 -0
  157. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/epoll_context.h +0 -0
  158. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/error.h +0 -0
  159. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/event_loop.h +0 -0
  160. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/event_loop_thread.cpp +0 -0
  161. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/event_loop_thread.h +0 -0
  162. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/event_manager.h +0 -0
  163. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/interruptive_concurrent_queue.h +0 -0
  164. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/io_context.cpp +0 -0
  165. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/io_context.h +0 -0
  166. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/io_socket.cpp +0 -0
  167. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/io_socket.h +0 -0
  168. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/iocp_context.cpp +0 -0
  169. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/iocp_context.h +0 -0
  170. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/logging.h +0 -0
  171. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/message.h +0 -0
  172. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/message_connection.h +0 -0
  173. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/message_connection_tcp.cpp +0 -0
  174. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/message_connection_tcp.h +0 -0
  175. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/network_utils.h +0 -0
  176. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/bytes.h +0 -0
  177. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/exception.h +0 -0
  178. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/gil.h +0 -0
  179. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/io_context.h +0 -0
  180. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/io_socket.h +0 -0
  181. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/message.h +0 -0
  182. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/python.h +0 -0
  183. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/ymq.cpp +0 -0
  184. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/pymod_ymq/ymq.h +0 -0
  185. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/readme.md +0 -0
  186. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/simple_interface.cpp +0 -0
  187. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/simple_interface.h +0 -0
  188. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/tcp_client.cpp +0 -0
  189. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/tcp_client.h +0 -0
  190. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/tcp_operations.h +0 -0
  191. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/tcp_server.cpp +0 -0
  192. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/tcp_server.h +0 -0
  193. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/third_party/concurrentqueue.h +0 -0
  194. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/timed_queue.h +0 -0
  195. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/timestamp.h +0 -0
  196. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/typedefs.h +0 -0
  197. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/utils.h +0 -0
  198. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/io/ymq/ymq.py +0 -0
  199. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/__init__.py +0 -0
  200. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/constants.h +0 -0
  201. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/defs.h +0 -0
  202. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/io_helper.cpp +0 -0
  203. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/io_helper.h +0 -0
  204. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/message.cpp +0 -0
  205. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/message.h +0 -0
  206. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/object_manager.cpp +0 -0
  207. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/object_manager.h +0 -0
  208. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/object_storage_server.h +0 -0
  209. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/object_storage/pymod_object_storage_server.cpp +0 -0
  210. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/__init__.py +0 -0
  211. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/__init__.py +0 -0
  212. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/_python.py +0 -0
  213. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/common.capnp +0 -0
  214. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/message.capnp +0 -0
  215. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/object_storage.capnp +0 -0
  216. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/capnp/status.capnp +0 -0
  217. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/introduction.md +0 -0
  218. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/__init__.py +0 -0
  219. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/common.py +0 -0
  220. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/message.py +0 -0
  221. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/mixins.py +0 -0
  222. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/object_storage.py +0 -0
  223. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/python/status.py +0 -0
  224. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/protocol/worker.md +0 -0
  225. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/__init__.py +0 -0
  226. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/allocate_policy/__init__.py +0 -0
  227. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/allocate_policy/allocate_policy.py +0 -0
  228. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/allocate_policy/capability_allocate_policy.py +0 -0
  229. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/allocate_policy/even_load_allocate_policy.py +0 -0
  230. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/allocate_policy/mixins.py +0 -0
  231. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/__init__.py +0 -0
  232. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/balance_controller.py +0 -0
  233. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/client_controller.py +0 -0
  234. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/config_controller.py +0 -0
  235. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/graph_controller.py +0 -0
  236. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/information_controller.py +0 -0
  237. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/mixins.py +0 -0
  238. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/object_controller.py +0 -0
  239. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/scaling_controller.py +0 -0
  240. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/task_controller.py +0 -0
  241. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/controllers/worker_controller.py +0 -0
  242. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/object_usage/__init__.py +0 -0
  243. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/object_usage/object_tracker.py +0 -0
  244. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/scheduler.py +0 -0
  245. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/task/__init__.py +0 -0
  246. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/task/task_state_machine.py +0 -0
  247. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/scheduler/task/task_state_manager.py +0 -0
  248. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/__init__.py +0 -0
  249. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/constants.py +0 -0
  250. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/live_display.py +0 -0
  251. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/memory_window.py +0 -0
  252. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/setting_page.py +0 -0
  253. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/task_graph.py +0 -0
  254. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/task_log.py +0 -0
  255. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/utility.py +0 -0
  256. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/webui.py +0 -0
  257. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/ui/worker_processors.py +0 -0
  258. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/__init__.py +0 -0
  259. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/debug.py +0 -0
  260. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/event_list.py +0 -0
  261. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/event_loop.py +0 -0
  262. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/exceptions.py +0 -0
  263. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/formatter.py +0 -0
  264. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/graph/__init__.py +0 -0
  265. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/graph/optimization.py +0 -0
  266. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/graph/topological_sorter.py +0 -0
  267. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/graph/topological_sorter_graphblas.py +0 -0
  268. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/identifiers.py +0 -0
  269. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/logging/__init__.py +0 -0
  270. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/logging/decorators.py +0 -0
  271. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/logging/scoped_logger.py +0 -0
  272. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/logging/utility.py +0 -0
  273. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/many_to_many_dict.py +0 -0
  274. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/metadata/__init__.py +0 -0
  275. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/metadata/profile_result.py +0 -0
  276. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/metadata/task_flags.py +0 -0
  277. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/mixins.py +0 -0
  278. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/network_util.py +0 -0
  279. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/one_to_many_dict.py +0 -0
  280. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/queues/__init__.py +0 -0
  281. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/queues/async_indexed_queue.py +0 -0
  282. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/queues/async_priority_queue.py +0 -0
  283. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/queues/async_sorted_priority_queue.py +0 -0
  284. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/queues/indexed_queue.py +0 -0
  285. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/utility/serialization.py +0 -0
  286. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/__init__.py +0 -0
  287. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/__init__.py +0 -0
  288. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/heartbeat_manager.py +0 -0
  289. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/mixins.py +0 -0
  290. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor/__init__.py +0 -0
  291. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor/object_cache.py +0 -0
  292. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/processor/streaming_buffer.py +0 -0
  293. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/profiling_manager.py +0 -0
  294. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/task_manager.py +0 -0
  295. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/agent/timeout_manager.py +0 -0
  296. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker/preload.py +0 -0
  297. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/__init__.py +0 -0
  298. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/native.py +0 -0
  299. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/__init__.py +0 -0
  300. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/callback.py +0 -0
  301. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/heartbeat_manager.py +0 -0
  302. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/message.py +0 -0
  303. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/task_manager.py +0 -0
  304. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/worker.py +0 -0
  305. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scaler/worker_adapter/symphony/worker_adapter.py +0 -0
  306. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scripts/build.sh +0 -0
  307. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scripts/library_tool.ps1 +0 -0
  308. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scripts/library_tool.sh +0 -0
  309. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/scripts/test.sh +0 -0
  310. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/slides/Effortless Distributed Computing in Python - FOSDEM 2025.pdf +0 -0
  311. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/slides/OSFF 2025 London.pdf +0 -0
  312. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/CMakeLists.txt +0 -0
  313. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/__init__.py +0 -0
  314. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/CMakeLists.txt +0 -0
  315. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/object_storage/CMakeLists.txt +0 -0
  316. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/object_storage/test_object_manager.cpp +0 -0
  317. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/object_storage/test_object_storage_server.cpp +0 -0
  318. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/CMakeLists.txt +0 -0
  319. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/common.h +0 -0
  320. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/__init__.py +0 -0
  321. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/main.py +0 -0
  322. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/passthrough.py +0 -0
  323. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/randomly_drop_packets.py +0 -0
  324. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/send_rst_to_client.py +0 -0
  325. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/py_mitm/types.py +0 -0
  326. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/cpp/ymq/test_ymq.cpp +0 -0
  327. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/io/ymq/CMakeLists.txt +0 -0
  328. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/io/ymq/test_logging.cpp +0 -0
  329. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_async_indexed_queue.py +0 -0
  330. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_async_priority_queue.py +0 -0
  331. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_async_sorted_priority_queue.py +0 -0
  332. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_balance.py +0 -0
  333. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_capabilities.py +0 -0
  334. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_capability_allocate_policy.py +0 -0
  335. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_cluster.py +0 -0
  336. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_cluster_config.py +0 -0
  337. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_cluster_disconnect.py +0 -0
  338. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_config_types.py +0 -0
  339. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_death_timeout.py +0 -0
  340. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_future.py +0 -0
  341. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_graph.py +0 -0
  342. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_indexed_queue.py +0 -0
  343. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_object_usage.py +0 -0
  344. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_profiling.py +0 -0
  345. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_protected.py +0 -0
  346. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_scaling.py +0 -0
  347. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_scheduler_config.py +0 -0
  348. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_serializer.py +0 -0
  349. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/test_ui.py +0 -0
  350. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/tests/utility.py +0 -0
  351. {opengris_scaler-1.12.9 → opengris_scaler-1.12.12}/version.h.in +0 -0
@@ -7,6 +7,7 @@ This document describes the contribution process and governance policies of the
7
7
 
8
8
  ## Helpful Resources
9
9
 
10
+ * [Development Guidelines](https://finos.github.io/opengris-scaler/tutorials/development.html)
10
11
 
11
12
  * [README.md](./README.md)
12
13
 
@@ -103,4 +104,4 @@ This document MAY be amended by a vote of the Maintainers according to the Maint
103
104
 
104
105
  ## Code of Conduct
105
106
 
106
- Please see the FINOS [Community Code of Conduct](https://www.finos.org/code-of-conduct).
107
+ Please see the FINOS [Community Code of Conduct](https://www.finos.org/code-of-conduct).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: opengris-scaler
3
- Version: 1.12.9
3
+ Version: 1.12.12
4
4
  Summary: OpenGRIS Scaler Distribution Framework
5
5
  Author-Email: Citi <opensource@citi.com>
6
6
  License: Apache 2.0
@@ -365,6 +365,8 @@ with Client(address="tcp://127.0.0.1:2345") as client:
365
365
  print(future.result()) # 21
366
366
  ```
367
367
 
368
+ **Note**: When creating a `Client` inside a task (nested client), the `address` parameter is optional. If omitted, the client automatically uses the scheduler address from the worker context. If provided, the specified address takes precedence.
369
+
368
370
  ## Task Routing and Capability Management
369
371
 
370
372
  > **Note**: This feature is experimental and may change in future releases.
@@ -322,6 +322,8 @@ with Client(address="tcp://127.0.0.1:2345") as client:
322
322
  print(future.result()) # 21
323
323
  ```
324
324
 
325
+ **Note**: When creating a `Client` inside a task (nested client), the `address` parameter is optional. If omitted, the client automatically uses the scheduler address from the worker context. If provided, the specified address takes precedence.
326
+
325
327
  ## Task Routing and Capability Management
326
328
 
327
329
  > **Note**: This feature is experimental and may change in future releases.
@@ -28,3 +28,4 @@ Content
28
28
  tutorials/features
29
29
  tutorials/configuration
30
30
  tutorials/examples
31
+ tutorials/development
@@ -0,0 +1,193 @@
1
+ =======================
2
+ Development Guidelines
3
+ =======================
4
+
5
+ .. contents:: Table of Contents
6
+ :depth: 2
7
+
8
+ Please be aware that contributing code to this repo requires following several opinionated rules.
9
+ Pull requests that ignore the guidelines are unlikely to be accepted.
10
+
11
+ These development guidelines will be updated whenever we need to clarify missing rules or adjust existing guidance.
12
+
13
+ This project consists of both Python and C++ code, so the guidelines cover expectations for each language.
14
+
15
+ Both humans and AI contributors should follow these guidelines.
16
+
17
+ Common Guidelines
18
+ -----------------
19
+
20
+ Naming
21
+ ~~~~~~
22
+
23
+ Names should be crystal clear within the code context. That context can be a function, module (file), or library.
24
+ In general, prefer the most specific name unless a conventional name is already established.
25
+
26
+ Bad examples:
27
+ * data1, data2
28
+ * a, b, c, d, e
29
+ * df
30
+ * function1
31
+ * array
32
+
33
+ Avoid abbreviations whenever possible. Abbreviations make the code harder to read and debug unless the term is widely
34
+ known or an industry standard.
35
+
36
+ Numbers
37
+ ~~~~~~~
38
+
39
+ Magic numbers are not allowed. Every constant should be assigned to a well-named variable that explains its purpose.
40
+
41
+ Object-Oriented Programming (OOP)
42
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43
+
44
+ OOP is available in both C++ and Python. Use classes to encapsulate related behavior and data when those pieces belong
45
+ together.
46
+
47
+ **We allow subtyping, but we do not allow inheritance.**
48
+ * Subtyping: allowed - override member functions that have no implementations (interfaces in C++).
49
+ * Inheritance: disallowed - do not override functions that already provide implementations.
50
+
51
+ Class and static methods are allowed in Python. Remember that class methods provide no benefit over module-level
52
+ functions unless the behavior is tied to class-level state. Place the function in the scope that matches its
53
+ responsibility.
54
+
55
+ Functions
56
+ ~~~~~~~~~
57
+
58
+ * Please refactor aggressively, except in test cases where limited duplication can aid readability.
59
+ Shared test helpers should still live in utility functions.
60
+ * Express complex conditional filtering logic with guard clauses to improve readability.
61
+
62
+ Python Guidelines
63
+ -----------------
64
+
65
+ * We follow PEP 8 closely, with the exception of a 120-character line width. Refer to PEP 8 for the remaining details.
66
+ * Python type hints are mandatory for all function arguments and return types, and mypy will check them.
67
+ * We use the Black formatter; run `black -l 120 -C`.
68
+ * All Python imports must be absolute.
69
+ * We do not allow any content in `__init__.py` files unless a special case (such as the project root)
70
+ requires it for user convenience.
71
+
72
+ Test Cases
73
+ ~~~~~~~~~~
74
+
75
+ * Python test cases should use the standard `unittest` module, and each test class should live in its own Python file
76
+ named with the `test_*.py` prefix.
77
+ * Mirror the unit-test directory structure to the code structure because the `tests` directory lives at the repo root.
78
+
79
+ C++ Guidelines
80
+ --------------
81
+
82
+ Naming
83
+ ~~~~~~
84
+
85
+ Please use PascalCase for namespaces and classes. Capitalize the first character, for example:
86
+ * SomeClass
87
+ * LongNameClass
88
+
89
+ Use all capital letters for global variables or macros. System or third-party library definitions are exempt from this
90
+ rule:
91
+ * GLOBAL_VARIABLE
92
+
93
+ Use camelCase for variable and function names, with the first character lower case:
94
+ * addSomeValue
95
+ * deleteSomeValue
96
+
97
+ Keep abbreviations uppercase, for example:
98
+ * TCPAcceptor instead of TcpAcceptor
99
+ * IOSocket instead of IoSocket
100
+
101
+ File names should use snake_case. Use the `.h` extension for headers and `.cpp` for source files:
102
+ * header files: message_connection.h
103
+ * source files: message_connection.cpp
104
+
105
+ Formatting
106
+ ~~~~~~~~~~
107
+
108
+ Please use the `.clang-format` file in the repo root for code formatting.
109
+
110
+ Namespaces
111
+ ~~~~~~~~~~
112
+
113
+ * Do not add `using namespace` directives like `using namespace std;`.
114
+ * Always use fully qualified names such as `std::cout`.
115
+
116
+ Includes
117
+ ~~~~~~~~
118
+
119
+ * Remove include files when none of their symbols are used.
120
+ * Always include the header that defines the symbols you rely on; avoid depending on transitive includes. For example:
121
+ * There are files `common.h`, `some_module.h`, and `application.cpp`.
122
+ * At the top of `common.h`, there is `#include <cstring>`.
123
+ * At the top of `some_module.h`, there is `#include "common.h"`.
124
+ * At the top of `application.cpp`, there is `#include "some_module.h"`.
125
+ * Even though `application.cpp` compiles because `<cstring>` is indirectly included through `common.h`, explicitly
126
+ include `<cstring>` in `application.cpp`.
127
+
128
+ Struct/Class
129
+ ~~~~~~~~~~~~
130
+
131
+ In C++, structs and classes are the same except for default access. Use `struct` for passive data structures with minimal
132
+ helpers. Use `class` for stateful types, and do not expose fields directly. Provide setters and getters instead.
133
+
134
+ .. code:: cpp
135
+
136
+ struct Address {
137
+ std::string domain;
138
+ int port;
139
+ };
140
+
141
+ // If a data structure has internal state that consumers should not mutate directly, provide methods to modify that
142
+ // state instead of exposing the members.
143
+ class Client {
144
+ public:
145
+ void send(const std::vector<uint8_t>& buffer);
146
+
147
+ int getMessageCount() const;
148
+
149
+ private:
150
+ int messageCount;
151
+ };
152
+
153
+ Code Layout
154
+ ~~~~~~~~~~~
155
+
156
+ For any header or source file, order elements as follows:
157
+ * system library includes
158
+ * standard library includes
159
+ * third-party library includes
160
+ * in-library includes
161
+ * global variables
162
+ * API classes and functions
163
+ * internal functions that are not meant to be used outside the file
164
+
165
+ Class definitions should follow this order:
166
+
167
+ .. code:: cpp
168
+
169
+ // List public members first, then protected, then private sections.
170
+ // Place using declarations at the top, followed by constructors, copy/move constructors, and the destructor.
171
+ // Declare member functions before member variables.
172
+ class Foobar {
173
+ public:
174
+ // Using types should go first.
175
+ using Type = some_namespace::SomeType;
176
+
177
+ Foobar();
178
+ Foobar(const std::string& foobar) : _foobar(foobar) {}
179
+ ~Foobar();
180
+
181
+ const std::string& getCurrentFoobar() const;
182
+
183
+ protected:
184
+ void someProtectedMethod();
185
+
186
+ int _someProtectedVariable;
187
+
188
+ private:
189
+ void somePrivateMethod();
190
+
191
+ std::string _foobar;
192
+ int _somePrivateVariable;
193
+ };
@@ -118,6 +118,28 @@ Tasks can depend on other tasks' result without using graph.
118
118
  .. literalinclude:: ../../../examples/nested_client.py
119
119
  :language: python
120
120
 
121
+ Nested Client Scheduler Address
122
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
123
+
124
+ When creating a ``Client`` inside a task (nested client), the scheduler ``address`` parameter is optional. If omitted, the client automatically detects and uses the scheduler address from the worker context. This is particularly useful when workers are behind firewalls or NAT, where the scheduler address accessible from inside the worker may differ from external addresses.
125
+
126
+ **Automatic Address Detection:**
127
+
128
+ .. code:: python
129
+
130
+ from scaler import Client
131
+
132
+ def nested_task():
133
+ # Automatically uses worker's scheduler address if no address is provided to Client()
134
+ with Client() as client:
135
+ result = client.submit(lambda x: x * 2, 5).result()
136
+ return result
137
+
138
+ # Main client
139
+ client = Client(address="tcp://127.0.0.1:2345")
140
+ future = client.submit(nested_task)
141
+ print(future.result()) # 10
142
+
121
143
  Dynamically Building Graph Within a Task
122
144
  ----------------------------------------
123
145
 
@@ -51,7 +51,7 @@ class _CallNode:
51
51
  class Client:
52
52
  def __init__(
53
53
  self,
54
- address: str,
54
+ address: Optional[str] = None,
55
55
  profiling: bool = False,
56
56
  timeout_seconds: int = DEFAULT_CLIENT_TIMEOUT_SECONDS,
57
57
  heartbeat_interval_seconds: int = DEFAULT_HEARTBEAT_INTERVAL_SECONDS,
@@ -61,8 +61,9 @@ class Client:
61
61
  """
62
62
  The Scaler Client used to send tasks to a scheduler.
63
63
 
64
- :param address: Address of Scheduler to submit work to
65
- :type address: str
64
+ :param address: Address of Scheduler to submit work to. If None, will attempt to auto-detect
65
+ when running inside a worker context.
66
+ :type address: Optional[str]
66
67
  :param profiling: If True, the returned futures will have the `task_duration()` property enabled.
67
68
  :type profiling: bool
68
69
  :param timeout_seconds: Seconds until heartbeat times out
@@ -72,6 +73,7 @@ class Client:
72
73
  :param stream_output: If True, stdout/stderr will be streamed to client during task execution
73
74
  :type stream_output: bool
74
75
  """
76
+ address = self._resolve_scheduler_address(address)
75
77
  self.__initialize__(address, profiling, timeout_seconds, heartbeat_interval_seconds, serializer, stream_output)
76
78
 
77
79
  def __initialize__(
@@ -380,6 +382,10 @@ class Client:
380
382
  disconnect from connected scheduler, this will not shut down the scheduler
381
383
  """
382
384
 
385
+ # Handle case where client wasn't fully initialized
386
+ if not hasattr(self, "_stop_event"):
387
+ return
388
+
383
389
  if self._stop_event.is_set():
384
390
  self.__destroy()
385
391
  return
@@ -633,3 +639,20 @@ class Client:
633
639
  assert current_task is not None
634
640
 
635
641
  return retrieve_task_flags_from_task(current_task).priority
642
+
643
+ def _resolve_scheduler_address(self, address: Optional[str]) -> str:
644
+ """Resolve the scheduler address based on the provided address and worker context."""
645
+ # Provided address always takes precedence
646
+ if address is not None:
647
+ return address
648
+
649
+ # No address provided, check if we're running inside a worker context
650
+ current_processor = Processor.get_current_processor()
651
+ if current_processor is None:
652
+ raise ValueError(
653
+ "No scheduler address provided and not running inside a worker context. "
654
+ "Please provide a scheduler address when creating the Client outside of a worker."
655
+ )
656
+
657
+ # Return the scheduler address from the current processor
658
+ return current_processor.scheduler_address().to_address()
@@ -1,5 +1,6 @@
1
1
  import argparse
2
2
  import logging
3
+ import sys
3
4
 
4
5
  from scaler.config.loader import load_config
5
6
  from scaler.config.section.object_storage_server import ObjectStorageServerConfig
@@ -31,11 +32,14 @@ def main():
31
32
 
32
33
  log_format_str, log_level_str, log_paths = get_logger_info(logging.getLogger())
33
34
 
34
- ObjectStorageServer().run(
35
- oss_config.object_storage_address.host,
36
- oss_config.object_storage_address.port,
37
- oss_config.object_storage_address.identity,
38
- log_level_str,
39
- log_format_str,
40
- log_paths,
41
- )
35
+ try:
36
+ ObjectStorageServer().run(
37
+ oss_config.object_storage_address.host,
38
+ oss_config.object_storage_address.port,
39
+ oss_config.object_storage_address.identity,
40
+ log_level_str,
41
+ log_format_str,
42
+ log_paths,
43
+ )
44
+ except KeyboardInterrupt:
45
+ sys.exit(0)
@@ -31,11 +31,9 @@ set_target_properties(py_object_storage_server PROPERTIES
31
31
  )
32
32
 
33
33
  target_link_libraries(py_object_storage_server PRIVATE
34
- $<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,-Bstatic>
35
34
  capnp_objs
36
35
  ymq_objs
37
36
  object_storage_server_objs
38
- $<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,-Bdynamic>
39
37
  CapnProto::capnp
40
38
  CapnProto::kj
41
39
  Python3::Module
@@ -138,6 +138,8 @@ void ObjectStorageServer::processRequests(std::function<bool()> running)
138
138
  auto maybeMessageFuture = ymq::futureRecvMessage(_ioSocket);
139
139
  while (maybeMessageFuture.wait_for(100ms) == std::future_status::timeout) {
140
140
  if (!running()) {
141
+ _logger.log(scaler::ymq::Logger::LoggingLevel::info, "ObjectStorageServer: stopped by user");
142
+ pendingRequests.clear();
141
143
  return;
142
144
  }
143
145
  }
@@ -0,0 +1 @@
1
+ 1.12.12
@@ -37,6 +37,7 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
37
37
  self,
38
38
  event_loop: str,
39
39
  agent_address: ZMQConfig,
40
+ scheduler_address: ZMQConfig,
40
41
  storage_address: ObjectStorageConfig,
41
42
  preload: Optional[str],
42
43
  resume_event: Optional[EventType],
@@ -50,6 +51,7 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
50
51
 
51
52
  self._event_loop = event_loop
52
53
  self._agent_address = agent_address
54
+ self._scheduler_address = scheduler_address
53
55
  self._storage_address = storage_address
54
56
  self._preload = preload
55
57
 
@@ -74,6 +76,10 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
74
76
  """Returns the current Processor instance controlling the current process, if any."""
75
77
  return _current_processor.get()
76
78
 
79
+ def scheduler_address(self) -> ZMQConfig:
80
+ """Returns the scheduler address this processor's worker is connected to."""
81
+ return self._scheduler_address
82
+
77
83
  def current_task(self) -> Optional[Task]:
78
84
  return self._current_task
79
85
 
@@ -19,6 +19,7 @@ class ProcessorHolder:
19
19
  self,
20
20
  event_loop: str,
21
21
  agent_address: ZMQConfig,
22
+ scheduler_address: ZMQConfig,
22
23
  storage_address: ObjectStorageConfig,
23
24
  preload: Optional[str],
24
25
  garbage_collect_interval_seconds: int,
@@ -43,6 +44,7 @@ class ProcessorHolder:
43
44
  self._processor = Processor(
44
45
  event_loop=event_loop,
45
46
  agent_address=agent_address,
47
+ scheduler_address=scheduler_address,
46
48
  storage_address=storage_address,
47
49
  preload=preload,
48
50
  resume_event=self._resume_event,
@@ -23,6 +23,7 @@ class VanillaProcessorManager(ProcessorManager):
23
23
  identity: WorkerID,
24
24
  event_loop: str,
25
25
  address_internal: ZMQConfig,
26
+ scheduler_address: ZMQConfig,
26
27
  preload: Optional[str],
27
28
  garbage_collect_interval_seconds: int,
28
29
  trim_memory_threshold_bytes: int,
@@ -34,6 +35,7 @@ class VanillaProcessorManager(ProcessorManager):
34
35
 
35
36
  self._identity = identity
36
37
  self._event_loop = event_loop
38
+ self._scheduler_address = scheduler_address
37
39
  self._preload = preload
38
40
 
39
41
  self._garbage_collect_interval_seconds = garbage_collect_interval_seconds
@@ -299,6 +301,7 @@ class VanillaProcessorManager(ProcessorManager):
299
301
  self._current_holder = ProcessorHolder(
300
302
  self._event_loop,
301
303
  self._address_internal,
304
+ self._scheduler_address,
302
305
  storage_address,
303
306
  self._preload,
304
307
  self._garbage_collect_interval_seconds,
@@ -139,6 +139,7 @@ class Worker(multiprocessing.get_context("spawn").Process): # type: ignore
139
139
  identity=self._ident,
140
140
  event_loop=self._event_loop,
141
141
  address_internal=self._address_internal,
142
+ scheduler_address=self._address,
142
143
  preload=self._preload,
143
144
  garbage_collect_interval_seconds=self._garbage_collect_interval_seconds,
144
145
  trim_memory_threshold_bytes=self._trim_memory_threshold_bytes,
@@ -320,6 +320,14 @@ class TestClient(unittest.TestCase):
320
320
  # but new tasks should work fine
321
321
  self.assertEqual(client.submit(round, 3.14).result(), 3.0)
322
322
 
323
+ def test_client_no_address_outside_worker(self):
324
+ """Test that creating a Client without an address outside worker context raises ValueError."""
325
+ with self.assertRaises(ValueError) as context:
326
+ Client()
327
+
328
+ self.assertIn("No scheduler address provided", str(context.exception))
329
+ self.assertIn("not running inside a worker context", str(context.exception))
330
+
323
331
 
324
332
  class TestClientPreload(unittest.TestCase):
325
333
  # Separate class for preload functionality with separate cluster to avoid interfering with time-sensitive tests
@@ -34,6 +34,18 @@ class TestNestedTask(unittest.TestCase):
34
34
  result = client.submit(fibonacci, client, 8).result()
35
35
  self.assertEqual(result, 21)
36
36
 
37
+ def test_nested_task_auto_address(self) -> None:
38
+ """Test nested task with automatic scheduler address detection."""
39
+ with Client(self.address) as client:
40
+ result = client.submit(nested_task_auto_address, 5).result()
41
+ self.assertEqual(result, 25)
42
+
43
+ def test_nested_task_explicit_address(self) -> None:
44
+ """Test nested task with explicit scheduler address (honors user-provided address)."""
45
+ with Client(self.address) as client:
46
+ result = client.submit(nested_task_explicit_address, self.address, 7).result()
47
+ self.assertEqual(result, 49)
48
+
37
49
 
38
50
  def parent_task_arg_client(client: Client) -> int:
39
51
  iterable = [(v,) for v in range(0, N_TASKS)]
@@ -60,3 +72,25 @@ def fibonacci(client: Client, n: int):
60
72
  a = client.submit(fibonacci, client, n - 1)
61
73
  b = client.submit(fibonacci, client, n - 2)
62
74
  return a.result() + b.result()
75
+
76
+
77
+ def nested_task_auto_address(value: int) -> int:
78
+ """Test function that creates a nested client without providing an address."""
79
+ # Client should automatically detect worker context and use worker's scheduler address
80
+ client = Client()
81
+ try:
82
+ result = client.submit(nested_task, value).result()
83
+ return result
84
+ finally:
85
+ client.disconnect()
86
+
87
+
88
+ def nested_task_explicit_address(scheduler_address: str, value: int) -> int:
89
+ """Test function that creates a nested client with an explicit address."""
90
+ # Client should honor the explicitly provided address even though running in worker context
91
+ client = Client(address=scheduler_address)
92
+ try:
93
+ result = client.submit(nested_task, value).result()
94
+ return result
95
+ finally:
96
+ client.disconnect()
@@ -1 +0,0 @@
1
- 1.12.9