UncountablePythonSDK 0.0.157__tar.gz → 0.0.159__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 (397) hide show
  1. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.github/workflows/publish.yml +2 -2
  3. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  5. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
  6. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/upload_file.md +1 -2
  7. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/async_batch_large_parse.py +7 -1
  8. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/pyproject.toml +1 -1
  9. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_open_api.py +5 -1
  10. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/client.py +2 -0
  11. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/file_upload.py +30 -1
  12. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/column.py +106 -0
  13. uncountablepythonsdk-0.0.159/uncountable/core/query/types.py +12 -0
  14. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/construct_client.py +16 -4
  15. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/job.py +5 -1
  16. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/command_client.py +1 -2
  17. uncountablepythonsdk-0.0.159/uncountable/integration/request_context.py +34 -0
  18. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/complete_async_parse.py +2 -1
  19. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch_processor.py +5 -1
  20. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_base.py +5 -1
  21. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config.py +2 -0
  22. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/client_config_t.py +36 -0
  23. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/queued_job_t.py +2 -0
  24. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.gitignore +0 -0
  25. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/.python-version +0 -0
  26. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/README.md +0 -0
  27. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  28. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  29. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  30. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/.gitignore +0 -0
  31. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/conf.py +0 -0
  32. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/index.md +0 -0
  33. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/create_ingredient.md +0 -0
  34. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/create_output.md +0 -0
  35. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/integration_examples/index.md +0 -0
  36. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/justfile +0 -0
  37. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/requirements.txt +0 -0
  38. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/android-chrome-192x192.png +0 -0
  39. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/android-chrome-512x512.png +0 -0
  40. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/apple-touch-icon.png +0 -0
  41. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/browserconfig.xml +0 -0
  42. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/favicon-16x16.png +0 -0
  43. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/favicon-32x32.png +0 -0
  44. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/manifest.json +0 -0
  45. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/mstile-150x150.png +0 -0
  46. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  47. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/docs/static/logo_blue.png +0 -0
  48. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/async_batch.py +0 -0
  49. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/basic_auth.py +0 -0
  50. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/create_entity.py +0 -0
  51. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/create_ingredient_sdk.py +0 -0
  52. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/download_files.py +0 -0
  53. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/edit_recipe_inputs.py +0 -0
  54. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  55. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  56. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  57. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  58. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  59. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  60. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  61. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  62. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  63. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/invoke_uploader.py +0 -0
  64. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/oauth.py +0 -0
  65. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_input_pdf_attribute.py +0 -0
  66. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_recipe_metadata_file.py +0 -0
  67. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/set_recipe_output_file_sdk.py +0 -0
  68. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/examples/upload_files.py +0 -0
  69. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/__init__.py +0 -0
  70. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/__init__.py +0 -0
  71. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/_is_enum.py +0 -0
  72. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  73. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/argument_parser.py +0 -0
  74. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/argument_parser/case_convert.py +0 -0
  75. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_blob_session.py +0 -0
  77. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  78. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_local_session.py +0 -0
  79. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_s3_session.py +0 -0
  80. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  81. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  82. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  83. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/py.typed +0 -0
  84. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/__init__.py +0 -0
  85. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/annotation.py +0 -0
  86. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/missing_sentry.py +0 -0
  87. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/opaque_key.py +0 -0
  88. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_alias.py +0 -0
  89. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_class.py +0 -0
  90. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_generic.py +0 -0
  91. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/serial_union.py +0 -0
  92. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/unknown.py +0 -0
  93. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization/yaml.py +0 -0
  94. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/__init__.py +0 -0
  95. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  96. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  97. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/dataclasses.py +0 -0
  98. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/serialization_util/serialization_helpers.py +0 -0
  99. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/strenum_compat/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/strenum_compat/strenum_compat.py +0 -0
  101. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/__main__.py +0 -0
  103. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  104. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  105. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  106. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/builder.py +0 -0
  107. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/builder_types.py +0 -0
  108. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/config.py +0 -0
  109. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/cross_output_links.py +0 -0
  110. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_io_ts.py +0 -0
  111. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_open_api_util.py +0 -0
  112. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_python.py +0 -0
  113. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_typescript.py +0 -0
  114. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/emit_typescript_util.py +0 -0
  115. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/load_types.py +0 -0
  116. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  117. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/open_api_util.py +0 -0
  118. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/parts/base.py.prepart +0 -0
  119. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  120. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/test.py +0 -0
  121. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/type_info/__main__.py +0 -0
  122. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  123. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  125. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/util.py +0 -0
  126. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/__main__.py +0 -0
  128. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  129. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  130. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pkgs/type_spec/value_spec/types.py +0 -0
  131. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/pyproject.toml +0 -0
  132. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/setup.cfg +0 -0
  133. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/__init__.py +0 -0
  134. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/async_batch.py +0 -0
  136. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/environment.py +0 -0
  137. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/__init__.py +0 -0
  138. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/builder.py +0 -0
  139. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/query/row.py +0 -0
  140. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/core/types.py +0 -0
  141. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/__init__.py +0 -0
  142. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/cli.py +0 -0
  143. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/cron.py +0 -0
  144. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/connect.py +0 -0
  146. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/db/session.py +0 -0
  147. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/entrypoint.py +0 -0
  148. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/executors.py +0 -0
  150. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  151. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/executors/script_executor.py +0 -0
  152. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/http_server/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/http_server/types.py +0 -0
  154. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  156. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  157. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  158. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  160. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  161. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  162. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  163. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  164. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  166. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  167. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  168. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  169. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  170. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/types.py +0 -0
  171. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/queue_runner/worker.py +0 -0
  172. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/scan_profiles.py +0 -0
  173. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/scheduler.py +0 -0
  174. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  175. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  176. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/server.py +0 -0
  177. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/telemetry.py +0 -0
  178. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  179. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/py.typed +0 -0
  180. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/__init__.py +0 -0
  182. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/__init__.py +0 -0
  183. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/execute_batch.py +0 -0
  184. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  185. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/chemical/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  187. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  189. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/__init__.py +0 -0
  190. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_entities.py +0 -0
  191. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_entity.py +0 -0
  192. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  193. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/export_entities.py +0 -0
  194. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/get_entities_data.py +0 -0
  195. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  196. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/list_aggregate.py +0 -0
  197. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/list_entities.py +0 -0
  198. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/lock_entity.py +0 -0
  199. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/lookup_entity.py +0 -0
  200. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  201. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_barcode.py +0 -0
  202. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  203. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/set_values.py +0 -0
  204. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  205. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/entity/unlock_entity.py +0 -0
  206. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/equipment/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  208. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/field_options/__init__.py +0 -0
  209. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  210. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/file_folders/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  212. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/create_file_record.py +0 -0
  214. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/files/download_file.py +0 -0
  215. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/list_id_source.py +0 -0
  217. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/id_source/match_id_source.py +0 -0
  218. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/input_groups/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  220. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/create_inputs.py +0 -0
  222. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_input_data.py +0 -0
  223. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_input_names.py +0 -0
  224. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  225. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  226. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_category.py +0 -0
  227. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  228. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  229. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  231. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/push_notification.py +0 -0
  232. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  233. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/export_listing.py +0 -0
  235. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/listing/fetch_listing.py +0 -0
  236. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/material_families/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  238. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  240. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  241. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_data.py +0 -0
  243. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_names.py +0 -0
  244. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  245. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  246. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  247. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/__init__.py +0 -0
  248. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  249. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  250. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/__init__.py +0 -0
  251. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/get_projects.py +0 -0
  252. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/project/get_projects_data.py +0 -0
  253. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/__init__.py +0 -0
  254. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  255. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  256. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  257. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  258. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/__init__.py +0 -0
  259. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  260. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  261. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  262. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  263. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  264. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  265. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  266. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_recipe.py +0 -0
  267. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/create_recipes.py +0 -0
  268. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  269. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  270. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  271. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_curve.py +0 -0
  272. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  273. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  274. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  275. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  276. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  277. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  278. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  279. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  280. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  281. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  282. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  283. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  284. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  285. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  286. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  287. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  288. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/__init__.py +0 -0
  289. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  290. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  291. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/triggers/__init__.py +0 -0
  292. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/triggers/run_trigger.py +0 -0
  293. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/__init__.py +0 -0
  294. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  295. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/user/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/api/user/get_current_user_info.py +0 -0
  297. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch.py +0 -0
  298. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_batch_t.py +0 -0
  299. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_jobs.py +0 -0
  300. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/async_jobs_t.py +0 -0
  301. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/auth_retrieval.py +0 -0
  302. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/auth_retrieval_t.py +0 -0
  303. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/base.py +0 -0
  304. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/base_t.py +0 -0
  305. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/calculations.py +0 -0
  306. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/calculations_t.py +0 -0
  307. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/chemical_structure.py +0 -0
  308. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/chemical_structure_t.py +0 -0
  309. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/curves.py +0 -0
  310. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/curves_t.py +0 -0
  311. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/data.py +0 -0
  312. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/data_t.py +0 -0
  313. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/entity.py +0 -0
  314. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/entity_t.py +0 -0
  315. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/experiment_groups.py +0 -0
  316. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/experiment_groups_t.py +0 -0
  317. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/exports.py +0 -0
  318. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/exports_t.py +0 -0
  319. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/field_values.py +0 -0
  320. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/field_values_t.py +0 -0
  321. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/fields.py +0 -0
  322. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/fields_t.py +0 -0
  323. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/generic_upload.py +0 -0
  324. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/generic_upload_t.py +0 -0
  325. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/id_source.py +0 -0
  326. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/id_source_t.py +0 -0
  327. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/identifier.py +0 -0
  328. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/identifier_t.py +0 -0
  329. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/input_attributes.py +0 -0
  330. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/input_attributes_t.py +0 -0
  331. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/inputs.py +0 -0
  332. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/inputs_t.py +0 -0
  333. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_server.py +0 -0
  334. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_server_t.py +0 -0
  335. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_session.py +0 -0
  336. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integration_session_t.py +0 -0
  337. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integrations.py +0 -0
  338. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/integrations_t.py +0 -0
  339. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/job_definition.py +0 -0
  340. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/job_definition_t.py +0 -0
  341. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/listing.py +0 -0
  342. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/listing_t.py +0 -0
  343. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notices.py +0 -0
  344. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notices_t.py +0 -0
  345. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notifications.py +0 -0
  346. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/notifications_t.py +0 -0
  347. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/outputs.py +0 -0
  348. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/outputs_t.py +0 -0
  349. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/overrides.py +0 -0
  350. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/overrides_t.py +0 -0
  351. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/permissions.py +0 -0
  352. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/permissions_t.py +0 -0
  353. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/phases.py +0 -0
  354. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/phases_t.py +0 -0
  355. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/post_base.py +0 -0
  356. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/post_base_t.py +0 -0
  357. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/queued_job.py +0 -0
  358. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_identifiers.py +0 -0
  359. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_identifiers_t.py +0 -0
  360. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_inputs.py +0 -0
  361. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_inputs_t.py +0 -0
  362. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_links.py +0 -0
  363. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_links_t.py +0 -0
  364. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_metadata.py +0 -0
  365. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_metadata_t.py +0 -0
  366. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_output_metadata.py +0 -0
  367. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_output_metadata_t.py +0 -0
  368. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_step_relationships.py +0 -0
  369. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_step_relationships_t.py +0 -0
  370. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_tags.py +0 -0
  371. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_tags_t.py +0 -0
  372. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_workflow_steps.py +0 -0
  373. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  374. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipes.py +0 -0
  375. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/recipes_t.py +0 -0
  376. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/response.py +0 -0
  377. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/response_t.py +0 -0
  378. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet.py +0 -0
  379. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_format.py +0 -0
  380. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_format_t.py +0 -0
  381. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/runsheet_t.py +0 -0
  382. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/secret_retrieval.py +0 -0
  383. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/secret_retrieval_t.py +0 -0
  384. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/sockets.py +0 -0
  385. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/sockets_t.py +0 -0
  386. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/specs.py +0 -0
  387. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/specs_t.py +0 -0
  388. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/units.py +0 -0
  389. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/units_t.py +0 -0
  390. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/uploader.py +0 -0
  391. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/uploader_t.py +0 -0
  392. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/users.py +0 -0
  393. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/users_t.py +0 -0
  394. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/webhook_job.py +0 -0
  395. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/webhook_job_t.py +0 -0
  396. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/workflows.py +0 -0
  397. {uncountablepythonsdk-0.0.157 → uncountablepythonsdk-0.0.159}/uncountable/types/workflows_t.py +0 -0
