UncountablePythonSDK 0.0.182__tar.gz → 0.0.183__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 (453) hide show
  1. {uncountablepythonsdk-0.0.182/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.183}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -6
  4. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_blob_session.py +52 -12
  5. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_file_share_session.py +43 -0
  6. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_s3_session.py +53 -7
  7. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/filesystem_session.py +11 -0
  8. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/environment.py +0 -4
  9. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/webhook_server/entrypoint.py +0 -2
  10. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_inputs.py +1 -1
  11. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/client_base.py +1 -1
  12. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_auth.py +0 -38
  13. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_routes/__init__.py +0 -3
  14. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_routes/_boundary.py +0 -39
  15. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_routes/health.py +0 -30
  16. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_routes/jobs.py +0 -147
  17. uncountablepythonsdk-0.0.182/uncountable/integration/webhook_server/admin_routes/register.py +0 -13
  18. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/.github/workflows/documentation.yml +0 -0
  19. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/.github/workflows/publish.yml +0 -0
  20. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/.gitignore +0 -0
  21. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/README.md +0 -0
  22. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  23. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  24. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  25. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/.flowmarkignore +0 -0
  26. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/.gitignore +0 -0
  27. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/conf.py +0 -0
  28. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/index.md +0 -0
  29. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/integration_examples/add_file_to_folder.md +0 -0
  30. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/integration_examples/create_ingredient.md +0 -0
  31. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/integration_examples/create_output.md +0 -0
  32. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/integration_examples/index.md +0 -0
  33. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/integration_examples/upload_file.md +0 -0
  34. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/justfile +0 -0
  35. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/requirements.txt +0 -0
  36. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/android-chrome-192x192.png +0 -0
  37. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/android-chrome-512x512.png +0 -0
  38. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/apple-touch-icon.png +0 -0
  39. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/browserconfig.xml +0 -0
  40. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/favicon-16x16.png +0 -0
  41. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/favicon-32x32.png +0 -0
  42. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/manifest.json +0 -0
  43. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/mstile-150x150.png +0 -0
  44. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  45. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/docs/static/logo_blue.png +0 -0
  46. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/async_batch.py +0 -0
  47. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/async_batch_large_parse.py +0 -0
  48. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/basic_auth.py +0 -0
  49. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/create_entity.py +0 -0
  50. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/create_ingredient_sdk.py +0 -0
  51. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/download_files.py +0 -0
  52. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/edit_recipe_inputs.py +0 -0
  53. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  54. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  55. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  56. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  57. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  58. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  59. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  60. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  61. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  62. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/integration-server/pyproject.toml +0 -0
  63. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/invoke_uploader.py +0 -0
  64. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/oauth.py +0 -0
  65. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/set_input_pdf_attribute.py +0 -0
  66. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/set_recipe_metadata_file.py +0 -0
  67. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/set_recipe_output_file_sdk.py +0 -0
  68. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/stream_dataset_measurements.py +0 -0
  69. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/examples/upload_files.py +0 -0
  70. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/__init__.py +0 -0
  71. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/__init__.py +0 -0
  72. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/cached_parser.py +0 -0
  73. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/case_convert.py +0 -0
  74. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_base.py +0 -0
  75. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_builder.py +0 -0
  76. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_cache.py +0 -0
  77. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_error.py +0 -0
  78. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_function_type.py +0 -0
  79. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_inner.py +0 -0
  80. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/parser_options.py +0 -0
  81. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/argument_parser/type_predicates.py +0 -0
  82. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/__init__.py +0 -0
  83. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  84. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_local_session.py +0 -0
  85. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
  86. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  87. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  88. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/py.typed +0 -0
  89. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/__init__.py +0 -0
  90. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/annotation.py +0 -0
  91. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/missing_sentry.py +0 -0
  92. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/opaque_key.py +0 -0
  93. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_alias.py +0 -0
  94. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_class.py +0 -0
  95. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_generic.py +0 -0
  96. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/serial_union.py +0 -0
  97. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/unknown.py +0 -0
  98. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/usage.py +0 -0
  99. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization/yaml.py +0 -0
  100. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/__init__.py +0 -0
  101. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  102. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  103. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/dataclasses.py +0 -0
  104. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/serialization_util/serialization_helpers.py +0 -0
  105. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/strenum_compat/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/strenum_compat/strenum_compat.py +0 -0
  107. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/__init__.py +0 -0
  108. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/__main__.py +0 -0
  109. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  110. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  111. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/emit_python.py +0 -0
  112. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  113. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/builder.py +0 -0
  114. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/builder_types.py +0 -0
  115. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/config.py +0 -0
  116. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/cross_output_links.py +0 -0
  117. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_io_ts.py +0 -0
  118. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_open_api.py +0 -0
  119. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_open_api_util.py +0 -0
  120. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_python.py +0 -0
  121. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_scss.py +0 -0
  122. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_typescript.py +0 -0
  123. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/emit_typescript_util.py +0 -0
  124. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/load_types.py +0 -0
  125. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  126. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/open_api_util.py +0 -0
  127. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/parts/base.py.prepart +0 -0
  128. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  129. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/test.py +0 -0
  130. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/type_info/__main__.py +0 -0
  131. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  132. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  133. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  134. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/util.py +0 -0
  135. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/__main__.py +0 -0
  137. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  138. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  139. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pkgs/type_spec/value_spec/types.py +0 -0
  140. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/pyproject.toml +0 -0
  141. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/setup.cfg +0 -0
  142. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/async_batch.py +0 -0
  145. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/client.py +0 -0
  146. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/file_upload.py +0 -0
  147. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/query/__init__.py +0 -0
  148. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/query/builder.py +0 -0
  149. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/query/column.py +0 -0
  150. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/query/row.py +0 -0
  151. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/query/types.py +0 -0
  152. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/core/types.py +0 -0
  153. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/cli.py +0 -0
  155. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/construct_client.py +0 -0
  156. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/cron.py +0 -0
  157. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/__init__.py +0 -0
  158. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/connect.py +0 -0
  159. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/db/session.py +0 -0
  160. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/entrypoint.py +0 -0
  161. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/__init__.py +0 -0
  162. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/executors.py +0 -0
  163. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  164. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/executors/script_executor.py +0 -0
  165. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/http_server/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/http_server/types.py +0 -0
  167. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/job.py +0 -0
  168. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  171. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  172. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  173. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  175. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  176. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  177. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  178. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/provision_webhook.py +0 -0
  179. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  180. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_postgres.py +0 -0
  182. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_sql_base.py +0 -0
  183. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  184. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/factory.py +0 -0
  185. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  186. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  187. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_process.py +0 -0
  188. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_runner.py +0 -0
  189. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  190. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  191. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/types.py +0 -0
  192. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/queue_runner/worker.py +0 -0
  193. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/request_context.py +0 -0
  194. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/scan_profiles.py +0 -0
  195. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/scheduler.py +0 -0
  196. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  197. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/basic_secret.py +0 -0
  198. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  199. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/server.py +0 -0
  200. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/telemetry.py +0 -0
  201. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/webhook_bootstrap.py +0 -0
  202. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/integration/webhook_entity.py +0 -0
  203. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/py.typed +0 -0
  204. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/__init__.py +0 -0
  205. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/__init__.py +0 -0
  206. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/execute_batch.py +0 -0
  208. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  209. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/chemical/__init__.py +0 -0
  210. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  211. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  213. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
  214. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/__init__.py +0 -0
  215. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_entities.py +0 -0
  216. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_entity.py +0 -0
  217. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
  218. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  219. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/export_entities.py +0 -0
  220. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/get_entities_data.py +0 -0
  221. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  222. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/list_aggregate.py +0 -0
  223. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/list_entities.py +0 -0
  224. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/lock_entity.py +0 -0
  225. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/lookup_entity.py +0 -0
  226. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  227. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_barcode.py +0 -0
  228. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
  229. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  230. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/set_values.py +0 -0
  231. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  232. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/entity/unlock_entity.py +0 -0
  233. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/equipment/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  235. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/field_options/__init__.py +0 -0
  236. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  237. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  239. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  240. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/files/__init__.py +0 -0
  241. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/files/download_file.py +0 -0
  242. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/list_id_source.py +0 -0
  244. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/id_source/match_id_source.py +0 -0
  245. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/input_groups/__init__.py +0 -0
  246. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  247. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/__init__.py +0 -0
  248. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/create_inputs.py +0 -0
  249. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_input_data.py +0 -0
  250. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_input_names.py +0 -0
  251. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  252. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  253. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_category.py +0 -0
  254. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  255. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  256. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/__init__.py +0 -0
  257. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  258. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/push_notification.py +0 -0
  259. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  260. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/__init__.py +0 -0
  261. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/export_listing.py +0 -0
  262. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/listing/fetch_listing.py +0 -0
  263. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/material_families/__init__.py +0 -0
  264. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  265. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/__init__.py +0 -0
  266. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/get_analyze_results.py +0 -0
  267. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/get_suggest_results.py +0 -0
  268. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/ml/submit_async_job.py +0 -0
  269. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  271. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  272. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/output_parameters/__init__.py +0 -0
  273. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
  274. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/__init__.py +0 -0
  275. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_data.py +0 -0
  276. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_names.py +0 -0
  277. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  278. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  279. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  280. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/__init__.py +0 -0
  281. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  282. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  283. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/__init__.py +0 -0
  284. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/get_projects.py +0 -0
  285. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/project/get_projects_data.py +0 -0
  286. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/__init__.py +0 -0
  287. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  288. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
  289. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  290. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  291. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  292. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/__init__.py +0 -0
  293. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  294. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  295. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  296. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  297. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  298. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  299. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  300. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_recipe.py +0 -0
  301. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/create_recipes.py +0 -0
  302. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  303. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  304. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  305. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_curve.py +0 -0
  306. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  307. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  308. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  309. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  310. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  311. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  312. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  313. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  314. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  315. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  316. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  317. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  318. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  319. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  320. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  321. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  322. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  323. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/__init__.py +0 -0
  324. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  325. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  326. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/time_series/__init__.py +0 -0
  327. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/time_series/ingest_dataset_measurements.py +0 -0
  328. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/triggers/__init__.py +0 -0
  329. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/triggers/run_trigger.py +0 -0
  330. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/__init__.py +0 -0
  331. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  332. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  333. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/user/__init__.py +0 -0
  334. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/api/user/get_current_user_info.py +0 -0
  335. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch.py +0 -0
  336. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch_processor.py +0 -0
  337. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/async_batch_t.py +0 -0
  338. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/async_jobs.py +0 -0
  339. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/async_jobs_t.py +0 -0
  340. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/auth_retrieval.py +0 -0
  341. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/auth_retrieval_t.py +0 -0
  342. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/base.py +0 -0
  343. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/base_t.py +0 -0
  344. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/calculations.py +0 -0
  345. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/calculations_t.py +0 -0
  346. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/chemical_structure.py +0 -0
  347. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/chemical_structure_t.py +0 -0
  348. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/client_config.py +0 -0
  349. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/client_config_t.py +0 -0
  350. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/condition_match.py +0 -0
  351. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/condition_match_t.py +0 -0
  352. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/curves.py +0 -0
  353. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/curves_t.py +0 -0
  354. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/data.py +0 -0
  355. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/data_t.py +0 -0
  356. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/dataset_measurements.py +0 -0
  357. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/dataset_measurements_t.py +0 -0
  358. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/entity.py +0 -0
  359. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/entity_t.py +0 -0
  360. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/experiment_groups.py +0 -0
  361. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/experiment_groups_t.py +0 -0
  362. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/exports.py +0 -0
  363. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/exports_t.py +0 -0
  364. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/field_values.py +0 -0
  365. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/field_values_t.py +0 -0
  366. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/fields.py +0 -0
  367. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/fields_t.py +0 -0
  368. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/generic_upload.py +0 -0
  369. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/generic_upload_t.py +0 -0
  370. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/id_source.py +0 -0
  371. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/id_source_t.py +0 -0
  372. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/identifier.py +0 -0
  373. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/identifier_t.py +0 -0
  374. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/input_attributes.py +0 -0
  375. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/input_attributes_t.py +0 -0
  376. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/inputs.py +0 -0
  377. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/inputs_t.py +0 -0
  378. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_server.py +0 -0
  379. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_server_t.py +0 -0
  380. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_session.py +0 -0
  381. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integration_session_t.py +0 -0
  382. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integrations.py +0 -0
  383. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/integrations_t.py +0 -0
  384. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/job_definition.py +0 -0
  385. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/job_definition_t.py +0 -0
  386. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/listing.py +0 -0
  387. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/listing_t.py +0 -0
  388. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/ml_reports.py +0 -0
  389. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/ml_reports_t.py +0 -0
  390. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/notices.py +0 -0
  391. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/notices_t.py +0 -0
  392. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/notifications.py +0 -0
  393. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/notifications_t.py +0 -0
  394. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/outputs.py +0 -0
  395. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/outputs_t.py +0 -0
  396. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/overrides.py +0 -0
  397. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/overrides_t.py +0 -0
  398. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/permissions.py +0 -0
  399. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/permissions_t.py +0 -0
  400. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/phases.py +0 -0
  401. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/phases_t.py +0 -0
  402. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/post_base.py +0 -0
  403. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/post_base_t.py +0 -0
  404. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/queued_job.py +0 -0
  405. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/queued_job_t.py +0 -0
  406. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_identifiers.py +0 -0
  407. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_identifiers_t.py +0 -0
  408. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_inputs.py +0 -0
  409. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_inputs_t.py +0 -0
  410. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_links.py +0 -0
  411. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_links_t.py +0 -0
  412. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_metadata.py +0 -0
  413. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_metadata_t.py +0 -0
  414. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_output_metadata.py +0 -0
  415. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_output_metadata_t.py +0 -0
  416. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_step_relationships.py +0 -0
  417. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_step_relationships_t.py +0 -0
  418. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_tags.py +0 -0
  419. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_tags_t.py +0 -0
  420. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_step_types.py +0 -0
  421. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  422. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_steps.py +0 -0
  423. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  424. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipes.py +0 -0
  425. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/recipes_t.py +0 -0
  426. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/request_headers.py +0 -0
  427. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/request_headers_t.py +0 -0
  428. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/response.py +0 -0
  429. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/response_t.py +0 -0
  430. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet.py +0 -0
  431. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_format.py +0 -0
  432. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_format_t.py +0 -0
  433. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/runsheet_t.py +0 -0
  434. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/secret_retrieval.py +0 -0
  435. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/secret_retrieval_t.py +0 -0
  436. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/sockets.py +0 -0
  437. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/sockets_t.py +0 -0
  438. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/specs.py +0 -0
  439. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/specs_t.py +0 -0
  440. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/step_relationships.py +0 -0
  441. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/step_relationships_t.py +0 -0
  442. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/units.py +0 -0
  443. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/units_t.py +0 -0
  444. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/uploader.py +0 -0
  445. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/uploader_t.py +0 -0
  446. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/users.py +0 -0
  447. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/users_t.py +0 -0
  448. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook.py +0 -0
  449. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_job.py +0 -0
  450. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_job_t.py +0 -0
  451. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/webhook_t.py +0 -0
  452. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/workflows.py +0 -0
  453. {uncountablepythonsdk-0.0.182 → uncountablepythonsdk-0.0.183}/uncountable/types/workflows_t.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.182
