UncountablePythonSDK 0.0.127__tar.gz → 0.0.129__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.

Potentially problematic release.


This version of UncountablePythonSDK might be problematic. Click here for more details.

Files changed (362) hide show
  1. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/UncountablePythonSDK.egg-info/SOURCES.txt +3 -0
  5. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_instrument.py +4 -3
  6. uncountablepythonsdk-0.0.129/examples/integration-server/jobs/materials_auto/example_parse.py +130 -0
  7. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_predictions.py +2 -2
  8. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +3 -2
  9. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/profile.yaml +9 -0
  10. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/pyproject.toml +1 -1
  11. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization_util/serialization_helpers.py +3 -1
  12. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/builder.py +9 -3
  13. uncountablepythonsdk-0.0.129/pkgs/type_spec/builder_types.py +9 -0
  14. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/cross_output_links.py +2 -10
  15. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_open_api.py +0 -12
  16. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_python.py +72 -11
  17. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_typescript_util.py +28 -6
  18. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/load_types.py +1 -1
  19. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/type_info/emit_type_info.py +13 -2
  20. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/client.py +10 -3
  21. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/job.py +2 -3
  22. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/command_server.py +8 -7
  23. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/telemetry.py +41 -7
  24. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/webhook_server/entrypoint.py +2 -0
  25. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/__init__.py +2 -0
  26. uncountablepythonsdk-0.0.129/uncountable/types/api/entity/list_aggregate.py +79 -0
  27. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/list_entities.py +25 -0
  28. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_recipes_data.py +13 -0
  29. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/async_batch_processor.py +20 -0
  30. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/client_base.py +195 -1
  31. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/client_config.py +1 -0
  32. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/client_config_t.py +10 -0
  33. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/entity_t.py +2 -0
  34. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/.github/workflows/publish.yml +0 -0
  35. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/.gitignore +0 -0
  36. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/.python-version +0 -0
  37. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/README.md +0 -0
  38. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  39. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  40. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  41. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/.gitignore +0 -0
  42. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/conf.py +0 -0
  43. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/index.md +0 -0
  44. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/integration_examples/create_ingredient.md +0 -0
  45. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/integration_examples/create_output.md +0 -0
  46. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/integration_examples/index.md +0 -0
  47. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/justfile +0 -0
  48. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/requirements.txt +0 -0
  49. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/android-chrome-192x192.png +0 -0
  50. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/android-chrome-512x512.png +0 -0
  51. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/apple-touch-icon.png +0 -0
  52. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/browserconfig.xml +0 -0
  53. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/favicon-16x16.png +0 -0
  54. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/favicon-32x32.png +0 -0
  55. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/manifest.json +0 -0
  56. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/mstile-150x150.png +0 -0
  57. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  58. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/docs/static/logo_blue.png +0 -0
  59. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/async_batch.py +0 -0
  60. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/basic_auth.py +0 -0
  61. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/create_entity.py +0 -0
  62. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/create_ingredient_sdk.py +0 -0
  63. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/download_files.py +0 -0
  64. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/edit_recipe_inputs.py +0 -0
  65. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  66. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  67. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  68. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  69. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/invoke_uploader.py +0 -0
  70. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/oauth.py +0 -0
  71. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/set_recipe_metadata_file.py +0 -0
  72. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/set_recipe_output_file_sdk.py +0 -0
  73. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/examples/upload_files.py +0 -0
  74. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/__init__.py +0 -0
  75. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/argument_parser/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/argument_parser/_is_enum.py +0 -0
  77. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  78. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/argument_parser/argument_parser.py +0 -0
  79. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/argument_parser/case_convert.py +0 -0
  80. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/__init__.py +0 -0
  81. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/_blob_session.py +0 -0
  82. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  83. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/_local_session.py +0 -0
  84. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/_s3_session.py +0 -0
  85. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  86. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  87. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  88. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/py.typed +0 -0
  89. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/__init__.py +0 -0
  90. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/annotation.py +0 -0
  91. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/missing_sentry.py +0 -0
  92. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/opaque_key.py +0 -0
  93. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/serial_alias.py +0 -0
  94. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/serial_class.py +0 -0
  95. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/serial_generic.py +0 -0
  96. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/serial_union.py +0 -0
  97. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization/yaml.py +0 -0
  98. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization_util/__init__.py +0 -0
  99. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  100. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  101. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/serialization_util/dataclasses.py +0 -0
  102. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/strenum_compat/__init__.py +0 -0
  103. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/strenum_compat/strenum_compat.py +0 -0
  104. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/__init__.py +0 -0
  105. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/__main__.py +0 -0
  106. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  107. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  108. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  109. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/config.py +0 -0
  110. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_io_ts.py +0 -0
  111. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_open_api_util.py +0 -0
  112. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/emit_typescript.py +0 -0
  113. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  114. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/open_api_util.py +0 -0
  115. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/parts/base.py.prepart +0 -0
  116. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  117. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/test.py +0 -0
  118. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/type_info/__main__.py +0 -0
  119. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  120. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  121. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/util.py +0 -0
  122. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/value_spec/__init__.py +0 -0
  123. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/value_spec/__main__.py +0 -0
  124. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  125. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  126. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pkgs/type_spec/value_spec/types.py +0 -0
  127. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/pyproject.toml +0 -0
  128. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/setup.cfg +0 -0
  129. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/__init__.py +0 -0
  130. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/__init__.py +0 -0
  131. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/async_batch.py +0 -0
  132. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/environment.py +0 -0
  133. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/file_upload.py +0 -0
  134. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/core/types.py +0 -0
  135. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/cli.py +0 -0
  137. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/construct_client.py +0 -0
  138. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/cron.py +0 -0
  139. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/db/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/db/connect.py +0 -0
  141. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/db/session.py +0 -0
  142. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/entrypoint.py +0 -0
  143. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/executors/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/executors/executors.py +0 -0
  145. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  146. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/executors/script_executor.py +0 -0
  147. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/http_server/__init__.py +0 -0
  148. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/http_server/types.py +0 -0
  149. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  152. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  153. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  155. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  156. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  157. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  158. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  159. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  161. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  162. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  163. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  164. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  165. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/types.py +0 -0
  166. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/queue_runner/worker.py +0 -0
  167. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/scan_profiles.py +0 -0
  168. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/scheduler.py +0 -0
  169. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  171. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/integration/server.py +0 -0
  172. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/py.typed +0 -0
  173. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/batch/__init__.py +0 -0
  175. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/batch/execute_batch.py +0 -0
  176. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  177. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/chemical/__init__.py +0 -0
  178. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  179. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  180. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  181. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/__init__.py +0 -0
  182. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/create_entities.py +0 -0
  183. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/create_entity.py +0 -0
  184. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  185. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/export_entities.py +0 -0
  186. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/get_entities_data.py +0 -0
  187. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  188. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/lock_entity.py +0 -0
  189. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/lookup_entity.py +0 -0
  190. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  191. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  192. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/set_values.py +0 -0
  193. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  194. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/entity/unlock_entity.py +0 -0
  195. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/equipment/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  197. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/field_options/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  199. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/files/__init__.py +0 -0
  200. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/files/download_file.py +0 -0
  201. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/id_source/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/id_source/list_id_source.py +0 -0
  203. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/id_source/match_id_source.py +0 -0
  204. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/input_groups/__init__.py +0 -0
  205. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  206. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/create_inputs.py +0 -0
  208. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/get_input_data.py +0 -0
  209. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/get_input_names.py +0 -0
  210. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  211. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  212. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/set_input_category.py +0 -0
  213. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  214. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  215. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/integrations/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  217. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/integrations/push_notification.py +0 -0
  218. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  219. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/material_families/__init__.py +0 -0
  220. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  221. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/outputs/__init__.py +0 -0
  222. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/outputs/get_output_data.py +0 -0
  223. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/outputs/get_output_names.py +0 -0
  224. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  225. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  226. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/permissions/__init__.py +0 -0
  227. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  228. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/project/__init__.py +0 -0
  229. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/project/get_projects.py +0 -0
  230. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/project/get_projects_data.py +0 -0
  231. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipe_links/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  233. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  234. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  235. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  236. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  238. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  239. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  240. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  241. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  242. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  243. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  244. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/create_recipe.py +0 -0
  245. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/create_recipes.py +0 -0
  246. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  247. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  248. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  249. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_curve.py +0 -0
  250. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  251. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  252. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  253. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  254. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  255. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  256. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  257. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  258. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  259. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  260. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  261. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  262. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  263. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  264. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  265. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/runsheet/__init__.py +0 -0
  266. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  267. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/triggers/__init__.py +0 -0
  268. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/triggers/run_trigger.py +0 -0
  269. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/uploader/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  271. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  272. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/user/__init__.py +0 -0
  273. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/api/user/get_current_user_info.py +0 -0
  274. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/async_batch.py +0 -0
  275. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/async_batch_t.py +0 -0
  276. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/async_jobs.py +0 -0
  277. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/async_jobs_t.py +0 -0
  278. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/auth_retrieval.py +0 -0
  279. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/auth_retrieval_t.py +0 -0
  280. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/base.py +0 -0
  281. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/base_t.py +0 -0
  282. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/calculations.py +0 -0
  283. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/calculations_t.py +0 -0
  284. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/chemical_structure.py +0 -0
  285. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/chemical_structure_t.py +0 -0
  286. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/curves.py +0 -0
  287. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/curves_t.py +0 -0
  288. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/data.py +0 -0
  289. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/data_t.py +0 -0
  290. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/entity.py +0 -0
  291. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/experiment_groups.py +0 -0
  292. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/experiment_groups_t.py +0 -0
  293. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/exports.py +0 -0
  294. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/exports_t.py +0 -0
  295. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/field_values.py +0 -0
  296. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/field_values_t.py +0 -0
  297. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/fields.py +0 -0
  298. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/fields_t.py +0 -0
  299. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/generic_upload.py +0 -0
  300. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/generic_upload_t.py +0 -0
  301. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/id_source.py +0 -0
  302. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/id_source_t.py +0 -0
  303. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/identifier.py +0 -0
  304. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/identifier_t.py +0 -0
  305. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/input_attributes.py +0 -0
  306. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/input_attributes_t.py +0 -0
  307. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/inputs.py +0 -0
  308. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/inputs_t.py +0 -0
  309. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integration_server.py +0 -0
  310. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integration_server_t.py +0 -0
  311. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integration_session.py +0 -0
  312. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integration_session_t.py +0 -0
  313. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integrations.py +0 -0
  314. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/integrations_t.py +0 -0
  315. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/job_definition.py +0 -0
  316. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/job_definition_t.py +0 -0
  317. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/notifications.py +0 -0
  318. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/notifications_t.py +0 -0
  319. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/outputs.py +0 -0
  320. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/outputs_t.py +0 -0
  321. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/overrides.py +0 -0
  322. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/overrides_t.py +0 -0
  323. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/permissions.py +0 -0
  324. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/permissions_t.py +0 -0
  325. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/phases.py +0 -0
  326. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/phases_t.py +0 -0
  327. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/post_base.py +0 -0
  328. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/post_base_t.py +0 -0
  329. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/queued_job.py +0 -0
  330. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/queued_job_t.py +0 -0
  331. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_identifiers.py +0 -0
  332. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_identifiers_t.py +0 -0
  333. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_inputs.py +0 -0
  334. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_inputs_t.py +0 -0
  335. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_links.py +0 -0
  336. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_links_t.py +0 -0
  337. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_metadata.py +0 -0
  338. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_metadata_t.py +0 -0
  339. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_output_metadata.py +0 -0
  340. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_output_metadata_t.py +0 -0
  341. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_tags.py +0 -0
  342. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_tags_t.py +0 -0
  343. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_workflow_steps.py +0 -0
  344. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  345. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipes.py +0 -0
  346. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/recipes_t.py +0 -0
  347. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/response.py +0 -0
  348. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/response_t.py +0 -0
  349. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/secret_retrieval.py +0 -0
  350. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/secret_retrieval_t.py +0 -0
  351. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/sockets.py +0 -0
  352. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/sockets_t.py +0 -0
  353. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/units.py +0 -0
  354. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/units_t.py +0 -0
  355. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/uploader.py +0 -0
  356. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/uploader_t.py +0 -0
  357. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/users.py +0 -0
  358. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/users_t.py +0 -0
  359. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/webhook_job.py +0 -0
  360. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/webhook_job_t.py +0 -0
  361. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/workflows.py +0 -0
  362. {uncountablepythonsdk-0.0.127 → uncountablepythonsdk-0.0.129}/uncountable/types/workflows_t.py +0 -0
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
12
  - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
