UncountablePythonSDK 0.0.160__tar.gz → 0.0.163__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 (407) hide show
  1. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/.github/workflows/publish.yml +1 -1
  2. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/PKG-INFO +2 -1
  3. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/UncountablePythonSDK.egg-info/PKG-INFO +2 -1
  4. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/UncountablePythonSDK.egg-info/SOURCES.txt +9 -1
  5. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/UncountablePythonSDK.egg-info/requires.txt +1 -0
  6. uncountablepythonsdk-0.0.163/docs/integration_examples/add_file_to_folder.md +57 -0
  7. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/integration_examples/index.md +1 -0
  8. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/requirements.txt +1 -1
  9. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/argument_parser/__init__.py +3 -3
  10. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/argument_parser/argument_parser.py +50 -36
  11. uncountablepythonsdk-0.0.163/pkgs/argument_parser/parser_error.py +60 -0
  12. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pyproject.toml +1 -0
  13. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/query/column.py +1 -1
  14. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/command_server.py +11 -7
  15. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +10 -0
  16. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/datastore/model.py +5 -1
  17. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/__init__.py +10 -2
  18. uncountablepythonsdk-0.0.163/uncountable/types/api/file_folders/add_file_to_folder.py +43 -0
  19. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/update_output_condition_parameter.py +1 -0
  20. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/create_recipe.py +1 -0
  21. uncountablepythonsdk-0.0.163/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +46 -0
  22. uncountablepythonsdk-0.0.163/uncountable/types/api/recipes/upsert_step_relationships.py +91 -0
  23. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/async_batch_processor.py +79 -1
  24. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/async_batch_t.py +2 -0
  25. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/client_base.py +83 -19
  26. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/entity_t.py +4 -0
  27. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/listing.py +1 -0
  28. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/listing_t.py +15 -1
  29. uncountablepythonsdk-0.0.163/uncountable/types/recipe_workflow_step_types.py +15 -0
  30. uncountablepythonsdk-0.0.163/uncountable/types/recipe_workflow_step_types_t.py +118 -0
  31. uncountablepythonsdk-0.0.163/uncountable/types/step_relationships.py +15 -0
  32. uncountablepythonsdk-0.0.163/uncountable/types/step_relationships_t.py +140 -0
  33. uncountablepythonsdk-0.0.160/uncountable/types/api/files/create_file_record.py +0 -41
  34. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/.github/workflows/documentation.yml +0 -0
  35. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/.gitignore +0 -0
  36. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/.python-version +0 -0
  37. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/README.md +0 -0
  38. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  39. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  40. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/.gitignore +0 -0
  41. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/conf.py +0 -0
  42. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/index.md +0 -0
  43. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/integration_examples/create_ingredient.md +0 -0
  44. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/integration_examples/create_output.md +0 -0
  45. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/integration_examples/upload_file.md +0 -0
  46. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/justfile +0 -0
  47. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/android-chrome-192x192.png +0 -0
  48. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/android-chrome-512x512.png +0 -0
  49. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/apple-touch-icon.png +0 -0
  50. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/browserconfig.xml +0 -0
  51. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/favicon-16x16.png +0 -0
  52. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/favicon-32x32.png +0 -0
  53. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/manifest.json +0 -0
  54. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/mstile-150x150.png +0 -0
  55. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  56. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/docs/static/logo_blue.png +0 -0
  57. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/async_batch.py +0 -0
  58. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/async_batch_large_parse.py +0 -0
  59. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/basic_auth.py +0 -0
  60. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/create_entity.py +0 -0
  61. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/create_ingredient_sdk.py +0 -0
  62. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/download_files.py +0 -0
  63. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/edit_recipe_inputs.py +0 -0
  64. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  65. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  66. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  67. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  68. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  69. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  70. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  71. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  72. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  73. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/integration-server/pyproject.toml +0 -0
  74. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/invoke_uploader.py +0 -0
  75. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/oauth.py +0 -0
  76. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/set_input_pdf_attribute.py +0 -0
  77. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/set_recipe_metadata_file.py +0 -0
  78. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/set_recipe_output_file_sdk.py +0 -0
  79. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/examples/upload_files.py +0 -0
  80. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/__init__.py +0 -0
  81. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/argument_parser/_is_enum.py +0 -0
  82. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  83. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/argument_parser/case_convert.py +0 -0
  84. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/__init__.py +0 -0
  85. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_blob_session.py +0 -0
  86. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  87. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  88. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_local_session.py +0 -0
  89. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_s3_session.py +0 -0
  90. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  91. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  92. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  93. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/py.typed +0 -0
  94. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/__init__.py +0 -0
  95. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/annotation.py +0 -0
  96. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/missing_sentry.py +0 -0
  97. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/opaque_key.py +0 -0
  98. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/serial_alias.py +0 -0
  99. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/serial_class.py +0 -0
  100. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/serial_generic.py +0 -0
  101. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/serial_union.py +0 -0
  102. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/unknown.py +0 -0
  103. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization/yaml.py +0 -0
  104. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization_util/__init__.py +0 -0
  105. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  106. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  107. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization_util/dataclasses.py +0 -0
  108. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/serialization_util/serialization_helpers.py +0 -0
  109. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/strenum_compat/__init__.py +0 -0
  110. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/strenum_compat/strenum_compat.py +0 -0
  111. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/__init__.py +0 -0
  112. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/__main__.py +0 -0
  113. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  114. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  115. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  116. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/builder.py +0 -0
  117. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/builder_types.py +0 -0
  118. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/config.py +0 -0
  119. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/cross_output_links.py +0 -0
  120. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_io_ts.py +0 -0
  121. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_open_api.py +0 -0
  122. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_open_api_util.py +0 -0
  123. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_python.py +0 -0
  124. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_typescript.py +0 -0
  125. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/emit_typescript_util.py +0 -0
  126. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/load_types.py +0 -0
  127. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  128. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/open_api_util.py +0 -0
  129. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/parts/base.py.prepart +0 -0
  130. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  131. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/test.py +0 -0
  132. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/type_info/__main__.py +0 -0
  133. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  134. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  136. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/util.py +0 -0
  137. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/value_spec/__init__.py +0 -0
  138. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/value_spec/__main__.py +0 -0
  139. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  140. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  141. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/pkgs/type_spec/value_spec/types.py +0 -0
  142. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/setup.cfg +0 -0
  143. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/async_batch.py +0 -0
  146. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/client.py +0 -0
  147. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/environment.py +0 -0
  148. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/file_upload.py +0 -0
  149. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/query/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/query/builder.py +0 -0
  151. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/query/row.py +0 -0
  152. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/query/types.py +0 -0
  153. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/core/types.py +0 -0
  154. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/cli.py +0 -0
  156. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/construct_client.py +0 -0
  157. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/cron.py +0 -0
  158. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/db/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/db/connect.py +0 -0
  160. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/db/session.py +0 -0
  161. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/entrypoint.py +0 -0
  162. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/executors/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/executors/executors.py +0 -0
  164. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  165. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/executors/script_executor.py +0 -0
  166. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/http_server/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/http_server/types.py +0 -0
  168. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/job.py +0 -0
  169. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  172. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  173. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  175. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  176. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  177. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  178. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  179. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  180. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  181. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  182. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  183. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/types.py +0 -0
  184. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/queue_runner/worker.py +0 -0
  185. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/request_context.py +0 -0
  186. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/scan_profiles.py +0 -0
  187. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/scheduler.py +0 -0
  188. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  190. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/server.py +0 -0
  191. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/telemetry.py +0 -0
  192. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  193. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/py.typed +0 -0
  194. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/batch/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/batch/execute_batch.py +0 -0
  197. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  198. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/chemical/__init__.py +0 -0
  199. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  200. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  201. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  202. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/create_entities.py +0 -0
  204. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/create_entity.py +0 -0
  205. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  206. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/export_entities.py +0 -0
  207. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/get_entities_data.py +0 -0
  208. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  209. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/list_aggregate.py +0 -0
  210. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/list_entities.py +0 -0
  211. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/lock_entity.py +0 -0
  212. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/lookup_entity.py +0 -0
  213. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  214. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/set_barcode.py +0 -0
  215. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  216. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/set_values.py +0 -0
  217. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  218. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/entity/unlock_entity.py +0 -0
  219. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/equipment/__init__.py +0 -0
  220. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  221. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/field_options/__init__.py +0 -0
  222. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  223. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/file_folders/__init__.py +0 -0
  224. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  225. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/files/__init__.py +0 -0
  226. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/files/download_file.py +0 -0
  227. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/id_source/__init__.py +0 -0
  228. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/id_source/list_id_source.py +0 -0
  229. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/id_source/match_id_source.py +0 -0
  230. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/input_groups/__init__.py +0 -0
  231. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  232. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/__init__.py +0 -0
  233. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/create_inputs.py +0 -0
  234. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/get_input_data.py +0 -0
  235. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/get_input_names.py +0 -0
  236. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  237. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  238. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/set_input_category.py +0 -0
  239. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  240. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  241. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/integrations/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  243. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/integrations/push_notification.py +0 -0
  244. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  245. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/listing/__init__.py +0 -0
  246. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/listing/export_listing.py +0 -0
  247. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/listing/fetch_listing.py +0 -0
  248. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/material_families/__init__.py +0 -0
  249. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  250. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/notebooks/__init__.py +0 -0
  251. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  252. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  253. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/__init__.py +0 -0
  254. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/get_output_data.py +0 -0
  255. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/get_output_names.py +0 -0
  256. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  257. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  258. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/permissions/__init__.py +0 -0
  259. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  260. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  261. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/project/__init__.py +0 -0
  262. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/project/get_projects.py +0 -0
  263. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/project/get_projects_data.py +0 -0
  264. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipe_links/__init__.py +0 -0
  265. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  266. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  267. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  268. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  269. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  271. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  272. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  273. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  274. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  275. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  276. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  277. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/create_recipes.py +0 -0
  278. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  279. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  280. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  281. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_curve.py +0 -0
  282. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  283. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  284. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  285. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  286. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  287. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  288. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  289. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  290. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  291. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  292. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  293. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  294. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  295. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  296. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  297. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  298. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/runsheet/__init__.py +0 -0
  299. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  300. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  301. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/triggers/__init__.py +0 -0
  302. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/triggers/run_trigger.py +0 -0
  303. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/uploader/__init__.py +0 -0
  304. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  305. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  306. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/user/__init__.py +0 -0
  307. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/api/user/get_current_user_info.py +0 -0
  308. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/async_batch.py +0 -0
  309. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/async_jobs.py +0 -0
  310. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/async_jobs_t.py +0 -0
  311. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/auth_retrieval.py +0 -0
  312. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/auth_retrieval_t.py +0 -0
  313. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/base.py +0 -0
  314. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/base_t.py +0 -0
  315. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/calculations.py +0 -0
  316. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/calculations_t.py +0 -0
  317. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/chemical_structure.py +0 -0
  318. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/chemical_structure_t.py +0 -0
  319. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/client_config.py +0 -0
  320. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/client_config_t.py +0 -0
  321. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/curves.py +0 -0
  322. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/curves_t.py +0 -0
  323. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/data.py +0 -0
  324. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/data_t.py +0 -0
  325. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/entity.py +0 -0
  326. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/experiment_groups.py +0 -0
  327. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/experiment_groups_t.py +0 -0
  328. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/exports.py +0 -0
  329. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/exports_t.py +0 -0
  330. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/field_values.py +0 -0
  331. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/field_values_t.py +0 -0
  332. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/fields.py +0 -0
  333. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/fields_t.py +0 -0
  334. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/generic_upload.py +0 -0
  335. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/generic_upload_t.py +0 -0
  336. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/id_source.py +0 -0
  337. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/id_source_t.py +0 -0
  338. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/identifier.py +0 -0
  339. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/identifier_t.py +0 -0
  340. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/input_attributes.py +0 -0
  341. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/input_attributes_t.py +0 -0
  342. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/inputs.py +0 -0
  343. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/inputs_t.py +0 -0
  344. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integration_server.py +0 -0
  345. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integration_server_t.py +0 -0
  346. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integration_session.py +0 -0
  347. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integration_session_t.py +0 -0
  348. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integrations.py +0 -0
  349. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/integrations_t.py +0 -0
  350. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/job_definition.py +0 -0
  351. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/job_definition_t.py +0 -0
  352. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/notices.py +0 -0
  353. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/notices_t.py +0 -0
  354. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/notifications.py +0 -0
  355. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/notifications_t.py +0 -0
  356. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/outputs.py +0 -0
  357. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/outputs_t.py +0 -0
  358. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/overrides.py +0 -0
  359. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/overrides_t.py +0 -0
  360. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/permissions.py +0 -0
  361. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/permissions_t.py +0 -0
  362. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/phases.py +0 -0
  363. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/phases_t.py +0 -0
  364. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/post_base.py +0 -0
  365. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/post_base_t.py +0 -0
  366. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/queued_job.py +0 -0
  367. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/queued_job_t.py +0 -0
  368. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_identifiers.py +0 -0
  369. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_identifiers_t.py +0 -0
  370. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_inputs.py +0 -0
  371. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_inputs_t.py +0 -0
  372. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_links.py +0 -0
  373. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_links_t.py +0 -0
  374. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_metadata.py +0 -0
  375. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_metadata_t.py +0 -0
  376. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_output_metadata.py +0 -0
  377. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_output_metadata_t.py +0 -0
  378. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_step_relationships.py +0 -0
  379. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_step_relationships_t.py +0 -0
  380. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_tags.py +0 -0
  381. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_tags_t.py +0 -0
  382. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_workflow_steps.py +0 -0
  383. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  384. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipes.py +0 -0
  385. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/recipes_t.py +0 -0
  386. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/response.py +0 -0
  387. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/response_t.py +0 -0
  388. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/runsheet.py +0 -0
  389. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/runsheet_format.py +0 -0
  390. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/runsheet_format_t.py +0 -0
  391. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/runsheet_t.py +0 -0
  392. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/secret_retrieval.py +0 -0
  393. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/secret_retrieval_t.py +0 -0
  394. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/sockets.py +0 -0
  395. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/sockets_t.py +0 -0
  396. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/specs.py +0 -0
  397. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/specs_t.py +0 -0
  398. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/units.py +0 -0
  399. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/units_t.py +0 -0
  400. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/uploader.py +0 -0
  401. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/uploader_t.py +0 -0
  402. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/users.py +0 -0
  403. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/users_t.py +0 -0
  404. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/webhook_job.py +0 -0
  405. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/webhook_job_t.py +0 -0
  406. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/workflows.py +0 -0
  407. {uncountablepythonsdk-0.0.160 → uncountablepythonsdk-0.0.163}/uncountable/types/workflows_t.py +0 -0