3
+ Version: 0.0.183
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.182
3
+ Version: 0.0.183
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
@@ -190,13 +190,7 @@ uncountable/integration/queue_runner/datastore/model.py
190
190
  uncountable/integration/secret_retrieval/__init__.py
191
191
  uncountable/integration/secret_retrieval/basic_secret.py
192
192
  uncountable/integration/secret_retrieval/retrieve_secret.py
193
- uncountable/integration/webhook_server/admin_auth.py
194
193
  uncountable/integration/webhook_server/entrypoint.py
195
- uncountable/integration/webhook_server/admin_routes/__init__.py
196
- uncountable/integration/webhook_server/admin_routes/_boundary.py
197
- uncountable/integration/webhook_server/admin_routes/health.py
198
- uncountable/integration/webhook_server/admin_routes/jobs.py
199
- uncountable/integration/webhook_server/admin_routes/register.py
200
194
  uncountable/types/__init__.py
201
195
  uncountable/types/async_batch.py
202
196
  uncountable/types/async_batch_processor.py
@@ -2,7 +2,7 @@ from io import BytesIO
2
2
  from typing import Self
3
3
 
4
4
  from azure.core.credentials import AzureSasCredential
5
- from azure.storage.blob import BlobServiceClient, ContainerClient
5
+ from azure.storage.blob import BlobPrefix, BlobServiceClient, ContainerClient
6
6
 