13
- - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
13
+ - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6
14
14
  - uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1
15
15
  with:
16
16
  repo: casey/just@0.10
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.127
3
+ Version: 0.0.129
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.127
3
+ Version: 0.0.129
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
@@ -43,6 +43,7 @@ examples/integration-server/jobs/materials_auto/concurrent_cron.py
43
43
  examples/integration-server/jobs/materials_auto/example_cron.py
44
44
  examples/integration-server/jobs/materials_auto/example_http.py
45
45
  examples/integration-server/jobs/materials_auto/example_instrument.py
46
+ examples/integration-server/jobs/materials_auto/example_parse.py
46
47
  examples/integration-server/jobs/materials_auto/example_predictions.py
47
48
  examples/integration-server/jobs/materials_auto/example_runsheet_wh.py
48
49
  examples/integration-server/jobs/materials_auto/example_wh.py
@@ -81,6 +82,7 @@ pkgs/strenum_compat/strenum_compat.py
81
82
  pkgs/type_spec/__init__.py
82
83
  pkgs/type_spec/__main__.py
83
84
  pkgs/type_spec/builder.py
85
+ pkgs/type_spec/builder_types.py
84
86
  pkgs/type_spec/config.py
85
87
  pkgs/type_spec/cross_output_links.py
86
88
  pkgs/type_spec/emit_io_ts.py
