UncountablePythonSDK 0.0.180__tar.gz → 0.0.181__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 (449) hide show
  1. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/.github/workflows/publish.yml +1 -1
  3. {uncountablepythonsdk-0.0.180/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.181}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  5. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/UncountablePythonSDK.egg-info/SOURCES.txt +9 -0
  6. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/pyproject.toml +2 -2
  7. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_inner.py +15 -1
  8. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/__main__.py +4 -0
  9. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/actions_registry/__main__.py +1 -0
  10. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/actions_registry/emit_python.py +9 -0
  11. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/actions_registry/emit_typescript.py +12 -0
  12. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/builder.py +106 -24
  13. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/config.py +40 -0
  14. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_python.py +10 -1
  15. uncountablepythonsdk-0.0.181/pkgs/type_spec/emit_scss.py +42 -0
  16. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_typescript_util.py +23 -6
  17. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/type_info/emit_type_info.py +5 -1
  18. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/environment.py +4 -0
  19. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/http_server/types.py +12 -0
  20. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/job_scheduler.py +1 -1
  21. uncountablepythonsdk-0.0.181/uncountable/integration/webhook_server/admin_auth.py +38 -0
  22. uncountablepythonsdk-0.0.181/uncountable/integration/webhook_server/admin_routes.py +49 -0
  23. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/webhook_server/entrypoint.py +2 -0
  24. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/__init__.py +8 -0
  25. uncountablepythonsdk-0.0.181/uncountable/types/api/ml/get_analyze_results.py +56 -0
  26. uncountablepythonsdk-0.0.181/uncountable/types/api/ml/get_suggest_results.py +69 -0
  27. uncountablepythonsdk-0.0.181/uncountable/types/api/ml/submit_async_job.py +231 -0
  28. uncountablepythonsdk-0.0.181/uncountable/types/api/user/__init__.py +1 -0
  29. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/client_base.py +64 -0
  30. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/entity_t.py +9 -1
  31. uncountablepythonsdk-0.0.181/uncountable/types/ml_reports.py +15 -0
  32. uncountablepythonsdk-0.0.181/uncountable/types/ml_reports_t.py +138 -0
  33. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/specs.py +4 -0
  34. uncountablepythonsdk-0.0.181/uncountable/types/specs_t.py +72 -0
  35. uncountablepythonsdk-0.0.180/uncountable/types/specs_t.py +0 -22
  36. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/.gitignore +0 -0
  37. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/README.md +0 -0
  38. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  39. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  40. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  41. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/.flowmarkignore +0 -0
  42. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/.gitignore +0 -0
  43. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/conf.py +0 -0
  44. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/index.md +0 -0
  45. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/integration_examples/add_file_to_folder.md +0 -0
  46. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/integration_examples/create_ingredient.md +0 -0
  47. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/integration_examples/create_output.md +0 -0
  48. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/integration_examples/index.md +0 -0
  49. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/integration_examples/upload_file.md +0 -0
  50. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/justfile +0 -0
  51. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/requirements.txt +0 -0
  52. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/android-chrome-192x192.png +0 -0
  53. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/android-chrome-512x512.png +0 -0
  54. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/apple-touch-icon.png +0 -0
  55. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/browserconfig.xml +0 -0
  56. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/favicon-16x16.png +0 -0
  57. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/favicon-32x32.png +0 -0
  58. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/manifest.json +0 -0
  59. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/mstile-150x150.png +0 -0
  60. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  61. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/docs/static/logo_blue.png +0 -0
  62. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/async_batch.py +0 -0
  63. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/async_batch_large_parse.py +0 -0
  64. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/basic_auth.py +0 -0
  65. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/create_entity.py +0 -0
  66. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/create_ingredient_sdk.py +0 -0
  67. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/download_files.py +0 -0
  68. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/edit_recipe_inputs.py +0 -0
  69. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  70. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  71. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  72. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  73. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  74. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  75. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  76. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  77. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  78. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/invoke_uploader.py +0 -0
  79. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/oauth.py +0 -0
  80. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/set_input_pdf_attribute.py +0 -0
  81. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/set_recipe_metadata_file.py +0 -0
  82. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/set_recipe_output_file_sdk.py +0 -0
  83. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/stream_dataset_measurements.py +0 -0
  84. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/examples/upload_files.py +0 -0
  85. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/__init__.py +0 -0
  87. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/cached_parser.py +0 -0
  88. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/case_convert.py +0 -0
  89. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_base.py +0 -0
  90. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_builder.py +0 -0
  91. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_cache.py +0 -0
  92. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_error.py +0 -0
  93. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_function_type.py +0 -0
  94. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/parser_options.py +0 -0
  95. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/argument_parser/type_predicates.py +0 -0
  96. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/__init__.py +0 -0
  97. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_blob_session.py +0 -0
  98. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  99. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  100. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_local_session.py +0 -0
  101. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_s3_session.py +0 -0
  102. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
  103. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  104. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  105. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  106. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/py.typed +0 -0
  107. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/__init__.py +0 -0
  108. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/annotation.py +0 -0
  109. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/missing_sentry.py +0 -0
  110. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/opaque_key.py +0 -0
  111. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/serial_alias.py +0 -0
  112. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/serial_class.py +0 -0
  113. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/serial_generic.py +0 -0
  114. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/serial_union.py +0 -0
  115. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/unknown.py +0 -0
  116. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/usage.py +0 -0
  117. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization/yaml.py +0 -0
  118. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization_util/__init__.py +0 -0
  119. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  120. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  121. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization_util/dataclasses.py +0 -0
  122. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/serialization_util/serialization_helpers.py +0 -0
  123. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/strenum_compat/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/strenum_compat/strenum_compat.py +0 -0
  125. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/builder_types.py +0 -0
  128. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/cross_output_links.py +0 -0
  129. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_io_ts.py +0 -0
  130. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_open_api.py +0 -0
  131. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_open_api_util.py +0 -0
  132. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/emit_typescript.py +0 -0
  133. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/load_types.py +0 -0
  134. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  135. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/open_api_util.py +0 -0
  136. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/parts/base.py.prepart +0 -0
  137. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  138. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/test.py +0 -0
  139. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/type_info/__main__.py +0 -0
  140. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  141. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  142. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/util.py +0 -0
  143. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/value_spec/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/value_spec/__main__.py +0 -0
  145. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  146. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  147. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pkgs/type_spec/value_spec/types.py +0 -0
  148. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/pyproject.toml +0 -0
  149. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/setup.cfg +0 -0
  150. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/__init__.py +0 -0
  152. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/async_batch.py +0 -0
  153. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/client.py +0 -0
  154. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/file_upload.py +0 -0
  155. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/query/__init__.py +0 -0
  156. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/query/builder.py +0 -0
  157. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/query/column.py +0 -0
  158. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/query/row.py +0 -0
  159. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/query/types.py +0 -0
  160. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/core/types.py +0 -0
  161. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/__init__.py +0 -0
  162. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/cli.py +0 -0
  163. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/construct_client.py +0 -0
  164. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/cron.py +0 -0
  165. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/db/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/db/connect.py +0 -0
  167. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/db/session.py +0 -0
  168. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/entrypoint.py +0 -0
  169. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/executors/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/executors/executors.py +0 -0
  171. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  172. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/executors/script_executor.py +0 -0
  173. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/http_server/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/job.py +0 -0
  175. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/__init__.py +0 -0
  176. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  178. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  179. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  180. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  182. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  183. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  184. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  185. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/provision_webhook.py +0 -0
  186. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  187. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/datastore_postgres.py +0 -0
  189. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/datastore_sql_base.py +0 -0
  190. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  191. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/factory.py +0 -0
  192. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  193. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  194. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/job_process.py +0 -0
  195. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/job_runner.py +0 -0
  196. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  197. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/types.py +0 -0
  198. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/queue_runner/worker.py +0 -0
  199. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/request_context.py +0 -0
  200. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/scan_profiles.py +0 -0
  201. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/scheduler.py +0 -0
  202. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/secret_retrieval/basic_secret.py +0 -0
  204. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  205. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/server.py +0 -0
  206. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/telemetry.py +0 -0
  207. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/integration/webhook_signature_key.py +0 -0
  208. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/py.typed +0 -0
  209. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/__init__.py +0 -0
  210. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/batch/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/batch/execute_batch.py +0 -0
  212. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  213. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/chemical/__init__.py +0 -0
  214. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  215. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  217. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
  218. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/create_entities.py +0 -0
  220. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/create_entity.py +0 -0
  221. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
  222. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  223. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/export_entities.py +0 -0
  224. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/get_entities_data.py +0 -0
  225. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  226. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/list_aggregate.py +0 -0
  227. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/list_entities.py +0 -0
  228. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/lock_entity.py +0 -0
  229. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/lookup_entity.py +0 -0
  230. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  231. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/set_barcode.py +0 -0
  232. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
  233. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  234. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/set_values.py +0 -0
  235. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  236. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/entity/unlock_entity.py +0 -0
  237. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/equipment/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  239. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/field_options/__init__.py +0 -0
  240. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  241. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/file_folders/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  243. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  244. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/files/__init__.py +0 -0
  245. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/files/download_file.py +0 -0
  246. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/id_source/__init__.py +0 -0
  247. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/id_source/list_id_source.py +0 -0
  248. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/id_source/match_id_source.py +0 -0
  249. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/input_groups/__init__.py +0 -0
  250. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  251. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/__init__.py +0 -0
  252. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/create_inputs.py +0 -0
  253. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/get_input_data.py +0 -0
  254. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/get_input_names.py +0 -0
  255. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  256. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  257. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/set_input_category.py +0 -0
  258. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  259. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  260. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/integrations/__init__.py +0 -0
  261. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  262. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/integrations/push_notification.py +0 -0
  263. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  264. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/listing/__init__.py +0 -0
  265. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/listing/export_listing.py +0 -0
  266. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/listing/fetch_listing.py +0 -0
  267. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/material_families/__init__.py +0 -0
  268. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  269. {uncountablepythonsdk-0.0.180/uncountable/types/api/notebooks → uncountablepythonsdk-0.0.181/uncountable/types/api/ml}/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.180/uncountable/types/api/output_parameters → uncountablepythonsdk-0.0.181/uncountable/types/api/notebooks}/__init__.py +0 -0
  271. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  272. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  273. {uncountablepythonsdk-0.0.180/uncountable/types/api/outputs → uncountablepythonsdk-0.0.181/uncountable/types/api/output_parameters}/__init__.py +0 -0
  274. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
  275. {uncountablepythonsdk-0.0.180/uncountable/types/api/permissions → uncountablepythonsdk-0.0.181/uncountable/types/api/outputs}/__init__.py +0 -0
  276. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/outputs/get_output_data.py +0 -0
  277. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/outputs/get_output_names.py +0 -0
  278. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  279. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  280. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  281. {uncountablepythonsdk-0.0.180/uncountable/types/api/project → uncountablepythonsdk-0.0.181/uncountable/types/api/permissions}/__init__.py +0 -0
  282. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  283. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  284. {uncountablepythonsdk-0.0.180/uncountable/types/api/recipe_links → uncountablepythonsdk-0.0.181/uncountable/types/api/project}/__init__.py +0 -0
  285. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/project/get_projects.py +0 -0
  286. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/project/get_projects_data.py +0 -0
  287. {uncountablepythonsdk-0.0.180/uncountable/types/api/recipe_metadata → uncountablepythonsdk-0.0.181/uncountable/types/api/recipe_links}/__init__.py +0 -0
  288. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  289. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
  290. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  291. {uncountablepythonsdk-0.0.180/uncountable/types/api/recipes → uncountablepythonsdk-0.0.181/uncountable/types/api/recipe_metadata}/__init__.py +0 -0
  292. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  293. {uncountablepythonsdk-0.0.180/uncountable/types/api/runsheet → uncountablepythonsdk-0.0.181/uncountable/types/api/recipes}/__init__.py +0 -0
  294. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  295. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  296. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  297. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  298. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  299. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  300. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  301. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/create_recipe.py +0 -0
  302. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/create_recipes.py +0 -0
  303. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  304. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  305. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  306. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_curve.py +0 -0
  307. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  308. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  309. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  310. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  311. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  312. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  313. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  314. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  315. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  316. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  317. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  318. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  319. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  320. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  321. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  322. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  323. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  324. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  325. {uncountablepythonsdk-0.0.180/uncountable/types/api/time_series → uncountablepythonsdk-0.0.181/uncountable/types/api/runsheet}/__init__.py +0 -0
  326. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  327. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  328. {uncountablepythonsdk-0.0.180/uncountable/types/api/triggers → uncountablepythonsdk-0.0.181/uncountable/types/api/time_series}/__init__.py +0 -0
  329. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/time_series/ingest_dataset_measurements.py +0 -0
  330. {uncountablepythonsdk-0.0.180/uncountable/types/api/uploader → uncountablepythonsdk-0.0.181/uncountable/types/api/triggers}/__init__.py +0 -0
  331. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/triggers/run_trigger.py +0 -0
  332. {uncountablepythonsdk-0.0.180/uncountable/types/api/user → uncountablepythonsdk-0.0.181/uncountable/types/api/uploader}/__init__.py +0 -0
  333. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  334. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  335. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/api/user/get_current_user_info.py +0 -0
  336. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/async_batch.py +0 -0
  337. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/async_batch_processor.py +0 -0
  338. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/async_batch_t.py +0 -0
  339. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/async_jobs.py +0 -0
  340. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/async_jobs_t.py +0 -0
  341. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/auth_retrieval.py +0 -0
  342. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/auth_retrieval_t.py +0 -0
  343. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/base.py +0 -0
  344. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/base_t.py +0 -0
  345. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/calculations.py +0 -0
  346. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/calculations_t.py +0 -0
  347. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/chemical_structure.py +0 -0
  348. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/chemical_structure_t.py +0 -0
  349. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/client_config.py +0 -0
  350. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/client_config_t.py +0 -0
  351. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/condition_match.py +0 -0
  352. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/condition_match_t.py +0 -0
  353. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/curves.py +0 -0
  354. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/curves_t.py +0 -0
  355. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/data.py +0 -0
  356. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/data_t.py +0 -0
  357. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/dataset_measurements.py +0 -0
  358. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/dataset_measurements_t.py +0 -0
  359. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/entity.py +0 -0
  360. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/experiment_groups.py +0 -0
  361. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/experiment_groups_t.py +0 -0
  362. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/exports.py +0 -0
  363. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/exports_t.py +0 -0
  364. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/field_values.py +0 -0
  365. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/field_values_t.py +0 -0
  366. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/fields.py +0 -0
  367. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/fields_t.py +0 -0
  368. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/generic_upload.py +0 -0
  369. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/generic_upload_t.py +0 -0
  370. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/id_source.py +0 -0
  371. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/id_source_t.py +0 -0
  372. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/identifier.py +0 -0
  373. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/identifier_t.py +0 -0
  374. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/input_attributes.py +0 -0
  375. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/input_attributes_t.py +0 -0
  376. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/inputs.py +0 -0
  377. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/inputs_t.py +0 -0
  378. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integration_server.py +0 -0
  379. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integration_server_t.py +0 -0
  380. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integration_session.py +0 -0
  381. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integration_session_t.py +0 -0
  382. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integrations.py +0 -0
  383. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/integrations_t.py +0 -0
  384. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/job_definition.py +0 -0
  385. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/job_definition_t.py +0 -0
  386. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/listing.py +0 -0
  387. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/listing_t.py +0 -0
  388. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/notices.py +0 -0
  389. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/notices_t.py +0 -0
  390. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/notifications.py +0 -0
  391. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/notifications_t.py +0 -0
  392. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/outputs.py +0 -0
  393. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/outputs_t.py +0 -0
  394. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/overrides.py +0 -0
  395. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/overrides_t.py +0 -0
  396. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/permissions.py +0 -0
  397. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/permissions_t.py +0 -0
  398. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/phases.py +0 -0
  399. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/phases_t.py +0 -0
  400. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/post_base.py +0 -0
  401. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/post_base_t.py +0 -0
  402. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/queued_job.py +0 -0
  403. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/queued_job_t.py +0 -0
  404. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_identifiers.py +0 -0
  405. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_identifiers_t.py +0 -0
  406. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_inputs.py +0 -0
  407. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_inputs_t.py +0 -0
  408. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_links.py +0 -0
  409. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_links_t.py +0 -0
  410. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_metadata.py +0 -0
  411. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_metadata_t.py +0 -0
  412. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_output_metadata.py +0 -0
  413. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_output_metadata_t.py +0 -0
  414. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_step_relationships.py +0 -0
  415. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_step_relationships_t.py +0 -0
  416. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_tags.py +0 -0
  417. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_tags_t.py +0 -0
  418. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_workflow_step_types.py +0 -0
  419. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  420. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_workflow_steps.py +0 -0
  421. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  422. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipes.py +0 -0
  423. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/recipes_t.py +0 -0
  424. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/request_headers.py +0 -0
  425. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/request_headers_t.py +0 -0
  426. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/response.py +0 -0
  427. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/response_t.py +0 -0
  428. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/runsheet.py +0 -0
  429. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/runsheet_format.py +0 -0
  430. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/runsheet_format_t.py +0 -0
  431. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/runsheet_t.py +0 -0
  432. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/secret_retrieval.py +0 -0
  433. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/secret_retrieval_t.py +0 -0
  434. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/sockets.py +0 -0
  435. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/sockets_t.py +0 -0
  436. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/step_relationships.py +0 -0
  437. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/step_relationships_t.py +0 -0
  438. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/units.py +0 -0
  439. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/units_t.py +0 -0
  440. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/uploader.py +0 -0
  441. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/uploader_t.py +0 -0
  442. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/users.py +0 -0
  443. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/users_t.py +0 -0
  444. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/webhook.py +0 -0
  445. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/webhook_job.py +0 -0
  446. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/webhook_job_t.py +0 -0
  447. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/webhook_t.py +0 -0
  448. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/workflows.py +0 -0
  449. {uncountablepythonsdk-0.0.180 → uncountablepythonsdk-0.0.181}/uncountable/types/workflows_t.py +0 -0
