UncountablePythonSDK 0.0.158__tar.gz → 0.0.160__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 (399) hide show
  1. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
  4. uncountablepythonsdk-0.0.160/docs/static/favicons/manifest.json +18 -0
  5. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/async_batch_large_parse.py +7 -1
  6. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/pyproject.toml +1 -1
  7. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/__init__.py +2 -0
  8. uncountablepythonsdk-0.0.160/pkgs/filesystem_utils/_file_share_session.py +131 -0
  9. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/file_type_utils.py +9 -0
  10. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_open_api.py +21 -15
  11. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/client.py +5 -0
  12. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/file_upload.py +30 -1
  13. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/job.py +5 -1
  14. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/worker.py +15 -2
  15. uncountablepythonsdk-0.0.160/uncountable/integration/request_context.py +34 -0
  16. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/edit_recipe_inputs.py +59 -1
  17. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/uploader/complete_async_parse.py +2 -1
  18. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/async_batch_processor.py +5 -1
  19. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/client_base.py +5 -1
  20. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/queued_job_t.py +2 -0
  21. uncountablepythonsdk-0.0.158/docs/static/favicons/manifest.json +0 -18
  22. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/.github/workflows/documentation.yml +0 -0
  23. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/.github/workflows/publish.yml +0 -0
  24. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/.gitignore +0 -0
  25. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/.python-version +0 -0
  26. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/README.md +0 -0
  27. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  28. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  29. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  30. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/.gitignore +0 -0
  31. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/conf.py +0 -0
  32. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/index.md +0 -0
  33. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/integration_examples/create_ingredient.md +0 -0
  34. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/integration_examples/create_output.md +0 -0
  35. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/integration_examples/index.md +0 -0
  36. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/integration_examples/upload_file.md +0 -0
  37. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/justfile +0 -0
  38. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/requirements.txt +0 -0
  39. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/android-chrome-192x192.png +0 -0
  40. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/android-chrome-512x512.png +0 -0
  41. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/apple-touch-icon.png +0 -0
  42. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/browserconfig.xml +0 -0
  43. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/favicon-16x16.png +0 -0
  44. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/favicon-32x32.png +0 -0
  45. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/mstile-150x150.png +0 -0
  46. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  47. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/docs/static/logo_blue.png +0 -0
  48. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/async_batch.py +0 -0
  49. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/basic_auth.py +0 -0
  50. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/create_entity.py +0 -0
  51. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/create_ingredient_sdk.py +0 -0
  52. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/download_files.py +0 -0
  53. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/edit_recipe_inputs.py +0 -0
  54. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  55. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  56. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  57. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  58. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  59. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  60. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  61. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  62. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  63. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/invoke_uploader.py +0 -0
  64. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/oauth.py +0 -0
  65. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/set_input_pdf_attribute.py +0 -0
  66. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/set_recipe_metadata_file.py +0 -0
  67. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/set_recipe_output_file_sdk.py +0 -0
  68. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/examples/upload_files.py +0 -0
  69. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/__init__.py +0 -0
  70. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/argument_parser/__init__.py +0 -0
  71. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/argument_parser/_is_enum.py +0 -0
  72. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  73. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/argument_parser/argument_parser.py +0 -0
  74. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/argument_parser/case_convert.py +0 -0
  75. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/_blob_session.py +0 -0
  76. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  77. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/_local_session.py +0 -0
  78. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/_s3_session.py +0 -0
  79. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  80. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  81. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/py.typed +0 -0
  82. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/__init__.py +0 -0
  83. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/annotation.py +0 -0
  84. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/missing_sentry.py +0 -0
  85. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/opaque_key.py +0 -0
  86. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/serial_alias.py +0 -0
  87. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/serial_class.py +0 -0
  88. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/serial_generic.py +0 -0
  89. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/serial_union.py +0 -0
  90. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/unknown.py +0 -0
  91. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization/yaml.py +0 -0
  92. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization_util/__init__.py +0 -0
  93. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  94. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  95. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization_util/dataclasses.py +0 -0
  96. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/serialization_util/serialization_helpers.py +0 -0
  97. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/strenum_compat/__init__.py +0 -0
  98. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/strenum_compat/strenum_compat.py +0 -0
  99. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/__main__.py +0 -0
  101. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  103. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  104. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/builder.py +0 -0
  105. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/builder_types.py +0 -0
  106. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/config.py +0 -0
  107. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/cross_output_links.py +0 -0
  108. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_io_ts.py +0 -0
  109. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_open_api_util.py +0 -0
  110. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_python.py +0 -0
  111. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_typescript.py +0 -0
  112. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/emit_typescript_util.py +0 -0
  113. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/load_types.py +0 -0
  114. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  115. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/open_api_util.py +0 -0
  116. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/parts/base.py.prepart +0 -0
  117. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  118. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/test.py +0 -0
  119. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/type_info/__main__.py +0 -0
  120. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  121. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  122. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  123. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/util.py +0 -0
  124. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/value_spec/__init__.py +0 -0
  125. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/value_spec/__main__.py +0 -0
  126. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  127. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  128. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pkgs/type_spec/value_spec/types.py +0 -0
  129. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/pyproject.toml +0 -0
  130. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/setup.cfg +0 -0
  131. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/__init__.py +0 -0
  132. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/__init__.py +0 -0
  133. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/async_batch.py +0 -0
  134. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/environment.py +0 -0
  135. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/query/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/query/builder.py +0 -0
  137. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/query/column.py +0 -0
  138. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/query/row.py +0 -0
  139. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/query/types.py +0 -0
  140. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/core/types.py +0 -0
  141. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/__init__.py +0 -0
  142. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/cli.py +0 -0
  143. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/construct_client.py +0 -0
  144. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/cron.py +0 -0
  145. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/db/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/db/connect.py +0 -0
  147. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/db/session.py +0 -0
  148. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/entrypoint.py +0 -0
  149. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/executors/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/executors/executors.py +0 -0
  151. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  152. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/executors/script_executor.py +0 -0
  153. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/http_server/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/http_server/types.py +0 -0
  155. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/__init__.py +0 -0
  156. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  158. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  159. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  160. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  162. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  163. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  164. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  165. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  166. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  168. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  169. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  170. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  171. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  172. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/queue_runner/types.py +0 -0
  173. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/scan_profiles.py +0 -0
  174. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/scheduler.py +0 -0
  175. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  176. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  177. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/server.py +0 -0
  178. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/telemetry.py +0 -0
  179. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  180. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/py.typed +0 -0
  181. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/__init__.py +0 -0
  182. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/__init__.py +0 -0
  183. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/batch/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/batch/execute_batch.py +0 -0
  185. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  186. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/chemical/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  188. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  190. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/create_entities.py +0 -0
  192. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/create_entity.py +0 -0
  193. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  194. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/export_entities.py +0 -0
  195. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/get_entities_data.py +0 -0
  196. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  197. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/list_aggregate.py +0 -0
  198. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/list_entities.py +0 -0
  199. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/lock_entity.py +0 -0
  200. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/lookup_entity.py +0 -0
  201. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  202. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/set_barcode.py +0 -0
  203. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  204. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/set_values.py +0 -0
  205. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  206. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/entity/unlock_entity.py +0 -0
  207. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/equipment/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  209. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/field_options/__init__.py +0 -0
  210. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  211. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/file_folders/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  213. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/files/__init__.py +0 -0
  214. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/files/create_file_record.py +0 -0
  215. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/files/download_file.py +0 -0
  216. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/id_source/__init__.py +0 -0
  217. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/id_source/list_id_source.py +0 -0
  218. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/id_source/match_id_source.py +0 -0
  219. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/input_groups/__init__.py +0 -0
  220. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  221. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/__init__.py +0 -0
  222. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/create_inputs.py +0 -0
  223. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/get_input_data.py +0 -0
  224. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/get_input_names.py +0 -0
  225. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  226. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  227. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/set_input_category.py +0 -0
  228. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  229. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  230. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/integrations/__init__.py +0 -0
  231. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  232. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/integrations/push_notification.py +0 -0
  233. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  234. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/listing/__init__.py +0 -0
  235. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/listing/export_listing.py +0 -0
  236. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/listing/fetch_listing.py +0 -0
  237. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/material_families/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  239. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/notebooks/__init__.py +0 -0
  240. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  241. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  242. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/get_output_data.py +0 -0
  244. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/get_output_names.py +0 -0
  245. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  246. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  247. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  248. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/permissions/__init__.py +0 -0
  249. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  250. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  251. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/project/__init__.py +0 -0
  252. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/project/get_projects.py +0 -0
  253. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/project/get_projects_data.py +0 -0
  254. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipe_links/__init__.py +0 -0
  255. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  256. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  257. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  258. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  259. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  261. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  262. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  263. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  264. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  265. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  266. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  267. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/create_recipe.py +0 -0
  268. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/create_recipes.py +0 -0
  269. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  270. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  271. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_curve.py +0 -0
  272. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  273. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  274. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  275. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  276. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  277. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  278. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  279. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  280. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  281. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  282. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  283. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  284. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  285. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  286. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  287. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  288. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/runsheet/__init__.py +0 -0
  289. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  290. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  291. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/triggers/__init__.py +0 -0
  292. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/triggers/run_trigger.py +0 -0
  293. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/uploader/__init__.py +0 -0
  294. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  295. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/user/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/api/user/get_current_user_info.py +0 -0
  297. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/async_batch.py +0 -0
  298. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/async_batch_t.py +0 -0
  299. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/async_jobs.py +0 -0
  300. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/async_jobs_t.py +0 -0
  301. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/auth_retrieval.py +0 -0
  302. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/auth_retrieval_t.py +0 -0
  303. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/base.py +0 -0
  304. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/base_t.py +0 -0
  305. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/calculations.py +0 -0
  306. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/calculations_t.py +0 -0
  307. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/chemical_structure.py +0 -0
  308. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/chemical_structure_t.py +0 -0
  309. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/client_config.py +0 -0
  310. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/client_config_t.py +0 -0
  311. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/curves.py +0 -0
  312. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/curves_t.py +0 -0
  313. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/data.py +0 -0
  314. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/data_t.py +0 -0
  315. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/entity.py +0 -0
  316. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/entity_t.py +0 -0
  317. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/experiment_groups.py +0 -0
  318. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/experiment_groups_t.py +0 -0
  319. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/exports.py +0 -0
  320. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/exports_t.py +0 -0
  321. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/field_values.py +0 -0
  322. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/field_values_t.py +0 -0
  323. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/fields.py +0 -0
  324. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/fields_t.py +0 -0
  325. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/generic_upload.py +0 -0
  326. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/generic_upload_t.py +0 -0
  327. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/id_source.py +0 -0
  328. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/id_source_t.py +0 -0
  329. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/identifier.py +0 -0
  330. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/identifier_t.py +0 -0
  331. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/input_attributes.py +0 -0
  332. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/input_attributes_t.py +0 -0
  333. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/inputs.py +0 -0
  334. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/inputs_t.py +0 -0
  335. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integration_server.py +0 -0
  336. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integration_server_t.py +0 -0
  337. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integration_session.py +0 -0
  338. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integration_session_t.py +0 -0
  339. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integrations.py +0 -0
  340. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/integrations_t.py +0 -0
  341. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/job_definition.py +0 -0
  342. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/job_definition_t.py +0 -0
  343. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/listing.py +0 -0
  344. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/listing_t.py +0 -0
  345. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/notices.py +0 -0
  346. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/notices_t.py +0 -0
  347. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/notifications.py +0 -0
  348. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/notifications_t.py +0 -0
  349. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/outputs.py +0 -0
  350. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/outputs_t.py +0 -0
  351. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/overrides.py +0 -0
  352. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/overrides_t.py +0 -0
  353. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/permissions.py +0 -0
  354. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/permissions_t.py +0 -0
  355. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/phases.py +0 -0
  356. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/phases_t.py +0 -0
  357. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/post_base.py +0 -0
  358. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/post_base_t.py +0 -0
  359. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/queued_job.py +0 -0
  360. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_identifiers.py +0 -0
  361. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_identifiers_t.py +0 -0
  362. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_inputs.py +0 -0
  363. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_inputs_t.py +0 -0
  364. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_links.py +0 -0
  365. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_links_t.py +0 -0
  366. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_metadata.py +0 -0
  367. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_metadata_t.py +0 -0
  368. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_output_metadata.py +0 -0
  369. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_output_metadata_t.py +0 -0
  370. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_step_relationships.py +0 -0
  371. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_step_relationships_t.py +0 -0
  372. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_tags.py +0 -0
  373. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_tags_t.py +0 -0
  374. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_workflow_steps.py +0 -0
  375. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  376. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipes.py +0 -0
  377. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/recipes_t.py +0 -0
  378. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/response.py +0 -0
  379. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/response_t.py +0 -0
  380. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/runsheet.py +0 -0
  381. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/runsheet_format.py +0 -0
  382. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/runsheet_format_t.py +0 -0
  383. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/runsheet_t.py +0 -0
  384. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/secret_retrieval.py +0 -0
  385. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/secret_retrieval_t.py +0 -0
  386. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/sockets.py +0 -0
  387. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/sockets_t.py +0 -0
  388. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/specs.py +0 -0
  389. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/specs_t.py +0 -0
  390. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/units.py +0 -0
  391. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/units_t.py +0 -0
  392. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/uploader.py +0 -0
  393. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/uploader_t.py +0 -0
  394. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/users.py +0 -0
  395. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/users_t.py +0 -0
  396. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/webhook_job.py +0 -0
  397. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/webhook_job_t.py +0 -0
  398. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/workflows.py +0 -0
  399. {uncountablepythonsdk-0.0.158 → uncountablepythonsdk-0.0.160}/uncountable/types/workflows_t.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.158
