UncountablePythonSDK 0.0.175__tar.gz → 0.0.177__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/.github/workflows/publish.yml +1 -1
  2. {uncountablepythonsdk-0.0.175/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.177}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  4. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/UncountablePythonSDK.egg-info/SOURCES.txt +5 -0
  5. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/UncountablePythonSDK.egg-info/requires.txt +1 -1
  6. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/conf.py +20 -0
  7. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/actions_registry/__main__.py +1 -0
  8. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/actions_registry/emit_python.py +4 -0
  9. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/actions_registry/emit_typescript.py +4 -0
  10. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/value_spec/__main__.py +10 -0
  11. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/value_spec/emit_python.py +9 -0
  12. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pyproject.toml +1 -1
  13. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/file_upload.py +18 -13
  14. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/query/builder.py +10 -1
  15. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/query/column.py +29 -0
  16. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/cli.py +29 -0
  17. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/construct_client.py +6 -6
  18. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/job.py +27 -6
  19. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/command_client.py +20 -0
  20. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/command_server.py +19 -0
  21. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +9 -0
  22. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +9 -5
  23. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +12 -0
  24. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +47 -0
  25. uncountablepythonsdk-0.0.177/uncountable/integration/queue_runner/command_server/provision_webhook.py +28 -0
  26. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/scan_profiles.py +2 -0
  27. uncountablepythonsdk-0.0.177/uncountable/integration/secret_retrieval/__init__.py +7 -0
  28. uncountablepythonsdk-0.0.175/uncountable/integration/secret_retrieval/retrieve_secret.py → uncountablepythonsdk-0.0.177/uncountable/integration/secret_retrieval/basic_secret.py +12 -4
  29. uncountablepythonsdk-0.0.177/uncountable/integration/secret_retrieval/retrieve_secret.py +108 -0
  30. uncountablepythonsdk-0.0.177/uncountable/integration/webhook_signature_key.py +110 -0
  31. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/__init__.py +2 -0
  32. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/notebooks/add_notebook_content.py +3 -2
  33. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_recipes_data.py +1 -1
  34. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/auth_retrieval_t.py +3 -3
  35. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/client_base.py +2 -2
  36. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/entity_t.py +6 -0
  37. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integration_server_t.py +1 -0
  38. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/job_definition.py +1 -0
  39. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/job_definition_t.py +18 -1
  40. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/secret_retrieval.py +2 -0
  41. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/secret_retrieval_t.py +33 -1
  42. uncountablepythonsdk-0.0.177/uncountable/types/webhook.py +7 -0
  43. uncountablepythonsdk-0.0.177/uncountable/types/webhook_t.py +22 -0
  44. uncountablepythonsdk-0.0.175/uncountable/integration/secret_retrieval/__init__.py +0 -3
  45. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/.github/workflows/documentation.yml +0 -0
  46. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/.gitignore +0 -0
  47. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/README.md +0 -0
  48. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  49. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  50. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/.flowmarkignore +0 -0
  51. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/.gitignore +0 -0
  52. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/index.md +0 -0
  53. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/integration_examples/add_file_to_folder.md +0 -0
  54. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/integration_examples/create_ingredient.md +0 -0
  55. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/integration_examples/create_output.md +0 -0
  56. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/integration_examples/index.md +0 -0
  57. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/integration_examples/upload_file.md +0 -0
  58. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/justfile +0 -0
  59. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/requirements.txt +0 -0
  60. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/android-chrome-192x192.png +0 -0
  61. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/android-chrome-512x512.png +0 -0
  62. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/apple-touch-icon.png +0 -0
  63. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/browserconfig.xml +0 -0
  64. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/favicon-16x16.png +0 -0
  65. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/favicon-32x32.png +0 -0
  66. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/manifest.json +0 -0
  67. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/mstile-150x150.png +0 -0
  68. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  69. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/docs/static/logo_blue.png +0 -0
  70. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/async_batch.py +0 -0
  71. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/async_batch_large_parse.py +0 -0
  72. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/basic_auth.py +0 -0
  73. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/create_entity.py +0 -0
  74. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/create_ingredient_sdk.py +0 -0
  75. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/download_files.py +0 -0
  76. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/edit_recipe_inputs.py +0 -0
  77. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  78. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  79. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  80. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  81. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  82. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  83. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  84. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  85. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  86. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/integration-server/pyproject.toml +0 -0
  87. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/invoke_uploader.py +0 -0
  88. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/oauth.py +0 -0
  89. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/set_input_pdf_attribute.py +0 -0
  90. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/set_recipe_metadata_file.py +0 -0
  91. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/set_recipe_output_file_sdk.py +0 -0
  92. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/examples/upload_files.py +0 -0
  93. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/__init__.py +0 -0
  94. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/__init__.py +0 -0
  95. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/cached_parser.py +0 -0
  96. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/case_convert.py +0 -0
  97. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_base.py +0 -0
  98. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_builder.py +0 -0
  99. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_cache.py +0 -0
  100. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_error.py +0 -0
  101. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_function_type.py +0 -0
  102. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_inner.py +0 -0
  103. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/parser_options.py +0 -0
  104. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/argument_parser/type_predicates.py +0 -0
  105. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_blob_session.py +0 -0
  107. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  108. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  109. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_local_session.py +0 -0
  110. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_s3_session.py +0 -0
  111. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
  112. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  113. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  114. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  115. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/py.typed +0 -0
  116. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/__init__.py +0 -0
  117. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/annotation.py +0 -0
  118. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/missing_sentry.py +0 -0
  119. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/opaque_key.py +0 -0
  120. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/serial_alias.py +0 -0
  121. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/serial_class.py +0 -0
  122. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/serial_generic.py +0 -0
  123. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/serial_union.py +0 -0
  124. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/unknown.py +0 -0
  125. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization/yaml.py +0 -0
  126. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization_util/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  128. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  129. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization_util/dataclasses.py +0 -0
  130. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/serialization_util/serialization_helpers.py +0 -0
  131. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/strenum_compat/__init__.py +0 -0
  132. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/strenum_compat/strenum_compat.py +0 -0
  133. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/__init__.py +0 -0
  134. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/__main__.py +0 -0
  135. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/builder.py +0 -0
  137. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/builder_types.py +0 -0
  138. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/config.py +0 -0
  139. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/cross_output_links.py +0 -0
  140. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_io_ts.py +0 -0
  141. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_open_api.py +0 -0
  142. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_open_api_util.py +0 -0
  143. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_python.py +0 -0
  144. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_typescript.py +0 -0
  145. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/emit_typescript_util.py +0 -0
  146. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/load_types.py +0 -0
  147. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  148. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/open_api_util.py +0 -0
  149. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/parts/base.py.prepart +0 -0
  150. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  151. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/test.py +0 -0
  152. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/type_info/__main__.py +0 -0
  153. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  154. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  156. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/util.py +0 -0
  157. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/value_spec/__init__.py +0 -0
  158. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  159. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/pkgs/type_spec/value_spec/types.py +0 -0
  160. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/setup.cfg +0 -0
  161. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/__init__.py +0 -0
  162. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/async_batch.py +0 -0
  164. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/client.py +0 -0
  165. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/environment.py +0 -0
  166. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/query/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/query/row.py +0 -0
  168. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/query/types.py +0 -0
  169. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/core/types.py +0 -0
  170. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/cron.py +0 -0
  172. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/db/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/db/connect.py +0 -0
  174. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/db/session.py +0 -0
  175. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/entrypoint.py +0 -0
  176. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/executors/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/executors/executors.py +0 -0
  178. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  179. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/executors/script_executor.py +0 -0
  180. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/http_server/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/http_server/types.py +0 -0
  182. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/__init__.py +0 -0
  183. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  185. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  187. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  189. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  190. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  191. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  192. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  193. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/types.py +0 -0
  194. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/queue_runner/worker.py +0 -0
  195. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/request_context.py +0 -0
  196. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/scheduler.py +0 -0
  197. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/server.py +0 -0
  198. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/telemetry.py +0 -0
  199. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  200. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/py.typed +0 -0
  201. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/batch/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/batch/execute_batch.py +0 -0
  204. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  205. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/chemical/__init__.py +0 -0
  206. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  207. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  209. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
  210. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/create_entities.py +0 -0
  212. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/create_entity.py +0 -0
  213. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
  214. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  215. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/export_entities.py +0 -0
  216. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/get_entities_data.py +0 -0
  217. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  218. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/list_aggregate.py +0 -0
  219. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/list_entities.py +0 -0
  220. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/lock_entity.py +0 -0
  221. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/lookup_entity.py +0 -0
  222. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  223. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/set_barcode.py +0 -0
  224. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
  225. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  226. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/set_values.py +0 -0
  227. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  228. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/entity/unlock_entity.py +0 -0
  229. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/equipment/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  231. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/field_options/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  233. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/file_folders/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  235. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  236. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/files/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/files/download_file.py +0 -0
  238. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/id_source/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/id_source/list_id_source.py +0 -0
  240. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/id_source/match_id_source.py +0 -0
  241. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/input_groups/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  243. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/create_inputs.py +0 -0
  245. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/get_input_data.py +0 -0
  246. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/get_input_names.py +0 -0
  247. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  248. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  249. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/set_input_category.py +0 -0
  250. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  251. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  252. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/integrations/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  254. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/integrations/push_notification.py +0 -0
  255. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  256. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/listing/__init__.py +0 -0
  257. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/listing/export_listing.py +0 -0
  258. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/listing/fetch_listing.py +0 -0
  259. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/material_families/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  261. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/notebooks/__init__.py +0 -0
  262. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  263. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/output_parameters/__init__.py +0 -0
  264. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
  265. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/__init__.py +0 -0
  266. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/get_output_data.py +0 -0
  267. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/get_output_names.py +0 -0
  268. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  269. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  270. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  271. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/permissions/__init__.py +0 -0
  272. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  273. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  274. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/project/__init__.py +0 -0
  275. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/project/get_projects.py +0 -0
  276. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/project/get_projects_data.py +0 -0
  277. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_links/__init__.py +0 -0
  278. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  279. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
  280. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  281. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  282. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  283. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/__init__.py +0 -0
  284. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  285. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  286. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  287. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  288. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  289. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  290. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  291. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/create_recipe.py +0 -0
  292. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/create_recipes.py +0 -0
  293. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  294. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  295. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  296. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_curve.py +0 -0
  297. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  298. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  299. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  300. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  301. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  302. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  303. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  304. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  305. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  306. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  307. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  308. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  309. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  310. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  311. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  312. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  313. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  314. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/runsheet/__init__.py +0 -0
  315. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  316. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  317. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/triggers/__init__.py +0 -0
  318. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/triggers/run_trigger.py +0 -0
  319. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/uploader/__init__.py +0 -0
  320. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  321. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  322. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/user/__init__.py +0 -0
  323. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/api/user/get_current_user_info.py +0 -0
  324. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/async_batch.py +0 -0
  325. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/async_batch_processor.py +0 -0
  326. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/async_batch_t.py +0 -0
  327. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/async_jobs.py +0 -0
  328. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/async_jobs_t.py +0 -0
  329. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/auth_retrieval.py +0 -0
  330. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/base.py +0 -0
  331. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/base_t.py +0 -0
  332. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/calculations.py +0 -0
  333. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/calculations_t.py +0 -0
  334. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/chemical_structure.py +0 -0
  335. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/chemical_structure_t.py +0 -0
  336. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/client_config.py +0 -0
  337. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/client_config_t.py +0 -0
  338. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/condition_match.py +0 -0
  339. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/condition_match_t.py +0 -0
  340. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/curves.py +0 -0
  341. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/curves_t.py +0 -0
  342. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/data.py +0 -0
  343. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/data_t.py +0 -0
  344. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/entity.py +0 -0
  345. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/experiment_groups.py +0 -0
  346. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/experiment_groups_t.py +0 -0
  347. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/exports.py +0 -0
  348. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/exports_t.py +0 -0
  349. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/field_values.py +0 -0
  350. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/field_values_t.py +0 -0
  351. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/fields.py +0 -0
  352. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/fields_t.py +0 -0
  353. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/generic_upload.py +0 -0
  354. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/generic_upload_t.py +0 -0
  355. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/id_source.py +0 -0
  356. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/id_source_t.py +0 -0
  357. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/identifier.py +0 -0
  358. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/identifier_t.py +0 -0
  359. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/input_attributes.py +0 -0
  360. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/input_attributes_t.py +0 -0
  361. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/inputs.py +0 -0
  362. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/inputs_t.py +0 -0
  363. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integration_server.py +0 -0
  364. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integration_session.py +0 -0
  365. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integration_session_t.py +0 -0
  366. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integrations.py +0 -0
  367. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/integrations_t.py +0 -0
  368. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/listing.py +0 -0
  369. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/listing_t.py +0 -0
  370. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/notices.py +0 -0
  371. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/notices_t.py +0 -0
  372. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/notifications.py +0 -0
  373. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/notifications_t.py +0 -0
  374. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/outputs.py +0 -0
  375. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/outputs_t.py +0 -0
  376. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/overrides.py +0 -0
  377. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/overrides_t.py +0 -0
  378. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/permissions.py +0 -0
  379. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/permissions_t.py +0 -0
  380. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/phases.py +0 -0
  381. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/phases_t.py +0 -0
  382. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/post_base.py +0 -0
  383. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/post_base_t.py +0 -0
  384. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/queued_job.py +0 -0
  385. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/queued_job_t.py +0 -0
  386. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_identifiers.py +0 -0
  387. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_identifiers_t.py +0 -0
  388. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_inputs.py +0 -0
  389. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_inputs_t.py +0 -0
  390. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_links.py +0 -0
  391. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_links_t.py +0 -0
  392. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_metadata.py +0 -0
  393. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_metadata_t.py +0 -0
  394. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_output_metadata.py +0 -0
  395. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_output_metadata_t.py +0 -0
  396. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_step_relationships.py +0 -0
  397. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_step_relationships_t.py +0 -0
  398. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_tags.py +0 -0
  399. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_tags_t.py +0 -0
  400. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_workflow_step_types.py +0 -0
  401. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  402. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_workflow_steps.py +0 -0
  403. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  404. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipes.py +0 -0
  405. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/recipes_t.py +0 -0
  406. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/request_headers.py +0 -0
  407. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/request_headers_t.py +0 -0
  408. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/response.py +0 -0
  409. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/response_t.py +0 -0
  410. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/runsheet.py +0 -0
  411. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/runsheet_format.py +0 -0
  412. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/runsheet_format_t.py +0 -0
  413. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/runsheet_t.py +0 -0
  414. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/sockets.py +0 -0
  415. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/sockets_t.py +0 -0
  416. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/specs.py +0 -0
  417. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/specs_t.py +0 -0
  418. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/step_relationships.py +0 -0
  419. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/step_relationships_t.py +0 -0
  420. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/units.py +0 -0
  421. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/units_t.py +0 -0
  422. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/uploader.py +0 -0
  423. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/uploader_t.py +0 -0
  424. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/users.py +0 -0
  425. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/users_t.py +0 -0
  426. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/webhook_job.py +0 -0
  427. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/webhook_job_t.py +0 -0
  428. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/workflows.py +0 -0
  429. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.177}/uncountable/types/workflows_t.py +0 -0