@@ -17,7 +17,7 @@ jobs:
17
17
  - name: Set up UV
18
18
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
19
19
  with:
20
- version: "0.11.0"
20
+ version: "0.12.0"
21
21
  activate-environment: true
22
22
  enable-cache: true
23
23
  - name: Install dependencies
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Set up UV
27
27
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
28
28
  with:
29
- version: "0.11.0"
29
+ version: "0.12.0"
30
30
  activate-environment: true
31
31
  enable-cache: false
32
32
  - name: Install build dependencies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.180
3
+ Version: 0.0.181
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.180
3
+ Version: 0.0.181
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
@@ -104,6 +104,7 @@ pkgs/type_spec/emit_io_ts.py
104
104
  pkgs/type_spec/emit_open_api.py
105
105
  pkgs/type_spec/emit_open_api_util.py
106
106
  pkgs/type_spec/emit_python.py
107
+ pkgs/type_spec/emit_scss.py
107
108
  pkgs/type_spec/emit_typescript.py
108
109
  pkgs/type_spec/emit_typescript_util.py
109
110
  pkgs/type_spec/load_types.py
@@ -188,6 +189,8 @@ uncountable/integration/queue_runner/datastore/model.py
188
189
  uncountable/integration/secret_retrieval/__init__.py
189
190
  uncountable/integration/secret_retrieval/basic_secret.py
