UncountablePythonSDK 0.0.116__tar.gz → 0.0.118__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 UncountablePythonSDK might be problematic. Click here for more details.

Files changed (342) hide show
  1. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/.github/workflows/publish.yml +1 -1
  3. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  5. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/UncountablePythonSDK.egg-info/SOURCES.txt +5 -0
  6. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/justfile +1 -1
  7. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/example_instrument.py +33 -1
  8. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/pyproject.toml +1 -1
  9. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/argument_parser/__init__.py +1 -0
  10. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/argument_parser/argument_parser.py +3 -3
  11. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/builder.py +2 -0
  12. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_open_api.py +64 -9
  13. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/open_api_util.py +12 -5
  14. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/value_spec/emit_python.py +6 -1
  15. uncountablepythonsdk-0.0.118/uncountable/integration/cli.py +106 -0
  16. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/command_client.py +26 -0
  17. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/command_server.py +42 -2
  18. uncountablepythonsdk-0.0.118/uncountable/integration/queue_runner/command_server/constants.py +4 -0
  19. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +18 -0
  20. uncountablepythonsdk-0.0.118/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +49 -0
  21. uncountablepythonsdk-0.0.118/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +87 -0
  22. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +45 -0
  23. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +28 -0
  24. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/datastore/interface.py +5 -0
  25. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/job_scheduler.py +3 -8
  26. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/queue_runner.py +10 -2
  27. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/__init__.py +4 -0
  28. uncountablepythonsdk-0.0.118/uncountable/types/api/integrations/publish_realtime_data.py +41 -0
  29. uncountablepythonsdk-0.0.118/uncountable/types/api/uploader/__init__.py +1 -0
  30. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/entity_t.py +1 -1
  31. uncountablepythonsdk-0.0.118/uncountable/types/integrations.py +10 -0
  32. uncountablepythonsdk-0.0.118/uncountable/types/integrations_t.py +62 -0
  33. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/queued_job.py +1 -0
  34. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/queued_job_t.py +11 -2
  35. uncountablepythonsdk-0.0.116/uncountable/integration/cli.py +0 -49
  36. uncountablepythonsdk-0.0.116/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -40
  37. uncountablepythonsdk-0.0.116/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -38
  38. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/.gitignore +0 -0
  39. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/.python-version +0 -0
  40. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/README.md +0 -0
  41. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  42. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  43. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  44. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/.gitignore +0 -0
  45. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/conf.py +0 -0
  46. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/index.md +0 -0
  47. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/quickstart.md +0 -0
  48. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/requirements.txt +0 -0
  49. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/android-chrome-192x192.png +0 -0
  50. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/android-chrome-512x512.png +0 -0
  51. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/apple-touch-icon.png +0 -0
  52. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/browserconfig.xml +0 -0
  53. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/favicon-16x16.png +0 -0
  54. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/favicon-32x32.png +0 -0
  55. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/manifest.json +0 -0
  56. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/mstile-150x150.png +0 -0
  57. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  58. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/docs/static/logo_blue.png +0 -0
  59. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/async_batch.py +0 -0
  60. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/create_entity.py +0 -0
  61. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/create_ingredient_sdk.py +0 -0
  62. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/download_files.py +0 -0
  63. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/edit_recipe_inputs.py +0 -0
  64. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  65. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  66. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  67. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  68. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  69. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  70. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/invoke_uploader.py +0 -0
  71. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/set_recipe_metadata_file.py +0 -0
  72. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/set_recipe_output_file_sdk.py +0 -0
  73. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/examples/upload_files.py +0 -0
  74. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/__init__.py +0 -0
  75. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/argument_parser/_is_enum.py +0 -0
  76. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  77. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/argument_parser/case_convert.py +0 -0
  78. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/__init__.py +0 -0
  79. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/_blob_session.py +0 -0
  80. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  81. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/_local_session.py +0 -0
  82. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/_s3_session.py +0 -0
  83. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  84. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  85. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  86. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/py.typed +0 -0
  87. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/__init__.py +0 -0
  88. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/annotation.py +0 -0
  89. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/missing_sentry.py +0 -0
  90. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/opaque_key.py +0 -0
  91. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/serial_alias.py +0 -0
  92. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/serial_class.py +0 -0
  93. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/serial_generic.py +0 -0
  94. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/serial_union.py +0 -0
  95. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization/yaml.py +0 -0
  96. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization_util/__init__.py +0 -0
  97. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  98. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  99. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization_util/dataclasses.py +0 -0
  100. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/serialization_util/serialization_helpers.py +0 -0
  101. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/strenum_compat/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/strenum_compat/strenum_compat.py +0 -0
  103. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/__init__.py +0 -0
  104. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/__main__.py +0 -0
  105. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  107. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  108. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/config.py +0 -0
  109. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/cross_output_links.py +0 -0
  110. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_io_ts.py +0 -0
  111. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_open_api_util.py +0 -0
  112. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_python.py +0 -0
  113. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_typescript.py +0 -0
  114. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/emit_typescript_util.py +0 -0
  115. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/load_types.py +0 -0
  116. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  117. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/parts/base.py.prepart +0 -0
  118. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  119. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/test.py +0 -0
  120. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/type_info/__main__.py +0 -0
  121. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  122. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  123. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  124. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/util.py +0 -0
  125. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/value_spec/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/value_spec/__main__.py +0 -0
  127. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  128. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pkgs/type_spec/value_spec/types.py +0 -0
  129. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/pyproject.toml +0 -0
  130. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/setup.cfg +0 -0
  131. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/__init__.py +0 -0
  132. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/__init__.py +0 -0
  133. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/async_batch.py +0 -0
  134. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/client.py +0 -0
  135. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/environment.py +0 -0
  136. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/file_upload.py +0 -0
  137. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/core/types.py +0 -0
  138. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/__init__.py +0 -0
  139. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/construct_client.py +0 -0
  140. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/cron.py +0 -0
  141. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/db/__init__.py +0 -0
  142. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/db/connect.py +0 -0
  143. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/db/session.py +0 -0
  144. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/entrypoint.py +0 -0
  145. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/executors/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/executors/executors.py +0 -0
  147. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  148. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/executors/script_executor.py +0 -0
  149. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/http_server/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/http_server/types.py +0 -0
  151. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/job.py +0 -0
  152. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  156. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  158. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/types.py +0 -0
  159. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/queue_runner/worker.py +0 -0
  160. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/scan_profiles.py +0 -0
  161. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/scheduler.py +0 -0
  162. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  164. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/server.py +0 -0
  165. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/telemetry.py +0 -0
  166. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  167. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/py.typed +0 -0
  168. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/batch/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/batch/execute_batch.py +0 -0
  171. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  172. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/chemical/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  174. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  175. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  176. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/create_entities.py +0 -0
  178. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/create_entity.py +0 -0
  179. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  180. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/export_entities.py +0 -0
  181. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/get_entities_data.py +0 -0
  182. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  183. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/list_entities.py +0 -0
  184. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/lock_entity.py +0 -0
  185. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/lookup_entity.py +0 -0
  186. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  187. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  188. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/set_values.py +0 -0
  189. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  190. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/entity/unlock_entity.py +0 -0
  191. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/equipment/__init__.py +0 -0
  192. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  193. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/field_options/__init__.py +0 -0
  194. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  195. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/files/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/files/download_file.py +0 -0
  197. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/id_source/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/id_source/list_id_source.py +0 -0
  199. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/id_source/match_id_source.py +0 -0
  200. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/input_groups/__init__.py +0 -0
  201. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  202. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/create_inputs.py +0 -0
  204. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/get_input_data.py +0 -0
  205. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/get_input_names.py +0 -0
  206. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  207. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  208. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/set_input_category.py +0 -0
  209. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  210. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  211. {uncountablepythonsdk-0.0.116/uncountable/types/api/material_families → uncountablepythonsdk-0.0.118/uncountable/types/api/integrations}/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.116/uncountable/types/api/outputs → uncountablepythonsdk-0.0.118/uncountable/types/api/material_families}/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  214. {uncountablepythonsdk-0.0.116/uncountable/types/api/permissions → uncountablepythonsdk-0.0.118/uncountable/types/api/outputs}/__init__.py +0 -0
  215. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/outputs/get_output_data.py +0 -0
  216. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/outputs/get_output_names.py +0 -0
  217. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  218. {uncountablepythonsdk-0.0.116/uncountable/types/api/project → uncountablepythonsdk-0.0.118/uncountable/types/api/permissions}/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  220. {uncountablepythonsdk-0.0.116/uncountable/types/api/recipe_links → uncountablepythonsdk-0.0.118/uncountable/types/api/project}/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/project/get_projects.py +0 -0
  222. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/project/get_projects_data.py +0 -0
  223. {uncountablepythonsdk-0.0.116/uncountable/types/api/recipe_metadata → uncountablepythonsdk-0.0.118/uncountable/types/api/recipe_links}/__init__.py +0 -0
  224. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  225. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  226. {uncountablepythonsdk-0.0.116/uncountable/types/api/recipes → uncountablepythonsdk-0.0.118/uncountable/types/api/recipe_metadata}/__init__.py +0 -0
  227. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  228. {uncountablepythonsdk-0.0.116/uncountable/types/api/runsheet → uncountablepythonsdk-0.0.118/uncountable/types/api/recipes}/__init__.py +0 -0
  229. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  230. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  231. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  232. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  233. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  234. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  235. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  236. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/create_recipe.py +0 -0
  237. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/create_recipes.py +0 -0
  238. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  239. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  240. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  241. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_curve.py +0 -0
  242. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  243. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  244. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  245. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  246. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  247. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  248. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  249. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  250. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  251. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  252. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  253. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  254. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  255. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  256. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  257. {uncountablepythonsdk-0.0.116/uncountable/types/api/triggers → uncountablepythonsdk-0.0.118/uncountable/types/api/runsheet}/__init__.py +0 -0
  258. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  259. {uncountablepythonsdk-0.0.116/uncountable/types/api/uploader → uncountablepythonsdk-0.0.118/uncountable/types/api/triggers}/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/triggers/run_trigger.py +0 -0
  261. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  262. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/async_batch.py +0 -0
  263. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/async_batch_processor.py +0 -0
  264. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/async_batch_t.py +0 -0
  265. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/async_jobs.py +0 -0
  266. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/async_jobs_t.py +0 -0
  267. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/auth_retrieval.py +0 -0
  268. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/auth_retrieval_t.py +0 -0
  269. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/base.py +0 -0
  270. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/base_t.py +0 -0
  271. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/calculations.py +0 -0
  272. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/calculations_t.py +0 -0
  273. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/chemical_structure.py +0 -0
  274. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/chemical_structure_t.py +0 -0
  275. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/client_base.py +0 -0
  276. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/client_config.py +0 -0
  277. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/client_config_t.py +0 -0
  278. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/curves.py +0 -0
  279. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/curves_t.py +0 -0
  280. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/data.py +0 -0
  281. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/data_t.py +0 -0
  282. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/entity.py +0 -0
  283. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/experiment_groups.py +0 -0
  284. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/experiment_groups_t.py +0 -0
  285. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/exports.py +0 -0
  286. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/exports_t.py +0 -0
  287. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/field_values.py +0 -0
  288. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/field_values_t.py +0 -0
  289. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/fields.py +0 -0
  290. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/fields_t.py +0 -0
  291. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/generic_upload.py +0 -0
  292. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/generic_upload_t.py +0 -0
  293. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/id_source.py +0 -0
  294. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/id_source_t.py +0 -0
  295. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/identifier.py +0 -0
  296. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/identifier_t.py +0 -0
  297. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/input_attributes.py +0 -0
  298. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/input_attributes_t.py +0 -0
  299. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/inputs.py +0 -0
  300. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/inputs_t.py +0 -0
  301. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/integration_server.py +0 -0
  302. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/integration_server_t.py +0 -0
  303. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/job_definition.py +0 -0
  304. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/job_definition_t.py +0 -0
  305. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/outputs.py +0 -0
  306. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/outputs_t.py +0 -0
  307. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/overrides.py +0 -0
  308. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/overrides_t.py +0 -0
  309. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/permissions.py +0 -0
  310. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/permissions_t.py +0 -0
  311. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/phases.py +0 -0
  312. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/phases_t.py +0 -0
  313. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/post_base.py +0 -0
  314. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/post_base_t.py +0 -0
  315. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_identifiers.py +0 -0
  316. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_identifiers_t.py +0 -0
  317. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_inputs.py +0 -0
  318. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_inputs_t.py +0 -0
  319. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_links.py +0 -0
  320. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_links_t.py +0 -0
  321. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_metadata.py +0 -0
  322. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_metadata_t.py +0 -0
  323. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_output_metadata.py +0 -0
  324. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_output_metadata_t.py +0 -0
  325. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_tags.py +0 -0
  326. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_tags_t.py +0 -0
  327. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_workflow_steps.py +0 -0
  328. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  329. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipes.py +0 -0
  330. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/recipes_t.py +0 -0
  331. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/response.py +0 -0
  332. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/response_t.py +0 -0
  333. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/secret_retrieval.py +0 -0
  334. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/secret_retrieval_t.py +0 -0
  335. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/units.py +0 -0
  336. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/units_t.py +0 -0
  337. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/users.py +0 -0
  338. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/users_t.py +0 -0
  339. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/webhook_job.py +0 -0
  340. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/webhook_job_t.py +0 -0
  341. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/workflows.py +0 -0
  342. {uncountablepythonsdk-0.0.116 → uncountablepythonsdk-0.0.118}/uncountable/types/workflows_t.py +0 -0