@@ -28,7 +28,7 @@ jobs:
28
28
  with:
29
29
  version: "0.11.0"
30
30
  activate-environment: true
31
- enable-cache: true
31
+ enable-cache: false
32
32
  - name: Install build dependencies
33
33
  run: |
34
34
  uv pip install --upgrade build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.175
3
+ Version: 0.0.177
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
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: aiotus==1.*
20
- Requires-Dist: aiohttp==3.*
20
+ Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
23
  Requires-Dist: APScheduler==3.*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.175
3
+ Version: 0.0.177
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
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: aiotus==1.*
20
- Requires-Dist: aiohttp==3.*
20
+ Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
23
  Requires-Dist: APScheduler==3.*
@@ -148,6 +148,7 @@ uncountable/integration/scan_profiles.py
148
148
  uncountable/integration/scheduler.py
149
149
  uncountable/integration/server.py
150
150
  uncountable/integration/telemetry.py
151
+ uncountable/integration/webhook_signature_key.py
151
152
  uncountable/integration/db/__init__.py
152
153
  uncountable/integration/db/connect.py
153
154
  uncountable/integration/db/session.py
@@ -166,6 +167,7 @@ uncountable/integration/queue_runner/command_server/__init__.py
166
167
  uncountable/integration/queue_runner/command_server/command_client.py