@@ -9,7 +9,7 @@ jobs:
9
9
  docs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
12
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
13
13
  - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6
14
14
  - uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1
15
15
  with:
@@ -19,7 +19,7 @@ jobs:
19
19
  name: Build distribution packages
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
- - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
22
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
23
23
  with:
24
24
  fetch-depth: 0
25
25
  tags: true
@@ -36,7 +36,7 @@ jobs:
36
36
  run: |
37
37
  export SETUPTOOLS_SCM_PRETEND_VERSION_FOR_uncountablepythonsdk=$(git describe --tags --exact-match)
38
38
  python3 -m build
39
- - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
39
+ - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
40
40
  with:
41
41
  name: package-distributions
42
42
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.157
3
+ Version: 0.0.159
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.157
3
+ Version: 0.0.159
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
@@ -126,12 +126,14 @@ uncountable/core/query/__init__.py
126
126
  uncountable/core/query/builder.py
127
127
  uncountable/core/query/column.py
128
128
  uncountable/core/query/row.py
129
+ uncountable/core/query/types.py
129
130
  uncountable/integration/__init__.py
130
131
  uncountable/integration/cli.py
131
132
  uncountable/integration/construct_client.py
132
133
  uncountable/integration/cron.py
133
134
  uncountable/integration/entrypoint.py