3
+ Version: 0.0.160
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.158
3
+ Version: 0.0.160
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
@@ -60,6 +60,7 @@ pkgs/argument_parser/argument_parser.py
60
60
  pkgs/argument_parser/case_convert.py
61
61
  pkgs/filesystem_utils/__init__.py
62
62
  pkgs/filesystem_utils/_blob_session.py
63
+ pkgs/filesystem_utils/_file_share_session.py
63
64
  pkgs/filesystem_utils/_gdrive_session.py
64
65
  pkgs/filesystem_utils/_local_session.py
65
66
  pkgs/filesystem_utils/_s3_session.py
@@ -133,6 +134,7 @@ uncountable/integration/construct_client.py
133
134
  uncountable/integration/cron.py
134
135
  uncountable/integration/entrypoint.py
135
136
  uncountable/integration/job.py
137
+ uncountable/integration/request_context.py
136
138
  uncountable/integration/scan_profiles.py
137
139
  uncountable/integration/scheduler.py
138
140
  uncountable/integration/server.py
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "",
3
+ "icons": [
4
+ {
5
+ "src": "/static/img/icons/android-chrome-192x192.png",
6
+ "sizes": "192x192",
7
+ "type": "image/png"
8
+ },
9
+ {
10
+ "src": "/static/img/icons/android-chrome-512x512.png",
11
+ "sizes": "512x512",
12
+ "type": "image/png"
13
+ }
14
+ ],
15
+ "theme_color": "#ffffff",
16
+ "background_color": "#ffffff",
17
+ "display": "standalone"
18
+ }
@@ -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),
@@ -12,7 +12,7 @@ dependencies = [
12
12
  "types-paramiko ==4.0.0.20250822",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
- "types-pytz ==2025.*",
15
+ "types-pytz ==2026.*",
16
16
  "types-requests == 2.*",
17
17
  "types-simplejson == 3.*",
18
18
  "pandas-stubs",
@@ -1,4 +1,5 @@
1
1
  from ._blob_session import BlobSession as BlobSession
2
+ from ._file_share_session import FileShareSession as FileShareSession
2
3
  from ._gdrive_session import GDriveSession as GDriveSession
3
4
  from ._gdrive_session import delete_gdrive_file as delete_gdrive_file
4
5
  from ._gdrive_session import download_gdrive_file as download_gdrive_file
@@ -13,6 +14,7 @@ from ._sftp_session import move_sftp_files as move_sftp_files
13
14
  from .file_type_utils import FileObjectData as FileObjectData
14
15
  from .file_type_utils import FileSystemBlobConfig as FileSystemBlobConfig
15
16
  from .file_type_utils import FileSystemFileReference as FileSystemFileReference
17
+ from .file_type_utils import FileSystemFileShareConfig as FileSystemFileShareConfig
16
18
  from .file_type_utils import FileSystemObject as FileSystemObject
17
19
  from .file_type_utils import FileSystemS3Config as FileSystemS3Config
18
20
  from .file_type_utils import FileSystemSFTPConfig as FileSystemSFTPConfig
@@ -0,0 +1,131 @@
1
+ from io import BytesIO
2
+ from typing import Self
3
+
4
+ from azure.core.credentials import AzureSasCredential
5
+ from azure.storage.fileshare import ShareClient, ShareDirectoryClient
6
+
7
+ from pkgs.filesystem_utils.file_type_utils import (
8
+ FileObjectData,
9
+ FileSystemFileReference,
10
+ FileSystemFileShareConfig,
11
+ FileSystemObject,
12
+ FileTransfer,
13
+ IncompatibleFileReference,
14
+ )
15
+ from pkgs.filesystem_utils.filesystem_session import FileSystemSession
16
+
17
+
18
+ class FileShareSession(FileSystemSession):
19
+ def __init__(self, config: FileSystemFileShareConfig) -> None:
20
+ super().__init__()
21
+ self.config = config
22
+ self._share_client: ShareClient | None = None
23
+
24
+ def start(self) -> None:
25
+ self._share_client = ShareClient(
26
+ account_url=self.config.account_url,
27
+ share_name=self.config.share_name,
28
+ credential=self.config.credential,
29
+ )
30
+
31
+ def __enter__(self) -> Self:
32
+ self.start()
33
+ return self
34
+
35
+ def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> None:
36
+ self._share_client = None
37
+
38
+ def _list_dir(
39
+ self,
40
+ dir_client: ShareDirectoryClient,
41
+ *,
42
+ recursive: bool,
43
+ valid_extensions: list[str] | None,
44
+ ) -> list[FileSystemObject]:
45
+ results: list[FileSystemObject] = []
46
+ for item in dir_client.list_directories_and_files():
47
+ item_path = f"{dir_client.directory_path}/{item['name']}".lstrip("/")
48
+ if item["is_directory"]:
49
+ if recursive:
50
+ assert self._share_client is not None
51
+ results.extend(
52
+ self._list_dir(
53
+ self._share_client.get_directory_client(item_path),
54
+ recursive=recursive,
55
+ valid_extensions=valid_extensions,
56
+ )
57
+ )
58
+ elif valid_extensions is None or any(
59
+ item_path.endswith(ext) for ext in valid_extensions
60
+ ):
61
+ results.append(FileSystemFileReference(filepath=item_path))
62
+ return results
63
+
64
+ def list_files(
65
+ self,
66
+ dir_path: FileSystemObject,
67
+ *,
68
+ recursive: bool = False,
69
+ valid_extensions: list[str] | None = None,
70
+ ) -> list[FileSystemObject]:
71
+ if not isinstance(dir_path, FileSystemFileReference):
72
+ raise IncompatibleFileReference()
73
+ assert self._share_client is not None, (
74
+ "call to list_files on uninitialized file share session"
75
+ )
76
+ dir_client = self._share_client.get_directory_client(dir_path.filepath)
77
+ return self._list_dir(
78
+ dir_client, recursive=recursive, valid_extensions=valid_extensions
79
+ )
80
+
81
+ def download_files(self, filepaths: list[FileSystemObject]) -> list[FileObjectData]:
82
+ assert self._share_client is not None, (
83
+ "call to download_files on uninitialized file share session"
84
+ )
85
+ downloaded: list[FileObjectData] = []
86
+ for file_object in filepaths:
87
+ if (
88
+ not isinstance(file_object, FileSystemFileReference)
89
+ or not file_object.filename
90
+ ):
91
+ raise IncompatibleFileReference()
92
+ file_client = self._share_client.get_file_client(file_object.filepath)
93
+ stream = file_client.download_file()
94
+ file_data = stream.readall()
95
+ downloaded.append(
96
+ FileObjectData(
97
+ file_data=file_data,
98
+ file_IO=BytesIO(file_data),
99
+ filename=file_object.filename,
100
+ filepath=file_object.filepath,
101
+ )
102
+ )
103
+ return downloaded
104
+
105
+ def move_files(self, file_mappings: list[FileTransfer]) -> None:
106
+ assert self._share_client is not None, (
107
+ "call to move_files on uninitialized file share session"
108
+ )
109
+ for src, dest in file_mappings:
110
+ if not isinstance(src, FileSystemFileReference) or not isinstance(
111
+ dest, FileSystemFileReference
112
+ ):
113
+ raise IncompatibleFileReference()
114
+ src_client = self._share_client.get_file_client(src.filepath)
115
+ dest_client = self._share_client.get_file_client(dest.filepath)
116
+ source_url = (
117
+ f"{src_client.url}?{self.config.credential.signature}"
118
+ if isinstance(self.config.credential, AzureSasCredential)
119
+ else src_client.url
120
+ )
121
+ dest_client.start_copy_from_url(source_url)
122
+ src_client.delete_file()
123
+
124
+ def delete_files(self, filepaths: list[FileSystemObject]) -> None:
125
+ assert self._share_client is not None, (
126
+ "call to delete_files on uninitialized file share session"
127
+ )
128
+ for file_object in filepaths:
129
+ if not isinstance(file_object, FileSystemFileReference):
130
+ raise IncompatibleFileReference()
131
+ self._share_client.get_file_client(file_object.filepath).delete_file()
@@ -89,3 +89,12 @@ class FileSystemBlobConfig:
89
89
  | None
90
90
  )