167
168
  uncountable/integration/queue_runner/command_server/command_server.py
168
169
  uncountable/integration/queue_runner/command_server/constants.py
170
+ uncountable/integration/queue_runner/command_server/provision_webhook.py
169
171
  uncountable/integration/queue_runner/command_server/types.py
170
172
  uncountable/integration/queue_runner/command_server/protocol/__init__.py
171
173
  uncountable/integration/queue_runner/command_server/protocol/command_server.proto
@@ -177,6 +179,7 @@ uncountable/integration/queue_runner/datastore/datastore_sqlite.py
177
179
  uncountable/integration/queue_runner/datastore/interface.py
178
180
  uncountable/integration/queue_runner/datastore/model.py
179
181
  uncountable/integration/secret_retrieval/__init__.py
182
+ uncountable/integration/secret_retrieval/basic_secret.py
180
183
  uncountable/integration/secret_retrieval/retrieve_secret.py
181
184
  uncountable/integration/webhook_server/entrypoint.py
182
185
  uncountable/types/__init__.py
@@ -290,8 +293,10 @@ uncountable/types/uploader.py
290
293
  uncountable/types/uploader_t.py
291
294
  uncountable/types/users.py
292
295
  uncountable/types/users_t.py
296
+ uncountable/types/webhook.py
293
297
  uncountable/types/webhook_job.py