@@ -17,7 +17,7 @@ jobs:
17
17
  - name: Set up UV
18
18
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
19
19
  with:
20
- version: "0.7.1"
20
+ version: "0.8.4"
21
21
  activate-environment: true
22
22
  enable-cache: true
23
23
  - name: Install dependencies
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Set up UV
26
26
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
27
27
  with:
28
- version: "0.7.1"
28
+ version: "0.8.4"
29
29
  activate-environment: true
30
30
  enable-cache: true
31
31
  - name: Install build dependencies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.116
3
+ Version: 0.0.118
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.116
3
+ Version: 0.0.118
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -138,6 +138,7 @@ uncountable/integration/queue_runner/worker.py
138
138
  uncountable/integration/queue_runner/command_server/__init__.py
139
139
  uncountable/integration/queue_runner/command_server/command_client.py
140
140
  uncountable/integration/queue_runner/command_server/command_server.py
141
+ uncountable/integration/queue_runner/command_server/constants.py
141
142
  uncountable/integration/queue_runner/command_server/types.py
142
143
  uncountable/integration/queue_runner/command_server/protocol/__init__.py
143
144
  uncountable/integration/queue_runner/command_server/protocol/command_server.proto
@@ -194,6 +195,8 @@ uncountable/types/inputs.py
194
195
  uncountable/types/inputs_t.py
