UncountablePythonSDK 0.0.162__tar.gz → 0.0.164__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 (408) hide show
  1. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.github/workflows/publish.yml +1 -1
  3. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  5. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/SOURCES.txt +4 -0
  6. uncountablepythonsdk-0.0.164/docs/integration_examples/add_file_to_folder.md +57 -0
  7. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/index.md +1 -0
  8. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/pyproject.toml +1 -1
  9. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/__init__.py +4 -3
  10. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/argument_parser.py +71 -37
  11. uncountablepythonsdk-0.0.164/pkgs/argument_parser/parser_error.py +95 -0
  12. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/client.py +3 -4
  13. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/column.py +1 -1
  14. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/construct_client.py +13 -19
  15. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/command_server.py +11 -7
  16. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +10 -0
  17. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/model.py +5 -1
  18. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/worker.py +12 -1
  19. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/__init__.py +2 -0
  20. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch_processor.py +8 -8
  21. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_base.py +16 -16
  22. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/entity_t.py +8 -0
  23. uncountablepythonsdk-0.0.164/uncountable/types/request_headers.py +9 -0
  24. uncountablepythonsdk-0.0.164/uncountable/types/request_headers_t.py +33 -0
  25. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.gitignore +0 -0
  26. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/.python-version +0 -0
  27. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/README.md +0 -0
  28. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  29. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  30. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  31. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/.gitignore +0 -0
  32. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/conf.py +0 -0
  33. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/index.md +0 -0
  34. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/create_ingredient.md +0 -0
  35. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/create_output.md +0 -0
  36. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/integration_examples/upload_file.md +0 -0
  37. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/justfile +0 -0
  38. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/requirements.txt +0 -0
  39. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/android-chrome-192x192.png +0 -0
  40. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/android-chrome-512x512.png +0 -0
  41. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/apple-touch-icon.png +0 -0
  42. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/browserconfig.xml +0 -0
  43. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/favicon-16x16.png +0 -0
  44. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/favicon-32x32.png +0 -0
  45. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/manifest.json +0 -0
  46. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/mstile-150x150.png +0 -0
  47. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  48. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/docs/static/logo_blue.png +0 -0
  49. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/async_batch.py +0 -0
  50. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/async_batch_large_parse.py +0 -0
  51. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/basic_auth.py +0 -0
  52. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/create_entity.py +0 -0
  53. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/create_ingredient_sdk.py +0 -0
  54. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/download_files.py +0 -0
  55. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/edit_recipe_inputs.py +0 -0
  56. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  57. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  58. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  59. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  60. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  61. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  62. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  63. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  64. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  65. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/invoke_uploader.py +0 -0
  66. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/oauth.py +0 -0
  67. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_input_pdf_attribute.py +0 -0
  68. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_recipe_metadata_file.py +0 -0
  69. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/set_recipe_output_file_sdk.py +0 -0
  70. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/examples/upload_files.py +0 -0
  71. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/__init__.py +0 -0
  72. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/_is_enum.py +0 -0
  73. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  74. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/argument_parser/case_convert.py +0 -0
  75. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_blob_session.py +0 -0
  77. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  78. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  79. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_local_session.py +0 -0
  80. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_s3_session.py +0 -0
  81. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  82. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  83. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  84. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/py.typed +0 -0
  85. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/annotation.py +0 -0
  87. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/missing_sentry.py +0 -0
  88. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/opaque_key.py +0 -0
  89. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_alias.py +0 -0
  90. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_class.py +0 -0
  91. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_generic.py +0 -0
  92. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/serial_union.py +0 -0
  93. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/unknown.py +0 -0
  94. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization/yaml.py +0 -0
  95. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/__init__.py +0 -0
  96. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  97. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  98. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/dataclasses.py +0 -0
  99. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/serialization_util/serialization_helpers.py +0 -0
  100. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/strenum_compat/__init__.py +0 -0
  101. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/strenum_compat/strenum_compat.py +0 -0
  102. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/__init__.py +0 -0
  103. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/__main__.py +0 -0
  104. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  105. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  106. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  107. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/builder.py +0 -0
  108. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/builder_types.py +0 -0
  109. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/config.py +0 -0
  110. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/cross_output_links.py +0 -0
  111. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_io_ts.py +0 -0
  112. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_open_api.py +0 -0
  113. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_open_api_util.py +0 -0
  114. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_python.py +0 -0
  115. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_typescript.py +0 -0
  116. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/emit_typescript_util.py +0 -0
  117. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/load_types.py +0 -0
  118. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  119. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/open_api_util.py +0 -0
  120. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/parts/base.py.prepart +0 -0
  121. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  122. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/test.py +0 -0
  123. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/type_info/__main__.py +0 -0
  124. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  125. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  127. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/util.py +0 -0
  128. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/__init__.py +0 -0
  129. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/__main__.py +0 -0
  130. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  131. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  132. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pkgs/type_spec/value_spec/types.py +0 -0
  133. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/pyproject.toml +0 -0
  134. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/setup.cfg +0 -0
  135. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/__init__.py +0 -0
  137. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/async_batch.py +0 -0
  138. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/environment.py +0 -0
  139. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/file_upload.py +0 -0
  140. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/__init__.py +0 -0
  141. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/builder.py +0 -0
  142. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/row.py +0 -0
  143. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/query/types.py +0 -0
  144. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/core/types.py +0 -0
  145. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/cli.py +0 -0
  147. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/cron.py +0 -0
  148. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/connect.py +0 -0
  150. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/db/session.py +0 -0
  151. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/entrypoint.py +0 -0
  152. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/executors.py +0 -0
  154. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  155. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/executors/script_executor.py +0 -0
  156. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/http_server/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/http_server/types.py +0 -0
  158. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/job.py +0 -0
  159. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  162. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  163. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  164. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  165. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  166. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  167. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  168. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  169. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  171. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  172. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  173. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/queue_runner/types.py +0 -0
  174. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/request_context.py +0 -0
  175. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/scan_profiles.py +0 -0
  176. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/scheduler.py +0 -0
  177. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  178. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  179. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/server.py +0 -0
  180. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/telemetry.py +0 -0
  181. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  182. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/py.typed +0 -0
  183. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/__init__.py +0 -0
  185. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/execute_batch.py +0 -0
  186. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  187. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/chemical/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  189. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  190. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  191. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/__init__.py +0 -0
  192. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_entities.py +0 -0
  193. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_entity.py +0 -0
  194. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  195. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/export_entities.py +0 -0
  196. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/get_entities_data.py +0 -0
  197. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  198. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/list_aggregate.py +0 -0
  199. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/list_entities.py +0 -0
  200. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/lock_entity.py +0 -0
  201. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/lookup_entity.py +0 -0
  202. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  203. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_barcode.py +0 -0
  204. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  205. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/set_values.py +0 -0
  206. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  207. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/entity/unlock_entity.py +0 -0
  208. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/equipment/__init__.py +0 -0
  209. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  210. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/field_options/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  212. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  214. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  215. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/files/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/files/download_file.py +0 -0
  217. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/__init__.py +0 -0
  218. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/list_id_source.py +0 -0
  219. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/id_source/match_id_source.py +0 -0
  220. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/input_groups/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  222. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/__init__.py +0 -0
  223. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/create_inputs.py +0 -0
  224. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_input_data.py +0 -0
  225. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_input_names.py +0 -0
  226. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  227. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  228. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_category.py +0 -0
  229. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  230. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  231. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  233. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/push_notification.py +0 -0
  234. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  235. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/__init__.py +0 -0
  236. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/export_listing.py +0 -0
  237. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/listing/fetch_listing.py +0 -0
  238. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/material_families/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  240. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/__init__.py +0 -0
  241. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  242. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  243. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_data.py +0 -0
  245. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_names.py +0 -0
  246. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  247. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  248. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  249. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/__init__.py +0 -0
  250. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  251. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  252. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/get_projects.py +0 -0
  254. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/project/get_projects_data.py +0 -0
  255. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/__init__.py +0 -0
  256. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  257. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  258. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  259. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  260. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/__init__.py +0 -0
  261. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  262. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  263. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  264. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  265. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  266. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  267. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  268. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_recipe.py +0 -0
  269. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/create_recipes.py +0 -0
  270. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  271. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  272. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  273. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_curve.py +0 -0
  274. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  275. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  276. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  277. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  278. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  279. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  280. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  281. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  282. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  283. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  284. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  285. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  286. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  287. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  288. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  289. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  290. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  291. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  292. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/__init__.py +0 -0
  293. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  294. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  295. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/triggers/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/triggers/run_trigger.py +0 -0
  297. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/__init__.py +0 -0
  298. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  299. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  300. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/user/__init__.py +0 -0
  301. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/api/user/get_current_user_info.py +0 -0
  302. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch.py +0 -0
  303. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_batch_t.py +0 -0
  304. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_jobs.py +0 -0
  305. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/async_jobs_t.py +0 -0
  306. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/auth_retrieval.py +0 -0
  307. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/auth_retrieval_t.py +0 -0
  308. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/base.py +0 -0
  309. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/base_t.py +0 -0
  310. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/calculations.py +0 -0
  311. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/calculations_t.py +0 -0
  312. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/chemical_structure.py +0 -0
  313. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/chemical_structure_t.py +0 -0
  314. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_config.py +0 -0
  315. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/client_config_t.py +0 -0
  316. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/curves.py +0 -0
  317. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/curves_t.py +0 -0
  318. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/data.py +0 -0
  319. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/data_t.py +0 -0
  320. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/entity.py +0 -0
  321. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/experiment_groups.py +0 -0
  322. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/experiment_groups_t.py +0 -0
  323. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/exports.py +0 -0
  324. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/exports_t.py +0 -0
  325. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/field_values.py +0 -0
  326. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/field_values_t.py +0 -0
  327. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/fields.py +0 -0
  328. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/fields_t.py +0 -0
  329. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/generic_upload.py +0 -0
  330. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/generic_upload_t.py +0 -0
  331. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/id_source.py +0 -0
  332. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/id_source_t.py +0 -0
  333. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/identifier.py +0 -0
  334. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/identifier_t.py +0 -0
  335. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/input_attributes.py +0 -0
  336. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/input_attributes_t.py +0 -0
  337. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/inputs.py +0 -0
  338. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/inputs_t.py +0 -0
  339. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_server.py +0 -0
  340. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_server_t.py +0 -0
  341. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_session.py +0 -0
  342. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integration_session_t.py +0 -0
  343. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integrations.py +0 -0
  344. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/integrations_t.py +0 -0
  345. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/job_definition.py +0 -0
  346. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/job_definition_t.py +0 -0
  347. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/listing.py +0 -0
  348. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/listing_t.py +0 -0
  349. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notices.py +0 -0
  350. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notices_t.py +0 -0
  351. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notifications.py +0 -0
  352. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/notifications_t.py +0 -0
  353. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/outputs.py +0 -0
  354. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/outputs_t.py +0 -0
  355. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/overrides.py +0 -0
  356. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/overrides_t.py +0 -0
  357. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/permissions.py +0 -0
  358. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/permissions_t.py +0 -0
  359. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/phases.py +0 -0
  360. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/phases_t.py +0 -0
  361. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/post_base.py +0 -0
  362. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/post_base_t.py +0 -0
  363. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/queued_job.py +0 -0
  364. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/queued_job_t.py +0 -0
  365. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_identifiers.py +0 -0
  366. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_identifiers_t.py +0 -0
  367. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_inputs.py +0 -0
  368. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_inputs_t.py +0 -0
  369. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_links.py +0 -0
  370. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_links_t.py +0 -0
  371. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_metadata.py +0 -0
  372. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_metadata_t.py +0 -0
  373. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_output_metadata.py +0 -0
  374. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_output_metadata_t.py +0 -0
  375. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_step_relationships.py +0 -0
  376. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_step_relationships_t.py +0 -0
  377. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_tags.py +0 -0
  378. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_tags_t.py +0 -0
  379. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_step_types.py +0 -0
  380. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  381. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_steps.py +0 -0
  382. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  383. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipes.py +0 -0
  384. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/recipes_t.py +0 -0
  385. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/response.py +0 -0
  386. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/response_t.py +0 -0
  387. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet.py +0 -0
  388. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_format.py +0 -0
  389. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_format_t.py +0 -0
  390. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/runsheet_t.py +0 -0
  391. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/secret_retrieval.py +0 -0
  392. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/secret_retrieval_t.py +0 -0
  393. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/sockets.py +0 -0
  394. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/sockets_t.py +0 -0
  395. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/specs.py +0 -0
  396. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/specs_t.py +0 -0
  397. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/step_relationships.py +0 -0
  398. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/step_relationships_t.py +0 -0
  399. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/units.py +0 -0
  400. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/units_t.py +0 -0
  401. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/uploader.py +0 -0
  402. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/uploader_t.py +0 -0
  403. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/users.py +0 -0
  404. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/users_t.py +0 -0
  405. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/webhook_job.py +0 -0
  406. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/webhook_job_t.py +0 -0
  407. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/workflows.py +0 -0
  408. {uncountablepythonsdk-0.0.162 → uncountablepythonsdk-0.0.164}/uncountable/types/workflows_t.py +0 -0