134
135
  uncountable/integration/job.py
136
+ uncountable/integration/request_context.py
135
137
  uncountable/integration/scan_profiles.py
136
138
  uncountable/integration/scheduler.py
137
139
  uncountable/integration/server.py
@@ -13,8 +13,7 @@ from uncountable.core.file_upload import DataFileUpload, UploadedFile
13
13
  client: Client = Client(
14
14
  base_url="<BASE_URL>",
15
15
  auth_details=AuthDetailsApiKey(
16
- api_id="<API_ID>",
17
- api_secret_key="<API_SECRET_KEY>"
16
+ api_id="<API_ID>", api_secret_key="<API_SECRET_KEY>"
18
17
  ),
19
18
  config=ClientConfig(allow_insecure_tls=False),
20
19
  )
@@ -2,6 +2,7 @@ import os
2
2
  from decimal import Decimal
3
3
 
4
4
  from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
5
+ from uncountable.core.file_upload import UploaderFileUpload
5
6
  from uncountable.types.generic_upload_t import UploadDestinationRecipe
6
7
  from uncountable.types.identifier import IdentifierKeyId
7
8
  from uncountable.types.uploader_t import (
@@ -37,8 +38,13 @@ parsed_file_data = [
37
38
  ]
38
39
 
39
40
  batch_loader = AsyncBatchProcessor(client=client)
41
+
42
+ uploaded = client.upload_files(
43
+ file_uploads=[UploaderFileUpload(parsed_file_data=parsed_file_data)]
44
+ )
45
+
40
46
  batch_loader.complete_async_parse(
41
- parsed_file_data=parsed_file_data,
47
+ file_id=uploaded[0].file_id,
42
48
  async_job_key=IdentifierKeyId(id=1),
43
49
  upload_destination=UploadDestinationRecipe(
44
50
  recipe_key=IdentifierKeyId(id=1),
@@ -18,7 +18,7 @@ dependencies = [
18
18
  "pandas-stubs",
19
19
  "xlrd == 2.*",
20
20
  "msgspec ==0.20.*",
21
- "websockets==15.0.1",
21
+ "websockets==16.0",
22
22
  ]
23
23
 
24
24
  [tool.mypy]
@@ -105,7 +105,11 @@ def _open_api_info(
105
105
  info["version"] = "1.0.0"
106
106
  info["title"] = "Uncountable API Documentation"
107
107
  info["description"] = full_description
108
- info["x-logo"] = {"url": "../static/images/logo_blue.png", "altText": "Logo"}
108
+ info["x-logo"] = {
109
+ "url": "../static/images/logo_blue.png",
110
+ "altText": "Logo",
111
+ "href": "#",
112
+ }
109
113
  return info
110
114
 
111
115
 
@@ -23,6 +23,7 @@ from uncountable.integration.telemetry import Logger, push_scope_optional
23
23
  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
+ from uncountable.types.client_config_t import RequestContext
26
27
 
27
28
  from .file_upload import FileUpload, FileUploader, UploadedFile
28
29
  from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
@@ -65,6 +66,7 @@ class ClientConfig(ClientConfigOptions):
65
66
  None
66
67
  )
67
68
  logger: Logger | None = None
69
+ request_context: RequestContext | None = None
68
70
 
69
71
 
70
72
  OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
@@ -8,8 +8,11 @@ from typing import Generator, Literal, Self, assert_never
8
8
 
9
9
  import aiohttp
10
10
  import aiotus
11
+ import simplejson as json
11
12
 
13
+ from pkgs.serialization_util import serialize_for_storage
12
14
  from uncountable.integration.telemetry import Logger, push_scope_optional
15
+ from uncountable.types import uploader_t
13
16
 
14
17
  from .types import AuthDetailsAll, AuthDetailsApiKey
15
18
 
@@ -19,6 +22,7 @@ _CHUNK_SIZE = 5 * 1024 * 1024 # s3 requires 5MiB minimum
19
22
  class FileUploadType(StrEnum):
20
23
  MEDIA_FILE_UPLOAD = "MEDIA_FILE_UPLOAD"
21
24
  DATA_FILE_UPLOAD = "DATA_FILE_UPLOAD"
25
+ UPLOADER_FILE_UPLOAD = "UPLOADER_FILE_UPLOAD"
22
26
 
23
27
 
24
28
  @dataclass(kw_only=True)
@@ -36,7 +40,20 @@ class DataFileUpload:
36
40
  type: Literal[FileUploadType.DATA_FILE_UPLOAD] = FileUploadType.DATA_FILE_UPLOAD
37
41
 
38
42
 
39
- FileUpload = MediaFileUpload | DataFileUpload
43
+ @dataclass(kw_only=True)
44
+ class UploaderFileUpload:
45
+ parsed_file_data: list[uploader_t.ParsedFileData]
46
+ type: Literal[FileUploadType.UPLOADER_FILE_UPLOAD] = (
47
+ FileUploadType.UPLOADER_FILE_UPLOAD
48
+ )
49
+
50
+
51
+ FileUpload = MediaFileUpload | DataFileUpload | UploaderFileUpload
52
+
53
+
54
+ @dataclass(kw_only=True)
55
+ class _ParsedFileDataWrapper:
56
+ parsed_file_data: list[uploader_t.ParsedFileData]
40
57
 
41
58
 
42
59
  @dataclass(kw_only=True)
@@ -55,6 +72,16 @@ def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None
55
72
  )
56
73
  case DataFileUpload():
57
74
  yield FileBytes(name=file_upload.name, bytes_data=file_upload.data)
75
+ case UploaderFileUpload():
76
+ wrapper = _ParsedFileDataWrapper(
77
+ parsed_file_data=file_upload.parsed_file_data
78
+ )
79
+ serialized = serialize_for_storage(wrapper)
80
+ json_bytes = json.dumps(serialized).encode("utf-8")
81
+ yield FileBytes(
82
+ name="parsed_file_data.json",
83
+ bytes_data=BytesIO(json_bytes),
84
+ )
58
85
 
59
86
 
60
87
  @dataclass(kw_only=True)
@@ -107,6 +134,8 @@ class FileUploader:
107
134
  attributes["file_path"] = file_upload.path
108
135
  case DataFileUpload():
109
136
  attributes["file_name"] = file_upload.name
137
+ case UploaderFileUpload():
138
+ attributes["file_name"] = "parsed_file_data.json"
110
139
  case _:
111
140
  assert_never(file_upload)
112
141
  with push_scope_optional(
@@ -8,11 +8,13 @@ from decimal import Decimal
8
8
  from enum import StrEnum
9
9
  from types import UnionType
10
10
  from typing import (
11
+ Never,
11
12
  Self,
12
13
  assert_never,
13
14
  overload,
14
15
  )
15
16
 
17
+ from uncountable.core.query.types import TranslatedText
16
18
  from uncountable.types import base_t, entity_t, listing_t
17
19
  from uncountable.types.listing import ColumnIdentifier
18
20
 
@@ -84,6 +86,9 @@ class Column[
84
86
  assert self.name is not None
85
87
  return obj.__dict__[self.name] # type: ignore[no-any-return]
86
88
 
89
+ def __set__(self, obj: Never, value: Never) -> None:
90
+ raise AttributeError("Columns are read-only")
91
+
87
92
  def __init__(
88
93
  self,
89
94
  *,
@@ -159,6 +164,55 @@ class TextColumn[
159
164
  # IMPROVE: Implement "Not Exists" and "Not Equals" filters (when supported in SDK)
160
165
 
161
166
 
167
+ class TranslatedTextColumn[
168
+ NullableT: NullableColumn | NonNullableColumn,
169
+ ](Column[TranslatedText, NullableT]):
170
+ __hash__ = Column.__hash__
171
+
172
+ def __init__(
173
+ self,
174
+ identifier: listing_t.ColumnIdentifier,
175
+ nullable: type[NullableT],
176
+ ) -> None:
177
+ super().__init__(
178
+ identifier=identifier,
179
+ nullable=nullable,
180
+ value_type=TranslatedText,
181
+ )
182
+
183
+ def __ne__(self, other: None) -> ColumnFilter: # type: ignore[override]
184
+ return ColumnFilter(
185
+ identifier=self.identifier,
186
+ filter=lambda identifier: listing_t.FilterSpecExists(column=identifier),
187
+ )
188
+
189
+ def __eq__(self, other: str) -> ColumnFilter: # type: ignore[override]
190
+ return ColumnFilter(
191
+ identifier=self.identifier,
192
+ filter=lambda x: listing_t.FilterSpecEquals(column=x, value=other),
193
+ )
194
+
195
+ def contains(self, other: str) -> ColumnFilter:
196
+ return ColumnFilter(
197
+ identifier=self.identifier,
198
+ filter=lambda x: listing_t.FilterSpecIStrContains(column=x, value=other),
199
+ )
200
+
201
+ def startswith(self, other: str) -> ColumnFilter:
202
+ return ColumnFilter(
203
+ identifier=self.identifier,
204
+ filter=lambda x: listing_t.FilterSpecIStrStartsWith(column=x, value=other),
205
+ )
206
+
207
+ def includes(self, other: str | tuple[str, ...]) -> ColumnFilter:
208
+ return ColumnFilter(
209
+ identifier=self.identifier,
210
+ filter=lambda x: listing_t.FilterSpecInclude(column=x, value=other),
211
+ )
212
+
213
+ # IMPROVE: Implement "Not Exists" and "Not Equals" filters (when supported in SDK)
214
+
215
+
162
216
  class EnumColumn[
163
217
  EnumT: StrEnum,
164
218
  NullableT: NullableColumn | NonNullableColumn,
@@ -513,6 +567,19 @@ class IdColumn[
513
567
  column: TextColumn[BaseNullableT],
514
568
  ) -> TextColumn[BaseNullableT]: ...
515
569
 
570
+ # Translated Text
571
+ @overload
572
+ def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
573
+ self: IdColumn[NullableColumn],
574
+ column: TranslatedTextColumn[BaseNullableT],
575
+ ) -> TranslatedTextColumn[NullableColumn]: ...
576
+
577
+ @overload
578
+ def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
579
+ self: IdColumn[NonNullableColumn],
580
+ column: TranslatedTextColumn[BaseNullableT],
581
+ ) -> TranslatedTextColumn[BaseNullableT]: ...
582
+
516
583
  # Enum
517
584
  @overload
518
585
  def __rshift__[EnumT: StrEnum, BaseNullableT: NullableColumn | NonNullableColumn](
@@ -658,6 +725,7 @@ class IdColumn[
658
725
  self,
659
726
  column: ColumnFilter
660
727
  | TextColumn[BaseNullableT]
728
+ | TranslatedTextColumn[BaseNullableT]
661
729
  | EnumColumn[EnumT, BaseNullableT]
662
730
  | EnumsColumn[EnumT, BaseNullableT]
663
731
  | BooleanColumn[BaseNullableT]
@@ -673,6 +741,9 @@ class IdColumn[
673
741
  | TextColumn[BaseNullableT]
674
742
  | TextColumn[NonNullableColumn | NullableColumn]
675
743
  | TextColumn[NullableColumn]
744
+ | TranslatedTextColumn[BaseNullableT]
745
+ | TranslatedTextColumn[NonNullableColumn | NullableColumn]
746
+ | TranslatedTextColumn[NullableColumn]
676
747
  | EnumColumn[EnumT, BaseNullableT]
677
748
  | EnumColumn[EnumT, NonNullableColumn | NullableColumn]
678
749
  | EnumColumn[EnumT, NullableColumn]
@@ -731,6 +802,13 @@ class IdColumn[
731
802
  if self.nullable is NonNullableColumn
732
803
  else NullableColumn,
733
804
  )
805
+ case TranslatedTextColumn():
806
+ return TranslatedTextColumn(
807
+ identifier=transitive_identifier,
808
+ nullable=column.nullable
809
+ if self.nullable is NonNullableColumn
810
+ else NullableColumn,
811
+ )
734
812
  case EnumColumn():
735
813
  return EnumColumn(
736
814
  identifier=transitive_identifier,
@@ -896,6 +974,19 @@ class IdsColumn[
896
974
  column: TextColumn[BaseNullableT],
897
975
  ) -> AggregatedColumn[tuple[str, ...], BaseNullableT]: ...
898
976
 
977
+ # Translated Text
978
+ @overload
979
+ def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
980
+ self: IdsColumn[NullableColumn],
981
+ column: TranslatedTextColumn[BaseNullableT],
982
+ ) -> AggregatedColumn[tuple[TranslatedText, ...], NullableColumn]: ...
983
+
984
+ @overload
985
+ def __rshift__[BaseNullableT: NullableColumn | NonNullableColumn](
986
+ self: IdsColumn[NonNullableColumn],
987
+ column: TranslatedTextColumn[BaseNullableT],
988
+ ) -> AggregatedColumn[tuple[TranslatedText, ...], BaseNullableT]: ...
989
+
899
990
  # Enum
900
991
  @overload
901
992
  def __rshift__[EnumT: StrEnum, BaseNullableT: NullableColumn | NonNullableColumn](
@@ -1030,6 +1121,7 @@ class IdsColumn[
1030
1121
  ](
1031
1122
  self,
1032
1123
  column: TextColumn[BaseNullableT]
1124
+ | TranslatedTextColumn[BaseNullableT]
1033
1125
  | EnumColumn[EnumT, BaseNullableT]
1034
1126
  | BooleanColumn[BaseNullableT]
1035
1127
  | DatetimeColumn[BaseNullableT]
@@ -1043,6 +1135,12 @@ class IdsColumn[
1043
1135
  AggregatedColumn[tuple[str, ...], BaseNullableT]
1044
1136
  | AggregatedColumn[tuple[str, ...], NonNullableColumn | NullableColumn]
1045
1137
  | AggregatedColumn[tuple[str, ...], NullableColumn]
1138
+ | AggregatedColumn[tuple[TranslatedText, ...], BaseNullableT]
1139
+ | AggregatedColumn[
1140
+ tuple[TranslatedText, ...],
1141
+ NonNullableColumn | NullableColumn,
1142
+ ]
1143
+ | AggregatedColumn[tuple[TranslatedText, ...], NullableColumn]
1046
1144
  | AggregatedColumn[tuple[str | None, ...], BaseNullableT]
1047
1145
  | AggregatedColumn[
1048
1146
  tuple[str | None, ...],
@@ -1090,6 +1188,14 @@ class IdsColumn[
1090
1188
  else NullableColumn,
1091
1189
  tuple_value_type=tuple[str, ...],
1092
1190
  )
1191
+ case TranslatedTextColumn():
1192
+ return AggregatedColumn(
1193
+ identifier=transitive_aggregate_identifier,
1194
+ nullable=column.nullable
1195
+ if self.nullable is NonNullableColumn
1196
+ else NullableColumn,
1197
+ tuple_value_type=tuple[TranslatedText, ...],
1198
+ )
1093
1199
  case EnumColumn():
1094
1200
  return AggregatedColumn(
1095
1201
  identifier=transitive_aggregate_identifier,
@@ -0,0 +1,12 @@
1
+ from dataclasses import dataclass
2
+
3
+ # This file contains types exclusively used to parse column values.
4
+ # Column types must be more permissive than generated SDK types to allow for disparity between the installed client and the platform.
5
+ # Eg. types containing an Enum must be typed as EnumType | str to handle future expansion of the Enum by the platform.
6
+
7
+
8
+ @dataclass(kw_only=True, frozen=True)
9
+ class TranslatedText:
10
+ value: str
11
+ display_value: str
12
+ inferred_locale: str
@@ -4,6 +4,7 @@ from uncountable.core.types import AuthDetailsAll, AuthDetailsOAuth
4
4
  from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
5
5
  from uncountable.integration.telemetry import JobLogger
6
6
  from uncountable.types import auth_retrieval_t
7
+ from uncountable.types.client_config_t import RequestContext
7
8
  from uncountable.types.job_definition_t import (
8
9
  ProfileMetadata,
9
10
  )
@@ -30,23 +31,34 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
30
31
 
31
32
 
32
33
  def _construct_client_config(
33
- *, profile_meta: ProfileMetadata, job_logger: JobLogger
34
+ *,
35
+ profile_meta: ProfileMetadata,
36
+ job_logger: JobLogger,
37
+ request_context: RequestContext | None = None,
34
38
  ) -> ClientConfig:
35
39
  if profile_meta.client_options is None:
36
- return ClientConfig(logger=job_logger)
40
+ return ClientConfig(logger=job_logger, request_context=request_context)
37
41
  return ClientConfig(
38
42
  allow_insecure_tls=profile_meta.client_options.allow_insecure_tls,
39
43
  extra_headers=profile_meta.client_options.extra_headers,
40
44
  logger=job_logger,
45
+ request_context=request_context,
41
46
  )
42
47
 
43
48
 
44
49
  def construct_uncountable_client(
45
- profile_meta: ProfileMetadata, logger: JobLogger
50
+ profile_meta: ProfileMetadata,
51
+ logger: JobLogger,
52
+ *,
53
+ request_context: RequestContext | None = None,
46
54
  ) -> Client:
47
55
  return Client(
48
56
  base_url=profile_meta.base_url,
49
57
  auth_details=_construct_auth_details(profile_meta),
50
- config=_construct_client_config(profile_meta=profile_meta, job_logger=logger),
58
+ config=_construct_client_config(
59
+ profile_meta=profile_meta,
60
+ job_logger=logger,
61
+ request_context=request_context,
62
+ ),
51
63
  app_base_url=profile_meta.app_base_url,
52
64
  )
@@ -24,6 +24,7 @@ from uncountable.integration.queue_runner.command_server.command_client import (
24
24
  from uncountable.integration.queue_runner.command_server.types import (
25
25
  CommandServerException,
26
26
  )
27
+ from uncountable.integration.request_context import extract_request_context
27
28
  from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
28
29
  from uncountable.integration.telemetry import JobLogger
29
30
  from uncountable.types import (
@@ -210,12 +211,15 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
210
211
  except (simplejson.JSONDecodeError, ValueError) as e:
211
212
  raise HttpException.body_parse_error() from e
212
213
 
214
+ request_context = extract_request_context(headers=request.headers)
215
+
213
216
  try:
214
217
  send_job_queue_message(
215
218
  job_ref_name=job_definition.id,
216
219
  payload=queued_job_t.QueuedJobPayload(
217
220
  invocation_context=queued_job_t.InvocationContextWebhook(
218
- webhook_payload=webhook_payload
221
+ webhook_payload=webhook_payload,
222
+ request_context=request_context,
219
223
  )
220
224
  ),
221
225
  port=get_local_admin_server_port(),
@@ -41,8 +41,7 @@ def command_server_connection(
41
41
  ) -> Generator[CommandServerStub, None, None]:
42
42
  try:
43
43
  with grpc.insecure_channel(f"{host}:{port}") as channel:
44
- stub = CommandServerStub(channel)
45
- yield stub
44
+ yield CommandServerStub(channel)
46
45
  except grpc._channel._InactiveRpcError as e:
47
46
  raise CommandServerTimeout() from e
48
47
 
@@ -0,0 +1,34 @@
1
+ from uncountable.types import client_config_t
2
+
3
+ MAX_HEADER_LENGTH = 100
4
+
5
+
6
+ def validated_header(*, headers: dict[str, str], key: str) -> str | None:
7
+ value = headers.get(key)
8
+ if value is not None and len(value) > MAX_HEADER_LENGTH:
9
+ return None
10
+ return value
11
+
12
+
13
+ def _parse_locale(*, raw_locale: str | None) -> client_config_t.SdkLocale | None:
14
+ if raw_locale is None:
15
+ return None
16
+ try:
17
+ return client_config_t.SdkLocale(raw_locale)
18
+ except ValueError:
19
+ return None
20
+
21
+
22
+ def extract_request_context(
23
+ *, headers: dict[str, str]
24
+ ) -> client_config_t.RequestContext | None:
25
+ user_timezone = validated_header(headers=headers, key="X-User-Timezone")
26
+ user_locale = _parse_locale(
27
+ raw_locale=validated_header(headers=headers, key="X-User-Locale")
28
+ )
29
+ if user_timezone is None and user_locale is None:
30
+ return None
31
+ return client_config_t.RequestContext(
32
+ user_timezone=user_timezone,
33
+ user_locale=user_locale,
34
+ )
@@ -31,9 +31,10 @@ ENDPOINT_PATH = "api/external/uploader/complete_async_parse"
31
31
  )
32
32
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
33
33
  class Arguments:
34
- parsed_file_data: list[uploader_t.ParsedFileData]
35
34
  async_job_key: identifier_t.IdentifierKey
36
35
  upload_destination: generic_upload_t.UploadDestinationRecipe
36
+ parsed_file_data: list[uploader_t.ParsedFileData] | None = None
37
+ file_id: base_t.ObjectId | None = None
37
38
 
38
39
 
39
40
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -205,18 +205,22 @@ class AsyncBatchProcessorBase(ABC):
205
205
  def complete_async_parse(
206
206
  self,
207
207
  *,
208
- parsed_file_data: list[uploader_t.ParsedFileData],
209
208
  async_job_key: identifier_t.IdentifierKey,
210
209
  upload_destination: generic_upload_t.UploadDestinationRecipe,
210
+ parsed_file_data: list[uploader_t.ParsedFileData] | None = None,
211
+ file_id: base_t.ObjectId | None = None,
211
212
  depends_on: list[str] | None = None,
212
213
  _request_options: client_config_t.RequestOptions | None = None,
213
214
  ) -> async_batch_t.QueuedAsyncBatchRequest:
214
215
  """Parses uploaded files asynchronously
215
216
 
217
+ :param parsed_file_data: Inline parsed data. Provide either parsed_file_data or file_id, not both.
218
+ :param file_id: File ID containing parsed data. Provide either file_id or parsed_file_data, not both.
216
219
  :param depends_on: A list of batch reference keys to process before processing this request
217
220
  """
218
221
  args = complete_async_parse_t.Arguments(
219
222
  parsed_file_data=parsed_file_data,
223
+ file_id=file_id,
220
224
  async_job_key=async_job_key,
221
225
  upload_destination=upload_destination,
222
226
  )
@@ -340,16 +340,20 @@ class ClientMethods(ABC):
340
340
  def complete_async_parse(
341
341
  self,
342
342
  *,
343
- parsed_file_data: list[uploader_t.ParsedFileData],
344
343
  async_job_key: identifier_t.IdentifierKey,
345
344
  upload_destination: generic_upload_t.UploadDestinationRecipe,
345
+ parsed_file_data: list[uploader_t.ParsedFileData] | None = None,
346
+ file_id: base_t.ObjectId | None = None,
346
347
  _request_options: client_config_t.RequestOptions | None = None,
347
348
  ) -> complete_async_parse_t.Data:
348
349
  """Parses uploaded files asynchronously
349
350
 
351
+ :param parsed_file_data: Inline parsed data. Provide either parsed_file_data or file_id, not both.
352
+ :param file_id: File ID containing parsed data. Provide either file_id or parsed_file_data, not both.
350
353
  """
351
354
  args = complete_async_parse_t.Arguments(
352
355
  parsed_file_data=parsed_file_data,
356
+ file_id=file_id,
353
357
  async_job_key=async_job_key,
354
358
  upload_destination=upload_destination,
355
359
  )
@@ -4,5 +4,7 @@
4
4
  # DO NOT MODIFY -- This file is generated by type_spec
5
5
  # Kept only for SDK backwards compatibility
6
6
  from .client_config_t import ClientConfigOptions as ClientConfigOptions
7
+ from .client_config_t import SdkLocale as SdkLocale
8
+ from .client_config_t import RequestContext as RequestContext
7
9
  from .client_config_t import RequestOptions as RequestOptions
8
10
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -6,13 +6,16 @@ from __future__ import annotations
6
6
  import typing # noqa: F401
7
7
  import datetime # noqa: F401
8
8
  from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
9
10
  import dataclasses
10
11
  from pkgs.serialization import serial_class
11
12
  from . import base_t
12
13
 
13
14
  __all__: list[str] = [
14
15
  "ClientConfigOptions",
16
+ "RequestContext",
15
17
  "RequestOptions",
18
+ "SdkLocale",
16
19
  ]
17
20
 
18
21
 
@@ -26,6 +29,39 @@ class ClientConfigOptions:
26
29
  extra_headers: dict[str, str] | None = None
27
30
 
28
31
 
32
+ # DO NOT MODIFY -- This file is generated by type_spec
33
+ class SdkLocale(StrEnum):
34
+ EN_US = "en-US"
35
+ DE_DE = "de-DE"
36
+ JA_JP = "ja-JP"
37
+ ES_ES = "es-ES"
38
+ ES_MX = "es-MX"
39
+ PT_BR = "pt-BR"
40
+ FR_FR = "fr-FR"
41
+ KO_KO = "ko-KR"
42
+ TH_TH = "th-TH"
43
+ ZH_CN = "zh-CN"
44
+ IT_IT = "it-IT"
45
+ AR_SA = "ar-SA"
46
+ TR_TR = "tr-TR"
47
+ PL_PL = "pl-PL"
48
+ RU_RU = "ru-RU"
49
+ ID_ID = "id-ID"
50
+ NO_NO = "no-NO"
51
+ MR_MR = "mr-MR"
52
+ ZH_TW = "zh-TW"
53
+
54
+
55
+ # DO NOT MODIFY -- This file is generated by type_spec
56
+ @serial_class(
57
+ named_type_path="sdk.client_config.RequestContext",
58
+ )
59
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
60
+ class RequestContext:
61
+ user_timezone: str | None = None
62
+ user_locale: SdkLocale | None = None
63
+
64
+
29
65
  # DO NOT MODIFY -- This file is generated by type_spec
30
66
  @serial_class(
31
67
  named_type_path="sdk.client_config.RequestOptions",
@@ -11,6 +11,7 @@ import dataclasses
11
11
  from pkgs.serialization import serial_class
12
12
  from pkgs.serialization import serial_union_annotation
13
13
  from . import base_t
14
+ from . import client_config_t
14
15
  from . import job_definition_t
15
16
 
16
17
  __all__: list[str] = [
@@ -74,6 +75,7 @@ class InvocationContextManual(InvocationContextBase):
74
75
  class InvocationContextWebhook(InvocationContextBase):
75
76
  type: typing.Literal[InvocationContextType.WEBHOOK] = InvocationContextType.WEBHOOK
76
77
  webhook_payload: base_t.JsonValue
78
+ request_context: client_config_t.RequestContext | None = None
77
79
 
78
80
 
79
81
  # DO NOT MODIFY -- This file is generated by type_spec