294
298
  uncountable/types/webhook_job_t.py
299
+ uncountable/types/webhook_t.py
295
300
  uncountable/types/workflows.py
296
301
  uncountable/types/workflows_t.py
297
302
  uncountable/types/api/__init__.py
@@ -1,5 +1,5 @@
1
1
  aiotus==1.*
2
- aiohttp==3.*
2
+ aiohttp>=3.14.1
3
3
  requests==2.*
4
4
  SQLAlchemy>=1.4.0
5
5
  APScheduler==3.*
@@ -7,6 +7,8 @@
7
7
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
8
8
 
9
9
  import datetime
10
+ import importlib
11
+ import inspect
10
12
 
11
13
  from docutils import nodes # type: ignore[import-untyped]
12
14
  from sphinx.addnodes import pending_xref # type: ignore[import-not-found]
@@ -63,6 +65,20 @@ favicons = [
63
65
  ]
64
66
 
65
67
 
68
+ def _resolve_alias_to_real_module(target_module: str) -> str:
69
+ if "." not in target_module:
70
+ return target_module
71
+ parent_name, attr_name = target_module.rsplit(".", 1)
72
+ try:
73
+ parent = importlib.import_module(parent_name)
74
+ except ImportError:
75
+ return target_module
76
+ aliased = getattr(parent, attr_name, None)
77
+ if not inspect.ismodule(aliased) or aliased.__name__ == target_module:
78
+ return target_module
79
+ return aliased.__name__
80
+
81
+
66
82
  def _hook_missing_reference(
67
83
  _app: Sphinx, _env: BuildEnvironment, node: pending_xref, contnode: nodes.Text
68
84
  ) -> nodes.reference | None:
@@ -80,6 +96,10 @@ def _hook_missing_reference(
80
96
  return None
81
97
 
82
98
  target_module, target_name = target.rsplit(".", 1)
99
+ real_module = _resolve_alias_to_real_module(target_module)
100
+ if real_module != target_module:
101
+ target_module = real_module
102
+ target = f"{target_module}.{target_name}"
83
103
 
84
104
  # construct relative path from current doc page to target page
85
105
  relative_segments_to_root = [".." for _ in current_doc.split("/")]
@@ -92,6 +92,7 @@ def main() -> None:
92
92
  ]
93
93
  if definition.visibility_scope is not None
94
94
  else None,
95
+ kind=definition.kind,
95
96
  arguments=definition.arguments,
96
97
  )