190
191
  uncountable/integration/secret_retrieval/retrieve_secret.py
192
+ uncountable/integration/webhook_server/admin_auth.py
193
+ uncountable/integration/webhook_server/admin_routes.py
191
194
  uncountable/integration/webhook_server/entrypoint.py
192
195
  uncountable/types/__init__.py
193
196
  uncountable/types/async_batch.py
@@ -244,6 +247,8 @@ uncountable/types/job_definition.py
244
247
  uncountable/types/job_definition_t.py
245
248
  uncountable/types/listing.py
246
249
  uncountable/types/listing_t.py
250
+ uncountable/types/ml_reports.py
251
+ uncountable/types/ml_reports_t.py
247
252
  uncountable/types/notices.py
248
253
  uncountable/types/notices_t.py
249
254
  uncountable/types/notifications.py
@@ -368,6 +373,10 @@ uncountable/types/api/listing/export_listing.py
368
373
  uncountable/types/api/listing/fetch_listing.py
369
374
  uncountable/types/api/material_families/__init__.py
370
375
  uncountable/types/api/material_families/update_entity_material_families.py
376
+ uncountable/types/api/ml/__init__.py
377
+ uncountable/types/api/ml/get_analyze_results.py
378
+ uncountable/types/api/ml/get_suggest_results.py
379
+ uncountable/types/api/ml/submit_async_job.py
371
380
  uncountable/types/api/notebooks/__init__.py