91
91
  container: ContainerProperties | str
92
+
93
+
94
+ @dataclass(frozen=True, kw_only=True)
95
+ class FileSystemFileShareConfig:
96
+ account_url: str
97
+ credential: (
98
+ AzureNamedKeyCredential | AzureSasCredential | TokenCredential | str | None
99
+ )
100
+ share_name: str
@@ -93,18 +93,29 @@ def _write_guide_as_html(guide: EmitOpenAPIGuide, *, is_open: bool) -> str:
93
93
  </details>"""
94
94
 
95
95
 
96
+ _FRONTMATTER_RE = re.compile(r"^---\n.*?\n---\n", re.DOTALL)
97
+
98
+
99
+ def _strip_guide_frontmatter(content: str) -> str:
100
+ return _FRONTMATTER_RE.sub("", content).lstrip("\n")
101
+
102
+
96
103
  def _open_api_info(
97
- config: OpenAPIConfig, guides: list[EmitOpenAPIGuide]
104
+ *, config: OpenAPIConfig, root_guides: list[builder.SpecGuide]
98
105
  ) -> GlobalContextInfo:
99
- full_guides = "<br/>".join([
100
- _write_guide_as_html(guide, is_open=True)
101
- for guide in sorted(guides, key=lambda g: g.ref_name)
102
- ])
103
- full_description = f"{config.description}<br/>{full_guides}"
104
106
  info: GlobalContextInfo = dict()
105
107
  info["version"] = "1.0.0"
106
108
  info["title"] = "Uncountable API Documentation"
107
- info["description"] = full_description
109
+ sorted_guides = sorted(root_guides, key=lambda g: g.ref_name)
110
+ description_parts = [
111
+ config.description,
112
+ *[
113
+ f'<a id="{guide.ref_name}" />\n\n'
114
+ + _strip_guide_frontmatter(guide.markdown_content)
115
+ for guide in sorted_guides
116
+ ],
117
+ ]
118
+ info["description"] = "\n\n".join(description_parts)
108
119
  info["x-logo"] = {
109
120
  "url": "../static/images/logo_blue.png",
110
121
  "altText": "Logo",
@@ -119,16 +130,11 @@ def _open_api_servers(config: OpenAPIConfig) -> list[EmitOpenAPIServer]:
119
130
 
120
131
 
121
132
  def emit_open_api(builder: builder.SpecBuilder, *, config: OpenAPIConfig) -> None:
122
- root_guides = builder.guides.get(RootGuideKey(), [])
123
- openapi_guides = [
124
- EmitOpenAPIGuide(
125
- ref_name=guide.ref_name, title=guide.title, html_content=guide.html_content
126
- )
127
- for guide in root_guides
128
- ]
129
133
  gctx = EmitOpenAPIGlobalContext(
130
134
  version="3.0.0",
131
- info=_open_api_info(config, openapi_guides),
135
+ info=_open_api_info(
136
+ config=config, root_guides=builder.guides.get(RootGuideKey(), [])
137
+ ),
132
138
  servers=_open_api_servers(config),
133
139
  )
134
140
 
@@ -330,6 +330,11 @@ class Client(ClientMethods):
330
330
  headers = self._build_auth_headers()
331
331
  headers[UNC_REQUEST_ID_HEADER] = request_id
332
332
  headers[UNC_SDK_VERSION_HEADER] = get_version()
333
+ if self._cfg.request_context is not None:
334
+ if self._cfg.request_context.user_locale is not None:
335
+ headers["X-User-Locale"] = self._cfg.request_context.user_locale
336
+ if self._cfg.request_context.user_timezone is not None:
337
+ headers["X-User-Timezone"] = self._cfg.request_context.user_timezone
333
338
  method = api_request.method.lower()
334
339
  data = {"data": json.dumps(serialize_for_api(api_request.args))}
335
340
  match method:
@@ -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(
@@ -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(),
@@ -23,7 +23,7 @@ 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, job_definition_t, queued_job_t
26
+ from uncountable.types import base_t, client_config_t, job_definition_t, queued_job_t
27
27
 
28
28
 
29
29
  class Worker:
@@ -89,6 +89,16 @@ def _resolve_queued_job_payload(queued_job: queued_job_t.QueuedJob) -> base_t.Js
89
89
  return queued_job.payload.invocation_context.webhook_payload
90
90
 
91
91
 
92
+ def _resolve_queued_job_request_context(
93
+ queued_job: queued_job_t.QueuedJob,
94
+ ) -> client_config_t.RequestContext | None:
95
+ match queued_job.payload.invocation_context:
96
+ case queued_job_t.InvocationContextWebhook():
97
+ return queued_job.payload.invocation_context.request_context
98
+ case _:
99
+ return None
100
+
101
+
92
102
  def run_queued_job(
93
103
  queued_job: queued_job_t.QueuedJob,
94
104
  ) -> job_definition_t.JobResult:
@@ -108,8 +118,11 @@ def run_queued_job(
108
118
  )
109
119
  with job_logger.resource_tracking():
110
120
  try:
121
+ request_context = _resolve_queued_job_request_context(queued_job)
111
122
  client = construct_uncountable_client(
112
- profile_meta=job_details.profile_metadata, logger=job_logger
123
+ profile_meta=job_details.profile_metadata,
124
+ logger=job_logger,
125
+ request_context=request_context,
113
126
  )
114
127
  batch_processor = AsyncBatchProcessor(client=client)
115
128
 
@@ -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
+ )
@@ -23,12 +23,15 @@ __all__: list[str] = [
23
23
  "ENDPOINT_METHOD",
24
24
  "ENDPOINT_PATH",
25
25
  "MixStepMatchStrategy",
26
+ "PlaceholderAssignmentPlaceholderType",
26
27
  "PlaceholderBase",
27
28
  "PlaceholderDisplayMode",
28
29
  "PlaceholderType",
30
+ "ProductRecipePlaceholderAssignment",
29
31
  "RecipeInputEdit",
30
32
  "RecipeInputEditAddInput",
31
33
  "RecipeInputEditAddInstructions",
34
+ "RecipeInputEditAssignPlaceholder",
32
35
  "RecipeInputEditBase",
33
36
  "RecipeInputEditChangeBasisViewed",
34
37
  "RecipeInputEditClearInputs",
@@ -41,6 +44,8 @@ __all__: list[str] = [
41
44
  "RecipeInputEditUpdateAnnotations",
42
45
  "RecipeInputEditUpsertInput",
43
46
  "RecipeInputPlaceholder",
47
+ "RecipeInputPlaceholderAssignment",
48
+ "RecipeInputPlaceholderAssignmentBase",
44
49
  "SubcategoryPlaceholder",
45
50
  ]
46
51
 
@@ -60,6 +65,7 @@ class RecipeInputEditType(StrEnum):
60
65
  ADD_INSTRUCTIONS = "add_instructions"
61
66
  SET_ROLE = "set_role"
62
67
  SET_PLACEHOLDER = "set_placeholder"
68
+ ASSIGN_PLACEHOLDER = "assign_placeholder"
63
69
 
64
70
 
65
71
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -269,9 +275,60 @@ class RecipeInputEditPlaceholder(RecipeInputEditBase):
269
275
  mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
270
276
 
271
277
 
278
+ # DO NOT MODIFY -- This file is generated by type_spec
279
+ class PlaceholderAssignmentPlaceholderType(StrEnum):
280
+ PRODUCT = "product"
281
+
282
+
283
+ # DO NOT MODIFY -- This file is generated by type_spec
284
+ @serial_class(
285
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputPlaceholderAssignmentBase",
286
+ )
287
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
288
+ class RecipeInputPlaceholderAssignmentBase:
289
+ type: PlaceholderAssignmentPlaceholderType
290
+
291
+
292
+ # DO NOT MODIFY -- This file is generated by type_spec
293
+ @serial_class(
294
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.ProductRecipePlaceholderAssignment",
295
+ parse_require={"type"},
296
+ )
297
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
298
+ class ProductRecipePlaceholderAssignment(RecipeInputPlaceholderAssignmentBase):
299
+ type: typing.Literal[PlaceholderAssignmentPlaceholderType.PRODUCT] = PlaceholderAssignmentPlaceholderType.PRODUCT
300
+ product_key: identifier_t.IdentifierKey
301
+ recipe_key: identifier_t.IdentifierKey
302
+
303
+
304
+ # DO NOT MODIFY -- This file is generated by type_spec
305
+ RecipeInputPlaceholderAssignment = typing.Annotated[
306
+ typing.Union[ProductRecipePlaceholderAssignment],
307
+ serial_union_annotation(
308
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputPlaceholderAssignment",
309
+ discriminator="type",
310
+ discriminator_map={
311
+ "product": ProductRecipePlaceholderAssignment,
312
+ },
313
+ ),
314
+ ]
315
+
316
+
317
+ # DO NOT MODIFY -- This file is generated by type_spec
318
+ @serial_class(
319
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditAssignPlaceholder",
320
+ parse_require={"type"},
321
+ )
322
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
323
+ class RecipeInputEditAssignPlaceholder(RecipeInputEditBase):
324
+ type: typing.Literal[RecipeInputEditType.ASSIGN_PLACEHOLDER] = RecipeInputEditType.ASSIGN_PLACEHOLDER
325
+ assignment: RecipeInputPlaceholderAssignment
326
+ mix_step_match_strategy: MixStepMatchStrategy = MixStepMatchStrategy.FIRST
327
+
328
+
272
329
  # DO NOT MODIFY -- This file is generated by type_spec
273
330
  RecipeInputEdit = typing.Annotated[
274
- RecipeInputEditClearInputs | RecipeInputEditUpsertInput | RecipeInputEditAddInput | RecipeInputEditUpdateAnnotations | RecipeInputEditSetLot | RecipeInputEditSetPropagatedPercentage | RecipeInputEditChangeBasisViewed | RecipeInputEditAddInstructions | RecipeInputEditSetRole | RecipeInputEditPlaceholder,
331
+ RecipeInputEditClearInputs | RecipeInputEditUpsertInput | RecipeInputEditAddInput | RecipeInputEditUpdateAnnotations | RecipeInputEditSetLot | RecipeInputEditSetPropagatedPercentage | RecipeInputEditChangeBasisViewed | RecipeInputEditAddInstructions | RecipeInputEditSetRole | RecipeInputEditPlaceholder | RecipeInputEditAssignPlaceholder,
275
332
  serial_union_annotation(
276
333
  named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEdit",
277
334
  discriminator="type",
@@ -286,6 +343,7 @@ RecipeInputEdit = typing.Annotated[
286
343
  "add_instructions": RecipeInputEditAddInstructions,
287
344
  "set_role": RecipeInputEditSetRole,
288
345
  "set_placeholder": RecipeInputEditPlaceholder,
346
+ "assign_placeholder": RecipeInputEditAssignPlaceholder,
289
347
  },
290
348
  ),
291
349
  ]
@@ -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
  )
@@ -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