195
196
  uncountable/types/integration_server.py
196
197
  uncountable/types/integration_server_t.py
198
+ uncountable/types/integrations.py
199
+ uncountable/types/integrations_t.py
197
200
  uncountable/types/job_definition.py
198
201
  uncountable/types/job_definition_t.py
199
202
  uncountable/types/outputs.py
@@ -279,6 +282,8 @@ uncountable/types/api/inputs/set_input_attribute_values.py
279
282
  uncountable/types/api/inputs/set_input_category.py
280
283
  uncountable/types/api/inputs/set_input_subcategories.py
281
284
  uncountable/types/api/inputs/set_intermediate_type.py
285
+ uncountable/types/api/integrations/__init__.py
286
+ uncountable/types/api/integrations/publish_realtime_data.py
282
287
  uncountable/types/api/material_families/__init__.py
283
288
  uncountable/types/api/material_families/update_entity_material_families.py
284
289
  uncountable/types/api/outputs/__init__.py
@@ -1,5 +1,5 @@
1
1
  docs-setup-python:
2
- curl -LsSf https://astral.sh/uv/0.7.1/install.sh | sh
2
+ curl -LsSf https://astral.sh/uv/0.8.4/install.sh | sh
3
3
  uv pip install -r requirements.txt
4
4
 