97
98
  action_definitions_with_arguments_list.append(
@@ -54,6 +54,10 @@ def _emit_action_definition(
54
54
  out.write(
55
55
  f"{sub_indent}visibility_scope={_emit_visibility_scope(action.visibility_scope)},\n"
56
56
  )
57
+ if action.kind is not None:
58
+ out.write(
59
+ f"{sub_indent}kind=actions_registry_t.ActionDefinitionKind.{action.kind.name},\n"
60
+ )
57
61
  if action.arguments is not None:
58
62
  out.write(f"{sub_indent}arguments={_py_str(action.arguments)},\n")
59
63
  out.write(f"{indent}),\n")
@@ -147,6 +147,10 @@ def _emit_action_definition(
147
147
  out.write(
148
148
  f"{sub_indent}visibilityScope: {_emit_visibility_scope(action_definition.visibility_scope)},\n"
149
149
  )
150
+ if action_definition.kind is not None:
151
+ out.write(
152
+ f"{sub_indent}kind: ActionsRegistryT.ActionDefinitionKind.{ts_name(action_definition.kind, name_case=builder.NameCase.convert)},\n"
153
+ )
150
154
  out.write(f"{indent}}} as ActionsRegistryT.ActionDefinition{argument_type},\n")
151
155
  return out.getvalue()
152
156
 
@@ -173,6 +173,7 @@ key_description = "description"
173
173
  key_brief = "brief"
174
174
  key_name = "name"
175
175
  key_draft = "draft"
176
+ key_deferred_value_spec = "deferred_value_spec"
176
177
 
177
178
 
178
179
  TypeT = TypeVar("TypeT")
@@ -236,6 +237,14 @@ def main() -> None:
236
237
  arg_meta = get(args_meta, in_argument.ref_name)
237
238
  arg_description = get_as(arg_meta, key_description, str)
238
239
  arg_name = get_as(arg_meta, key_name, str)
240
+ deferred_value_spec = None
241
+ if (
242
+ isinstance(arg_meta, dict)
243
+ and arg_meta.get(key_deferred_value_spec) is not None
244
+ ):
245
+ deferred_value_spec = get_as(
246
+ arg_meta, key_deferred_value_spec, bool
247
+ )
239
248
 
240
249
  arguments.append(
241
250
  value_spec_t.FunctionArgument(
@@ -245,6 +254,7 @@ def main() -> None:
245
254
  type=convert_to_value_spec_type(in_argument.type_path),
246
255
  on_null=in_argument.on_null,
247
256
  extant=in_argument.extant,
257
+ deferred_value_spec=deferred_value_spec,
248
258
  )
249
259
  )
250
260
 
@@ -29,6 +29,7 @@ from decimal import Decimal
29
29
 
30
30
  from main.base.types import value_spec_t, base_t
31
31
 
32
+ from . import expression
32
33
  from .function_wrapper import ExtractorArgs, WrapArgs
33
34
  """
34
35
  )
@@ -70,6 +71,12 @@ def _emit_function_wrapper(function: value_spec_t.Function) -> str:
70
71
 
71
72
  {INDENT}def get_{argument.ref_name}_at(self, at: int) -> base_t.ExtJsonValue:
72
73
  {INDENT}{INDENT}return self._extract_at({index}, at)
74
+ """
75
+ )
76
+ elif argument.deferred_value_spec:
77
+ out.write(
78
+ f"""{INDENT}def get_{argument.ref_name}(self) -> expression.ParseNode | None:
79
+ {INDENT}{INDENT}return self.extract_node({index})
73
80
  """
74
81
  )
75
82
  else:
@@ -213,6 +220,8 @@ def _emit_argument(argument: value_spec_t.FunctionArgument, indent: str) -> str:
213
220
  out.write(
214
221
  f"{sub_indent}extant=value_spec_t.ArgumentExtant.{argument.extant.name},\n"
215
222
  )
223
+ if argument.deferred_value_spec:
224
+ out.write(f"{sub_indent}deferred_value_spec={argument.deferred_value_spec},\n")
216
225
  out.write(f"{sub_indent}type={_emit_type(argument.type, sub_indent)},\n")
217
226
  out.write(f"{indent})")
218
227
 
@@ -52,7 +52,7 @@ requires-python = ">=3.12"
52
52
  # May be compatible with older versions
53
53
  dependencies = [
54
54
  "aiotus ==1.*",
55
- "aiohttp == 3.*",
55
+ "aiohttp >= 3.14.1",
56
56
  "requests == 2.*",
57
57
  "SQLAlchemy >= 1.4.0",
58
58
  "APScheduler == 3.*",
@@ -17,6 +17,7 @@ from uncountable.types import uploader_t
17
17
  from .types import AuthDetailsAll, AuthDetailsApiKey
18
18
 
19
19
  _CHUNK_SIZE = 5 * 1024 * 1024 # s3 requires 5MiB minimum
20
+ _PARSED_FILE_DATA_FILENAME = "parsed_file_data.json"
20
21
 
21
22
 
22
23
  class FileUploadType(StrEnum):
@@ -51,17 +52,27 @@ class UploaderFileUpload:
51
52
  FileUpload = MediaFileUpload | DataFileUpload | UploaderFileUpload
52
53
 
53
54
 
54
- @dataclass(kw_only=True)
55
- class _ParsedFileDataWrapper:
56
- parsed_file_data: list[uploader_t.ParsedFileData]
57
-
58
-
59
55
  @dataclass(kw_only=True)
60
56
  class FileBytes:
61
57
  name: str
62
58
  bytes_data: BytesIO
63
59
 
64
60
 
61
+ def _build_parsed_file_data_bytes(
62
+ *, parsed_file_data: list[uploader_t.ParsedFileData]
63
+ ) -> FileBytes:
64
+ buffer = BytesIO()
65
+ buffer.write(b'{"parsed_file_data": [')
66
+ for index, file_data in enumerate(parsed_file_data):
67
+ if index > 0:
68
+ buffer.write(b", ")
69
+ serialized_file_data = serialize_for_storage(file_data)
70
+ buffer.write(json.dumps(serialized_file_data).encode("utf-8"))
71
+ buffer.write(b"]}")
72
+ buffer.seek(0)
73
+ return FileBytes(name=_PARSED_FILE_DATA_FILENAME, bytes_data=buffer)
74
+
75
+
65
76
  @contextmanager
66
77
  def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None]:
67
78
  match file_upload:
@@ -73,15 +84,9 @@ def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None
73
84
  case DataFileUpload():
74
85
  yield FileBytes(name=file_upload.name, bytes_data=file_upload.data)
75
86
  case UploaderFileUpload():
76
- wrapper = _ParsedFileDataWrapper(
87
+ yield _build_parsed_file_data_bytes(
77
88
  parsed_file_data=file_upload.parsed_file_data
78
89
  )
79
- serialized = serialize_for_storage(wrapper)
80
- json_bytes = json.dumps(serialized).encode("utf-8")
81
- yield FileBytes(
82
- name="parsed_file_data.json",
83
- bytes_data=BytesIO(json_bytes),
84
- )
85
90
 
86
91
 
87
92
  @dataclass(kw_only=True)
@@ -135,7 +140,7 @@ class FileUploader:
135
140
  case DataFileUpload():
136
141
  attributes["file_name"] = file_upload.name
137
142
  case UploaderFileUpload():
138
- attributes["file_name"] = "parsed_file_data.json"
143
+ attributes["file_name"] = _PARSED_FILE_DATA_FILENAME
139
144
  case _:
140
145
  assert_never(file_upload)
141
146
  with push_scope_optional(
@@ -13,6 +13,7 @@ from uncountable.core.query.column import (
13
13
  Column,
14
14
  ColumnFilter,
15
15
  EnumColumn,
16
+ JsonColumn,
16
17
  NullableColumn,
17
18
  PrimaryKeyColumn,
18
19
  get_column_base,
@@ -72,8 +73,16 @@ class QueryBuilder[QueryRowT: QueryRow]:
72
73
  column.identifier for column in column_definitions.values()
73
74
  )
74
75
  self._property_names: tuple[str, ...] = tuple(column_definitions.keys())
76
+ json_property_names = {
77
+ name
78
+ for name, column in column_definitions.items()
79
+ if isinstance(column, JsonColumn)
80
+ }
75
81
  self._parser: CachedParser = CachedParser(
76
- serial_class(unconverted_keys={*self._property_names})(
82
+ serial_class(
83
+ unconverted_keys={*self._property_names},
84
+ unconverted_values=json_property_names,
85
+ )(
77
86
  make_dataclass(
78
87
  cls_name=self._model.__name__,
79
88
  fields=[
@@ -465,6 +465,27 @@ class NullableTextsColumn[
465
465
  # IMPROVE: Implement "Not Exists" filter (when supported in SDK)
466
466
 
467
467
 
468
+ class JsonColumn(Column[base_t.JsonValue, NullableColumn]):
469
+ __hash__ = Column.__hash__
470
+
471
+ def __init__(self, identifier: listing_t.ColumnIdentifier) -> None:
472
+ super().__init__(
473
+ identifier=identifier,
474
+ nullable=NullableColumn,
475
+ value_type=(
476
+ dict[str, base_t.JsonValue] | list[base_t.JsonValue] | base_t.JsonScalar
477
+ ),
478
+ )
479
+
480
+ def __ne__(self, other: None) -> ColumnFilter: # type: ignore[override]
481
+ return ColumnFilter(
482
+ identifier=self.identifier,
483
+ filter=lambda identifier: listing_t.FilterSpecExists(column=identifier),
484
+ )
485
+
486
+ # IMPROVE: Implement "Not Exists" filter (when supported in SDK)
487
+
488
+
468
489
  class PrimaryKeyColumn(
469
490
  Column[base_t.ObjectId, NonNullableColumn],
470
491
  ):
@@ -684,6 +705,10 @@ class IdColumn[
684
705
  column: NullableTextsColumn[BaseNullableT],
685
706
  ) -> NullableTextsColumn[BaseNullableT]: ...
686
707
 
708
+ # Json
709
+ @overload
710
+ def __rshift__(self, column: JsonColumn) -> JsonColumn: ...
711
+
687
712
  # Ids
688
713
  @overload
689
714
  def __rshift__[
@@ -734,6 +759,7 @@ class IdColumn[
734
759
  | NumericColumn[BaseNullableT]
735
760
  | TextsColumn[BaseNullableT]
736
761
  | NullableTextsColumn[BaseNullableT]
762
+ | JsonColumn
737
763
  | IdsColumn[BaseNullableT]
738
764
  | IdColumn[BaseNullableT],
739
765
  ) -> (
@@ -768,6 +794,7 @@ class IdColumn[
768
794
  | NullableTextsColumn[BaseNullableT]
769
795
  | NullableTextsColumn[NonNullableColumn | NullableColumn]
770
796
  | NullableTextsColumn[NullableColumn]
797
+ | JsonColumn
771
798
  | IdsColumn[BaseNullableT]
772
799
  | IdsColumn[NonNullableColumn | NullableColumn]
773
800
  | IdsColumn[NullableColumn]
@@ -869,6 +896,8 @@ class IdColumn[
869
896
  if self.nullable is NonNullableColumn
870
897
  else NullableColumn,
871
898
  )
899
+ case JsonColumn():
900
+ return JsonColumn(identifier=transitive_identifier)
872
901
  case IdsColumn():
873
902
  return IdsColumn(
874
903
  id_type=column.id_type,
@@ -12,6 +12,7 @@ from uncountable.integration.queue_runner.command_server.command_client import (
12
12
  send_job_cancellation_message,
13
13
  send_job_queue_message,
14
14
  send_list_queued_jobs_message,
15
+ send_provision_webhook_message,
15
16
  send_retry_job_message,
16
17
  )
17
18
  from uncountable.integration.queue_runner.command_server.types import (
@@ -220,6 +221,33 @@ def register_retry_job_parser(
220
221
  retry_failed_jobs_parser.set_defaults(func=_handle_retry_job)
221
222
 
222
223
 
224
+ def register_provision_webhook_parser(
225
+ sub_parser_manager: argparse._SubParsersAction,
226
+ parents: list[argparse.ArgumentParser],
227
+ ) -> None:
228
+ provision_parser = sub_parser_manager.add_parser(
229
+ "provision-webhook",
230
+ parents=parents,
231
+ help="Provision an Uncountable webhook job by creating its webhook entity and signature key",
232
+ description="Provision an Uncountable webhook job by creating its webhook entity and signature key",
233
+ )
234
+ provision_parser.add_argument(
235
+ "job_id",
236
+ type=str,
237
+ help="The id of the Uncountable webhook job to provision",
238
+ )
239
+
240
+ def _handle_provision_webhook(args: argparse.Namespace) -> None:
241
+ profile_name = send_provision_webhook_message(
242
+ job_id=args.job_id,
243
+ host=args.host,
244
+ port=get_local_admin_server_port(),
245
+ )
246
+ print(f"provisioned webhook {profile_name}/{args.job_id}")
247
+
248
+ provision_parser.set_defaults(func=_handle_provision_webhook)
249
+
250
+
223
251
  def main() -> None:
224
252
  logger = Logger(get_current_span())
225
253
 
@@ -242,6 +270,7 @@ def main() -> None:
242
270
  register_retry_job_parser(subparser_action, parents=[base_parser])
243
271
  register_list_queued_jobs(subparser_action, parents=[base_parser])
244
272
  register_cancel_queued_job_parser(subparser_action, parents=[base_parser])
273
+ register_provision_webhook_parser(subparser_action, parents=[base_parser])
245
274
 
246
275
  args = main_parser.parse_args()
247
276
  with logger.push_scope(args.command):
@@ -1,8 +1,8 @@
1
1
  from uncountable.core import AuthDetailsApiKey, Client
2
2
  from uncountable.core.client import ClientConfig
3
3
  from uncountable.core.types import AuthDetailsAll, AuthDetailsOAuth
4
- from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
5
- from uncountable.integration.telemetry import JobLogger
4
+ from uncountable.integration.secret_retrieval.basic_secret import retrieve_basic_secret
5
+ from uncountable.integration.telemetry import Logger
6
6
  from uncountable.types import auth_retrieval_t
7
7
  from uncountable.types.client_config_t import RequestContext
8
8
  from uncountable.types.job_definition_t import (
@@ -13,16 +13,16 @@ from uncountable.types.job_definition_t import (
13
13
  def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
14
14
  match profile_meta.auth_retrieval:
15
15
  case auth_retrieval_t.AuthRetrievalOAuth():
16
- refresh_token = retrieve_secret(
16
+ refresh_token = retrieve_basic_secret(
17
17
  profile_meta.auth_retrieval.refresh_token_secret,
18
18
  profile_metadata=profile_meta,
19
19
  )
20
20
  return AuthDetailsOAuth(refresh_token=refresh_token)
21
21
  case auth_retrieval_t.AuthRetrievalBasic():
22
- api_id = retrieve_secret(
22
+ api_id = retrieve_basic_secret(
23
23
  profile_meta.auth_retrieval.api_id_secret, profile_metadata=profile_meta
24
24
  )
25
- api_key = retrieve_secret(
25
+ api_key = retrieve_basic_secret(
26
26
  profile_meta.auth_retrieval.api_key_secret,
27
27
  profile_metadata=profile_meta,
28
28
  )
@@ -32,7 +32,7 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
32
32
 
33
33
  def construct_uncountable_client(
34
34
  profile_meta: ProfileMetadata,
35
- logger: JobLogger,
35
+ logger: Logger,
36
36
  *,
37
37
  request_context: RequestContext | None = None,
38
38
  headers: dict[str, str] | None = None,
@@ -25,8 +25,11 @@ from uncountable.integration.queue_runner.command_server.types import (
25
25
  CommandServerException,
26
26
  )
27
27
  from uncountable.integration.request_context import extract_request_context
28
- from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
28
+ from uncountable.integration.secret_retrieval import retrieve_secret
29
29
  from uncountable.integration.telemetry import JobLogger
30
+ from uncountable.integration.webhook_signature_key import (
31
+ webhook_signature_key_retrieval,
32
+ )
30
33
  from uncountable.types import (
31
34
  base_t,
32
35
  job_definition_t,
@@ -166,6 +169,26 @@ class CustomHttpJob(Job[GenericHttpRequest]):
166
169
  return JobResult(success=False)
167
170
 
168
171
 
172
+ def _resolve_webhook_signature_key(
173
+ *,
174
+ job_definition: job_definition_t.HttpJobDefinitionBase,
175
+ profile_meta: ProfileMetadata,
176
+ ) -> str:
177
+ if isinstance(job_definition, job_definition_t.WebhookJobDefinition):
178
+ return retrieve_secret(job_definition.signature_key_secret, profile_meta)
179
+ if isinstance(job_definition, job_definition_t.UncountableWebhookJobDefinition):
180
+ return retrieve_secret(
181
+ webhook_signature_key_retrieval(job_id=job_definition.id),
182
+ profile_meta,
183
+ )
184
+ raise HttpException.configuration_error(
185
+ message=(
186
+ "[internal] non-webhook job definition passed to webhook validation: "
187
+ f"{profile_meta.name}/{job_definition.id}"
188
+ )
189
+ )
190
+
191
+
169
192
  class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
170
193
  @property
171
194
  def payload_type(self) -> type[webhook_job_t.WebhookEventPayload]:
@@ -182,10 +205,8 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
182
205
  job_definition: job_definition_t.HttpJobDefinitionBase,
183
206
  profile_meta: ProfileMetadata,
184
207
  ) -> None:
185
- assert isinstance(job_definition, job_definition_t.WebhookJobDefinition)
186
- signature_key = retrieve_secret(
187
- profile_metadata=profile_meta,
188
- secret_retrieval=job_definition.signature_key_secret,
208
+ signature_key = _resolve_webhook_signature_key(
209
+ job_definition=job_definition, profile_meta=profile_meta
189
210
  )
190
211
  passed_signature = request.headers.get("Uncountable-Webhook-Signature")
191
212
  if passed_signature is None:
@@ -195,7 +216,7 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
195
216
  signature_key.encode("utf-8"), msg=request.body_bytes, digestmod="sha256"
196
217
  ).hexdigest()
197
218
 
198
- if request_body_signature != passed_signature:
219
+ if not hmac.compare_digest(request_body_signature, passed_signature):
199
220
  raise HttpException.payload_failed_signature()
200
221
 
201
222
  @staticmethod
@@ -17,6 +17,8 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
17
17
  EnqueueJobResult,
18
18
  ListQueuedJobsRequest,
19
19
  ListQueuedJobsResult,
20
+ ProvisionWebhookRequest,
21
+ ProvisionWebhookResult,
20
22
  RetryJobRequest,
21
23
  RetryJobResult,
22
24
  VaccuumQueuedJobsRequest,
@@ -33,6 +35,7 @@ from .protocol.command_server_pb2_grpc import CommandServerStub
33
35
 
34
36
  _LOCAL_RPC_HOST = "localhost"
35
37
  _DEFAULT_MESSAGE_TIMEOUT_SECS = 2
38
+ _PROVISION_WEBHOOK_TIMEOUT_SECS = 30
36
39
 
37
40
 
38
41
  @contextmanager
@@ -171,3 +174,20 @@ def send_vaccuum_queued_jobs_message(*, host: str = "localhost", port: int) -> N
171
174
 
172
175
  assert isinstance(response, VaccuumQueuedJobsResult)
173
176
  return None
177
+
178
+
179
+ def send_provision_webhook_message(
180
+ *, job_id: str, host: str = "localhost", port: int
181
+ ) -> str:
182
+ with command_server_connection(host=host, port=port) as stub:
183
+ request = ProvisionWebhookRequest(job_id=job_id)
184
+
185
+ try:
186
+ response = stub.ProvisionWebhook(
187
+ request, timeout=_PROVISION_WEBHOOK_TIMEOUT_SECS
188
+ )
189
+ except grpc.RpcError as e:
190
+ raise ValueError(e.details())
191
+
192
+ assert isinstance(response, ProvisionWebhookResult)
193
+ return response.profile_name
@@ -19,11 +19,16 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
19
19
  EnqueueJobResult,
20
20
  ListQueuedJobsRequest,
21
21
  ListQueuedJobsResult,
22
+ ProvisionWebhookRequest,
23
+ ProvisionWebhookResult,
22
24
  RetryJobRequest,
23
25
  RetryJobResult,
24
26
  VaccuumQueuedJobsRequest,
25
27
  VaccuumQueuedJobsResult,
26
28
  )
29
+ from uncountable.integration.queue_runner.command_server.provision_webhook import (
30
+ provision_webhook,
31
+ )
27
32
  from uncountable.integration.queue_runner.command_server.types import (
28
33
  CommandCancelJob,
29
34
  CommandCancelJobResponse,
@@ -199,6 +204,20 @@ async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None
199
204
  )
200
205
  return VaccuumQueuedJobsResult()
201
206
 
207
+ async def ProvisionWebhook(
208
+ self, request: ProvisionWebhookRequest, context: grpc_aio.ServicerContext
209
+ ) -> ProvisionWebhookResult:
210
+ loop = asyncio.get_running_loop()
211
+ profile_name = await loop.run_in_executor(
212
+ None, lambda: provision_webhook(job_id=request.job_id)
213
+ )
214
+ if profile_name is None:
215
+ await context.abort(
216
+ StatusCode.INVALID_ARGUMENT,
217
+ f"no Uncountable webhook job found with id {request.job_id}",
218
+ )
219
+ return ProvisionWebhookResult(profile_name=profile_name)
220
+
202
221
  add_CommandServerServicer_to_server(CommandServerHandler(), server)
203
222
 
204
223
  listen_addr = f"[::]:{get_local_admin_server_port()}"
@@ -8,6 +8,7 @@ service CommandServer {
8
8
  rpc ListQueuedJobs(ListQueuedJobsRequest) returns (ListQueuedJobsResult) {}
9
9
  rpc VaccuumQueuedJobs(VaccuumQueuedJobsRequest) returns (VaccuumQueuedJobsResult) {}
10
10
  rpc CancelJob(CancelJobRequest) returns (CancelJobResult) {}
11
+ rpc ProvisionWebhook(ProvisionWebhookRequest) returns (ProvisionWebhookResult) {}
11
12
  }
12
13
 
13
14
  message EnqueueJobRequest {
@@ -75,3 +76,11 @@ enum CancelJobStatus {
75
76
  message CancelJobResult {
76
77
  CancelJobStatus status = 1;
77
78
  }
79
+
80
+ message ProvisionWebhookRequest {
81
+ string job_id = 1;
82
+ }
83
+
84
+ message ProvisionWebhookResult {
85
+ string profile_name = 1;
86
+ }