372
381
  uncountable/types/api/notebooks/add_notebook_content.py
373
382
  uncountable/types/api/notebooks/get_notebook_content.py
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
11
  "more_itertools ==11.*",
12
- "types-paramiko ==5.0.0.20260617",
12
+ "types-paramiko ==5.0.0.20260724",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pytz ==2026.*",
15
15
  "types-requests == 2.*",
@@ -17,7 +17,7 @@ dependencies = [
17
17
  "pandas-stubs",
18
18
  "xlrd == 2.*",
19
19
  "msgspec ==0.21.*",
20
- "websockets==16.1.1",
20
+ "websockets==17.0",
21
21
  ]
22
22
 
23
23
  [tool.mypy]
@@ -560,9 +560,23 @@ def _build_parser_dataclass(
560
560
  type_params = getattr(parsed_type, "__parameters__", None)
561
561
  cache_key: typing.Any = parsed_type
562
562
  if type_params is not None and type_var_map:
563
+ # WARNING: Do not widen this back to the whole `type_var_map`. Only a class's
564
+ # own parameters can appear in its field annotations, so only their bindings
565
+ # distinguish one instantiation's parser from another; the map additionally
566
+ # carries every enclosing generic's TypeVars, which are irrelevant here.
567
+ #
568
+ # Widening it does not merely lose cache hits. Each generic class declares its
569
+ # own TypeVar, so a set of mutually recursive generics contributes a distinct
570
+ # one per level as the build descends. Keyed on the whole map, no key ever
571
+ # repeats, nothing is ever reused, and parser construction grows exponentially
572
+ # in the number of participating generics rather than terminating.
563
573
  cache_key = (
564
574
  parsed_type,
565
- tuple(type_var_map.items()),
575
+ tuple(
576
+ (param, type_var_map[param])
577
+ for param in type_params
578
+ if param in type_var_map
579
+ ),
566
580
  )
567
581
 
568
582
  cur_parser = context.cache.get(cache_key)
@@ -4,6 +4,7 @@ import sys
4
4
  from .config import parse_yaml_config
5
5
  from .emit_open_api import emit_open_api
6
6
  from .emit_python import emit_python
7
+ from .emit_scss import emit_scss
7
8
  from .emit_typescript import emit_typescript
8
9
  from .load_types import load_types
9
10
 
@@ -34,6 +35,9 @@ def main() -> bool:
34
35
  if config.typescript is not None:
35
36
  emit_typescript(builder, config.typescript)
36
37
 
38
+ if config.scss is not None:
39
+ emit_scss(builder, config.scss)
40
+
37
41
  return True
38
42
 
39
43
 
@@ -93,6 +93,7 @@ def main() -> None:
93
93
  if definition.visibility_scope is not None
94
94
  else None,
95
95
  kind=definition.kind,
96
+ search_aliases=definition.search_aliases,
96
97
  arguments=definition.arguments,
97
98
  )