@@ -50,7 +50,7 @@ jobs:
50
50
  permissions:
51
51
  id-token: write
52
52
  steps:
53
- - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
53
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
54
54
  with:
55
55
  name: package-distributions
56
56
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.160
3
+ Version: 0.0.163
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
@@ -38,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: azure-storage-file-share==12.*
41
42
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
43
  Requires-Dist: msgspec<0.21,>=0.19
43
44
  Requires-Dist: tabulate==0.9.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.160
3
+ Version: 0.0.163
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
@@ -38,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: azure-storage-file-share==12.*
41
42
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
43
  Requires-Dist: msgspec<0.21,>=0.19
43
44
  Requires-Dist: tabulate==0.9.0
@@ -14,6 +14,7 @@ docs/conf.py
14
14
  docs/index.md
15
15
  docs/justfile
16
16
  docs/requirements.txt
17
+ docs/integration_examples/add_file_to_folder.md
17
18
  docs/integration_examples/create_ingredient.md
18
19
  docs/integration_examples/create_output.md
19
20
  docs/integration_examples/index.md
@@ -58,6 +59,7 @@ pkgs/argument_parser/_is_enum.py
58
59
  pkgs/argument_parser/_is_namedtuple.py
59
60
  pkgs/argument_parser/argument_parser.py