@@ -17,7 +17,7 @@ jobs:
17
17
  - name: Set up UV
18
18
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
19
19
  with:
20
- version: "0.10.0"
20
+ version: "0.11.0"
21
21
  activate-environment: true
22
22
  enable-cache: true
23
23
  - name: Install dependencies
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Set up UV
27
27
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
28
28
  with:
29
- version: "0.10.0"
29
+ version: "0.11.0"
30
30
  activate-environment: true
31
31
  enable-cache: true
32
32
  - name: Install build dependencies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.162
3
+ Version: 0.0.164
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.162
3
+ Version: 0.0.164
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
@@ -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
@@ -257,6 +259,8 @@ uncountable/types/recipe_workflow_steps.py
257
259
  uncountable/types/recipe_workflow_steps_t.py
258
260
  uncountable/types/recipes.py
259
261
  uncountable/types/recipes_t.py
262
+ uncountable/types/request_headers.py
263
+ uncountable/types/request_headers_t.py
260
264
  uncountable/types/response.py
261
265
  uncountable/types/response_t.py
262
266
  uncountable/types/runsheet.py
@@ -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
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
11
  "more_itertools == 10.*",
12
- "types-paramiko ==4.0.0.20250822",
12
+ "types-paramiko ==4.0.0.20260322",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
15
  "types-pytz ==2026.*",