@@ -267,6 +269,7 @@ uncountable/types/api/entity/create_or_update_entity.py
267
269
  uncountable/types/api/entity/export_entities.py
268
270
  uncountable/types/api/entity/get_entities_data.py
269
271
  uncountable/types/api/entity/grant_entity_permissions.py
272
+ uncountable/types/api/entity/list_aggregate.py
270
273
  uncountable/types/api/entity/list_entities.py
271
274
  uncountable/types/api/entity/lock_entity.py
272
275
  uncountable/types/api/entity/lookup_entity.py
@@ -3,8 +3,6 @@ import time
3
3
  from dataclasses import dataclass
4
4
  from decimal import Decimal
5
5
 
6
- from pkgs.argument_parser.argument_parser import CachedParser
7
- from pkgs.serialization_util import serialize_for_api
8
6
  from uncountable.integration.job import JobArguments, WebhookJob, register_job
9
7
  from uncountable.types import (
10
8
  base_t,
@@ -16,6 +14,9 @@ from uncountable.types.integration_session_t import IntegrationSessionInstrument
16
14
  from websockets.sync.client import connect
17
15
  from websockets.typing import Data
18
16
 
17
+ from pkgs.argument_parser.argument_parser import CachedParser
18
+ from pkgs.serialization_util import serialize_for_api
19
+
19
20
 
20
21
  @dataclass(kw_only=True)
21
22
  class InstrumentPayload:
@@ -34,7 +35,7 @@ class InstrumentExample(WebhookJob[InstrumentPayload]):
34
35
  def parse_message(message: Data) -> sockets_t.SocketEventData | None:
35
36
  try:
36
37
  return parser.parse_api(json.loads(message)).data
37
- except ValueError as e:
38
+ except ValueError:
38
39
  return None
39
40
 
40
41
  integration_session = IntegrationSessionInstrument(
@@ -0,0 +1,130 @@
1
+ from dataclasses import dataclass
2
+ from decimal import Decimal
3
+
4
+ from uncountable.integration.job import JobArguments, WebhookJob, register_job
5
+ from uncountable.types import (
6
+ base_t,
7
+ entity_t,
8
+ generic_upload_t,
9
+ identifier_t,
10
+ job_definition_t,
11
+ notifications_t,
12
+ uploader_t,
13
+ )
14
+
15
+
16
+ @dataclass(kw_only=True)
17
+ class ParsePayload:
18
+ async_job_id: base_t.ObjectId
19
+
20
+
21
+ @register_job
22
+ class ParseExample(WebhookJob[ParsePayload]):
23
+ def run(
24
+ self, args: JobArguments, payload: ParsePayload
25
+ ) -> job_definition_t.JobResult:
26
+ dummy_parsed_file_data: list[uploader_t.ParsedFileData] = [
27
+ uploader_t.ParsedFileData(
28
+ file_name="my_file_to_upload.xlsx",
29
+ file_structures=[
30
+ uploader_t.DataChannel(
31
+ type=uploader_t.StructureElementType.CHANNEL,
32
+ channel=uploader_t.TextChannelData(
33
+ name="column1",
34
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
35
+ data=[
36
+ uploader_t.StringValue(value="value1"),
37
+ uploader_t.StringValue(value="value4"),
38
+ uploader_t.StringValue(value="value7"),
39
+ ],
40
+ ),
41
+ ),
42
+ uploader_t.DataChannel(
43
+ type=uploader_t.StructureElementType.CHANNEL,
44
+ channel=uploader_t.TextChannelData(
45
+ name="column2",
46
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
47
+ data=[
48
+ uploader_t.StringValue(value="value2"),
49
+ uploader_t.StringValue(value="value5"),
50
+ uploader_t.StringValue(value="value8"),
51
+ ],
52
+ ),
53
+ ),
54
+ uploader_t.DataChannel(
55
+ type=uploader_t.StructureElementType.CHANNEL,
56
+ channel=uploader_t.TextChannelData(
57
+ name="column3",
58
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
59
+ data=[
60
+ uploader_t.StringValue(value="value3"),
61
+ uploader_t.StringValue(value="value6"),
62
+ uploader_t.StringValue(value="value9"),
63
+ ],
64
+ ),
65
+ ),
66
+ uploader_t.HeaderEntry(
67
+ type=uploader_t.StructureElementType.HEADER,
68
+ value=uploader_t.TextHeaderData(
69
+ name="file_source",
70
+ type=uploader_t.HeaderType.TEXT_HEADER,
71
+ data=uploader_t.StringValue(value="my_file_to_upload.xlsx"),
72
+ ),
73
+ ),
74
+ uploader_t.HeaderEntry(
75
+ type=uploader_t.StructureElementType.HEADER,
76
+ value=uploader_t.NumericHeaderData(
77
+ name="file structure number",
78
+ data=uploader_t.DecimalValue(value=Decimal(99)),
79
+ ),
80
+ ),
81
+ ],
82
+ )
83
+ ]
84
+
85
+ user_id: base_t.ObjectId | None = None
86
+ recipe_id: base_t.ObjectId | None = None
87
+ data = args.client.get_entities_data(
88
+ entity_ids=[payload.async_job_id], entity_type=entity_t.EntityType.ASYNC_JOB
89
+ )
90
+ for field_value in data.entity_details[0].field_values:
91
+ if field_value.field_ref_name == "core_async_job_jobData":
92
+ assert isinstance(field_value.value, dict)
93
+ assert isinstance(field_value.value["user_id"], int)
94
+ user_id = field_value.value["user_id"]
95
+ if (
96
+ field_value.field_ref_name
97
+ == "unc_async_job_custom_parser_recipe_ids_in_view"
98
+ ):
99
+ assert isinstance(field_value.value, list)
100
+ assert isinstance(field_value.value[0], int)
101
+ recipe_id = field_value.value[0]
102
+
103
+ assert user_id is not None
104
+ assert recipe_id is not None
105
+
106
+ complete_async_parse_req = args.batch_processor.complete_async_parse(
107
+ parsed_file_data=dummy_parsed_file_data,
108
+ async_job_key=identifier_t.IdentifierKeyId(id=payload.async_job_id),
109
+ upload_destination=generic_upload_t.UploadDestinationRecipe(
110
+ recipe_key=identifier_t.IdentifierKeyId(id=recipe_id)
111
+ ),
112
+ )
113
+
114
+ args.batch_processor.push_notification(
115
+ depends_on=[complete_async_parse_req.batch_reference],
116
+ notification_targets=[
117
+ notifications_t.NotificationTargetUser(
118
+ user_key=identifier_t.IdentifierKeyId(id=user_id)
119
+ )
120
+ ],
121
+ subject="Upload complete",
122
+ message="Your file has been uploaded",
123
+ display_notice=True,
124
+ )
125
+
126
+ return job_definition_t.JobResult(success=True)
127
+
128
+ @property
129
+ def webhook_payload_type(self) -> type:
130
+ return ParsePayload
@@ -1,6 +1,6 @@
1
1
  import random
2
2
  from dataclasses import dataclass
3
- from datetime import datetime
3
+ from datetime import UTC, datetime
4
4
  from decimal import Decimal
5
5
 
6
6
  from uncountable.integration.job import JobArguments, WebhookJob, register_job
@@ -25,7 +25,7 @@ class PredictionsExample(WebhookJob[PredictionsPayload]):
25
25
  self, args: JobArguments, payload: PredictionsPayload
26
26
  ) -> job_definition_t.JobResult:
27
27
  recipe_data = args.client.get_recipes_data(recipe_ids=payload.recipe_ids)
28
- formatted_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
28
+ formatted_datetime = datetime.now(UTC).strftime("%Y-%m-%d %H:%M:%S")
29
29
 
30
30
  for recipe in recipe_data.recipes:
31
31
  test_sample_name = f"Predictions Model ({formatted_datetime})"
@@ -2,7 +2,7 @@ from io import BytesIO
2
2
 
3
3
  from uncountable.core.file_upload import DataFileUpload, FileUpload
4
4
  from uncountable.integration.job import JobArguments, RunsheetWebhookJob, register_job
5
- from uncountable.types import entity_t
5
+ from uncountable.types import webhook_job_t
6
6
 
7
7
 
8
8
  @register_job
@@ -11,8 +11,9 @@ class StandardRunsheetGenerator(RunsheetWebhookJob):
11
11
  self,
12
12
  *,
13
13
  args: JobArguments,
14
- entities: list[entity_t.Entity],
14
+ payload: webhook_job_t.RunsheetWebhookPayload,
15
15
  ) -> FileUpload:
16
+ entities = payload.entities
16
17
  args.logger.log_info(f"Generating runsheet for {len(entities)} entities")
17
18
 
18
19
  content = []
@@ -93,3 +93,12 @@ jobs:
93
93
  executor:
94
94
  type: script
95
95
  import_path: example_predictions
96
+ - id: example_parse
97
+ type: webhook
98
+ name: Webhook Parse
99
+ signature_key_secret:
100
+ type: env
101
+ env_key: WH_PARSE_SIGNATURE_KEY
102
+ executor:
103
+ type: script
104
+ import_path: example_parse
@@ -115,7 +115,6 @@ lint.ignore = [
115
115
  "PD010", # .pivottable. Should add
116
116
  "PD011", # use .to_numpy. Skip
117
117
  "PD015", # use .merge. Should add
118
- "PD901", # avoid generic df name. Skip
119
118
  "PERF203", # avoid try except in loop. Skip
120
119
  "PERF401", # use list comprehension. Skip
121
120
  "PERF402", # use list.copy. Skip
@@ -213,6 +212,7 @@ exclude = [
213
212
 
214
213
  [tool.ruff.lint.isort]
215
214
  split-on-trailing-comma = true
215
+ known-first-party = ["pkgs"]
216
216
 
217
217
  [tool.ruff.lint.mccabe]
218
218
  max-complexity = 130 # goal would be to bring this down to ~50 or so
@@ -85,7 +85,9 @@ def _serialize_dataclass(d: Any) -> dict[str, JsonValue]:
85
85
 
86
86
 
87
87
  def _to_string_value(value: Any) -> str:
88
- assert isinstance(value, (Decimal, int))
88
+ assert isinstance(value, (Decimal, int)), (
89
+ f"Expecting decimal or int, received: {value} (type={type(value)})"
90
+ )
89
91
  return str(value)
90
92
 
91
93
 
@@ -13,7 +13,7 @@ from enum import Enum, StrEnum, auto
13
13
  from typing import Any, Self
14
14
 
15
15
  from . import util
16
- from .cross_output_links import CrossOutputPaths
16
+ from .builder_types import CrossOutputPaths
17
17
  from .non_discriminated_union_exceptions import NON_DISCRIMINATED_UNION_EXCEPTIONS
18
18
  from .util import parse_type_str
19
19
 
@@ -1101,7 +1101,7 @@ def _parse_const(
1101
1101
  elif const_type.defn_type.name == BaseTypeName.s_dict:
1102
1102
  assert isinstance(value, dict)
1103
1103
  builder.ensure(
1104
- len(const_type.parameters) == 2, "constant-dict-expects-one-type"
1104
+ len(const_type.parameters) == 2, "constant-dict-expects-two-types"
1105
1105
  )
1106
1106
  key_type = const_type.parameters[0]
1107
1107
  value_type = const_type.parameters[1]
@@ -1150,6 +1150,11 @@ def _parse_const(
1150
1150
  )
1151
1151
  return value
1152
1152
 
1153
+ if not const_type.is_base:
1154
+ # IMPROVE: validate the object type properties before emission stage
1155
+ builder.ensure(isinstance(value, dict), "invalid value for object constant")
1156
+ return value
1157
+
1153
1158
  raise Exception("unsupported-const-scalar-type", const_type)
1154
1159
 
1155
1160
 
@@ -1271,7 +1276,8 @@ class SpecNamespace:
1271
1276
 
1272
1277
  assert util.is_valid_type_name(name), f"{name} is not a valid type name"
1273
1278
  assert name not in self.types, f"{name} is duplicate"
1274
- defn_type = defn["type"]
1279
+ defn_type = defn.get("type")
1280
+ assert isinstance(defn_type, str), f"{name} requires a string type"
1275
1281
  spec_type: SpecTypeDefn
1276
1282
  if defn_type == DefnTypeName.s_alias:
1277
1283
  spec_type = SpecTypeDefnAlias(self, name)
@@ -0,0 +1,9 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(kw_only=True, frozen=True)
5
+ class CrossOutputPaths:
6
+ python_types_output: str
7
+ typescript_types_output: str
8
+ typescript_routes_output_by_endpoint: dict[str, str]
9
+ typespec_files_input: list[str]
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
- from dataclasses import dataclass
5
4
 
6
- from pkgs.type_spec import builder
5
+ from . import builder
6
+ from .builder_types import CrossOutputPaths
7
7
 
8
8
 
9
9
  def get_python_stub_file_path(
@@ -17,14 +17,6 @@ def get_python_stub_file_path(
17
17
  return api_stub_file
18
18
 
19
19
 
20
- @dataclass(kw_only=True, frozen=True)
21
- class CrossOutputPaths:
22
- python_types_output: str
23
- typescript_types_output: str
24
- typescript_routes_output_by_endpoint: dict[str, str]
25
- typespec_files_input: list[str]
26
-
27
-
28
20
  def get_python_api_file_path(
29
21
  cross_output_paths: CrossOutputPaths,
30
22
  namespace: builder.SpecNamespace,
@@ -610,18 +610,6 @@ def _emit_type(
610
610
  ctx.types[stype.name] = final_type
611
611
 
612
612
 
613
- def _emit_constant(ctx: EmitOpenAPIContext, sconst: builder.SpecConstant) -> None:
614
- if sconst.value_type.is_base_type(builder.BaseTypeName.s_string):
615
- value = util.encode_common_string(cast(str, sconst.value))
616
- elif sconst.value_type.is_base_type(builder.BaseTypeName.s_integer):
617
- value = str(sconst.value)
618
- else:
619
- raise Exception("invalid constant type", sconst.name)
620
-
621
- const_name = sconst.name.upper()
622
- print("_emit_constant", value, const_name)
623
-
624
-
625
613
  def _emit_endpoint(
626
614
  gctx: EmitOpenAPIGlobalContext,
627
615
  ctx: EmitOpenAPIContext,
@@ -35,6 +35,11 @@ QUEUED_BATCH_REQUEST_STYPE = builder.SpecTypeDefnObject(
35
35
  namespace=ASYNC_BATCH_TYPE_NAMESPACE, name="QueuedAsyncBatchRequest"
36
36
  )
37
37
 
38
+ CLIENT_CONFIG_TYPE_NAMESPACE = builder.SpecNamespace(name="client_config")
39
+ REQUEST_OPTIONS_STYPE = builder.SpecTypeDefnObject(
40
+ namespace=CLIENT_CONFIG_TYPE_NAMESPACE, name="RequestOptions"
41
+ )
42
+
38
43
 
39
44
  @dataclasses.dataclass(kw_only=True)
40
45
  class TrackingContext:
@@ -117,26 +122,36 @@ def _check_type_match(stype: builder.SpecType, value: Any) -> bool:
117
122
  raise Exception("invalid type", stype, value)
118
123
 
119
124
 
120
- def _emit_value(ctx: TrackingContext, stype: builder.SpecType, value: Any) -> str:
125
+ def _emit_value(
126
+ ctx: TrackingContext, stype: builder.SpecType, value: Any, indent: int = 0
127
+ ) -> str:
121
128
  literal = builder.unwrap_literal_type(stype)
122
129
  if literal is not None:
123
130
  return _emit_value(ctx, literal.value_type, literal.value)
124
131
 
125
132
  if stype.is_base_type(builder.BaseTypeName.s_string):
126
- assert isinstance(value, str)
133
+ assert isinstance(value, str), (
134
+ f"Expected str value for {stype.name} but got {value}"
135
+ )
127
136
  return util.encode_common_string(value)
128
137
  elif stype.is_base_type(builder.BaseTypeName.s_integer):
129
- assert isinstance(value, int)
138
+ assert isinstance(value, int), (
139
+ f"Expected int value for {stype.name} but got {value}"
140
+ )
130
141
  return str(value)
131
142
  elif stype.is_base_type(builder.BaseTypeName.s_boolean):
132
- assert isinstance(value, bool)
143
+ assert isinstance(value, bool), (
144
+ f"Expected bool value for {stype.name} but got {value}"
145
+ )
133
146
  return "True" if value else "False"
134
147
  elif stype.is_base_type(builder.BaseTypeName.s_decimal) or stype.is_base_type(
135
148
  builder.BaseTypeName.s_lossy_decimal
136
149
  ):
137
150
  # Note that decimal requires the `!decimal 123.12` style notation in the YAML
138
151
  # file since PyYaml parses numbers as float, unfortuantely
139
- assert isinstance(value, (Decimal, int))
152
+ assert isinstance(value, (Decimal, int)), (
153
+ f"Expected decimal value for {stype.name} but got {value} (type: {type(value)})"
154
+ )
140
155
  if isinstance(value, int):
141
156
  # skip quotes for integers
142
157
  return f"Decimal({value})"
@@ -151,14 +166,14 @@ def _emit_value(ctx: TrackingContext, stype: builder.SpecType, value: Any) -> st
151
166
  key_type = stype.parameters[0]
152
167
  value_type = stype.parameters[1]
153
168
  return (
154
- "{\n "
155
- + ",\n ".join(
169
+ f"{{\n{INDENT * (indent + 1)}"
170
+ + f",\n{INDENT * (indent + 1)}".join(
156
171
  _emit_value(ctx, key_type, dkey)
157
172
  + ": "
158
- + _emit_value(ctx, value_type, dvalue)
173
+ + _emit_value(ctx, value_type, dvalue, indent=indent + 1)
159
174
  for dkey, dvalue in value.items()
160
175
  )
161
- + "\n}"
176
+ + f"\n{INDENT * indent}}}"
162
177
  )
163
178
 
164
179
  if stype.defn_type.is_base_type(builder.BaseTypeName.s_optional):
@@ -184,6 +199,34 @@ def _emit_value(ctx: TrackingContext, stype: builder.SpecType, value: Any) -> st
184
199
  return f"{refer_to(ctx, stype)}.{_resolve_enum_name(value, stype.name_case)}"
185
200
  elif isinstance(stype, builder.SpecTypeDefnAlias):
186
201
  return _emit_value(ctx, stype.alias, value)
202
+ elif isinstance(stype, builder.SpecTypeDefnObject):
203
+ assert isinstance(value, dict), (
204
+ f"Expected dict value for {stype.name} but got {value}"
205
+ )
206
+ if not stype.is_hashable:
207
+ raise Exception("invalid constant object type, non-hashable", value, stype)
208
+ obj_out = f"{refer_to(ctx, stype)}("
209
+ emitted_fields: set[str] = set()
210
+ for prop_name, prop in (stype.properties or {}).items():
211
+ if prop_name not in value:
212
+ continue
213
+ else:
214
+ value_to_emit = value[prop_name]
215
+ emitted_fields.add(prop_name)
216
+ py_name = python_field_name(prop.name, prop.name_case)
217
+ obj_out += f"\n{INDENT * (indent + 1)}{py_name}={_emit_value(ctx, prop.spec_type, value_to_emit, indent=indent + 1)},"
218
+ whitespace = f"\n{INDENT * indent}" if len(emitted_fields) > 0 else ""
219
+ obj_out += f"{whitespace})"
220
+
221
+ if emitted_fields != set(value.keys()):
222
+ raise Exception(
223
+ "invalid object type, extra fields found:",
224
+ value,
225
+ stype,
226
+ set(value.keys()) - emitted_fields,
227
+ )
228
+
229
+ return obj_out
187
230
 
188
231
  raise Exception("invalid constant type", value, stype)
189
232
 
@@ -471,6 +514,19 @@ def _emit_endpoint_invocation_function_signature(
471
514
  else []
472
515
  ) + (extra_params if extra_params is not None else [])
473
516
 
517
+ request_options_property = builder.SpecProperty(
518
+ name="_request_options",
519
+ label="_request_options",
520
+ spec_type=REQUEST_OPTIONS_STYPE,
521
+ extant=builder.PropertyExtant.optional,
522
+ convert_value=builder.PropertyConvertValue.auto,
523
+ name_case=builder.NameCase.convert,
524
+ default=None,
525
+ has_default=True,
526
+ desc=None,
527
+ )
528
+ all_arguments.append(request_options_property)
529
+
474
530
  # All endpoints share a function name
475
531
  function = endpoint.path_per_api_endpoint[endpoint.default_endpoint_key].function
476
532
  assert function is not None
@@ -641,6 +697,7 @@ def _emit_endpoint_invocation_function(
641
697
  method={refer_to(ctx=ctx, stype=endpoint_method_stype)},
642
698
  endpoint={refer_to(ctx=ctx, stype=endpoint_path_stype)},
643
699
  args=args,
700
+ request_options=_request_options,
644
701
  )
645
702
  return self.do_request(api_request=api_request, return_type={refer_to(ctx=ctx, stype=data_type)})"""
646
703
  )
@@ -1396,7 +1453,7 @@ CLIENT_CLASS_IMPORTS = [
1396
1453
  "import dataclasses",
1397
1454
  ]
1398
1455
  ASYNC_BATCH_PROCESSOR_FILENAME = "async_batch_processor"
1399
- ASYNC_BATCH_PROCESSOR_IMPORTS = [
1456
+ ASYNC_BATCH_PROCESSOR_BASE_IMPORTS = [
1400
1457
  "import uuid",
1401
1458
  "from abc import ABC, abstractmethod",
1402
1459
  "from pkgs.serialization_util import serialize_for_api",
@@ -1434,8 +1491,11 @@ def _emit_async_batch_processor(
1434
1491
  config=config,
1435
1492
  )
1436
1493
 
1494
+ imports = ASYNC_BATCH_PROCESSOR_BASE_IMPORTS.copy()
1495
+ if ctx.use_dataclass:
1496
+ imports.append("import dataclasses")
1437
1497
  async_batch_processor_out.write(
1438
- f"""{LINE_BREAK.join(ASYNC_BATCH_PROCESSOR_IMPORTS)}
1498
+ f"""{LINE_BREAK.join(imports)}
1439
1499
 
1440
1500
 
1441
1501
  class AsyncBatchProcessorBase(ABC):
@@ -1498,6 +1558,7 @@ class APIRequest:
1498
1558
  method: str
1499
1559
  endpoint: str
1500
1560
  args: typing.Any
1561
+ request_options: {refer_to(ctx=ctx, stype=REQUEST_OPTIONS_STYPE)} | None = None
1501
1562
 
1502
1563
 
1503
1564
  class ClientMethods(ABC):
@@ -3,7 +3,7 @@ import typing
3
3
  from dataclasses import dataclass, field
4
4
 
5
5
  from . import builder, util
6
- from .cross_output_links import CrossOutputPaths
6
+ from .builder_types import CrossOutputPaths
7
7
 
8
8
  INDENT = " "
9
9
 
@@ -51,7 +51,10 @@ def ts_name(name: str, name_case: builder.NameCase) -> str:
51
51
 
52
52
 
53
53
  def emit_value_ts(
54
- ctx: EmitTypescriptContext, stype: builder.SpecType, value: typing.Any
54
+ ctx: EmitTypescriptContext,
55
+ stype: builder.SpecType,
56
+ value: typing.Any,
57
+ indent: int = 0,
55
58
  ) -> str:
56
59
  """Mimics emit_python even if not all types are used in TypeScript yet"""
57
60
  literal = builder.unwrap_literal_type(stype)
@@ -88,17 +91,17 @@ def emit_value_ts(
88
91
  raise Exception("invalid dict keys -- dict keys must be string or enum")
89
92
 
90
93
  return (
91
- "{\n\t"
92
- + ",\n\t".join(
94
+ f"{{\n{INDENT * (indent + 1)}"
95
+ + f",\n{INDENT * (indent + 1)}".join(
93
96
  (
94
97
  f"[{emit_value_ts(ctx, key_type, dkey)}]: "
95
98
  if not key_type.is_base_type(builder.BaseTypeName.s_string)
96
99
  else f"{dkey}: "
97
100
  )
98
- + emit_value_ts(ctx, value_type, dvalue)
101
+ + emit_value_ts(ctx, value_type, dvalue, indent=indent + 1)
99
102
  for dkey, dvalue in value.items()
100
103
  )
101
- + "\n}"
104
+ + f"\n{INDENT * (indent)}}}"
102
105
  )
103
106
 
104
107
  if stype.defn_type.is_base_type(builder.BaseTypeName.s_optional):
@@ -109,6 +112,25 @@ def emit_value_ts(
109
112
 
110
113
  elif isinstance(stype, builder.SpecTypeDefnStringEnum):
111
114
  return f"{refer_to(ctx, stype)}.{ts_enum_name(value, stype.name_case)}"
115
+ elif isinstance(stype, builder.SpecTypeDefnObject):
116
+ assert isinstance(value, dict), (
117
+ f"Expected dict value for {stype.name} but got {value}"
118
+ )
119
+ obj_out = "{"
120
+ did_emit = False
121
+ for prop_name, prop in (stype.properties or {}).items():
122
+ if prop_name not in value and prop.has_default:
123
+ value_to_emit = prop.default
124
+ elif prop_name not in value:
125
+ continue
126
+ else:
127
+ value_to_emit = value[prop_name]
128
+ did_emit = True
129
+ typescript_name = ts_name(prop.name, prop.name_case)
130
+ obj_out += f"\n{INDENT * (indent + 1)}{typescript_name}: {emit_value_ts(ctx, prop.spec_type, value_to_emit, indent=indent + 1)},"
131
+ whitespace = f"\n{INDENT * indent}" if did_emit else ""
132
+ obj_out += f"{whitespace}}} as const"
133
+ return obj_out
112
134
 
113
135
  raise Exception("invalid constant type", value, stype, type(stype))
114
136
 
@@ -7,8 +7,8 @@ from shelljob import fs
7
7
  from pkgs.serialization import yaml
8
8
 
9
9
  from .builder import SpecBuilder
10
+ from .builder_types import CrossOutputPaths
10
11
  from .config import Config
11
- from .cross_output_links import CrossOutputPaths
12
12
 
13
13
  ext_map = {
14
14
  ".ts": "typescript",
@@ -171,9 +171,16 @@ class MapTypeAlias(MapTypeBase):
171
171
  discriminator: str | None
172
172
 
173
173
 
174
+ @dataclasses.dataclass
175
+ class StringEnumValue:
176
+ value: str
177
+ label: str
178
+ deprecated: bool = False
179
+
180
+
174
181
  @dataclasses.dataclass
175
182
  class MapStringEnum(MapTypeBase):
176
- values: dict[str, str]
183
+ values: dict[str, StringEnumValue]
177
184
 
178
185
 
179
186
  MapType = MapTypeObject | MapTypeAlias | MapStringEnum
@@ -436,7 +443,11 @@ def _build_map_type(
436
443
  # IMPROVE: We probably want the label here, but this requires a change
437
444
  # to the front-end type-info and form code to handle
438
445
  values={
439
- entry.value: (entry.label or entry.name)
446
+ entry.value: StringEnumValue(
447
+ value=entry.value,
448
+ label=entry.label or entry.name,
449
+ deprecated=entry.deprecated,
450
+ )
440
451
  for entry in stype.values.values()
441
452
  },
442
453
  )