60
61
  pkgs/argument_parser/case_convert.py
62
+ pkgs/argument_parser/parser_error.py
61
63
  pkgs/filesystem_utils/__init__.py
62
64
  pkgs/filesystem_utils/_blob_session.py
63
65
  pkgs/filesystem_utils/_file_share_session.py
@@ -251,6 +253,8 @@ uncountable/types/recipe_step_relationships.py
251
253
  uncountable/types/recipe_step_relationships_t.py
252
254
  uncountable/types/recipe_tags.py
253
255
  uncountable/types/recipe_tags_t.py
256
+ uncountable/types/recipe_workflow_step_types.py
257
+ uncountable/types/recipe_workflow_step_types_t.py
254
258
  uncountable/types/recipe_workflow_steps.py
255
259
  uncountable/types/recipe_workflow_steps_t.py
256
260
  uncountable/types/recipes.py
@@ -267,6 +271,8 @@ uncountable/types/sockets.py
267
271
  uncountable/types/sockets_t.py
268
272
  uncountable/types/specs.py
269
273
  uncountable/types/specs_t.py
274
+ uncountable/types/step_relationships.py
275
+ uncountable/types/step_relationships_t.py
270
276
  uncountable/types/units.py
271
277
  uncountable/types/units_t.py
272
278
  uncountable/types/uploader.py