7
7
  from pkgs.filesystem_utils.file_type_utils import (
8
8
  FileObjectData,
@@ -78,6 +78,24 @@ class BlobSession(FileSystemSession):
78
78
 
79
79
  return filesystem_file_references
80
80
 
81
+ def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
82
+ if not isinstance(dir_path, FileSystemFileReference):
83
+ raise IncompatibleFileReferenceError()
84
+
85
+ assert self.service_client is not None and self.container_client is not None, (
86
+ "call to list_directories on uninitialized blob session"
87
+ )
88
+
89
+ prefix = _add_slash(dir_path.filepath)
90
+ directories: list[FileSystemObject] = []
91
+ for item in self.container_client.walk_blobs(
92
+ name_starts_with=prefix, delimiter="/"
93
+ ):
94
+ if isinstance(item, BlobPrefix):
95
+ directories.append(FileSystemFileReference(item.name.rstrip("/")))
96
+
97
+ return directories
98
+
81
99
  def download_files(
82
100
  self,
83
101
  filepaths: list[FileSystemObject],
@@ -108,6 +126,22 @@ class BlobSession(FileSystemSession):
108
126
 
109
127
  return downloaded_files
110
128
 
129
+ def _move_blob(self, src_name: str, dest_name: str) -> None:
130
+ assert self.container_client is not None, (
131
+ "call to _move_blob on uninitialized blob session"
132
+ )
133
+ source_blob_client = self.container_client.get_blob_client(src_name)
134
+ dest_blob_client = self.container_client.get_blob_client(dest_name)
135
+
136
+ source_url = (
137
+ f"{source_blob_client.url}?{self.config.credential.signature}"
138
+ if isinstance(self.config.credential, AzureSasCredential)
139
+ else source_blob_client.url
140
+ )
141
+
142
+ dest_blob_client.start_copy_from_url(source_url)
143
+ source_blob_client.delete_blob()
144
+
111
145
  def move_files(self, file_mappings: list[FileTransfer]) -> None:
112
146
  assert self.service_client is not None and self.container_client is not None, (
113
147
  "call to move_files on uninitialized blob session"
@@ -119,19 +153,25 @@ class BlobSession(FileSystemSession):
119
153
  ):
120
154
  raise IncompatibleFileReferenceError()
121
155
 
122
- source_blob_client = self.container_client.get_blob_client(
123
- src_file.filepath
124
- )
125
- dest_blob_client = self.container_client.get_blob_client(dest_file.filepath)
156
+ self._move_blob(src_file.filepath, dest_file.filepath)
126
157
 
127
- source_url = (
128
- f"{source_blob_client.url}?{self.config.credential.signature}"
129
- if isinstance(self.config.credential, AzureSasCredential)
130
- else source_blob_client.url
131
- )
158
+ def move_directory(
159
+ self, src_dir: FileSystemObject, dest_dir: FileSystemObject
160
+ ) -> None:
161
+ if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
162
+ dest_dir, FileSystemFileReference
163
+ ):
164
+ raise IncompatibleFileReferenceError()
165
+
166
+ assert self.service_client is not None and self.container_client is not None, (
167
+ "call to move_directory on uninitialized blob session"
168
+ )
132
169
 
133
- dest_blob_client.start_copy_from_url(source_url)
134
- source_blob_client.delete_blob()
170
+ src_prefix = _add_slash(src_dir.filepath)
171
+ dest_prefix = _add_slash(dest_dir.filepath)
172
+ for blob in self.container_client.list_blobs(name_starts_with=src_prefix):
173
+ dest_name = dest_prefix + blob.name[len(src_prefix) :]
174
+ self._move_blob(blob.name, dest_name)
135
175
 
136
176
  def delete_files(self, filepaths: list[FileSystemObject]) -> None:
137
177
  assert self.service_client is not None and self.container_client is not None, (
@@ -79,6 +79,49 @@ class FileShareSession(FileSystemSession):
79
79
  dir_client, recursive=recursive, valid_extensions=valid_extensions
80
80
  )
81
81
 
82
+ def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
83
+ if not isinstance(dir_path, FileSystemFileReference):
84
+ raise IncompatibleFileReferenceError()
85
+ assert self._share_client is not None, (
86
+ "call to list_directories on uninitialized file share session"
87
+ )
88
+ dir_client = self._share_client.get_directory_client(dir_path.filepath)
89
+ directories: list[FileSystemObject] = []
90
+ for item in dir_client.list_directories_and_files():
91
+ if item["is_directory"]:
92
+ item_path = f"{dir_client.directory_path}/{item['name']}".lstrip("/")
93
+ directories.append(FileSystemFileReference(filepath=item_path))
94
+ return directories
95
+
96
+ def create_directory(self, dir_path: FileSystemObject) -> None:
97
+ if not isinstance(dir_path, FileSystemFileReference):
98
+ raise IncompatibleFileReferenceError()
99
+ assert self._share_client is not None, (
100
+ "call to create_directory on uninitialized file share session"
101
+ )
102
+ current = ""
103
+ for segment in dir_path.filepath.strip("/").split("/"):
104
+ if not segment:
105
+ continue
106
+ current = f"{current}/{segment}".lstrip("/")
107
+ dir_client = self._share_client.get_directory_client(current)
108
+ if not dir_client.exists():
109
+ dir_client.create_directory()
110
+
111
+ def move_directory(
112
+ self, src_dir: FileSystemObject, dest_dir: FileSystemObject
113
+ ) -> None:
114
+ if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
115
+ dest_dir, FileSystemFileReference
116
+ ):
117
+ raise IncompatibleFileReferenceError()
118
+ assert self._share_client is not None, (
119
+ "call to move_directory on uninitialized file share session"
120
+ )
121
+ self._share_client.get_directory_client(src_dir.filepath).rename_directory(
122
+ dest_dir.filepath
123
+ )
124
+
82
125
  def download_files(self, filepaths: list[FileSystemObject]) -> list[FileObjectData]:
83
126
  assert self._share_client is not None, (
84
127
  "call to download_files on uninitialized file share session"
@@ -86,6 +86,28 @@ class S3Session(FileSystemSession):
86
86
 
87
87
  return filesystem_references
88
88
 
89
+ def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
90
+ if not isinstance(dir_path, FileSystemFileReference):
91
+ raise IncompatibleFileReferenceError()
92
+
93
+ assert self.bucket is not None, (
94
+ "call to list_directories on uninitialized s3 session"
95
+ )
96
+
97
+ prefix = _add_slash(dir_path.filepath)
98
+ paginator = self.bucket.meta.client.get_paginator("list_objects_v2")
99
+
100
+ directories: list[FileSystemObject] = []
101
+ for page in paginator.paginate(
102
+ Bucket=self.bucket.name, Prefix=prefix, Delimiter="/"
103
+ ):
104
+ for common_prefix in page.get("CommonPrefixes", []):
105
+ directories.append(
106
+ FileSystemFileReference(common_prefix["Prefix"].rstrip("/"))
107
+ )
108
+
109
+ return directories
110
+
89
111
  def download_files(
90
112
  self,
91
113
  filepaths: list[FileSystemObject],
@@ -115,6 +137,18 @@ class S3Session(FileSystemSession):
115
137
 
116
138
  return downloaded_files
117
139
 
140
+ def _move_object(self, src_key: str, dest_key: str) -> None:
141
+ assert self.bucket is not None, (
142
+ "call to _move_object on uninitialized s3 session"
143
+ )
144
+ self.bucket.Object(dest_key).copy_from(
145
+ CopySource={
146
+ "Bucket": self.bucket.name,
147
+ "Key": src_key,
148
+ }
149
+ )
150
+ self.bucket.Object(src_key).delete()
151
+
118
152
  def move_files(self, file_mappings: list[FileTransfer]) -> None:
119
153
  assert self.bucket is not None, "call to move_files on uninitialized s3 session"
120
154
 
@@ -123,10 +157,22 @@ class S3Session(FileSystemSession):
123
157
  dest_file, FileSystemFileReference
124
158
  ):
125
159
  raise IncompatibleFileReferenceError()
126
- self.bucket.Object(dest_file.filepath).copy_from(
127
- CopySource={
128
- "Bucket": self.bucket.name,
129
- "Key": src_file.filepath,
130
- }
131
- )
132
- self.bucket.Object(src_file.filepath).delete()
160
+ self._move_object(src_file.filepath, dest_file.filepath)
161
+
162
+ def move_directory(
163
+ self, src_dir: FileSystemObject, dest_dir: FileSystemObject
164
+ ) -> None:
165
+ if not isinstance(src_dir, FileSystemFileReference) or not isinstance(
166
+ dest_dir, FileSystemFileReference
167
+ ):
168
+ raise IncompatibleFileReferenceError()
169
+
170
+ assert self.bucket is not None, (
171
+ "call to move_directory on uninitialized s3 session"
172
+ )
173
+
174
+ src_prefix = _add_slash(src_dir.filepath)
175
+ dest_prefix = _add_slash(dest_dir.filepath)
176
+ for obj in self.bucket.objects.filter(Prefix=src_prefix):
177
+ dest_key = dest_prefix + obj.key[len(src_prefix) :]
178
+ self._move_object(obj.key, dest_key)
@@ -32,6 +32,17 @@ class FileSystemSession(ABC):
32
32
  def delete_files(self, filepaths: list[FileSystemObject]) -> None:
33
33
  raise NotImplementedError
34
34
 
35
+ def list_directories(self, dir_path: FileSystemObject) -> list[FileSystemObject]:
36
+ raise NotImplementedError
37
+
38
+ def create_directory(self, dir_path: FileSystemObject) -> None:
39
+ raise NotImplementedError
40
+
41
+ def move_directory(
42
+ self, src_dir: FileSystemObject, dest_dir: FileSystemObject
43
+ ) -> None:
44
+ raise NotImplementedError
45
+
35
46
  @abstractmethod
36
47
  def __enter__(self) -> "FileSystemSession": ...
37
48
 
@@ -26,10 +26,6 @@ def get_local_admin_server_port() -> int:
26
26
  return int(os.environ.get("UNC_ADMIN_SERVER_PORT", "50051"))
27
27
 
28
28
 
29
- def get_integration_admin_token() -> str | None:
30
- return os.environ.get("UNC_INTEGRATION_ADMIN_TOKEN")
31
-
32
-
33
29
  def get_otel_enabled() -> bool:
34
30
  return os.environ.get("UNC_OTEL_ENABLED") == "true"
35
31
 
@@ -12,7 +12,6 @@ from uncountable.integration.http_server import GenericHttpRequest, HttpExceptio
12
12
  from uncountable.integration.job import CustomHttpJob, WebhookJob
13
13
  from uncountable.integration.scan_profiles import load_profiles
14
14
  from uncountable.integration.telemetry import Logger
15
- from uncountable.integration.webhook_server.admin_routes import register_admin_routes
16
15
  from uncountable.types import job_definition_t
17
16
 
18
17
  app = flask.Flask(__name__)
@@ -99,7 +98,6 @@ def register_route(
99
98
 
100
99
  def main() -> None:
101
100
  app.add_url_rule("/health", "health", lambda: ("OK", 200))
102
- register_admin_routes(app)
103
101
 
104
102
  profiles = load_profiles()
105
103
  for profile_metadata in profiles:
@@ -21,7 +21,7 @@ __all__: list[str] = [
21
21
 
22
22
  ENDPOINT_METHOD = "POST"
23
23
  ENDPOINT_PATH = "api/external/recipes/external_set_recipe_inputs"
24
- ENDPOINT_DESCRIPTION = "Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Supports setting actual values, associating lots (creating them if needed), and removing inputs. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided."
24
+ ENDPOINT_DESCRIPTION = "Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Each entry edits one input on one recipe with a single operation: set the value (the actual value when set_actual_value is true, otherwise the set value), associate a lot (lot_recipe_id, created if the recipe is not already a lot), or remove the input (remove). A lot association targets the set value; combining it with set_actual_value fails. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided."
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -2177,7 +2177,7 @@ class ClientMethods(ABC):
2177
2177
  input_data: list[set_recipe_inputs_t.RecipeInputValue],
2178
2178
  _request_options: client_config_t.RequestOptions | None = None,
2179
2179
  ) -> set_recipe_inputs_t.Data:
2180
- """Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Supports setting actual values, associating lots (creating them if needed), and removing inputs. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided.
2180
+ """Sets input values for experiments. Supports numeric, text, and categorical types. Validates that the recipe step belongs to the correct recipe. Each entry edits one input on one recipe with a single operation: set the value (the actual value when set_actual_value is true, otherwise the set value), associate a lot (lot_recipe_id, created if the recipe is not already a lot), or remove the input (remove). A lot association targets the set value; combining it with set_actual_value fails. Writes all values to the first workflow step when no step is specified. Fails if both a numeric and string value are provided.
2181
2181
 
2182
2182
  :param input_data: The inputs to set. Must be at most 100 entries long
2183
2183
  """
@@ -1,38 +0,0 @@
1
- import functools
2
- import hmac
3
- from collections.abc import Callable
4
-
5
- import flask
6
- from flask.typing import ResponseReturnValue
7
- from uncountable.core.environment import get_integration_admin_token
8
- from uncountable.integration.http_server import HttpException
9
-
10
- _BEARER_PREFIX = "Bearer "
11
-
12
-
13
- def _extract_bearer_token(authorization_header: str | None) -> str | None:
14
- if authorization_header is None:
15
- return None
16
- if not authorization_header.startswith(_BEARER_PREFIX):
17
- return None
18
- return authorization_header[len(_BEARER_PREFIX) :]
19
-
20
-
21
- def require_admin_auth(
22
- view: Callable[..., ResponseReturnValue],
23
- ) -> Callable[..., ResponseReturnValue]:
24
- @functools.wraps(view)
25
- def wrapper(*args: object, **kwargs: object) -> ResponseReturnValue:
26
- admin_token = get_integration_admin_token()
27
- if admin_token is None:
28
- raise HttpException.service_unavailable()
29
- provided_token = _extract_bearer_token(
30
- flask.request.headers.get("Authorization")
31
- )
32
- if provided_token is None or not hmac.compare_digest(
33
- provided_token, admin_token
34
- ):
35
- raise HttpException.unauthorized()
36
- return view(*args, **kwargs)
37
-
38
- return wrapper
@@ -1,3 +0,0 @@
1
- from uncountable.integration.webhook_server.admin_routes.register import (
2
- register_admin_routes as register_admin_routes,
3
- )
@@ -1,39 +0,0 @@
1
- import functools
2
- from collections.abc import Callable
3
-
4
- import flask
5
- from flask.typing import ResponseReturnValue
6
- from uncountable.integration.http_server import HttpException
7
- from uncountable.integration.queue_runner.command_server.types import (
8
- CommandServerException,
9
- )
10
- from uncountable.integration.telemetry import Logger
11
-
12
-
13
- def register_admin_route(
14
- *,
15
- app: flask.Flask,
16
- logger: Logger,
17
- route: str,
18
- endpoint: str,
19
- view: Callable[..., ResponseReturnValue],
20
- methods: list[str],
21
- ) -> None:
22
- @functools.wraps(view)
23
- def wrapped(*args: object, **kwargs: object) -> ResponseReturnValue:
24
- with logger.push_scope(route):
25
- try:
26
- return view(*args, **kwargs)
27
- except HttpException as e:
28
- return e.make_error_response()
29
- except CommandServerException as e:
30
- logger.log_exception(
31
- e,
32
- message=f"admin route {route} could not reach the command server",
33
- )
34
- return HttpException.bad_gateway().make_error_response()
35
- except Exception as e:
36
- logger.log_exception(e, message=f"unexpected error on {route}")
37
- return HttpException.unknown_error().make_error_response()
38
-
39
- app.add_url_rule(route, endpoint=endpoint, view_func=wrapped, methods=methods)
@@ -1,30 +0,0 @@
1
- import flask
2
- from flask.typing import ResponseReturnValue
3
- from uncountable.core.environment import get_local_admin_server_port
4
- from uncountable.integration.queue_runner.command_server.command_client import (
5
- check_health,
6
- )
7
- from uncountable.integration.telemetry import Logger
8
- from uncountable.integration.webhook_server.admin_auth import require_admin_auth
9
- from uncountable.integration.webhook_server.admin_routes._boundary import (
10
- register_admin_route,
11
- )
12
-
13
- _ADMIN_HEALTH_ROUTE = "/admin/health"
14
-
15
-
16
- @require_admin_auth
17
- def _handle_admin_health() -> ResponseReturnValue:
18
- healthy = check_health(port=get_local_admin_server_port())
19
- return flask.jsonify({"healthy": healthy})
20
-
21
-
22
- def register_health_routes(*, app: flask.Flask, logger: Logger) -> None:
23
- register_admin_route(
24
- app=app,
25
- logger=logger,
26
- route=_ADMIN_HEALTH_ROUTE,
27
- endpoint="admin_health",
28
- view=_handle_admin_health,
29
- methods=["GET"],
30
- )
@@ -1,147 +0,0 @@
1
- import datetime
2
-
3
- import flask
4
- from flask.typing import ResponseReturnValue
5
- from uncountable.core.environment import get_local_admin_server_port
6
- from uncountable.integration.http_server import HttpException
7
- from uncountable.integration.queue_runner.command_server.command_client import (
8
- send_job_cancellation_message,
9
- send_job_queue_message,
10
- send_list_queued_jobs_message,
11
- send_retry_job_message,
12
- )
13
- from uncountable.integration.queue_runner.command_server.protocol.command_server_pb2 import (
14
- ListQueuedJobsResult,
15
- )
16
- from uncountable.integration.telemetry import Logger
17
- from uncountable.integration.webhook_server.admin_auth import require_admin_auth
18
- from uncountable.integration.webhook_server.admin_routes._boundary import (
19
- register_admin_route,
20
- )
21
- from uncountable.types import base_t, queued_job_t
22
-
23
- from pkgs.serialization_util import serialize_for_api
24
-
25
- _ADMIN_JOBS_ROUTE = "/admin/jobs"
26
- _ADMIN_ENQUEUE_JOB_ROUTE = "/admin/jobs/enqueue"
27
- _ADMIN_RETRY_JOB_ROUTE = "/admin/jobs/<job_uuid>/retry"
28
- _ADMIN_CANCEL_JOB_ROUTE = "/admin/jobs/<job_uuid>/cancel"
29
- _DEFAULT_JOBS_LIMIT = 100
30
- _VALID_JOB_STATUSES = {status.value for status in queued_job_t.JobStatus}
31
-
32
-
33
- def _parse_job_status(raw_status: str | None) -> queued_job_t.JobStatus | None:
34
- if raw_status is None:
35
- return None
36
- if raw_status not in _VALID_JOB_STATUSES:
37
- raise HttpException.bad_request(f"invalid status: {raw_status}")
38
- return queued_job_t.JobStatus(raw_status)
39
-
40
-
41
- def _parse_non_negative_int(raw_value: str | None, *, default: int) -> int:
42
- if raw_value is None:
43
- return default
44
- if not raw_value.isdigit():
45
- raise HttpException.bad_request(
46
- f"expected a non-negative integer, got: {raw_value}"
47
- )
48
- return int(raw_value)
49
-
50
-
51
- def _serialize_queued_job(
52
- item: ListQueuedJobsResult.ListQueuedJobsResultItem,
53
- ) -> dict[str, base_t.JsonValue]:
54
- metadata = queued_job_t.QueuedJobMetadata(
55
- queued_job_uuid=item.uuid,
56
- job_ref_name=item.job_ref_name,
57
- num_attempts=item.num_attempts,
58
- status=queued_job_t.JobStatus(item.status),
59
- submitted_at=item.submitted_at.ToDatetime(datetime.timezone.utc),
60
- )
61
- return serialize_for_api(metadata)
62
-
63
-
64
- @require_admin_auth
65
- def _handle_list_jobs() -> ResponseReturnValue:
66
- status = _parse_job_status(flask.request.args.get("status"))
67
- offset = _parse_non_negative_int(flask.request.args.get("offset"), default=0)
68
- limit = _parse_non_negative_int(
69
- flask.request.args.get("limit"), default=_DEFAULT_JOBS_LIMIT
70
- )
71
- jobs = send_list_queued_jobs_message(
72
- status=status, offset=offset, limit=limit, port=get_local_admin_server_port()
73
- )
74
- return flask.jsonify({"jobs": [_serialize_queued_job(job) for job in jobs]})
75
-
76
-
77
- @require_admin_auth
78
- def _handle_enqueue_job() -> ResponseReturnValue:
79
- body = flask.request.get_json(silent=True)
80
- if not isinstance(body, dict):
81
- raise HttpException.bad_request("expected a JSON object body")
82
- job_ref_name = body.get("job_ref_name")
83
- if not isinstance(job_ref_name, str):
84
- raise HttpException.bad_request("job_ref_name is required")
85
- webhook_payload = body.get("webhook_payload")
86
- invocation_context: queued_job_t.InvocationContext = (
87
- queued_job_t.InvocationContextManual()
88
- if webhook_payload is None
89
- else queued_job_t.InvocationContextWebhook(webhook_payload=webhook_payload)
90
- )
91
- queued_job_uuid = send_job_queue_message(
92
- job_ref_name=job_ref_name,
93
- payload=queued_job_t.QueuedJobPayload(invocation_context=invocation_context),
94
- port=get_local_admin_server_port(),
95
- )
96
- return flask.jsonify({"queuedJobUuid": queued_job_uuid})
97
-
98
-
99
- @require_admin_auth
100
- def _handle_retry_job(job_uuid: str) -> ResponseReturnValue:
101
- queued_job_uuid = send_retry_job_message(
102
- job_uuid=job_uuid, port=get_local_admin_server_port()
103
- )
104
- return flask.jsonify({"queuedJobUuid": queued_job_uuid})
105
-
106
-
107
- @require_admin_auth
108
- def _handle_cancel_job(job_uuid: str) -> ResponseReturnValue:
109
- status = send_job_cancellation_message(
110
- queued_job_uuid=job_uuid, port=get_local_admin_server_port()
111
- )
112
- return flask.jsonify({"status": status.value})
113
-
114
-
115
- def register_job_routes(*, app: flask.Flask, logger: Logger) -> None:
116
- register_admin_route(
117
- app=app,
118
- logger=logger,
119
- route=_ADMIN_JOBS_ROUTE,
120
- endpoint="admin_list_jobs",
121
- view=_handle_list_jobs,
122
- methods=["GET"],
123
- )
124
- register_admin_route(
125
- app=app,
126
- logger=logger,
127
- route=_ADMIN_ENQUEUE_JOB_ROUTE,
128
- endpoint="admin_enqueue_job",
129
- view=_handle_enqueue_job,
130
- methods=["POST"],
131
- )
132
- register_admin_route(
133
- app=app,
134
- logger=logger,
135
- route=_ADMIN_RETRY_JOB_ROUTE,
136
- endpoint="admin_retry_job",
137
- view=_handle_retry_job,
138
- methods=["POST"],
139
- )
140
- register_admin_route(
141
- app=app,
142
- logger=logger,
143
- route=_ADMIN_CANCEL_JOB_ROUTE,
144
- endpoint="admin_cancel_job",
145
- view=_handle_cancel_job,
146
- methods=["POST"],
147
- )
@@ -1,13 +0,0 @@
1
- import flask
2
- from opentelemetry.trace import get_current_span
3
- from uncountable.integration.telemetry import Logger
4
- from uncountable.integration.webhook_server.admin_routes.health import (
5
- register_health_routes,
6
- )
7
- from uncountable.integration.webhook_server.admin_routes.jobs import register_job_routes
8
-
9
-
10
- def register_admin_routes(app: flask.Flask) -> None:
11
- logger = Logger(get_current_span())
12
- register_health_routes(app=app, logger=logger)
13
- register_job_routes(app=app, logger=logger)