@@ -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,7 @@ 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 ParserEnumError as ParserEnumError
15
+ from .parser_error import ParserError as ParserError
16
+ from .parser_error import ParserExtraFieldsError as ParserExtraFieldsError
17
+ from .parser_error import ParserTypeError as ParserTypeError
@@ -26,6 +26,12 @@ 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 (
30
+ ParserEnumError,
31
+ ParserError,
32
+ ParserExtraFieldsError,
33
+ ParserTypeError,
34
+ )
29
35
 
30
36
  T = typing.TypeVar("T")
31
37
  ParserFunction = typing.Callable[[typing.Any], T]
@@ -72,22 +78,6 @@ class ParserContext:
72
78
  cache: ParserCache
73
79
 
74
80
 
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
81
  def is_union(field_type: typing.Any) -> bool:
92
82
  origin = typing.get_origin(field_type)
93
83
  return origin is typing.Union or origin is types.UnionType
@@ -152,8 +142,10 @@ def _invoke_fallback_parsers(
152
142
  except Exception as e:
153
143
  exceptions.append(e)
154
144
  continue
155
- raise ValueError(
156
- f"Unhandled value {value} cannot be cast to a member of {original_type}"
145
+ raise ParserError(
146
+ f"Unhandled value {value} cannot be cast to a member of {original_type}",
147
+ value=value,
148
+ expected_type=original_type,
157
149
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
158
150
 
159
151
 
@@ -169,7 +161,9 @@ def _invoke_membership_parser(
169
161
  if value == test_value:
170
162
  return test_value
171
163
 
172
- raise ValueError(f"Expected value from {expected_values} but got value {value}")
164
+ raise ParserError(
165
+ f"Expected value from {expected_values} but got value {value}", value=value
166
+ )
173
167
 
174
168
 
175
169
  # Uses `is` to compare
@@ -179,8 +173,10 @@ def _build_identity_parser(
179
173
  def parse(value: typing.Any) -> T:
180
174
  if value is identity_value:
181
175
  return identity_value
182
- raise ValueError(
183
- f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})"
176
+ raise ParserError(
177
+ f"Expected value {identity_value} (type: {type(identity_value)}) but got value {value} (type: {type(value)})",
178
+ value=value,
179
+ expected_type=type(identity_value),
184
180
  )
185
181
 
186
182
  return parse
@@ -206,12 +202,12 @@ def _build_parser_discriminated_union(
206
202
  else:
207
203
  discriminant = value.get(discriminator)
208
204
  if discriminant is None:
209
- raise ValueError("missing-union-discriminant")
205
+ raise ParserError("missing-union-discriminant")
210
206
  if not isinstance(discriminant, str):
211
- raise ValueError("union-discriminant-is-not-string")
207
+ raise ParserError("union-discriminant-is-not-string", value=discriminant)
212
208
  parser = discriminator_map.get(discriminant)
213
209
  if parser is None:
214
- raise ValueError("missing-type-for-union-discriminant", discriminant)
210
+ raise ParserError("missing-type-for-union-discriminant", value=discriminant)
215
211
  return parser(value)
216
212
 
217
213
  return parse
@@ -384,18 +380,22 @@ def _build_parser_inner(
384
380
  if origin in (list, set):
385
381
  args = typing.get_args(parsed_type)
386
382
  if len(args) != 1:
387
- raise ValueError("List types only support one argument")
383
+ raise ParserError(
384
+ "List types only support one argument", expected_type=parsed_type
385
+ )
388
386
  arg_parser = _build_parser_inner(args[0], context, type_var_map)
389
387
 
390
388
  def parse_element(value: typing.Any) -> typing.Any:
391
389
  try:
392
390
  return arg_parser(value)
393
391
  except Exception as e:
394
- raise ValueError("Failed to parse element", value) from e
392
+ raise ParserError("Failed to parse element", value=value) from e
395
393
 
396
394
  def parse(value: typing.Any) -> typing.Any:
397
395
  if not isinstance(value, list):
398
- raise ValueError("value is not a list", parsed_type)
396
+ raise ParserError(
397
+ "value is not a list", value=value, expected_type=parsed_type
398
+ )
399
399
  return origin(parse_element(x) for x in value)
400
400
 
401
401
  return parse
@@ -403,7 +403,10 @@ def _build_parser_inner(
403
403
  if origin is dict:
404
404
  args = typing.get_args(parsed_type)
405
405
  if len(args) != 2:
406
- raise ValueError("Dict types only support two arguments for now")
406
+ raise ParserError(
407
+ "Dict types only support two arguments for now",
408
+ expected_type=parsed_type,
409
+ )
407
410
  k_inner_parser = _build_parser_inner(
408
411
  args[0],
409
412
  context,
@@ -479,7 +482,11 @@ def _build_parser_inner(
479
482
  return value # type: ignore
480
483
  if isinstance(value, (float, int)):
481
484
  return str(value) # type: ignore
482
- raise ValueError(f"Invalid string value: {type(value)}: {value}")
485
+ raise ParserError(
486
+ f"Invalid string value: {type(value)}: {value}",
487
+ value=value,
488
+ expected_type=str,
489
+ )
483
490
 
484
491
  return parse_str
485
492
 
@@ -488,19 +495,38 @@ def _build_parser_inner(
488
495
  def parse_as_numeric_type(value: typing.Any) -> T:
489
496
  numeric_value: Decimal | float = parsed_type(value) # type: ignore
490
497
  if math.isnan(numeric_value):
491
- raise ValueError(f"Invalid numeric value: {numeric_value}")
498
+ raise ParserError(
499
+ f"Invalid numeric value: {numeric_value}",
500
+ value=numeric_value,
501
+ expected_type=parsed_type,
502
+ )
492
503
 
493
504
  return numeric_value # type: ignore
494
505
 
495
506
  return parse_as_numeric_type
496
507
 
497
- if parsed_type in (dict, bool) or is_string_enum_class(parsed_type):
508
+ if parsed_type in (dict, bool):
498
509
  return lambda value: parsed_type(value) # type: ignore
499
510
 
511
+ if is_string_enum_class(parsed_type):
512
+ assert issubclass(parsed_type, Enum)
513
+ enum_values: set[str] = set(member.value for member in parsed_type)
514
+
515
+ def parse_enum(value: typing.Any) -> T:
516
+ if not isinstance(value, str) or value not in enum_values:
517
+ raise ParserEnumError(
518
+ value=value,
519
+ enum_type=parsed_type,
520
+ valid_values=enum_values,
521
+ )
522
+ return parsed_type(value)
523
+
524
+ return parse_enum
525
+
500
526
  if parsed_type is MissingSentryType:
501
527
 
502
528
  def error(value: typing.Any) -> T:
503
- raise ValueError("Missing type cannot be parsed directly")
529
+ raise ParserError("Missing type cannot be parsed directly")
504
530
 
505
531
  return error
506
532
 
@@ -519,7 +545,9 @@ def _build_parser_inner(
519
545
  type_var_map,
520
546
  )
521
547
 
522
- raise ValueError(f"Unhandled type {parsed_type}/{origin}")
548
+ raise ParserError(
549
+ f"Unhandled type {parsed_type}/{origin}", expected_type=parsed_type
550
+ )
523
551
 
524
552
 
525
553
  # Take in map of parameter name to materialized type
@@ -583,7 +611,9 @@ def _build_parser_dataclass(
583
611
  field_value: typing.Any
584
612
  if field_raw_value == dataclasses.MISSING:
585
613
  if serial_class_data.has_parse_require(field.name):
586
- raise ValueError("missing-required-field", field.name)
614
+ raise ParserError(
615
+ "missing-required-field", field_name=field.name
616
+ )
587
617
  if _has_field_default(field):
588
618
  field_value = _get_field_default(field)
589
619
  elif is_missing(field_type):
@@ -596,7 +626,9 @@ def _build_parser_dataclass(
596
626
  # Backwards compatibilty to dataclasses that didn't set a default value
597
627
  field_value = False
598
628
  else:
599
- raise ValueError("missing-value-for-field", field.name)
629
+ raise ParserError(
630
+ "missing-value-for-field", field_name=field.name
631
+ )
600
632
  elif (
601
633
  field_raw_value is None
602
634
  and not is_optional(field_type)
@@ -612,8 +644,10 @@ def _build_parser_dataclass(
612
644
  data[field.name] = field_value
613
645
 
614
646
  except Exception as e:
615
- raise ValueError(
616
- f"unable-to-parse-field:{field.name}", field_raw_value
647
+ raise ParserError(
648
+ f"unable-to-parse-field:{field.name}",
649
+ field_name=field.name,
650
+ value=field_raw_value,
617
651
  ) from e
618
652
 
619
653
  if context.options.strict_property_parsing:
@@ -0,0 +1,95 @@
1
+ from __future__ import annotations
2
+
3
+ import reprlib
4
+ import typing
5
+
6
+ _UNSET = object()
7
+ _VALUE_REPR_MAX_LENGTH = 120
8
+
9
+
10
+ def _format_value(value: object) -> str:
11
+ value_repr = reprlib.Repr(
12
+ maxstring=_VALUE_REPR_MAX_LENGTH, maxother=_VALUE_REPR_MAX_LENGTH
13
+ ).repr(value)
14
+ if len(value_repr) <= _VALUE_REPR_MAX_LENGTH:
15
+ return value_repr
16
+ return f"{value_repr[: _VALUE_REPR_MAX_LENGTH - 3]}..."
17
+
18
+
19
+ def _format_message(message: str, value: object) -> str:
20
+ if value is _UNSET:
21
+ return message
22
+ return f"{message} (value: {_format_value(value)})"
23
+
24
+
25
+ class ParserError(ValueError):
26
+ """Raised when argument parsing fails. Carries structured context about the failure."""
27
+
28
+ def __init__(
29
+ self,
30
+ message: str,
31
+ *,
32
+ value: typing.Any = _UNSET,
33
+ expected_type: typing.Any = None,
34
+ field_name: str | None = None,
35
+ ) -> None:
36
+ self.error_message = message
37
+ self.value = value
38
+ self.expected_type = expected_type
39
+ self.field_name = field_name
40
+ super().__init__(message)
41
+
42
+ def __str__(self) -> str:
43
+ return _format_message(self.error_message, self.value)
44
+
45
+ def error_chain(self) -> list[ParserError]:
46
+ errors: list[ParserError] = []
47
+ current: BaseException | None = self
48
+ while isinstance(current, ParserError):
49
+ errors.append(current)
50
+ current = current.__cause__
51
+ return errors
52
+
53
+ def format_error_chain(self) -> str:
54
+ messages: list[str] = []
55
+ current: BaseException | None = self
56
+ while current is not None:
57
+ if isinstance(current, ParserError):
58
+ messages.append(_format_message(current.error_message, current.value))
59
+ current = current.__cause__
60
+ else:
61
+ messages.append(str(current))
62
+ break
63
+
64
+ if len(messages) <= 1:
65
+ return _format_message(self.error_message, self.value)
66
+
67
+ return " → ".join(messages)
68
+
69
+
70
+ class ParserExtraFieldsError(ParserError):
71
+ extra_fields: set[str]
72
+
73
+ def __init__(self, extra_fields: set[str]) -> None:
74
+ self.extra_fields = extra_fields
75
+ super().__init__(
76
+ f"extra fields were provided: {', '.join(extra_fields)}",
77
+ )
78
+
79
+
80
+ class ParserEnumError(ParserError):
81
+ valid_values: set[str]
82
+
83
+ def __init__(
84
+ self,
85
+ *,
86
+ value: object,
87
+ enum_type: type,
88
+ valid_values: set[str],
89
+ ) -> None:
90
+ self.valid_values = valid_values
91
+ message = f"'{value}' is not a valid string enum of type {enum_type.__name__}."
92
+ super().__init__(message, value=value, expected_type=enum_type)
93
+
94
+
95
+ class ParserTypeError(ParserError): ...
@@ -24,13 +24,12 @@ from uncountable.types import download_file_t
24
24
  from uncountable.types.client_base import APIRequest, ClientMethods
25
25
  from uncountable.types.client_config import ClientConfigOptions
26
26
  from uncountable.types.client_config_t import RequestContext
27
+ from uncountable.types.request_headers_t import InternalRequestHeaders, VersionHeaders
27
28
 
28
29
  from .file_upload import FileUpload, FileUploader, UploadedFile
29
30
  from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
30
31
 
31
32
  DT = typing.TypeVar("DT")
32
- UNC_REQUEST_ID_HEADER = "X-UNC-REQUEST-ID"
33
- UNC_SDK_VERSION_HEADER = "X-UNC-SDK-VERSION"
34
33
 
35
34
 
36
35
  class EndpointMethod(StrEnum):
@@ -328,8 +327,8 @@ class Client(ClientMethods):
328
327
  self, *, api_request: APIRequest, request_id: str
329
328
  ) -> HTTPRequest:
330
329
  headers = self._build_auth_headers()
331
- headers[UNC_REQUEST_ID_HEADER] = request_id
332
- headers[UNC_SDK_VERSION_HEADER] = get_version()
330
+ headers[InternalRequestHeaders.REQUEST_ID] = request_id
331
+ headers[VersionHeaders.UNC_SDK_VERSION] = get_version()
333
332
  if self._cfg.request_context is not None:
334
333
  if self._cfg.request_context.user_locale is not None:
335
334
  headers["X-User-Locale"] = self._cfg.request_context.user_locale
@@ -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
 
@@ -30,34 +30,28 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
30
30
  return AuthDetailsApiKey(api_id=api_id, api_secret_key=api_key)
31
31
 
32
32
 
33
- def _construct_client_config(
34
- *,
35
- profile_meta: ProfileMetadata,
36
- job_logger: JobLogger,
37
- request_context: RequestContext | None = None,
38
- ) -> ClientConfig:
39
- if profile_meta.client_options is None:
40
- return ClientConfig(logger=job_logger, request_context=request_context)
41
- return ClientConfig(
42
- allow_insecure_tls=profile_meta.client_options.allow_insecure_tls,
43
- extra_headers=profile_meta.client_options.extra_headers,
44
- logger=job_logger,
45
- request_context=request_context,
46
- )
47
-
48
-
49
33
  def construct_uncountable_client(
50
34
  profile_meta: ProfileMetadata,
51
35
  logger: JobLogger,
52
36
  *,
53
37
  request_context: RequestContext | None = None,
38
+ headers: dict[str, str] | None = None,
54
39
  ) -> Client:
40
+ extra_headers = {}
41
+ allow_insecure_tls = False
42
+ if profile_meta.client_options is not None:
43
+ extra_headers.update(profile_meta.client_options.extra_headers or {})
44
+ allow_insecure_tls = profile_meta.client_options.allow_insecure_tls
45
+
46
+ extra_headers.update(headers or {})
47
+
55
48
  return Client(
56
49
  base_url=profile_meta.base_url,
57
50
  auth_details=_construct_auth_details(profile_meta),
58
- config=_construct_client_config(
59
- profile_meta=profile_meta,
60
- job_logger=logger,
51
+ config=ClientConfig(
52
+ allow_insecure_tls=allow_insecure_tls,
53
+ extra_headers=extra_headers,
54
+ logger=logger,
61
55
  request_context=request_context,
62
56
  ),
63
57
  app_base_url=profile_meta.app_base_url,
@@ -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
  )
@@ -23,7 +23,13 @@ from uncountable.integration.queue_runner.datastore.interface import Datastore
23
23
  from uncountable.integration.queue_runner.types import ListenQueue, ResultQueue
24
24
  from uncountable.integration.scan_profiles import load_profiles
25
25
  from uncountable.integration.telemetry import JobLogger, Logger, get_otel_tracer
26
- from uncountable.types import base_t, client_config_t, job_definition_t, queued_job_t
26
+ from uncountable.types import (
27
+ base_t,
28
+ client_config_t,
29
+ job_definition_t,
30
+ queued_job_t,
31
+ request_headers_t,
32
+ )
27
33
 
28
34
 
29
35
  class Worker:
@@ -123,6 +129,11 @@ def run_queued_job(
123
129
  profile_meta=job_details.profile_metadata,
124
130
  logger=job_logger,
125
131
  request_context=request_context,
132
+ headers={
133
+ request_headers_t.IntegrationServerHeaders.JOB_UUID: queued_job.queued_job_uuid,
134
+ request_headers_t.IntegrationServerHeaders.JOB_ID: job_details.job_definition.id,
135
+ request_headers_t.IntegrationServerHeaders.JOB_NAME: job_details.job_definition.name,
136
+ },
126
137
  )
127
138
  batch_processor = AsyncBatchProcessor(client=client)
128
139
 
@@ -108,6 +108,7 @@ from . import recipes_t as recipes_t
108
108
  from .api.integrations import register_sockets_token as register_sockets_token_t
109
109
  from .api.recipes import remove_recipe_from_project as remove_recipe_from_project_t
110
110
  from .api.recipe_links import remove_recipe_link as remove_recipe_link_t
111
+ from . import request_headers_t as request_headers_t
111
112
  from .api.entity import resolve_entity_ids as resolve_entity_ids_t
112
113
  from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
113
114
  from . import response_t as response_t
@@ -258,6 +259,7 @@ __all__: list[str] = [
258
259
  "register_sockets_token_t",
259
260
  "remove_recipe_from_project_t",
260
261
  "remove_recipe_link_t",
262
+ "request_headers_t",
261
263
  "resolve_entity_ids_t",
262
264
  "resolve_output_conditions_t",
263
265
  "response_t",