UncountablePythonSDK 0.0.178__tar.gz → 0.0.179__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 (433) hide show
  1. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/.github/workflows/publish.yml +1 -1
  3. {uncountablepythonsdk-0.0.178/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.179}/PKG-INFO +2 -1
  4. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179/UncountablePythonSDK.egg-info}/PKG-INFO +2 -1
  5. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/UncountablePythonSDK.egg-info/SOURCES.txt +3 -0
  6. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/UncountablePythonSDK.egg-info/requires.txt +1 -0
  7. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/pyproject.toml +1 -1
  8. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_file_share_session.py +1 -0
  9. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pyproject.toml +1 -0
  10. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/client.py +1 -1
  11. uncountablepythonsdk-0.0.179/uncountable/integration/db/connect.py +48 -0
  12. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/command_server.py +2 -2
  13. uncountablepythonsdk-0.0.179/uncountable/integration/queue_runner/datastore/__init__.py +11 -0
  14. uncountablepythonsdk-0.0.179/uncountable/integration/queue_runner/datastore/datastore_postgres.py +12 -0
  15. uncountablepythonsdk-0.0.178/uncountable/integration/queue_runner/datastore/datastore_sqlite.py → uncountablepythonsdk-0.0.179/uncountable/integration/queue_runner/datastore/datastore_sql_base.py +3 -29
  16. uncountablepythonsdk-0.0.179/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +34 -0
  17. uncountablepythonsdk-0.0.179/uncountable/integration/queue_runner/datastore/factory.py +24 -0
  18. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/datastore/interface.py +17 -0
  19. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/datastore/model.py +1 -1
  20. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/job_scheduler.py +2 -5
  21. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/queue_runner.py +2 -6
  22. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/worker.py +1 -1
  23. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/entity_t.py +8 -0
  24. uncountablepythonsdk-0.0.178/uncountable/integration/db/connect.py +0 -18
  25. uncountablepythonsdk-0.0.178/uncountable/integration/queue_runner/datastore/__init__.py +0 -3
  26. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/.gitignore +0 -0
  27. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/README.md +0 -0
  28. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  29. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  30. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/.flowmarkignore +0 -0
  31. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/.gitignore +0 -0
  32. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/conf.py +0 -0
  33. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/index.md +0 -0
  34. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/integration_examples/add_file_to_folder.md +0 -0
  35. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/integration_examples/create_ingredient.md +0 -0
  36. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/integration_examples/create_output.md +0 -0
  37. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/integration_examples/index.md +0 -0
  38. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/integration_examples/upload_file.md +0 -0
  39. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/justfile +0 -0
  40. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/requirements.txt +0 -0
  41. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/android-chrome-192x192.png +0 -0
  42. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/android-chrome-512x512.png +0 -0
  43. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/apple-touch-icon.png +0 -0
  44. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/browserconfig.xml +0 -0
  45. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/favicon-16x16.png +0 -0
  46. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/favicon-32x32.png +0 -0
  47. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/manifest.json +0 -0
  48. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/mstile-150x150.png +0 -0
  49. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  50. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/docs/static/logo_blue.png +0 -0
  51. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/async_batch.py +0 -0
  52. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/async_batch_large_parse.py +0 -0
  53. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/basic_auth.py +0 -0
  54. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/create_entity.py +0 -0
  55. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/create_ingredient_sdk.py +0 -0
  56. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/download_files.py +0 -0
  57. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/edit_recipe_inputs.py +0 -0
  58. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  59. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  60. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  61. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  62. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  63. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  64. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  65. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  66. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  67. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/invoke_uploader.py +0 -0
  68. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/oauth.py +0 -0
  69. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/set_input_pdf_attribute.py +0 -0
  70. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/set_recipe_metadata_file.py +0 -0
  71. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/set_recipe_output_file_sdk.py +0 -0
  72. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/examples/upload_files.py +0 -0
  73. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/__init__.py +0 -0
  74. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/__init__.py +0 -0
  75. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/cached_parser.py +0 -0
  76. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/case_convert.py +0 -0
  77. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_base.py +0 -0
  78. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_builder.py +0 -0
  79. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_cache.py +0 -0
  80. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_error.py +0 -0
  81. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_function_type.py +0 -0
  82. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_inner.py +0 -0
  83. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/parser_options.py +0 -0
  84. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/argument_parser/type_predicates.py +0 -0
  85. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_blob_session.py +0 -0
  87. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  88. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_local_session.py +0 -0
  89. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_s3_session.py +0 -0
  90. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
  91. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  92. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  93. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  94. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/py.typed +0 -0
  95. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/__init__.py +0 -0
  96. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/annotation.py +0 -0
  97. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/missing_sentry.py +0 -0
  98. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/opaque_key.py +0 -0
  99. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/serial_alias.py +0 -0
  100. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/serial_class.py +0 -0
  101. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/serial_generic.py +0 -0
  102. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/serial_union.py +0 -0
  103. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/unknown.py +0 -0
  104. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization/yaml.py +0 -0
  105. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization_util/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  107. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  108. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization_util/dataclasses.py +0 -0
  109. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/serialization_util/serialization_helpers.py +0 -0
  110. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/strenum_compat/__init__.py +0 -0
  111. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/strenum_compat/strenum_compat.py +0 -0
  112. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/__init__.py +0 -0
  113. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/__main__.py +0 -0
  114. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  115. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  116. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/actions_registry/emit_python.py +0 -0
  117. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  118. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/builder.py +0 -0
  119. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/builder_types.py +0 -0
  120. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/config.py +0 -0
  121. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/cross_output_links.py +0 -0
  122. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_io_ts.py +0 -0
  123. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_open_api.py +0 -0
  124. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_open_api_util.py +0 -0
  125. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_python.py +0 -0
  126. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_typescript.py +0 -0
  127. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/emit_typescript_util.py +0 -0
  128. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/load_types.py +0 -0
  129. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  130. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/open_api_util.py +0 -0
  131. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/parts/base.py.prepart +0 -0
  132. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  133. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/test.py +0 -0
  134. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/type_info/__main__.py +0 -0
  135. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  136. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  137. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  138. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/util.py +0 -0
  139. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/value_spec/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/value_spec/__main__.py +0 -0
  141. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  142. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  143. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/pkgs/type_spec/value_spec/types.py +0 -0
  144. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/setup.cfg +0 -0
  145. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/async_batch.py +0 -0
  148. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/environment.py +0 -0
  149. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/file_upload.py +0 -0
  150. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/query/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/query/builder.py +0 -0
  152. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/query/column.py +0 -0
  153. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/query/row.py +0 -0
  154. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/query/types.py +0 -0
  155. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/core/types.py +0 -0
  156. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/cli.py +0 -0
  158. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/construct_client.py +0 -0
  159. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/cron.py +0 -0
  160. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/db/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/db/session.py +0 -0
  162. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/entrypoint.py +0 -0
  163. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/executors/__init__.py +0 -0
  164. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/executors/executors.py +0 -0
  165. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  166. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/executors/script_executor.py +0 -0
  167. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/http_server/__init__.py +0 -0
  168. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/http_server/types.py +0 -0
  169. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/job.py +0 -0
  170. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  172. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  173. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  174. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  175. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  176. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  177. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  178. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  179. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/provision_webhook.py +0 -0
  180. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  181. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/queue_runner/types.py +0 -0
  182. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/request_context.py +0 -0
  183. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/scan_profiles.py +0 -0
  184. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/scheduler.py +0 -0
  185. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/secret_retrieval/basic_secret.py +0 -0
  187. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  188. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/server.py +0 -0
  189. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/telemetry.py +0 -0
  190. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  191. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/integration/webhook_signature_key.py +0 -0
  192. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/py.typed +0 -0
  193. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/__init__.py +0 -0
  194. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/batch/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/batch/execute_batch.py +0 -0
  197. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  198. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/chemical/__init__.py +0 -0
  199. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  200. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  201. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  202. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
  203. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/__init__.py +0 -0
  204. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/create_entities.py +0 -0
  205. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/create_entity.py +0 -0
  206. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
  207. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  208. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/export_entities.py +0 -0
  209. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/get_entities_data.py +0 -0
  210. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  211. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/list_aggregate.py +0 -0
  212. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/list_entities.py +0 -0
  213. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/lock_entity.py +0 -0
  214. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/lookup_entity.py +0 -0
  215. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  216. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/set_barcode.py +0 -0
  217. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
  218. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  219. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/set_values.py +0 -0
  220. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  221. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/entity/unlock_entity.py +0 -0
  222. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/equipment/__init__.py +0 -0
  223. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  224. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/field_options/__init__.py +0 -0
  225. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  226. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/file_folders/__init__.py +0 -0
  227. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  228. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  229. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/files/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/files/download_file.py +0 -0
  231. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/id_source/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/id_source/list_id_source.py +0 -0
  233. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/id_source/match_id_source.py +0 -0
  234. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/input_groups/__init__.py +0 -0
  235. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  236. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/create_inputs.py +0 -0
  238. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/get_input_data.py +0 -0
  239. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/get_input_names.py +0 -0
  240. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  241. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  242. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/set_input_category.py +0 -0
  243. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  244. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  245. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/integrations/__init__.py +0 -0
  246. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  247. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/integrations/push_notification.py +0 -0
  248. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  249. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/listing/__init__.py +0 -0
  250. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/listing/export_listing.py +0 -0
  251. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/listing/fetch_listing.py +0 -0
  252. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/material_families/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  254. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/notebooks/__init__.py +0 -0
  255. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  256. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  257. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/output_parameters/__init__.py +0 -0
  258. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
  259. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/get_output_data.py +0 -0
  261. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/get_output_names.py +0 -0
  262. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  263. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  264. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  265. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/permissions/__init__.py +0 -0
  266. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  267. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  268. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/project/__init__.py +0 -0
  269. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/project/get_projects.py +0 -0
  270. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/project/get_projects_data.py +0 -0
  271. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_links/__init__.py +0 -0
  272. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  273. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
  274. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  275. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  276. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  277. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/__init__.py +0 -0
  278. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  279. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  280. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  281. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  282. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  283. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  284. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  285. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/create_recipe.py +0 -0
  286. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/create_recipes.py +0 -0
  287. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  288. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  289. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  290. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_curve.py +0 -0
  291. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  292. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  293. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  294. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  295. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  296. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  297. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  298. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  299. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  300. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  301. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  302. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  303. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  304. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  305. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  306. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  307. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  308. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  309. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/runsheet/__init__.py +0 -0
  310. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  311. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  312. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/triggers/__init__.py +0 -0
  313. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/triggers/run_trigger.py +0 -0
  314. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/uploader/__init__.py +0 -0
  315. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  316. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  317. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/user/__init__.py +0 -0
  318. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/api/user/get_current_user_info.py +0 -0
  319. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/async_batch.py +0 -0
  320. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/async_batch_processor.py +0 -0
  321. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/async_batch_t.py +0 -0
  322. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/async_jobs.py +0 -0
  323. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/async_jobs_t.py +0 -0
  324. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/auth_retrieval.py +0 -0
  325. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/auth_retrieval_t.py +0 -0
  326. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/base.py +0 -0
  327. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/base_t.py +0 -0
  328. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/calculations.py +0 -0
  329. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/calculations_t.py +0 -0
  330. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/chemical_structure.py +0 -0
  331. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/chemical_structure_t.py +0 -0
  332. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/client_base.py +0 -0
  333. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/client_config.py +0 -0
  334. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/client_config_t.py +0 -0
  335. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/condition_match.py +0 -0
  336. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/condition_match_t.py +0 -0
  337. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/curves.py +0 -0
  338. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/curves_t.py +0 -0
  339. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/data.py +0 -0
  340. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/data_t.py +0 -0
  341. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/entity.py +0 -0
  342. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/experiment_groups.py +0 -0
  343. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/experiment_groups_t.py +0 -0
  344. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/exports.py +0 -0
  345. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/exports_t.py +0 -0
  346. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/field_values.py +0 -0
  347. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/field_values_t.py +0 -0
  348. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/fields.py +0 -0
  349. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/fields_t.py +0 -0
  350. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/generic_upload.py +0 -0
  351. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/generic_upload_t.py +0 -0
  352. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/id_source.py +0 -0
  353. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/id_source_t.py +0 -0
  354. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/identifier.py +0 -0
  355. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/identifier_t.py +0 -0
  356. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/input_attributes.py +0 -0
  357. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/input_attributes_t.py +0 -0
  358. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/inputs.py +0 -0
  359. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/inputs_t.py +0 -0
  360. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integration_server.py +0 -0
  361. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integration_server_t.py +0 -0
  362. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integration_session.py +0 -0
  363. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integration_session_t.py +0 -0
  364. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integrations.py +0 -0
  365. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/integrations_t.py +0 -0
  366. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/job_definition.py +0 -0
  367. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/job_definition_t.py +0 -0
  368. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/listing.py +0 -0
  369. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/listing_t.py +0 -0
  370. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/notices.py +0 -0
  371. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/notices_t.py +0 -0
  372. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/notifications.py +0 -0
  373. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/notifications_t.py +0 -0
  374. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/outputs.py +0 -0
  375. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/outputs_t.py +0 -0
  376. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/overrides.py +0 -0
  377. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/overrides_t.py +0 -0
  378. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/permissions.py +0 -0
  379. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/permissions_t.py +0 -0
  380. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/phases.py +0 -0
  381. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/phases_t.py +0 -0
  382. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/post_base.py +0 -0
  383. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/post_base_t.py +0 -0
  384. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/queued_job.py +0 -0
  385. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/queued_job_t.py +0 -0
  386. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_identifiers.py +0 -0
  387. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_identifiers_t.py +0 -0
  388. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_inputs.py +0 -0
  389. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_inputs_t.py +0 -0
  390. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_links.py +0 -0
  391. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_links_t.py +0 -0
  392. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_metadata.py +0 -0
  393. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_metadata_t.py +0 -0
  394. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_output_metadata.py +0 -0
  395. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_output_metadata_t.py +0 -0
  396. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_step_relationships.py +0 -0
  397. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_step_relationships_t.py +0 -0
  398. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_tags.py +0 -0
  399. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_tags_t.py +0 -0
  400. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_workflow_step_types.py +0 -0
  401. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  402. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_workflow_steps.py +0 -0
  403. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  404. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipes.py +0 -0
  405. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/recipes_t.py +0 -0
  406. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/request_headers.py +0 -0
  407. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/request_headers_t.py +0 -0
  408. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/response.py +0 -0
  409. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/response_t.py +0 -0
  410. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/runsheet.py +0 -0
  411. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/runsheet_format.py +0 -0
  412. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/runsheet_format_t.py +0 -0
  413. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/runsheet_t.py +0 -0
  414. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/secret_retrieval.py +0 -0
  415. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/secret_retrieval_t.py +0 -0
  416. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/sockets.py +0 -0
  417. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/sockets_t.py +0 -0
  418. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/specs.py +0 -0
  419. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/specs_t.py +0 -0
  420. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/step_relationships.py +0 -0
  421. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/step_relationships_t.py +0 -0
  422. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/units.py +0 -0
  423. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/units_t.py +0 -0
  424. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/uploader.py +0 -0
  425. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/uploader_t.py +0 -0
  426. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/users.py +0 -0
  427. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/users_t.py +0 -0
  428. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/webhook.py +0 -0
  429. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/webhook_job.py +0 -0
  430. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/webhook_job_t.py +0 -0
  431. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/webhook_t.py +0 -0
  432. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/uncountable/types/workflows.py +0 -0
  433. {uncountablepythonsdk-0.0.178 → uncountablepythonsdk-0.0.179}/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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