5
5
  docs-clean:
@@ -1,7 +1,17 @@
1
+ import time
1
2
  from dataclasses import dataclass
3
+ from decimal import Decimal
2
4
 
3
5
  from uncountable.integration.job import JobArguments, WebhookJob, register_job
4
- from uncountable.types import base_t, entity_t, job_definition_t
6
+ from uncountable.types import (
7
+ base_t,
8
+ entity_t,
9
+ identifier_t,
10
+ integrations_t,
11
+ job_definition_t,
12
+ publish_realtime_data_t,
13
+ )
14
+ from uncountable.types.client_base import APIRequest
5
15
 
6
16
 
7
17
  @dataclass(kw_only=True)
@@ -31,6 +41,28 @@ class InstrumentExample(WebhookJob[InstrumentPayload]):
31
41
 
32
42
  args.logger.log_info(f"Instrument ID: {instrument_id}")
33
43
 
44
+ for i in range(10):
45
+ req_args = publish_realtime_data_t.Arguments(
46
+ data_package=integrations_t.DataPackageNumericReading(
47
+ value=Decimal(i * 15),
48
+ target_entity=entity_t.EntityIdentifier(
49
+ identifier_key=identifier_t.IdentifierKeyId(
50
+ id=payload.equipment_id
51
+ ),
52
+ type=entity_t.EntityType.EQUIPMENT,
53
+ ),
54
+ ),
55
+ )
56
+ api_request = APIRequest(
57
+ method=publish_realtime_data_t.ENDPOINT_METHOD,
58
+ endpoint=publish_realtime_data_t.ENDPOINT_PATH,
59
+ args=req_args,
60
+ )
61
+ args.client.do_request(
62
+ api_request=api_request, return_type=publish_realtime_data_t.Data
63
+ )
64
+ time.sleep(0.75)
65
+
34
66
  return job_definition_t.JobResult(success=True)
35
67
 
36
68
  @property
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
11
  "more_itertools == 10.*",
12
- "types-paramiko ==3.5.0.20240918",
12
+ "types-paramiko ==3.5.0.20250708",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
15
  "types-pytz ==2025.*",
@@ -7,6 +7,7 @@ from .argument_parser import ParserFunction as ParserFunction
7
7
  from .argument_parser import ParserOptions as ParserOptions
8
8
  from .argument_parser import SourceEncoding as SourceEncoding
9
9
  from .argument_parser import build_parser as build_parser
10
+ from .argument_parser import is_missing as is_missing
10
11
  from .argument_parser import is_optional as is_optional
11
12
  from .argument_parser import is_union as is_union
12
13
  from .case_convert import camel_to_snake_case as camel_to_snake_case
@@ -223,7 +223,7 @@ def _build_parser_inner(
223
223
  )
224
224
 
225
225
  if dataclasses.is_dataclass(parsed_type):
226
- return _build_parser_dataclass(parsed_type, context) # type: ignore[arg-type]
226
+ return _build_parser_dataclass(parsed_type, context)
227
227
 
228
228
  # namedtuple support
229
229
  if is_namedtuple_type(parsed_type):
@@ -244,7 +244,7 @@ def _build_parser_inner(
244
244
  })
245
245
 
246
246
  if parsed_type == type(None): # noqa: E721
247
- return lambda value: _invoke_membership_parser({None}, value) # type: ignore
247
+ return lambda value: _invoke_membership_parser({None}, value)
248
248
 
249
249
  origin = typing.get_origin(parsed_type)
250
250
  if origin is tuple:
@@ -271,7 +271,7 @@ def _build_parser_inner(
271
271
  arg_parsers = [_build_parser_inner(arg, context) for arg in sorted_args]
272
272
  return lambda value: _invoke_fallback_parsers(parsed_type, arg_parsers, value)
273
273
 
274
- if parsed_type is typing.Any: # type: ignore[comparison-overlap]
274
+ if parsed_type is typing.Any:
275
275
  return lambda value: value
276
276
 
277
277
  if origin in (list, set):
@@ -745,6 +745,8 @@ class SpecTypeDefnStringEnum(SpecTypeDefn):
745
745
  builder.ensure(
746
746
  isinstance(enum_value, str), "enum value should be string"
747
747
  )
748
+ assert isinstance(enum_value, str)
749
+
748
750
  deprecated = value.get("deprecated", False)
749
751
  builder.ensure(
750
752
  isinstance(deprecated, bool),
@@ -279,7 +279,12 @@ def _emit_stability_level(
279
279
  case EmitOpenAPIStabilityLevel.draft:
280
280
  stability_info["x-beta"] = True
281
281
  case EmitOpenAPIStabilityLevel.beta:
282
- stability_info["x-badges"] = [{"name": "Beta", "color": "DarkOrange"}]
282
+ stability_info["x-badges"] = [
283
+ {
284
+ "name": "Beta",
285
+ "color": "DarkOrange",
286
+ }
287
+ ]
283
288
  case EmitOpenAPIStabilityLevel.stable:
284
289
  pass
285
290
  case _:
@@ -334,18 +339,57 @@ def _emit_endpoint_response_examples(
334
339
  return {"examples": response_examples}
335
340
 
336
341
 
342
+ def _create_warning_banner(api_type: str, message: str) -> str:
343
+ return (
344
+ f'<div style="background-color: #fff3cd; border: 1px solid #ffeaa7; '
345
+ f'border-radius: 4px; padding: 12px; margin-bottom: 16px;">'
346
+ f"<strong>⚠️ {api_type} API:</strong> {message}"
347
+ f"</div>"
348
+ )
349
+
350
+
351
+ def _get_stability_warning(
352
+ stability_level: EmitOpenAPIStabilityLevel | None,
353
+ ) -> str:
354
+ resolved_stability_level = (
355
+ stability_level
356
+ if stability_level is not None
357
+ else EmitOpenAPIStabilityLevel.stable
358
+ )
359
+
360
+ match resolved_stability_level:
361
+ case EmitOpenAPIStabilityLevel.draft:
362
+ return _create_warning_banner(
363
+ "Draft",
364
+ "This endpoint is in draft status and may change significantly. Not recommended for production use.",
365
+ )
366
+ case EmitOpenAPIStabilityLevel.beta:
367
+ return _create_warning_banner(
368
+ "Beta",
369
+ "This endpoint is in beta and its required parameters may change. Use with caution in production environments.",
370
+ )
371
+ case EmitOpenAPIStabilityLevel.stable:
372
+ return ""
373
+
374
+
337
375
  def _emit_endpoint_description(
338
- description: str, guides: list[EmitOpenAPIGuide]
376
+ description: str,
377
+ guides: list[EmitOpenAPIGuide],
378
+ stability_level: EmitOpenAPIStabilityLevel | None = None,
339
379
  ) -> dict[str, str]:
380
+ stability_warning = _get_stability_warning(stability_level)
381
+
340
382
  full_guides = "<br/>".join([
341
383
  _write_guide_as_html(guide, is_open=False)
342
384
  for guide in sorted(guides, key=lambda g: g.ref_name)
343
385
  ])
344
- return {
345
- "description": description
346
- if len(guides) == 0
347
- else f"{description}<br/>{full_guides}"
348
- }
386
+
387
+ full_description_parts = [
388
+ part for part in [stability_warning, description, full_guides] if part
389
+ ]
390
+ full_description = "<br/>".join(full_description_parts)
391
+
392
+ return {"description": full_description}
349
393
 
350
394
 
351
395
  def _emit_namespace(
@@ -381,7 +425,9 @@ def _emit_namespace(
381
425
  "summary": endpoint.summary,
382
426
  }
383
427
  | _emit_endpoint_deprecated(endpoint.deprecated)
384
- | _emit_endpoint_description(endpoint.description, ctx.endpoint.guides)
428
+ | _emit_endpoint_description(
429
+ endpoint.description, ctx.endpoint.guides, endpoint.stability_level
430
+ )
385
431
  | _emit_stability_level(endpoint.stability_level)
386
432
  | _emit_endpoint_parameters(endpoint, argument_type, ctx.endpoint.examples)
387
433
  | _emit_endpoint_request_body(
@@ -479,9 +525,18 @@ def _emit_type(
479
525
  return
480
526
 
481
527
  if isinstance(stype, builder.SpecTypeDefnUnion):
528
+ converted_discriminator_map: dict[str, OpenAPIRefType] = dict()
529
+ if stype.discriminator_map is not None:
530
+ for discriminator_value, base_type in stype.discriminator_map.items():
531
+ converted_base_type = open_api_type(ctx, base_type, config=config)
532
+ assert isinstance(converted_base_type, OpenAPIRefType)
533
+ converted_discriminator_map[discriminator_value] = converted_base_type
482
534
  ctx.types[stype.name] = OpenAPIUnionType(
483
535
  [open_api_type(ctx, p, config=config) for p in stype.types],
484
- discrimnator=stype.discriminator,
536
+ discriminator=stype.discriminator,
537
+ discriminator_map=converted_discriminator_map
538
+ if stype.discriminator_map is not None
539
+ else None,
485
540
  )
486
541
  return
487
542
 
@@ -223,19 +223,26 @@ class OpenAPIUnionType(OpenAPIType):
223
223
  base_types: list[OpenAPIType],
224
224
  description: str | None = None,
225
225
  nullable: bool = False,
226
- discrimnator: str | None = None,
227
- discriminator_map: dict[str, OpenAPIType] | None = None,
226
+ discriminator: str | None = None,
227
+ discriminator_map: dict[str, OpenAPIRefType] | None = None,
228
228
  ) -> None:
229
229
  self.base_types = base_types
230
- self._discriminator = discrimnator
230
+ self._discriminator = discriminator
231
+ self._discriminator_map = discriminator_map
231
232
  super().__init__(description=description, nullable=nullable)
232
233
 
233
234
  def asdict(self) -> dict[str, object]:
234
235
  # TODO: use parents description and nullable
235
236
  return {
236
237
  "oneOf": [base_type.asdict() for base_type in self.base_types],
237
- "discriminator": {"propertyName": self._discriminator}
238
- if self._discriminator is not None
238
+ "discriminator": {
239
+ "propertyName": self._discriminator,
240
+ "mapping": {
241
+ discriminator_value: base_type.source
242
+ for discriminator_value, base_type in self._discriminator_map.items()
243
+ },
244
+ }
245
+ if self._discriminator is not None and self._discriminator_map is not None
239
246
  else None,
240
247
  }
241
248
 
@@ -75,9 +75,14 @@ def _emit_function_wrapper(function: value_spec_t.Function) -> str:
75
75
  ):
76
76
  python_type += " | None"
77
77
  any_pass_null = True
78
+
79
+ if python_type.startswith("base_t.ExtJsonValue"):
80
+ return_statement = f"self._extract({index})"
81
+ else:
82
+ return_statement = f"cast({python_type}, self._extract({index}))"
78
83
  out.write(
79
84
  f"""{INDENT}def get_{argument.ref_name}(self) -> {python_type}:
80
- {INDENT}{INDENT}return cast({python_type}, self._extract({index}))
85
+ {INDENT}{INDENT}return {return_statement}
81
86
  """
82
87
  )
83
88
  out.write("\n")
@@ -0,0 +1,106 @@
1
+ import argparse
2
+
3
+ from dateutil import tz
4
+ from opentelemetry.trace import get_current_span
5
+ from tabulate import tabulate
6
+
7
+ from uncountable.core.environment import get_local_admin_server_port
8
+ from uncountable.integration.queue_runner.command_server.command_client import (
9
+ send_job_queue_message,
10
+ send_list_queued_jobs_message,
11
+ )
12
+ from uncountable.integration.telemetry import Logger
13
+ from uncountable.types import queued_job_t
14
+
15
+
16
+ def register_enqueue_job_parser(
17
+ sub_parser_manager: argparse._SubParsersAction,
18
+ ) -> None:
19
+ run_parser = sub_parser_manager.add_parser(
20
+ "run",
21
+ description="Process a job with a given command and job ID.",
22
+ )
23
+ run_parser.add_argument("job_id", type=str, help="The ID of the job to process")
24
+
25
+ def _handle_enqueue_job(args: argparse.Namespace) -> None:
26
+ send_job_queue_message(
27
+ job_ref_name=args.job_id,
28
+ payload=queued_job_t.QueuedJobPayload(
29
+ invocation_context=queued_job_t.InvocationContextManual()
30
+ ),
31
+ host=args.host,
32
+ port=get_local_admin_server_port(),
33
+ )
34
+
35
+ run_parser.set_defaults(func=_handle_enqueue_job)
36
+
37
+
38
+ def register_list_queued_jobs(
39
+ sub_parser_manager: argparse._SubParsersAction,
40
+ ) -> None:
41
+ list_queued_jobs_parser = sub_parser_manager.add_parser(
42
+ "list-queued-jobs", description="List jobs queued on the integration server."
43
+ )
44
+
45
+ list_queued_jobs_parser.add_argument(
46
+ "--offset",
47
+ type=int,
48
+ default=0,
49
+ help="Number of jobs to skip. Should be non-negative.",
50
+ )
51
+ list_queued_jobs_parser.add_argument(
52
+ "--limit",
53
+ type=int,
54
+ default=100,
55
+ help="A number between 1 and 100 specifying the number of jobs to return in the result set.",
56
+ )
57
+
58
+ def _handle_list_queued_jobs(args: argparse.Namespace) -> None:
59
+ queued_jobs = send_list_queued_jobs_message(
60
+ offset=args.offset,
61
+ limit=args.limit,
62
+ host=args.host,
63
+ port=get_local_admin_server_port(),
64
+ )
65
+
66
+ headers = ["UUID", "Job Ref Name", "Attempts", "Submitted At"]
67
+ rows = [
68
+ [
69
+ job.uuid,
70
+ job.job_ref_name,
71
+ job.num_attempts,
72
+ job.submitted_at.ToDatetime(tz.UTC).astimezone(tz.tzlocal()),
73
+ ]
74
+ for job in queued_jobs
75
+ ]
76
+ print(tabulate(rows, headers=headers, tablefmt="grid"))
77
+
78
+ list_queued_jobs_parser.set_defaults(func=_handle_list_queued_jobs)
79
+
80
+
81
+ def main() -> None:
82
+ logger = Logger(get_current_span())
83
+
84
+ parser = argparse.ArgumentParser(
85
+ description="Execute a given integrations server command."
86
+ )
87
+
88
+ parser.add_argument(
89
+ "--host", type=str, default="localhost", nargs="?", help="The host to run on"
90
+ )
91
+
92
+ subparser_action = parser.add_subparsers(
93
+ dest="command",
94
+ required=True,
95
+ help="The command to execute (e.g., 'run')",
96
+ )
97
+
98
+ register_enqueue_job_parser(subparser_action)
99
+ register_list_queued_jobs(subparser_action)
100
+
101
+ args = parser.parse_args()
102
+ with logger.push_scope(args.command):
103
+ args.func(args)
104
+
105
+
106
+ main()
@@ -10,6 +10,8 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
10
10
  CheckHealthResult,
11
11
  EnqueueJobRequest,
12
12
  EnqueueJobResult,
13
+ ListQueuedJobsRequest,
14
+ ListQueuedJobsResult,
13
15
  )
14
16
  from uncountable.integration.queue_runner.command_server.types import (
15
17
  CommandServerBadResponse,
@@ -66,3 +68,27 @@ def check_health(*, host: str = _LOCAL_RPC_HOST, port: int) -> bool:
66
68
  assert isinstance(response, CheckHealthResult)
67
69
 
68
70
  return response.success
71
+
72
+
73
+ def send_list_queued_jobs_message(
74
+ *,
75
+ offset: int,
76
+ limit: int,
77
+ host: str = "localhost",
78
+ port: int,
79
+ ) -> list[ListQueuedJobsResult.ListQueuedJobsResultItem]:
80
+ with command_server_connection(host=host, port=port) as stub:
81
+ request = ListQueuedJobsRequest(
82
+ offset=offset,
83
+ limit=limit,
84
+ )
85
+
86
+ try:
87
+ response = stub.ListQueuedJobs(
88
+ request, timeout=_DEFAULT_MESSAGE_TIMEOUT_SECS
89
+ )
90
+ except grpc.RpcError as e:
91
+ raise ValueError(e.details()) # type: ignore
92
+
93
+ assert isinstance(response, ListQueuedJobsResult)
94
+ return list(response.queued_jobs)
@@ -1,7 +1,8 @@
1
1
  import asyncio
2
2
 
3
3
  import simplejson as json
4
- from grpc import aio
4
+ from google.protobuf.timestamp_pb2 import Timestamp
5
+ from grpc import StatusCode, aio
5
6
 
6
7
  from pkgs.argument_parser import CachedParser
7
8
  from uncountable.core.environment import get_local_admin_server_port
@@ -10,14 +11,18 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
10
11
  CheckHealthResult,
11
12
  EnqueueJobRequest,
12
13
  EnqueueJobResult,
14
+ ListQueuedJobsRequest,
15
+ ListQueuedJobsResult,
13
16
  )
14
17
  from uncountable.integration.queue_runner.command_server.types import (
15
18
  CommandEnqueueJob,
16
19
  CommandEnqueueJobResponse,
17
20
  CommandQueue,
18
21
  )
22
+ from uncountable.integration.queue_runner.datastore import DatastoreSqlite
19
23
  from uncountable.types import queued_job_t
20
24
 
25
+ from .constants import ListQueuedJobsConstants
21
26
  from .protocol.command_server_pb2_grpc import (
22
27
  CommandServerServicer,
23
28
  add_CommandServerServicer_to_server,
@@ -26,7 +31,7 @@ from .protocol.command_server_pb2_grpc import (
26
31
  queued_job_payload_parser = CachedParser(queued_job_t.QueuedJobPayload)
27
32
 
28
33
 
29
- async def serve(command_queue: CommandQueue) -> None:
34
+ async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None:
30
35
  server = aio.server()
31
36
 
32
37
  class CommandServerHandler(CommandServerServicer):
@@ -54,6 +59,41 @@ async def serve(command_queue: CommandQueue) -> None:
54
59
  ) -> CheckHealthResult:
55
60
  return CheckHealthResult(success=True)
56
61
 
62
+ async def ListQueuedJobs(
63
+ self, request: ListQueuedJobsRequest, context: aio.ServicerContext
64
+ ) -> ListQueuedJobsResult:
65
+ if (
66
+ request.limit < ListQueuedJobsConstants.LIMIT_MIN
67
+ or request.limit > ListQueuedJobsConstants.LIMIT_MAX
68
+ ):
69
+ await context.abort(
70
+ StatusCode.INVALID_ARGUMENT, "Limit must be between 1 and 100."
71
+ )
72
+
73
+ if request.offset < ListQueuedJobsConstants.OFFSET_MIN:
74
+ await context.abort(
75
+ StatusCode.INVALID_ARGUMENT, "Offset cannot be negative."
76
+ )
77
+
78
+ queued_job_metadata = datastore.list_queued_job_metadata(
79
+ offset=request.offset, limit=request.limit
80
+ )
81
+
82
+ response_list: list[ListQueuedJobsResult.ListQueuedJobsResultItem] = []
83
+ for item in queued_job_metadata:
84
+ proto_timestamp = Timestamp()
85
+ proto_timestamp.FromDatetime(item.submitted_at)
86
+
87
+ response_list.append(
88
+ ListQueuedJobsResult.ListQueuedJobsResultItem(
89
+ uuid=item.queued_job_uuid,
90
+ job_ref_name=item.job_ref_name,
91
+ num_attempts=item.num_attempts,
92
+ submitted_at=proto_timestamp,
93
+ )
94
+ )
95
+ return ListQueuedJobsResult(queued_jobs=response_list)
96
+
57
97
  add_CommandServerServicer_to_server(CommandServerHandler(), server)
58
98
 
59
99
  listen_addr = f"[::]:{get_local_admin_server_port()}"
@@ -0,0 +1,4 @@
1
+ class ListQueuedJobsConstants:
2
+ LIMIT_MIN = 1
3
+ LIMIT_MAX = 100
4
+ OFFSET_MIN = 0
@@ -1,8 +1,10 @@
1
1
  syntax = "proto3";
2
+ import "google/protobuf/timestamp.proto";
2
3
 
3
4
  service CommandServer {
4
5
  rpc EnqueueJob(EnqueueJobRequest) returns (EnqueueJobResult) {}
5
6
  rpc CheckHealth(CheckHealthRequest) returns (CheckHealthResult) {}
7
+ rpc ListQueuedJobs(ListQueuedJobsRequest) returns (ListQueuedJobsResult) {}
6
8
  }
7
9
 
8
10
  message EnqueueJobRequest {
@@ -20,3 +22,19 @@ message CheckHealthRequest {}
20
22
  message CheckHealthResult {
21
23
  bool success = 1;
22
24
  }
25
+
26
+ message ListQueuedJobsRequest {
27
+ uint32 offset = 1;
28
+ uint32 limit = 2;
29
+ }
30
+
31
+ message ListQueuedJobsResult {
32
+ message ListQueuedJobsResultItem {
33
+ string uuid = 1;
34
+ string job_ref_name = 2;
35
+ int64 num_attempts = 3;
36
+ google.protobuf.Timestamp submitted_at = 4;
37
+ }
38
+
39
+ repeated ListQueuedJobsResultItem queued_jobs = 1;
40
+ }
@@ -0,0 +1,49 @@
1
+ # ruff: noqa
2
+ # -*- coding: utf-8 -*-
3
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
4
+ # source: uncountable/integration/queue_runner/command_server/protocol/command_server.proto
5
+ # Protobuf Python Version: 4.25.1
6
+ """Generated protocol buffer code."""
7
+
8
+ from google.protobuf import descriptor as _descriptor
9
+ from google.protobuf import descriptor_pool as _descriptor_pool
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ # @@protoc_insertion_point(imports)
13
+
14
+ _sym_db = _symbol_database.Default()
15
+
16
+
17
+ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
18
+
19
+
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
21
+ b'\nQuncountable/integration/queue_runner/command_server/protocol/command_server.proto\x1a\x1fgoogle/protobuf/timestamp.proto"E\n\x11\x45nqueueJobRequest\x12\x14\n\x0cjob_ref_name\x18\x01 \x01(\t\x12\x1a\n\x12serialized_payload\x18\x02 \x01(\t"H\n\x10\x45nqueueJobResult\x12\x1b\n\x13successfully_queued\x18\x01 \x01(\x08\x12\x17\n\x0fqueued_job_uuid\x18\x02 \x01(\t"\x14\n\x12\x43heckHealthRequest"$\n\x11\x43heckHealthResult\x12\x0f\n\x07success\x18\x01 \x01(\x08"6\n\x15ListQueuedJobsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\r\x12\r\n\x05limit\x18\x02 \x01(\r"\xe4\x01\n\x14ListQueuedJobsResult\x12\x43\n\x0bqueued_jobs\x18\x01 \x03(\x0b\x32..ListQueuedJobsResult.ListQueuedJobsResultItem\x1a\x86\x01\n\x18ListQueuedJobsResultItem\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x14\n\x0cjob_ref_name\x18\x02 \x01(\t\x12\x14\n\x0cnum_attempts\x18\x03 \x01(\x03\x12\x30\n\x0csubmitted_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp2\xc3\x01\n\rCommandServer\x12\x35\n\nEnqueueJob\x12\x12.EnqueueJobRequest\x1a\x11.EnqueueJobResult"\x00\x12\x38\n\x0b\x43heckHealth\x12\x13.CheckHealthRequest\x1a\x12.CheckHealthResult"\x00\x12\x41\n\x0eListQueuedJobs\x12\x16.ListQueuedJobsRequest\x1a\x15.ListQueuedJobsResult"\x00\x62\x06proto3'
22
+ )
23
+
24
+ _globals = globals()
25
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
26
+ _builder.BuildTopDescriptorsAndMessages(
27
+ DESCRIPTOR,
28
+ "uncountable.integration.queue_runner.command_server.protocol.command_server_pb2",
29
+ _globals,
30
+ )
31
+ if _descriptor._USE_C_DESCRIPTORS == False:
32
+ DESCRIPTOR._options = None
33
+ _globals["_ENQUEUEJOBREQUEST"]._serialized_start = 118
34
+ _globals["_ENQUEUEJOBREQUEST"]._serialized_end = 187
35
+ _globals["_ENQUEUEJOBRESULT"]._serialized_start = 189
36
+ _globals["_ENQUEUEJOBRESULT"]._serialized_end = 261
37
+ _globals["_CHECKHEALTHREQUEST"]._serialized_start = 263
38
+ _globals["_CHECKHEALTHREQUEST"]._serialized_end = 283
39
+ _globals["_CHECKHEALTHRESULT"]._serialized_start = 285
40
+ _globals["_CHECKHEALTHRESULT"]._serialized_end = 321
41
+ _globals["_LISTQUEUEDJOBSREQUEST"]._serialized_start = 323
42
+ _globals["_LISTQUEUEDJOBSREQUEST"]._serialized_end = 377
43
+ _globals["_LISTQUEUEDJOBSRESULT"]._serialized_start = 380
44
+ _globals["_LISTQUEUEDJOBSRESULT"]._serialized_end = 608
45
+ _globals["_LISTQUEUEDJOBSRESULT_LISTQUEUEDJOBSRESULTITEM"]._serialized_start = 474
46
+ _globals["_LISTQUEUEDJOBSRESULT_LISTQUEUEDJOBSRESULTITEM"]._serialized_end = 608
47
+ _globals["_COMMANDSERVER"]._serialized_start = 611
48
+ _globals["_COMMANDSERVER"]._serialized_end = 806
49
+ # @@protoc_insertion_point(module_scope)