@@ -307,9 +313,9 @@ uncountable/types/api/equipment/associate_equipment_input.py
307
313
  uncountable/types/api/field_options/__init__.py
308
314
  uncountable/types/api/field_options/upsert_field_options.py
309
315
  uncountable/types/api/file_folders/__init__.py
316
+ uncountable/types/api/file_folders/add_file_to_folder.py
310
317
  uncountable/types/api/file_folders/modify_file_system.py
311
318
  uncountable/types/api/files/__init__.py
312
- uncountable/types/api/files/create_file_record.py
313
319
  uncountable/types/api/files/download_file.py
314
320
  uncountable/types/api/id_source/__init__.py
315
321
  uncountable/types/api/id_source/list_id_source.py
@@ -384,6 +390,8 @@ uncountable/types/api/recipes/set_recipe_tags.py
384
390
  uncountable/types/api/recipes/set_recipe_total.py
385
391
  uncountable/types/api/recipes/unarchive_recipes.py
386
392
  uncountable/types/api/recipes/unlock_recipes.py
393
+ uncountable/types/api/recipes/upsert_recipe_workflow_step.py
394
+ uncountable/types/api/recipes/upsert_step_relationships.py
387
395
  uncountable/types/api/runsheet/__init__.py
388
396
  uncountable/types/api/runsheet/complete_async_upload.py
389
397
  uncountable/types/api/runsheet/export_default_runsheet.py
@@ -20,6 +20,7 @@ simplejson==3.*
20
20
  grpcio==1.78.0
21
21
  protobuf>=4.21.1
22
22
  azure-storage-blob==12.*
23
+ azure-storage-file-share==12.*
23
24
  boto3-stubs[essential,ses]==1.*
24
25
  msgspec<0.21,>=0.19
25
26
  tabulate==0.9.0
@@ -0,0 +1,57 @@
1
+ # Add a File to a Folder
2
+
3
+ This is a two-step workflow: first upload the file using `upload_files`, then place it in a target folder using `add_file_to_folder`.
4
+
5
+ ## Step 1: Upload the file
6
+
7
+ ```{code-block} python
8
+ from io import BytesIO
9
+ from pathlib import Path
10
+
11
+ from uncountable.core import AuthDetailsApiKey, Client
12
+ from uncountable.core.client import ClientConfig
13
+ from uncountable.core.file_upload import DataFileUpload, UploadedFile
14
+
15
+ client: Client = Client(
16
+ base_url="<BASE_URL>",
17
+ auth_details=AuthDetailsApiKey(
18
+ api_id="<API_ID>", api_secret_key="<API_SECRET_KEY>"
19
+ ),
20
+ config=ClientConfig(allow_insecure_tls=False),
21
+ )
22
+
23
+ filepath = Path("<YOUR_FILE_PATH>")
24
+ file_io: BytesIO = BytesIO(filepath.read_bytes())
25
+
26
+ upload_file_response: list[UploadedFile] = client.upload_files(
27
+ file_uploads=[DataFileUpload(data=file_io, name=filepath.name)]
28
+ )
29
+
30
+ file_id = upload_file_response[0].file_id
31
+ ```
32
+
33
+ ## Step 2: Add the file to a folder
34
+
35
+ ```{code-block} python
36
+ from uncountable.types import identifier_t
37
+
38
+ response = client.add_file_to_folder(
39
+ file_id=file_id,
40
+ folder_key=identifier_t.IdentifierKeyId(id=<FOLDER_ID>),
41
+ )
42
+ ```
43
+
44
+ Example Response:
45
+ ```{code}
46
+ Data(modification_made=True, result_id=4521, entity=Entity(id=892, type=<EntityType.FILE_FOLDER_MEMBERSHIP: 'file_folder_membership'>), result_values=None)
47
+ ```
48
+
49
+ To add the file to the root folder instead of a specific folder:
50
+
51
+ ```{code-block} python
52
+ response = client.add_file_to_folder(
53
+ file_id=file_id,
54
+ folder_key=identifier_t.IdentifierKeyRefName(ref_name="root"),
55
+ )
56
+ ```
57
+
@@ -1,6 +1,7 @@
1
1
  # Integration Examples