12
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
13
13
  - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6
14
14
  - uses: extractions/setup-crate@0551596312d4008a6dfbc4d3c38fa20eaef46d2d # v2
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
22
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
23
23
  with:
24
24
  fetch-depth: 0
25
25
  tags: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.178
3
+ Version: 0.0.179
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
@@ -20,6 +20,7 @@ Requires-Dist: aiotus==1.*
20
20
  Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
+ Requires-Dist: psycopg[binary]==3.*
23
24
  Requires-Dist: APScheduler==3.*
24
25
  Requires-Dist: python-dateutil==2.*
25
26
  Requires-Dist: PyYAML==6.*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.178
3
+ Version: 0.0.179
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
@@ -20,6 +20,7 @@ Requires-Dist: aiotus==1.*
20
20
  Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
+ Requires-Dist: psycopg[binary]==3.*
23
24
  Requires-Dist: APScheduler==3.*
24
25
  Requires-Dist: python-dateutil==2.*
25
26
  Requires-Dist: PyYAML==6.*
@@ -175,7 +175,10 @@ uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.
175
175
  uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi
176
176
  uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py
177
177
  uncountable/integration/queue_runner/datastore/__init__.py
178
+ uncountable/integration/queue_runner/datastore/datastore_postgres.py
179
+ uncountable/integration/queue_runner/datastore/datastore_sql_base.py
178
180
  uncountable/integration/queue_runner/datastore/datastore_sqlite.py