98
99
  action_definitions_with_arguments_list.append(
@@ -22,6 +22,11 @@ def _module_enum_member(module: str) -> str:
22
22
  return module.upper()
23
23
 
24
24
 
25
+ def _emit_search_aliases(search_aliases: list[str]) -> str:
26
+ items = ", ".join(_py_str(alias) for alias in search_aliases)
27
+ return f"[{items}]"
28
+
29
+
25
30
  def _emit_visibility_scope(
26
31
  visibility_scope: list[actions_registry_t.ActionDefinitionVisibilityScope],
27
32
  ) -> str:
@@ -58,6 +63,10 @@ def _emit_action_definition(
58
63
  out.write(
59
64
  f"{sub_indent}kind=actions_registry_t.ActionDefinitionKind.{action.kind.name},\n"
60
65
  )
66
+ if action.search_aliases is not None and len(action.search_aliases) > 0:
67
+ out.write(
68
+ f"{sub_indent}search_aliases={_emit_search_aliases(action.search_aliases)},\n"
69
+ )
61
70
  if action.arguments is not None:
62
71
  out.write(f"{sub_indent}arguments={_py_str(action.arguments)},\n")
63
72
  out.write(f"{indent}),\n")
@@ -151,6 +151,13 @@ def _emit_action_definition(
151
151
  out.write(
152
152
  f"{sub_indent}kind: ActionsRegistryT.ActionDefinitionKind.{ts_name(action_definition.kind, name_case=builder.NameCase.convert)},\n"
153
153
  )
154
+ if (
155
+ action_definition.search_aliases is not None
156
+ and len(action_definition.search_aliases) > 0
157
+ ):
158
+ out.write(
159
+ f"{sub_indent}searchAliases: {_emit_search_aliases(action_definition.search_aliases)},\n"
160
+ )
154
161
  out.write(f"{indent}}} as ActionsRegistryT.ActionDefinition{argument_type},\n")
155
162
  return out.getvalue()
156
163
 
@@ -174,6 +181,11 @@ def _emit_action_definition_types(modules: list[str], indent: str) -> str:
174
181
  return out.getvalue()
175
182
 
176
183
 
184
+ def _emit_search_aliases(search_aliases: list[str]) -> str:
185
+ aliases = ",".join(encode_common_string(alias) for alias in search_aliases)
186
+ return f"[ {aliases} ]"
187
+
188
+
177
189
  def _emit_visibility_scope(
178
190
  visibility_scope: list[actions_registry_t.ActionDefinitionVisibilityScope],
179
191
  ) -> str:
@@ -517,7 +517,9 @@ class SpecTypeDefn(SpecType):
517
517
  class SpecTypeGenericParameter(SpecType):
518
518
  def __init__(
519
519
  self,
520
- spec_type_definition: SpecTypeDefnObject | SpecTypeDefnUnion,
520
+ spec_type_definition: SpecTypeDefnObject
521
+ | SpecTypeDefnUnion
522
+ | SpecTypeDefnAlias,
521
523
  name: str,
522
524
  ) -> None:
523
525
  self.spec_type_definition = spec_type_definition
@@ -546,6 +548,8 @@ class SpecTypeDefnObject(SpecTypeDefn):
546
548
  base: SpecTypeDefnObject | None
547
549
  parameters: list[str]
548
550
  base_type_instance: SpecTypeInstance | None
551
+ # Set by _mark_recursive_instantiations; see is_eagerly_self_referential.
552
+ needs_lazy_emission: bool = False
549
553
 
550
554
  def __init__(
551
555
  self,
@@ -652,22 +656,26 @@ class SpecTypeDefnObject(SpecTypeDefn):
652
656
 
653
657
  class SpecTypeDefnAlias(SpecTypeDefn):
654
658
  alias: SpecType
659
+ parameters: list[str]
655
660
 
656
661
  def __init__(
657
662
  self,
658
663
  namespace: SpecNamespace,
659
664
  name: str,
665
+ *,
666
+ parameters: list[str] | None = None,
660
667
  ) -> None:
661
668
  super().__init__(
662
669
  namespace,
663
670
  name,
664
671
  )
672
+ self.parameters = parameters if parameters is not None else []
665
673
  self.desc: str | None = None
666
674
  self.discriminator: str | None = None
667
675
 
668
676
  def process(self, builder: SpecBuilder, data: RawDict) -> None:
669
677
  super().base_process(builder, data, ["type", "desc", "alias", "discriminator"])
670
- self.alias = builder.parse_type(self.namespace, data["alias"])
678
+ self.alias = builder.parse_type(self.namespace, data["alias"], scope=self)
671
679
  self.desc = data.get("desc", None)
672
680
  self.discriminator = data.get("discriminator", None)
673
681
 
@@ -1447,19 +1455,19 @@ class SpecNamespace:
1447
1455
  defn_type = defn.get("type")
1448
1456
  assert isinstance(defn_type, str), f"{name} requires a string type"
1449
1457
  spec_type: SpecTypeDefn
1458
+ named_parameters = (
1459
+ [
1460
+ parameter.name
1461
+ for name_parameters in parsed_name.parameters
1462
+ for parameter in name_parameters
1463
+ ]
1464
+ if parsed_name.parameters is not None
1465
+ else None
1466
+ )
1450
1467
  if defn_type == DefnTypeName.s_alias:
1451
- spec_type = SpecTypeDefnAlias(self, name)
1468
+ spec_type = SpecTypeDefnAlias(self, name, parameters=named_parameters)
1452
1469
  elif defn_type == DefnTypeName.s_union:
1453
- union_parameters = (
1454
- [
1455
- parameter.name
1456
- for name_parameters in parsed_name.parameters
1457
- for parameter in name_parameters
1458
- ]
1459
- if parsed_name.parameters is not None
1460
- else None
1461
- )
1462
- spec_type = SpecTypeDefnUnion(self, name, parameters=union_parameters)
1470
+ spec_type = SpecTypeDefnUnion(self, name, parameters=named_parameters)
1463
1471
  elif defn_type == DefnTypeName.s_external:
1464
1472
  spec_type = SpecTypeDefnExternal(self, name)
1465
1473
  elif defn_type == DefnTypeName.s_new_type:
@@ -1467,19 +1475,10 @@ class SpecNamespace:
1467
1475
  elif defn_type == DefnTypeName.s_string_enum:
1468
1476
  spec_type = SpecTypeDefnStringEnum(self, name)
1469
1477
  else:
1470
- parameters = (
1471
- [
1472
- parameter.name
1473
- for name_parameters in parsed_name.parameters
1474
- for parameter in name_parameters
1475
- ]
1476
- if parsed_name.parameters is not None
1477
- else None
1478
- )
1479
1478
  spec_type = SpecTypeDefnObject(
1480
1479
  self,
1481
1480
  name,
1482
- parameters=parameters,
1481
+ parameters=named_parameters,
1483
1482
  )
1484
1483
  self.types[name] = spec_type
1485
1484
 
@@ -1549,6 +1548,62 @@ class NameDataPair:
1549
1548
  data: RawDict
1550
1549
 
1551
1550
 
1551
+ def is_eagerly_self_referential(target: SpecTypeDefn, current: SpecType) -> bool:
1552
+ """
1553
+ Does rendering `current` name `target` in a position evaluated eagerly.
1554
+
1555
+ A generic instantiation renders its parameters inline (`Container[Target]`), so a
1556
+ definition reachable that way is resolved at assignment time. Object properties are
1557
+ deferred in both emitted languages, so this stops at object definitions rather than
1558
+ descending into them.
1559
+ """
1560
+ if current is target:
1561
+ return True
1562
+ if isinstance(current, SpecTypeInstance):
1563
+ return is_eagerly_self_referential(target, current.defn_type) or any(
1564
+ is_eagerly_self_referential(target, parameter)
1565
+ for parameter in current.parameters
1566
+ )
1567
+ return False
1568
+
1569
+
1570
+ def _collect_objects_on_cycle(
1571
+ target: SpecTypeDefn,
1572
+ current: SpecType,
1573
+ found: set[SpecTypeDefnObject],
1574
+ seen: set[int],
1575
+ ) -> None:
1576
+ """
1577
+ Collect the objects whose instantiation is what closes the cycle back on `target`.
1578
+
1579
+ Only those need lazy emission. An instantiation that appears alongside them but
1580
+ does not name `target` — `Container<String>` in the same union — is not on the
1581
+ cycle and emits as a type alias like any other generic. The synthetic backing
1582
+ objects of unions and lists are skipped for the same reason: they are never
1583
+ emitted as objects.
1584
+ """
1585
+ if id(current) in seen:
1586
+ return
1587
+ seen.add(id(current))
1588
+ if isinstance(current, SpecTypeInstance):
1589
+ if (
1590
+ isinstance(current.defn_type, SpecTypeDefnObject)
1591
+ and not current.defn_type.is_base
1592
+ and current.parameters
1593
+ and is_eagerly_self_referential(target, current)
1594
+ ):
1595
+ found.add(current.defn_type)
1596
+ _collect_objects_on_cycle(target, current.defn_type, found, seen)
1597
+ for parameter in current.parameters:
1598
+ _collect_objects_on_cycle(target, parameter, found, seen)
1599
+ return
1600
+ if isinstance(current, SpecTypeDefnAlias):
1601
+ _collect_objects_on_cycle(target, current.alias, found, seen)
1602
+ return
1603
+ if isinstance(current, SpecTypeDefnUnion):
1604
+ _collect_objects_on_cycle(target, current.get_backing_type(), found, seen)
1605
+
1606
+
1552
1607
  class SpecBuilder:
1553
1608
  def __init__(
1554
1609
  self,
@@ -1651,8 +1706,33 @@ class SpecBuilder:
1651
1706
  print(self.where)
1652
1707
  raise
1653
1708
 
1709
+ self._mark_recursive_instantiations()
1654
1710
  return True
1655
1711
 
1712
+ def _mark_recursive_instantiations(self) -> None:
1713
+ """
1714
+ Flag objects instantiated inside a self-referential alias or union.
1715
+
1716
+ TypeScript expands a generic type alias eagerly, so such an instantiation is
1717
+ rejected as circular unless the instantiated object emits as an interface,
1718
+ whose members resolve lazily. Only objects on that cycle need it, so the
1719
+ remaining generics keep their existing emission.
1720
+ """
1721
+ for namespace in self.namespaces.values():
1722
+ for defn in namespace.types.values():
1723
+ if isinstance(defn, SpecTypeDefnAlias):
1724
+ expression: SpecType = defn.alias
1725
+ elif isinstance(defn, SpecTypeDefnUnion):
1726
+ expression = defn.get_backing_type()
1727
+ else:
1728
+ continue
1729
+ if not is_eagerly_self_referential(defn, expression):
1730
+ continue
1731
+ found: set[SpecTypeDefnObject] = set()
1732
+ _collect_objects_on_cycle(defn, expression, found, set())
1733
+ for obj in found:
1734
+ obj.needs_lazy_emission = True
1735
+
1656
1736
  def get_type_of_literal(self, value: util.LiteralTypeValue) -> SpecType:
1657
1737
  if isinstance(value, str):
1658
1738
  return self.namespaces[base_namespace_name].types[BaseTypeName.s_string]
@@ -1708,7 +1788,9 @@ class SpecBuilder:
1708
1788
  if (
1709
1789
  defn_type is None
1710
1790
  and scope is not None
1711
- and isinstance(scope, (SpecTypeDefnObject, SpecTypeDefnUnion))
1791
+ and isinstance(
1792
+ scope, (SpecTypeDefnObject, SpecTypeDefnUnion, SpecTypeDefnAlias)
1793
+ )
1712
1794
  ):
1713
1795
  if path[0].name in scope.parameters:
1714
1796
  return SpecTypeGenericParameter(
@@ -115,6 +115,36 @@ class OpenAPIConfig(BaseLanguageConfig):
115
115
  self.types_output = os.path.abspath(self.types_output)
116
116
 
117
117
 
118
+ @dataclass(kw_only=True)
119
+ class ScssConstantOutput:
120
+ namespace: str # namespace holding the constant to emit
121
+ constant: str # nested Dict constant to flatten into $prefix-<group>-<field> vars
122
+ output: str # scss file to write the flattened variables to
123
+ prefix: str # variable name prefix, e.g. "unc" for $unc-<group>-<field>
124
+
125
+ def __post_init__(self: Self) -> None:
126
+ self.output = os.path.abspath(self.output)
127
+
128
+
129
+ def _parse_scss_output(entry: object) -> ScssConstantOutput:
130
+ assert isinstance(entry, dict), (
131
+ f"scss config entry must be a mapping, got {entry!r}"
132
+ )
133
+ fields: dict[str, str] = {}
134
+ for key in ("namespace", "constant", "output", "prefix"):
135
+ value = entry.get(key)
136
+ assert isinstance(value, str), (
137
+ f"scss config entry requires string '{key}', got {value!r}"
138
+ )
139
+ fields[key] = value
140
+ return ScssConstantOutput(
141
+ namespace=fields["namespace"],
142
+ constant=fields["constant"],
143
+ output=fields["output"],
144
+ prefix=fields["prefix"],
145
+ )
146
+
147
+
118
148
  @dataclass(kw_only=True)
119
149
  class Config:
120
150
  top_namespace: str
@@ -124,6 +154,7 @@ class Config:
124
154
  typescript: TypeScriptConfig | None
125
155
  python: PythonConfig
126
156
  open_api: OpenAPIConfig | None
157
+ scss: list[ScssConstantOutput] | None
127
158
 
128
159
 
129
160
  T = TypeVar("T")
@@ -164,6 +195,14 @@ def parse_yaml_config(config_file: str) -> Config:
164
195
  else None
165
196
  )
166
197
 
198
+ raw_scss = raw_config.get("scss")
199
+ scss = None
200
+ if raw_scss is not None:
201
+ assert isinstance(raw_scss, list), (
202
+ f"scss config must be a list, got {raw_scss!r}"
203
+ )
204
+ scss = [_parse_scss_output(entry) for entry in raw_scss]
205
+
167
206
  top_namespace = raw_config["top_namespace"]
168
207
  assert isinstance(top_namespace, str)
169
208
 
@@ -174,4 +213,5 @@ def parse_yaml_config(config_file: str) -> Config:
174
213
  typescript=typescript,
175
214
  python=python,
176
215
  open_api=open_api,
216
+ scss=scss,
177
217
  )
@@ -947,7 +947,14 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
947
947
 
948
948
  if isinstance(stype, builder.SpecTypeDefnAlias):
949
949
  ctx.use_serial_alias = True
950
- ctx.out.write(f"{stype.name} = typing.Annotated[\n")
950
+ if len(stype.parameters) > 0:
951
+ type_params = f"[{', '.join(stype.parameters)}]"
952
+ assignment = f"type {stype.name}{type_params}"
953
+ elif builder.is_eagerly_self_referential(stype, stype.alias):
954
+ assignment = f"type {stype.name}"
955
+ else:
956
+ assignment = stype.name
957
+ ctx.out.write(f"{assignment} = typing.Annotated[\n")
951
958
  ctx.out.write(f"{INDENT}{refer_to(ctx, stype.alias)},\n")
952
959
  ctx.out.write(f"{INDENT}serial_alias_annotation(\n")
953
960
  ctx.out.write(
@@ -964,6 +971,8 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
964
971
  if len(stype.parameters) > 0:
965
972
  type_params = f"[{', '.join(stype.parameters)}]"
966
973
  ctx.out.write(f"type {stype.name}{type_params} = typing.Annotated[\n")
974
+ elif builder.is_eagerly_self_referential(stype, stype.get_backing_type()):
975
+ ctx.out.write(f"type {stype.name} = typing.Annotated[\n")
967
976
  else:
968
977
  ctx.out.write(f"{stype.name} = typing.Annotated[\n")
969
978
  ctx.out.write(f"{INDENT}{refer_to(ctx, stype.get_backing_type())},\n")
@@ -0,0 +1,42 @@
1
+ from collections import defaultdict
2
+
3
+ from . import builder, util
4
+ from .config import ScssConstantOutput
5
+
6
+ _HEADER = (
7
+ "// DO NOT MODIFY -- This file is generated by type_spec\n"
8
+ "// Edit the source constant in main/type_spec/ and run `just typespec regen-types`\n"
9
+ )
10
+
11
+
12
+ def emit_scss(
13
+ spec_builder: builder.SpecBuilder, configs: list[ScssConstantOutput]
14
+ ) -> None:
15
+ blocks_by_output: dict[str, list[str]] = defaultdict(list)
16
+ for config in configs:
17
+ namespace = spec_builder.namespaces[config.namespace]
18
+ sconst = namespace.constants[config.constant]
19
+ blocks_by_output[config.output].append(_render_constant(sconst, config.prefix))
20
+ for output, blocks in blocks_by_output.items():
21
+ util.rewrite_file(output, _HEADER + "\n" + "\n\n".join(blocks) + "\n")
22
+
23
+
24
+ def _render_constant(sconst: builder.SpecConstant, prefix: str) -> str:
25
+ value = sconst.value
26
+ assert isinstance(value, dict), "scss emit expects a nested Dict constant"
27
+
28
+ blocks: list[str] = []
29
+ for group, shades in value.items():
30
+ assert isinstance(shades, dict), (
31
+ "scss emit expects Dict<Key, Dict|Object> values"
32
+ )
33
+ lines = [
34
+ f"${_scss_name(prefix, str(group), str(field))}: {color};"
35
+ for field, color in shades.items()
36
+ ]
37
+ blocks.append("\n".join(lines))
38
+ return "\n\n".join(blocks)
39
+
40
+
41
+ def _scss_name(prefix: str, group: str, field: str) -> str:
42
+ return f"{prefix}-{group}-{field}".replace("_", "-")
@@ -193,7 +193,11 @@ def emit_type_ts(ctx: EmitTypescriptContext, stype: builder.SpecType) -> None:
193
193
  return
194
194
 
195
195
  if isinstance(stype, builder.SpecTypeDefnAlias):
196
- ctx.out.write(f"export type {stype.name} = {refer_to(ctx, stype.alias)}\n")
196
+ if len(stype.parameters) > 0:
197
+ full_type_name = f"{stype.name}<{', '.join(stype.parameters)}>"
198
+ else:
199
+ full_type_name = stype.name
200
+ ctx.out.write(f"export type {full_type_name} = {refer_to(ctx, stype.alias)}\n")
197
201
  return
198
202
 
199
203
  if isinstance(stype, builder.SpecTypeDefnUnion):
@@ -219,23 +223,36 @@ def emit_type_ts(ctx: EmitTypescriptContext, stype: builder.SpecType) -> None:
219
223
  assert isinstance(stype, builder.SpecTypeDefnObject)
220
224
  assert stype.base is not None
221
225
 
222
- base_type = ""
226
+ base_ref = ""
227
+ parenthesized_base = ""
223
228
  if not stype.base.is_base:
224
229
  if stype.base_type_instance is not None:
225
- base_type = f"({refer_to(ctx, stype.base_type_instance)}) & "
230
+ base_ref = refer_to(ctx, stype.base_type_instance)
231
+ parenthesized_base = f"({base_ref})"
226
232
  else:
227
- base_type = f"{refer_to(ctx, stype.base)} & "
233
+ base_ref = refer_to(ctx, stype.base)
234
+ parenthesized_base = base_ref
235
+ base_type = f"{parenthesized_base} & " if base_ref else ""
228
236
 
229
237
  if stype.properties is None and base_type == "":
230
238
  ctx.out.write(f"export type {stype.name} = TEmpty\n")
231
239
  elif stype.properties is None:
232
240
  ctx.out.write(f"export type {stype.name} = {base_type}{{}}\n")
233
241
  else:
234
- if isinstance(stype, builder.SpecTypeDefnObject) and len(stype.parameters) > 0:
242
+ if len(stype.parameters) > 0:
235
243
  full_type_name = f"{stype.name}<{', '.join(stype.parameters)}>"
236
244
  else:
237
245
  full_type_name = stype.name
238
- ctx.out.write(f"export type {full_type_name} = {base_type}{{")
246
+ if stype.needs_lazy_emission:
247
+ # WARNING: Must not go back to a type alias. TypeScript expands a
248
+ # generic type alias eagerly and rejects the cycle with TS2456;
249
+ # interface members resolve lazily. Kept to on-cycle objects because
250
+ # an interface has no implicit index signature, so it is not
251
+ # assignable where a type alias is.
252
+ extends = f" extends {base_ref}" if base_ref else ""
253
+ ctx.out.write(f"export interface {full_type_name}{extends} {{")
254
+ else:
255
+ ctx.out.write(f"export type {full_type_name} = {base_type}{{")
239
256
  ctx.out.write("\n")
240
257
  for prop in stype.properties.values():
241
258
  ref_type = refer_to(ctx, prop.spec_type)
@@ -149,7 +149,9 @@ def emit_type_info_python(build: builder.SpecBuilder, output: str) -> None:
149
149
 
150
150
  for namespace, data in type_map.namespaces.items():
151
151
  serial = serialize_for_storage(asdict_for_yaml_dump(data))
152
- yaml_content = yaml.dump(serial, default_flow_style=False, sort_keys=True)
152
+ yaml_content = yaml.dump(
153
+ serial, default_flow_style=False, sort_keys=True, Dumper=yaml.CDumper
154
+ )
153
155
  util.rewrite_file(f"{output}/namespace_{namespace}.yaml", yaml_content)
154
156
 
155
157
 
@@ -451,6 +453,7 @@ def _build_map_type(
451
453
 
452
454
  if isinstance(stype, builder.SpecTypeDefnAlias):
453
455
  ext_info = _parse_ext_info(stype.ext_info)
456
+ alias_params = stype.parameters if len(stype.parameters) > 0 else None
454
457
  return MapTypeAlias(
455
458
  type_name=stype.name,
456
459
  label=stype.label,
@@ -458,6 +461,7 @@ def _build_map_type(
458
461
  alias_type_path=type_path_of(stype.alias),
459
462
  ext_info=_parse_ext_info(stype.ext_info),
460
463
  discriminator=stype.discriminator,
464
+ parameters=alias_params,
461
465
  )
462
466
 
463
467
  if isinstance(stype, builder.SpecTypeDefnUnion):
@@ -26,6 +26,10 @@ def get_local_admin_server_port() -> int:
26
26
  return int(os.environ.get("UNC_ADMIN_SERVER_PORT", "50051"))
27
27
 
28
28
 
29
+ def get_integration_admin_token() -> str | None:
30
+ return os.environ.get("UNC_INTEGRATION_ADMIN_TOKEN")
31
+
32
+
29
33
  def get_otel_enabled() -> bool:
30
34
  return os.environ.get("UNC_OTEL_ENABLED") == "true"
31
35
 
@@ -28,6 +28,18 @@ class HttpException(Exception):
28
28
  def body_parse_error() -> "HttpException":
29
29
  return HttpException(error_code=400, message="body parse error")
30
30
 
31
+ @staticmethod
32
+ def unauthorized() -> "HttpException":
33
+ return HttpException(error_code=401, message="unauthorized")
34
+
35
+ @staticmethod
36
+ def service_unavailable() -> "HttpException":
37
+ return HttpException(error_code=503, message="service unavailable")
38
+
39
+ @staticmethod
40
+ def bad_gateway() -> "HttpException":
41
+ return HttpException(error_code=502, message="bad gateway")
42
+
31
43
  @staticmethod
32
44
  def unknown_error() -> "HttpException":
33
45
  return HttpException(error_code=500, message="internal server error")
@@ -237,7 +237,7 @@ async def start_scheduler(
237
237
  command_task.cancel()
238
238
  result_task.cancel()
239
239
  return
240
- elif task == command_task:
240
+ if task == command_task:
241
241
  command = command_task.result()
242
242
  match command:
243
243
  case CommandEnqueueJob():