2
2
 
3
3
  ```{toctree}
4
+ add_file_to_folder
4
5
  create_ingredient
5
6
  create_output
6
7
  upload_file
@@ -1,6 +1,6 @@
1
1
  furo==2025.12.19
2
2
  myst-parser==5.0.0
3
- sphinx-autoapi==3.7.0
3
+ sphinx-autoapi==3.8.0
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==9.1.0
6
6
  sphinx_design==0.7.0
@@ -1,11 +1,8 @@
1
1
  from ._is_enum import is_string_enum_class as is_string_enum_class
2
2
  from .argument_parser import CachedParser as CachedParser
3
3
  from .argument_parser import ParserBase as ParserBase
4
- from .argument_parser import ParserError as ParserError
5
- from .argument_parser import ParserExtraFieldsError as ParserExtraFieldsError
6
4
  from .argument_parser import ParserFunction as ParserFunction
7
5
  from .argument_parser import ParserOptions as ParserOptions
8
- from .argument_parser import ParserTypeError as ParserTypeError
9
6
  from .argument_parser import SourceEncoding as SourceEncoding
10
7
  from .argument_parser import build_parser as build_parser
11
8
  from .argument_parser import is_missing as is_missing
@@ -14,3 +11,6 @@ from .argument_parser import is_union as is_union
14
11
  from .case_convert import camel_to_snake_case as camel_to_snake_case
15
12
  from .case_convert import kebab_to_pascal_case as kebab_to_pascal_case
16
13
  from .case_convert import snake_to_camel_case as snake_to_camel_case
14
+ from .parser_error import ParserError as ParserError
15
+ from .parser_error import ParserExtraFieldsError as ParserExtraFieldsError
16
+ from .parser_error import ParserTypeError as ParserTypeError
@@ -26,6 +26,7 @@ from pkgs.serialization import (
26
26
  from ._is_enum import is_string_enum_class
27
27
  from ._is_namedtuple import is_namedtuple_type
28
28
  from .case_convert import camel_to_snake_case, snake_to_camel_case
29
+ from .parser_error import ParserError, ParserExtraFieldsError, ParserTypeError
29
30
 
30
31
  T = typing.TypeVar("T")
31
32
  ParserFunction = typing.Callable[[typing.Any], T]
@@ -72,22 +73,6 @@ class ParserContext:
72
73
  cache: ParserCache
73
74
 
74
75
 
75
- class ParserError(BaseException): ...
76
-
77
-
78
- class ParserExtraFieldsError(ParserError):
79
- extra_fields: set[str]
80
-
81
- def __init__(self, extra_fields: set[str]) -> None:
82
- self.extra_fields = extra_fields
83
-
84
- def __str__(self) -> str:
85
- return f"extra fields were provided: {', '.join(self.extra_fields)}"
86
-
87
-
88
- class ParserTypeError(ParserError): ...
89
-
90
-
91
76
  def is_union(field_type: typing.Any) -> bool:
92
77
  origin = typing.get_origin(field_type)
93
78
  return origin is typing.Union or origin is types.UnionType
@@ -152,8 +137,10 @@ def _invoke_fallback_parsers(
152
137
  except Exception as e:
153
138
  exceptions.append(e)
154
139
  continue
155
- raise ValueError(
156
- f"Unhandled value {value} cannot be cast to a member of {original_type}"
140
+ raise ParserError(
141
+ f"Unhandled value {value} cannot be cast to a member of {original_type}",
142
+ value=value,
143
+ expected_type=original_type,
157
144
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
158
145
 
159
146
 
@@ -169,7 +156,9 @@ def _invoke_membership_parser(
169
156
  if value == test_value:
170
157
  return test_value
171
158
 
172
- raise ValueError(f"Expected value from {expected_values} but got value {value}")
159
+ raise ParserError(
160
+ f"Expected value from {expected_values} but got value {value}", value=value
161
+ )
173
162
 
174
163
 
175
164
  # Uses `is` to compare
@@ -179,8 +168,10 @@ def _build_identity_parser(
179
168
  def parse(value: typing.Any) -> T:
180
169
  if value is identity_value:
181
170
  return identity_value
182
- raise ValueError(
183
- f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})"
171
+ raise ParserError(
172
+ f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})",
173
+ value=value,
174
+ expected_type=type(identity_value),
184
175
  )
185
176
 
186
177
  return parse
@@ -206,12 +197,12 @@ def _build_parser_discriminated_union(
206
197
  else:
207
198
  discriminant = value.get(discriminator)
208
199
  if discriminant is None:
209
- raise ValueError("missing-union-discriminant")
200
+ raise ParserError("missing-union-discriminant")
210
201
  if not isinstance(discriminant, str):
211
- raise ValueError("union-discriminant-is-not-string")
202
+ raise ParserError("union-discriminant-is-not-string", value=discriminant)
212
203
  parser = discriminator_map.get(discriminant)
213
204
  if parser is None:
214
- raise ValueError("missing-type-for-union-discriminant", discriminant)
205
+ raise ParserError("missing-type-for-union-discriminant", value=discriminant)
215
206
  return parser(value)
216
207
 
217
208
  return parse
@@ -384,18 +375,22 @@ def _build_parser_inner(
384
375
  if origin in (list, set):
385
376
  args = typing.get_args(parsed_type)
386
377
  if len(args) != 1:
387
- raise ValueError("List types only support one argument")
378
+ raise ParserError(
379
+ "List types only support one argument", expected_type=parsed_type
380
+ )
388
381
  arg_parser = _build_parser_inner(args[0], context, type_var_map)
389
382
 
390
383
  def parse_element(value: typing.Any) -> typing.Any:
391
384
  try:
392
385
  return arg_parser(value)
393
386
  except Exception as e:
394
- raise ValueError("Failed to parse element", value) from e
387
+ raise ParserError("Failed to parse element", value=value) from e
395
388
 
396
389
  def parse(value: typing.Any) -> typing.Any:
397
390
  if not isinstance(value, list):
398
- raise ValueError("value is not a list", parsed_type)
391
+ raise ParserError(
392
+ "value is not a list", value=value, expected_type=parsed_type
393
+ )
399
394
  return origin(parse_element(x) for x in value)
400
395
 
401
396
  return parse
@@ -403,7 +398,10 @@ def _build_parser_inner(
403
398
  if origin is dict:
404
399
  args = typing.get_args(parsed_type)
405
400
  if len(args) != 2:
406
- raise ValueError("Dict types only support two arguments for now")
401
+ raise ParserError(
402
+ "Dict types only support two arguments for now",
403
+ expected_type=parsed_type,
404
+ )
407
405
  k_inner_parser = _build_parser_inner(
408
406
  args[0],
409
407
  context,
@@ -479,7 +477,11 @@ def _build_parser_inner(
479
477
  return value # type: ignore
480
478
  if isinstance(value, (float, int)):
481
479
  return str(value) # type: ignore
482
- raise ValueError(f"Invalid string value: {type(value)}: {value}")
480
+ raise ParserError(
481
+ f"Invalid string value: {type(value)}: {value}",
482
+ value=value,
483
+ expected_type=str,
484
+ )
483
485
 
484
486
  return parse_str
485
487
 
@@ -488,7 +490,11 @@ def _build_parser_inner(
488
490
  def parse_as_numeric_type(value: typing.Any) -> T:
489
491
  numeric_value: Decimal | float = parsed_type(value) # type: ignore
490
492
  if math.isnan(numeric_value):
491
- raise ValueError(f"Invalid numeric value: {numeric_value}")
493
+ raise ParserError(
494
+ f"Invalid numeric value: {numeric_value}",
495
+ value=numeric_value,
496
+ expected_type=parsed_type,
497
+ )
492
498
 
493
499
  return numeric_value # type: ignore
494
500
 
@@ -500,7 +506,7 @@ def _build_parser_inner(
500
506
  if parsed_type is MissingSentryType:
501
507
 
502
508
  def error(value: typing.Any) -> T:
503
- raise ValueError("Missing type cannot be parsed directly")
509
+ raise ParserError("Missing type cannot be parsed directly")
504
510
 
505
511
  return error
506
512
 
@@ -519,7 +525,9 @@ def _build_parser_inner(
519
525
  type_var_map,
520
526
  )
521
527
 
522
- raise ValueError(f"Unhandled type {parsed_type}/{origin}")
528
+ raise ParserError(
529
+ f"Unhandled type {parsed_type}/{origin}", expected_type=parsed_type
530
+ )
523
531
 
524
532
 
525
533
  # Take in map of parameter name to materialized type
@@ -583,7 +591,9 @@ def _build_parser_dataclass(
583
591
  field_value: typing.Any
584
592
  if field_raw_value == dataclasses.MISSING:
585
593
  if serial_class_data.has_parse_require(field.name):
586
- raise ValueError("missing-required-field", field.name)
594
+ raise ParserError(
595
+ "missing-required-field", field_name=field.name
596
+ )
587
597
  if _has_field_default(field):
588
598
  field_value = _get_field_default(field)
589
599
  elif is_missing(field_type):
@@ -596,7 +606,9 @@ def _build_parser_dataclass(
596
606
  # Backwards compatibilty to dataclasses that didn't set a default value
597
607
  field_value = False
598
608
  else:
599
- raise ValueError("missing-value-for-field", field.name)
609
+ raise ParserError(
610
+ "missing-value-for-field", field_name=field.name
611
+ )
600
612
  elif (
601
613
  field_raw_value is None
602
614
  and not is_optional(field_type)
@@ -612,8 +624,10 @@ def _build_parser_dataclass(
612
624
  data[field.name] = field_value
613
625
 
614
626
  except Exception as e:
615
- raise ValueError(
616
- f"unable-to-parse-field:{field.name}", field_raw_value
627
+ raise ParserError(
628
+ f"unable-to-parse-field:{field.name}",
629
+ field_name=field.name,
630
+ value=field_raw_value,
617
631
  ) from e
618
632
 
619
633
  if context.options.strict_property_parsing:
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ _UNSET = object()
6
+
7
+
8
+ class ParserError(ValueError):
9
+ """Raised when argument parsing fails. Carries structured context about the failure."""
10
+
11
+ def __init__(
12
+ self,
13
+ message: str,
14
+ *,
15
+ value: typing.Any = _UNSET,
16
+ expected_type: typing.Any = None,
17
+ field_name: str | None = None,
18
+ ) -> None:
19
+ self.error_message = message
20
+ self.value = value
21
+ self.expected_type = expected_type
22
+ self.field_name = field_name
23
+ super().__init__(message)
24
+
25
+ def error_chain(self) -> list[ParserError]:
26
+ errors: list[ParserError] = []
27
+ current: BaseException | None = self
28
+ while isinstance(current, ParserError):
29
+ errors.append(current)
30
+ current = current.__cause__
31
+ return errors
32
+
33
+ def format_error_chain(self) -> str:
34
+ messages: list[str] = []
35
+ current: BaseException | None = self
36
+ while current is not None:
37
+ if isinstance(current, ParserError):
38
+ messages.append(current.error_message)
39
+ current = current.__cause__
40
+ else:
41
+ messages.append(str(current))
42
+ break
43
+
44
+ if len(messages) <= 1:
45
+ return self.error_message
46
+
47
+ return " → ".join(messages)
48
+
49
+
50
+ class ParserExtraFieldsError(ParserError):
51
+ extra_fields: set[str]
52
+
53
+ def __init__(self, extra_fields: set[str]) -> None:
54
+ self.extra_fields = extra_fields
55
+ super().__init__(
56
+ f"extra fields were provided: {', '.join(extra_fields)}",
57
+ )
58
+
59
+
60
+ class ParserTypeError(ParserError): ...
@@ -73,6 +73,7 @@ dependencies = [
73
73
  "grpcio == 1.78.0",
74
74
  "protobuf >= 4.21.1",
75
75
  "azure-storage-blob == 12.*",
76
+ "azure-storage-file-share == 12.*",
76
77
  "boto3-stubs[essential,ses]==1.*",
77
78
  "msgspec>=0.19,<0.21",
78
79
  "tabulate == 0.9.0",
@@ -294,7 +294,7 @@ class BooleanColumn[
294
294
  ) -> ColumnFilter:
295
295
  return ColumnFilter(
296
296
  identifier=self.identifier,
297
- filter=lambda x: listing_t.FilterSpecEquals(column=x, value=other),
297
+ filter=lambda x: listing_t.FilterSpecEqualsBoolean(column=x, value=other),
298
298
  )
299
299
 
300
300
 
@@ -159,13 +159,17 @@ async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None
159
159
  else None
160
160
  )
161
161
 
162
- queued_job_metadata = datastore.list_queued_job_metadata(
163
- status=job_status,
164
- limit=request.limit,
165
- offset=request.offset,
166
- job_ref_name=request.job_ref_name or None,
167
- submitted_from=submitted_from,
168
- submitted_to=submitted_to,
162
+ loop = asyncio.get_running_loop()
163
+ queued_job_metadata = await loop.run_in_executor(
164
+ None,
165
+ lambda: datastore.list_queued_job_metadata(
166
+ status=job_status,
167
+ limit=request.limit,
168
+ offset=request.offset,
169
+ job_ref_name=request.job_ref_name or None,
170
+ submitted_from=submitted_from,
171
+ submitted_to=submitted_to,
172
+ ),
169
173
  )
170
174
 
171
175
  response_list: list[ListQueuedJobsResult.ListQueuedJobsResultItem] = []
@@ -36,6 +36,16 @@ class DatastoreSqlite(Datastore):
36
36
  connection.execute(
37
37
  text("alter table queued_jobs add column status VARCHAR")
38
38
  )
39
+ connection.execute(
40
+ text(
41
+ "create index if not exists ix_queued_jobs_status on queued_jobs (status)"
42
+ )
43
+ )
44
+ connection.execute(
45
+ text(
46
+ "create index if not exists ix_queued_jobs_submitted_at on queued_jobs (submitted_at)"
47
+ )
48
+ )
39
49
 
40
50
  def add_job_to_queue(
41
51
  self, job_payload: queued_job_t.QueuedJobPayload, job_ref_name: str
@@ -13,7 +13,10 @@ class QueuedJob(Base):
13
13
  id = Column(Text, primary_key=True)
14
14
  job_ref_name = Column(Text, nullable=False, index=True)
15
15
  submitted_at = Column(
16
- DateTime(timezone=True), server_default=func.current_timestamp(), nullable=False
16
+ DateTime(timezone=True),
17
+ server_default=func.current_timestamp(),
18
+ nullable=False,
19
+ index=True,
17
20
  )
18
21
  payload = Column(JSON, nullable=False)
19
22
  num_attempts = Column(BigInteger, nullable=False, default=0, server_default="0")
@@ -21,4 +24,5 @@ class QueuedJob(Base):
21
24
  Enum(queued_job_t.JobStatus, length=None),
22
25
  default=queued_job_t.JobStatus.QUEUED,
23
26
  nullable=True,
27
+ index=True,
24
28
  )
@@ -2,6 +2,7 @@
2
2
  # ruff: noqa: E402 Q003
3
3
  # fmt: off
4
4
  # isort: skip_file
5
+ from .api.file_folders import add_file_to_folder as add_file_to_folder_t
5
6
  from .api.notebooks import add_notebook_content as add_notebook_content_t
6
7
  from .api.recipes import add_recipe_to_project as add_recipe_to_project_t
7
8
  from .api.recipes import add_time_series_data as add_time_series_data_t
@@ -22,7 +23,6 @@ from .api.runsheet import complete_async_upload as complete_async_upload_t
22
23
  from .api.chemical import convert_chemical_formats as convert_chemical_formats_t
23
24
  from .api.entity import create_entities as create_entities_t
24
25
  from .api.entity import create_entity as create_entity_t
25
- from .api.files import create_file_record as create_file_record_t
26
26
  from .api.inputs import create_inputs as create_inputs_t
27
27
  from .api.recipes import create_mix_order as create_mix_order_t
28
28
  from .api.entity import create_or_update_entity as create_or_update_entity_t
@@ -102,6 +102,7 @@ from . import recipe_metadata_t as recipe_metadata_t
102
102
  from . import recipe_output_metadata_t as recipe_output_metadata_t
103
103
  from . import recipe_step_relationships_t as recipe_step_relationships_t
104
104
  from . import recipe_tags_t as recipe_tags_t
105
+ from . import recipe_workflow_step_types_t as recipe_workflow_step_types_t
105
106
  from . import recipe_workflow_steps_t as recipe_workflow_steps_t
106
107
  from . import recipes_t as recipes_t
107
108
  from .api.integrations import register_sockets_token as register_sockets_token_t
@@ -132,6 +133,7 @@ from .api.recipes import set_recipe_total as set_recipe_total_t
132
133
  from .api.entity import set_values as set_values_t
133
134
  from . import sockets_t as sockets_t
134
135
  from . import specs_t as specs_t
136
+ from . import step_relationships_t as step_relationships_t
135
137
  from .api.entity import transition_entity_phase as transition_entity_phase_t
136
138
  from .api.recipes import unarchive_recipes as unarchive_recipes_t
137
139
  from . import units_t as units_t
@@ -142,12 +144,15 @@ from .api.outputs import update_output_condition_parameter as update_output_cond
142
144
  from . import uploader_t as uploader_t
143
145
  from .api.condition_parameters import upsert_condition_match as upsert_condition_match_t
144
146
  from .api.field_options import upsert_field_options as upsert_field_options_t
147
+ from .api.recipes import upsert_recipe_workflow_step as upsert_recipe_workflow_step_t
148
+ from .api.recipes import upsert_step_relationships as upsert_step_relationships_t
145
149
  from . import users_t as users_t
146
150
  from . import webhook_job_t as webhook_job_t
147
151
  from . import workflows_t as workflows_t
148
152
 
149
153
 
150
154
  __all__: list[str] = [
155
+ "add_file_to_folder_t",
151
156
  "add_notebook_content_t",
152
157
  "add_recipe_to_project_t",
153
158
  "add_time_series_data_t",
@@ -168,7 +173,6 @@ __all__: list[str] = [
168
173
  "convert_chemical_formats_t",
169
174
  "create_entities_t",
170
175
  "create_entity_t",
171
- "create_file_record_t",
172
176
  "create_inputs_t",
173
177
  "create_mix_order_t",
174
178
  "create_or_update_entity_t",
@@ -248,6 +252,7 @@ __all__: list[str] = [
248
252
  "recipe_output_metadata_t",
249
253
  "recipe_step_relationships_t",
250
254
  "recipe_tags_t",
255
+ "recipe_workflow_step_types_t",
251
256
  "recipe_workflow_steps_t",
252
257
  "recipes_t",
253
258
  "register_sockets_token_t",
@@ -278,6 +283,7 @@ __all__: list[str] = [
278
283
  "set_values_t",
279
284
  "sockets_t",
280
285
  "specs_t",
286
+ "step_relationships_t",
281
287
  "transition_entity_phase_t",
282
288
  "unarchive_recipes_t",
283
289
  "units_t",
@@ -288,6 +294,8 @@ __all__: list[str] = [
288
294
  "uploader_t",
289
295
  "upsert_condition_match_t",
290
296
  "upsert_field_options_t",
297
+ "upsert_recipe_workflow_step_t",
298
+ "upsert_step_relationships_t",
291
299
  "users_t",
292
300
  "webhook_job_t",
293
301
  "workflows_t",
@@ -0,0 +1,43 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ import dataclasses
10
+ from pkgs.serialization import serial_class
11
+ from ... import async_batch_t
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/file_folders/add_file_to_folder"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Arguments",
29
+ )
30
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
+ class Arguments:
32
+ file_id: base_t.ObjectId
33
+ folder_key: identifier_t.IdentifierKey
34
+
35
+
36
+ # DO NOT MODIFY -- This file is generated by type_spec
37
+ @serial_class(
38
+ named_type_path="sdk.api.file_folders.add_file_to_folder.Data",
39
+ )
40
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
41
+ class Data(async_batch_t.AsyncBatchActionReturn):
42
+ pass
43
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -36,6 +36,7 @@ class Arguments:
36
36
  update_type: post_base_t.UpdateType
37
37
  requirement_type: ConditionParameterRequirementType | None = None
38
38
  material_family_key: identifier_t.IdentifierKey | None = None
39
+ analytical_method_keys: list[identifier_t.IdentifierKey] | None = None
39
40
 
40
41
 
41
42
  # DO NOT MODIFY -- This file is generated by type_spec