181
+ uncountable/integration/queue_runner/datastore/factory.py
179
182
  uncountable/integration/queue_runner/datastore/interface.py
180
183
  uncountable/integration/queue_runner/datastore/model.py
181
184
  uncountable/integration/secret_retrieval/__init__.py
@@ -2,6 +2,7 @@ aiotus==1.*
2
2
  aiohttp>=3.14.1
3
3
  requests==2.*
4
4
  SQLAlchemy>=1.4.0
5
+ psycopg[binary]==3.*
5
6
  APScheduler==3.*
6
7
  python-dateutil==2.*
7
8
  PyYAML==6.*
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
11
  "more_itertools ==11.*",
12
- "types-paramiko ==4.0.0.20260518",
12
+ "types-paramiko ==5.0.0.20260617",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pytz ==2026.*",
15
15
  "types-requests == 2.*",
@@ -26,6 +26,7 @@ class FileShareSession(FileSystemSession):
26
26
  account_url=self.config.account_url,
27
27
  share_name=self.config.share_name,
28
28
  credential=self.config.credential,
29
+ token_intent="backup",
29
30
  )
30
31
 
31
32
  def __enter__(self) -> Self:
@@ -55,6 +55,7 @@ dependencies = [
55
55
  "aiohttp >= 3.14.1",
56
56
  "requests == 2.*",
57
57
  "SQLAlchemy >= 1.4.0",
58
+ "psycopg[binary] == 3.*",
58
59
  "APScheduler == 3.*",
59
60
  "python-dateutil == 2.*",
60
61
  "PyYAML == 6.*",
@@ -201,7 +201,7 @@ DownloadedFiles = list[DownloadedFile]
201
201
 
202
202
 
203
203
  class Client(ClientMethods):
204
- _parser_map: dict[type, CachedParser] = {}
204
+ _parser_map: typing.ClassVar[dict[type, CachedParser]] = {}
205
205
  _auth_details: AuthDetailsAll
206
206
  _base_url: str
207
207
  _file_uploader: FileUploader
@@ -0,0 +1,48 @@
1
+ import os
2
+ from enum import StrEnum
3
+
4
+ from opentelemetry.trace import get_current_span
5
+ from sqlalchemy import create_engine
6
+ from sqlalchemy.engine.base import Engine
7
+
8
+ from uncountable.integration.telemetry import Logger
9
+
10
+
11
+ class IntegrationDBService(StrEnum):
12
+ CRON = "cron"
13
+ RUNNER = "runner"
14
+
15
+
16
+ _DB_URI_ENV_VARS: dict[IntegrationDBService, str] = {
17
+ IntegrationDBService.CRON: "UNC_CRON_DB_URI",
18
+ IntegrationDBService.RUNNER: "UNC_RUNNER_DB_URI",
19
+ }
20
+
21
+ _DEPRECATED_DB_URI_ENV_VARS: dict[IntegrationDBService, str] = {
22
+ IntegrationDBService.CRON: "UNC_CRON_SQLITE_URI",
23
+ IntegrationDBService.RUNNER: "UNC_RUNNER_SQLITE_URI",
24
+ }
25
+
26
+
27
+ def _resolve_db_uri(service: IntegrationDBService) -> str:
28
+ logger = Logger(get_current_span())
29
+ env_var = _DB_URI_ENV_VARS[service]
30
+ uri = os.environ.get(env_var)
31
+ if uri is not None:
32
+ return uri
33
+
34
+ deprecated_env_var = _DEPRECATED_DB_URI_ENV_VARS[service]
35
+ deprecated_uri = os.environ.get(deprecated_env_var)
36
+ if deprecated_uri is not None:
37
+ logger.log_warning(
38
+ f"{deprecated_env_var} is deprecated and will be removed; set {env_var} instead.",
39
+ )
40
+ return deprecated_uri
41
+
42
+ raise KeyError(
43
+ f"no database URI configured for the {service} service: set {env_var}"
44
+ )
45
+
46
+
47
+ def create_db_engine(service: IntegrationDBService) -> Engine:
48
+ return create_engine(_resolve_db_uri(service))
@@ -41,7 +41,7 @@ from uncountable.integration.queue_runner.command_server.types import (
41
41
  CommandVaccuumQueuedJobs,
42
42
  CommandVaccuumQueuedJobsResponse,
43
43
  )
44
- from uncountable.integration.queue_runner.datastore import DatastoreSqlite
44
+ from uncountable.integration.queue_runner.datastore import Datastore
45
45
  from uncountable.types import queued_job_t
46
46
 
47
47
  from .constants import ListQueuedJobsConstants
@@ -53,7 +53,7 @@ from .protocol.command_server_pb2_grpc import (
53
53
  queued_job_payload_parser = CachedParser(queued_job_t.QueuedJobPayload)
54
54
 
55
55
 
56
- async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None:
56
+ async def serve(command_queue: CommandQueue, datastore: Datastore) -> None:
57
57
  server = grpc_aio.server()
58
58
 
59
59
  class CommandServerHandler(CommandServerServicer):
@@ -0,0 +1,11 @@
1
+ from .datastore_postgres import DatastorePostgres
2
+ from .datastore_sqlite import DatastoreSqlite
3
+ from .factory import create_datastore
4
+ from .interface import Datastore
5
+
6
+ __all__: list[str] = [
7
+ "Datastore",
8
+ "DatastorePostgres",
9
+ "DatastoreSqlite",
10
+ "create_datastore",
11
+ ]
@@ -0,0 +1,12 @@
1
+ from sqlalchemy.engine import Engine
2
+
3
+ from uncountable.integration.queue_runner.datastore.datastore_sql_base import (
4
+ DatastoreSqlBase,
5
+ )
6
+ from uncountable.integration.queue_runner.datastore.model import Base
7
+
8
+
9
+ class DatastorePostgres(DatastoreSqlBase):
10
+ @classmethod
11
+ def setup(cls, engine: Engine) -> None:
12
+ Base.metadata.create_all(engine)
@@ -2,14 +2,13 @@ import datetime
2
2
  import uuid
3
3
  from datetime import UTC
4
4
 
5
- from sqlalchemy import delete, insert, or_, select, text, update
6
- from sqlalchemy.engine import Engine
5
+ from sqlalchemy import delete, insert, or_, select, update
7
6
 
8
7
  from pkgs.argument_parser import CachedParser
9
8
  from pkgs.serialization_util import serialize_for_storage
10
9
  from uncountable.integration.db.session import DBSessionMaker
11
10
  from uncountable.integration.queue_runner.datastore.interface import Datastore
12
- from uncountable.integration.queue_runner.datastore.model import Base, QueuedJob
11
+ from uncountable.integration.queue_runner.datastore.model import QueuedJob
13
12
  from uncountable.types import queued_job_t
14
13
 
15
14
  queued_job_payload_parser = CachedParser(queued_job_t.QueuedJobPayload)
@@ -17,36 +16,11 @@ queued_job_payload_parser = CachedParser(queued_job_t.QueuedJobPayload)
17
16
  MAX_QUEUE_WINDOW_DAYS = 30
18
17
 
19
18
 
20
- class DatastoreSqlite(Datastore):
19
+ class DatastoreSqlBase(Datastore):
21
20
  def __init__(self, session_maker: DBSessionMaker) -> None:
22
21
  self.session_maker = session_maker
23
22
  super().__init__()
24
23
 
25
- @classmethod
26
- def setup(cls, engine: Engine) -> None:
27
- Base.metadata.create_all(engine)
28
- with engine.connect() as connection:
29
- if not bool(
30
- connection.execute(
31
- text(
32
- "select exists (select 1 from pragma_table_info('queued_jobs') where name='status');"
33
- )
34
- ).scalar()
35
- ):
36
- connection.execute(
37
- text("alter table queued_jobs add column status VARCHAR")
38
- )
39
- connection.execute(
40
- text(
41
- "create index if not exists ix_queued_jobs_status on queued_jobs (status)"
42
- )
43
- )
44
- connection.execute(
45
- text(
46
- "create index if not exists ix_queued_jobs_submitted_at on queued_jobs (submitted_at)"
47
- )
48
- )
49
-
50
24
  def add_job_to_queue(
51
25
  self, job_payload: queued_job_t.QueuedJobPayload, job_ref_name: str
52
26
  ) -> queued_job_t.QueuedJob:
@@ -0,0 +1,34 @@
1
+ from sqlalchemy import text
2
+ from sqlalchemy.engine import Engine
3
+
4
+ from uncountable.integration.queue_runner.datastore.datastore_sql_base import (
5
+ DatastoreSqlBase,
6
+ )
7
+ from uncountable.integration.queue_runner.datastore.model import Base
8
+
9
+
10
+ class DatastoreSqlite(DatastoreSqlBase):
11
+ @classmethod
12
+ def setup(cls, engine: Engine) -> None:
13
+ Base.metadata.create_all(engine)
14
+ with engine.connect() as connection:
15
+ if not bool(
16
+ connection.execute(
17
+ text(
18
+ "select exists (select 1 from pragma_table_info('queued_jobs') where name='status');"
19
+ )
20
+ ).scalar()
21
+ ):
22
+ connection.execute(
23
+ text("alter table queued_jobs add column status VARCHAR")
24
+ )
25
+ connection.execute(
26
+ text(
27
+ "create index if not exists ix_queued_jobs_status on queued_jobs (status)"
28
+ )
29
+ )
30
+ connection.execute(
31
+ text(
32
+ "create index if not exists ix_queued_jobs_submitted_at on queued_jobs (submitted_at)"
33
+ )
34
+ )
@@ -0,0 +1,24 @@
1
+ from sqlalchemy.engine import Engine
2
+
3
+ from uncountable.integration.db.session import get_session_maker
4
+ from uncountable.integration.queue_runner.datastore.datastore_postgres import (
5
+ DatastorePostgres,
6
+ )
7
+ from uncountable.integration.queue_runner.datastore.datastore_sqlite import (
8
+ DatastoreSqlite,
9
+ )
10
+ from uncountable.integration.queue_runner.datastore.interface import Datastore
11
+
12
+
13
+ def create_datastore(engine: Engine) -> Datastore:
14
+ session_maker = get_session_maker(engine)
15
+ dialect_name = engine.dialect.name
16
+ match dialect_name:
17
+ case "sqlite":
18
+ datastore: Datastore = DatastoreSqlite(session_maker)
19
+ case "postgresql":
20
+ datastore = DatastorePostgres(session_maker)
21
+ case _:
22
+ raise ValueError(f"unsupported database dialect: {dialect_name!r}")
23
+ datastore.setup(engine)
24
+ return datastore
@@ -1,10 +1,16 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from datetime import datetime
3
3
 
4
+ from sqlalchemy.engine import Engine
5
+
4
6
  from uncountable.types import queued_job_t
5
7
 
6
8
 
7
9
  class Datastore(ABC):
10
+ @classmethod
11
+ @abstractmethod
12
+ def setup(cls, engine: Engine) -> None: ...
13
+
8
14
  @abstractmethod
9
15
  def add_job_to_queue(
10
16
  self, job_payload: queued_job_t.QueuedJobPayload, job_ref_name: str
@@ -13,6 +19,14 @@ class Datastore(ABC):
13
19
  @abstractmethod
14
20
  def remove_job_from_queue(self, queued_job_uuid: str) -> None: ...
15
21
 
22
+ @abstractmethod
23
+ def update_job_status(
24
+ self, queued_job_uuid: str, status: queued_job_t.JobStatus
25
+ ) -> None: ...
26
+
27
+ @abstractmethod
28
+ def retry_job(self, queued_job_uuid: str) -> queued_job_t.QueuedJob | None: ...
29
+
16
30
  @abstractmethod
17
31
  def increment_num_attempts(self, queued_job_uuid: str) -> int: ...
18
32
 
@@ -38,3 +52,6 @@ class Datastore(ABC):
38
52
 
39
53
  @abstractmethod
40
54
  def get_queued_job(self, *, uuid: str) -> queued_job_t.QueuedJob | None: ...
55
+
56
+ @abstractmethod
57
+ def vaccuum_queued_jobs(self) -> list[str]: ...
@@ -21,7 +21,7 @@ class QueuedJob(Base):
21
21
  payload = Column(JSON, nullable=False)
22
22
  num_attempts = Column(BigInteger, nullable=False, default=0, server_default="0")
23
23
  status = Column(
24
- Enum(queued_job_t.JobStatus, length=None),
24
+ Enum(queued_job_t.JobStatus, length=None, native_enum=False),
25
25
  default=queued_job_t.JobStatus.QUEUED,
26
26
  nullable=True,
27
27
  index=True,
@@ -23,8 +23,7 @@ from uncountable.integration.queue_runner.command_server.types import (
23
23
  CommandCancelJobStatus,
24
24
  CommandVaccuumQueuedJobs,
25
25
  )
26
- from uncountable.integration.queue_runner.datastore import DatastoreSqlite
27
- from uncountable.integration.queue_runner.datastore.interface import Datastore
26
+ from uncountable.integration.queue_runner.datastore import Datastore
28
27
  from uncountable.integration.queue_runner.worker import Worker
29
28
  from uncountable.integration.scan_profiles import load_profiles
30
29
  from uncountable.integration.telemetry import Logger
@@ -90,9 +89,7 @@ def _start_workers(
90
89
  return job_worker_lookup
91
90
 
92
91
 
93
- async def start_scheduler(
94
- command_queue: CommandQueue, datastore: DatastoreSqlite
95
- ) -> None:
92
+ async def start_scheduler(command_queue: CommandQueue, datastore: Datastore) -> None:
96
93
  logger = Logger(get_current_span())
97
94
  result_queue: ResultQueue = asyncio.Queue()
98
95
 
@@ -1,20 +1,16 @@
1
1
  import asyncio
2
2
 
3
3
  from uncountable.integration.db.connect import IntegrationDBService, create_db_engine
4
- from uncountable.integration.db.session import get_session_maker
5
4
  from uncountable.integration.queue_runner.command_server import serve
6
5
  from uncountable.integration.queue_runner.command_server.types import CommandQueue
7
- from uncountable.integration.queue_runner.datastore import DatastoreSqlite
6
+ from uncountable.integration.queue_runner.datastore import create_datastore
8
7
  from uncountable.integration.queue_runner.job_scheduler import start_scheduler
9
8
 
10
9
 
11
10
  async def queue_runner_loop() -> None:
12
11
  command_queue: CommandQueue = asyncio.Queue()
13
12
  engine = create_db_engine(IntegrationDBService.RUNNER)
14
- session_maker = get_session_maker(engine)
15
-
16
- datastore = DatastoreSqlite(session_maker)
17
- datastore.setup(engine)
13
+ datastore = create_datastore(engine)
18
14
 
19
15
  command_server = asyncio.create_task(serve(command_queue, datastore))
20
16
 
@@ -21,7 +21,7 @@ from uncountable.core.async_batch import AsyncBatchProcessor
21
21
  from uncountable.integration.construct_client import construct_uncountable_client
22
22
  from uncountable.integration.executors.executors import execute_job
23
23
  from uncountable.integration.job import JobArguments
24
- from uncountable.integration.queue_runner.datastore.interface import Datastore
24
+ from uncountable.integration.queue_runner.datastore import Datastore
25
25
  from uncountable.integration.queue_runner.types import ListenQueue, ResultQueue
26
26
  from uncountable.integration.scan_profiles import load_profiles
27
27
  from uncountable.integration.telemetry import JobLogger, Logger, get_otel_tracer
@@ -43,6 +43,7 @@ __all__: list[str] = [
43
43
  "comment": "Comment",
44
44
  "comment_thread": "Comment Thread",
45
45
  "condition_match": "Condition Match",
46
+ "condition_nickname": "Condition Nickname",
46
47
  "condition_parameter": "Condition Parameter",
47
48
  "condition_parameter_mat_family": "Condition Parameter Material Family",
48
49
  "condition_parameter_matches": "Condition Parameter Matches",
@@ -118,6 +119,7 @@ __all__: list[str] = [
118
119
  "inventory_history": "Inventory History",
119
120
  "inventory_reconciliation_action": "Inventory Reconciliation Action",
120
121
  "inventory_reconciliation_session": "Inventory Reconciliation Session",
122
+ "it_admin_permission": "IT Admin Permission",
121
123
  "lab_location": "Lab Location",
122
124
  "lab_request": "Lab Request",
123
125
  "license": "License",
@@ -130,6 +132,7 @@ __all__: list[str] = [
130
132
  "measurement_timeline_type": "Measurement Timeline Type",
131
133
  "milestone": "Milestone",
132
134
  "ml_job": "Batch Processing Job",
135
+ "monitor": "Monitor",
133
136
  "monitor_dataset": "Monitor Dataset",
134
137
  "naming_scheme": "Naming Scheme",
135
138
  "naming_counter": "Naming Counter",
@@ -230,6 +233,7 @@ __all__: list[str] = [
230
233
  "timesheet_entry": "Timesheet Entry",
231
234
  "training_module": "Training Module",
232
235
  "training_module_answer": "Training Module Answer",
236
+ "training_module_attempt": "Training Module Attempt",
233
237
  "training_module_block": "Training Module Block",
234
238
  "training_module_page": "Training Module Page",
235
239
  "training_module_question": "Training Module Question",
@@ -297,6 +301,7 @@ class EntityType(StrEnum):
297
301
  COMMENT = "comment"
298
302
  COMMENT_THREAD = "comment_thread"
299
303
  CONDITION_MATCH = "condition_match"
304
+ CONDITION_NICKNAME = "condition_nickname"
300
305
  CONDITION_PARAMETER = "condition_parameter"
301
306
  CONDITION_PARAMETER_MAT_FAMILY = "condition_parameter_mat_family"
302
307
  CONDITION_PARAMETER_MATCHES = "condition_parameter_matches"
@@ -372,6 +377,7 @@ class EntityType(StrEnum):
372
377
  INVENTORY_HISTORY = "inventory_history"
373
378
  INVENTORY_RECONCILIATION_ACTION = "inventory_reconciliation_action"
374
379
  INVENTORY_RECONCILIATION_SESSION = "inventory_reconciliation_session"
380
+ IT_ADMIN_PERMISSION = "it_admin_permission"
375
381
  LAB_LOCATION = "lab_location"
376
382
  LAB_REQUEST = "lab_request"
377
383
  LICENSE = "license"
@@ -384,6 +390,7 @@ class EntityType(StrEnum):
384
390
  MEASUREMENT_TIMELINE_TYPE = "measurement_timeline_type"
385
391
  MILESTONE = "milestone"
386
392
  ML_JOB = "ml_job"
393
+ MONITOR = "monitor"
387
394
  MONITOR_DATASET = "monitor_dataset"
388
395
  NAMING_SCHEME = "naming_scheme"
389
396
  NAMING_COUNTER = "naming_counter"
@@ -484,6 +491,7 @@ class EntityType(StrEnum):
484
491
  TIMESHEET_ENTRY = "timesheet_entry"
485
492
  TRAINING_MODULE = "training_module"
486
493
  TRAINING_MODULE_ANSWER = "training_module_answer"
494
+ TRAINING_MODULE_ATTEMPT = "training_module_attempt"
487
495
  TRAINING_MODULE_BLOCK = "training_module_block"
488
496
  TRAINING_MODULE_PAGE = "training_module_page"
489
497
  TRAINING_MODULE_QUESTION = "training_module_question"
@@ -1,18 +0,0 @@
1
- import os
2
- from enum import StrEnum
3
-
4
- from sqlalchemy import create_engine
5
- from sqlalchemy.engine.base import Engine
6
-
7
-
8
- class IntegrationDBService(StrEnum):
9
- CRON = "cron"
10
- RUNNER = "runner"
11
-
12
-
13
- def create_db_engine(service: IntegrationDBService) -> Engine:
14
- match service:
15
- case IntegrationDBService.CRON:
16
- return create_engine(os.environ["UNC_CRON_SQLITE_URI"])
17
- case IntegrationDBService.RUNNER:
18
- return create_engine(os.environ["UNC_RUNNER_SQLITE_URI"])
@@ -1,3 +0,0 @@
1
- from .datastore_sqlite import DatastoreSqlite
2
-
3
- __all__: list[str] = ["DatastoreSqlite"]