UncountablePythonSDK 0.0.144__tar.gz → 0.0.146__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 (380) hide show
  1. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/.github/workflows/publish.yml +2 -2
  2. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/PKG-INFO +4 -4
  3. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/UncountablePythonSDK.egg-info/PKG-INFO +4 -4
  4. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
  5. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/UncountablePythonSDK.egg-info/requires.txt +3 -3
  6. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/integration_examples/index.md +1 -0
  7. uncountablepythonsdk-0.0.146/docs/integration_examples/upload_file.md +31 -0
  8. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/argument_parser/argument_parser.py +71 -14
  9. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/_gdrive_session.py +6 -3
  10. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_python.py +43 -2
  11. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_typescript_util.py +9 -0
  12. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/type_info/emit_type_info.py +38 -28
  13. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pyproject.toml +3 -3
  14. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/cli.py +8 -0
  15. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/command_client.py +2 -0
  16. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/command_server.py +13 -1
  17. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +1 -0
  18. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +14 -14
  19. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +7 -2
  20. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +8 -2
  21. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/datastore/interface.py +4 -1
  22. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/telemetry.py +5 -4
  23. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/__init__.py +2 -0
  24. uncountablepythonsdk-0.0.146/uncountable/types/api/files/create_file_record.py +41 -0
  25. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/integrations/publish_realtime_data.py +15 -1
  26. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/async_batch_processor.py +1 -1
  27. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/client_base.py +19 -1
  28. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/entity_t.py +12 -0
  29. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/job_definition_t.py +1 -0
  30. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/.github/workflows/documentation.yml +0 -0
  31. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/.gitignore +0 -0
  32. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/.python-version +0 -0
  33. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/README.md +0 -0
  34. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  35. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  36. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/.gitignore +0 -0
  37. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/conf.py +0 -0
  38. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/index.md +0 -0
  39. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/integration_examples/create_ingredient.md +0 -0
  40. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/integration_examples/create_output.md +0 -0
  41. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/justfile +0 -0
  42. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/requirements.txt +0 -0
  43. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/android-chrome-192x192.png +0 -0
  44. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/android-chrome-512x512.png +0 -0
  45. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/apple-touch-icon.png +0 -0
  46. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/browserconfig.xml +0 -0
  47. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/favicon-16x16.png +0 -0
  48. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/favicon-32x32.png +0 -0
  49. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/manifest.json +0 -0
  50. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/mstile-150x150.png +0 -0
  51. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  52. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/docs/static/logo_blue.png +0 -0
  53. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/async_batch.py +0 -0
  54. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/basic_auth.py +0 -0
  55. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/create_entity.py +0 -0
  56. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/create_ingredient_sdk.py +0 -0
  57. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/download_files.py +0 -0
  58. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/edit_recipe_inputs.py +0 -0
  59. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  60. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  61. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  62. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  63. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  64. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  65. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  66. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  67. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  68. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/integration-server/pyproject.toml +0 -0
  69. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/invoke_uploader.py +0 -0
  70. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/oauth.py +0 -0
  71. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/set_recipe_metadata_file.py +0 -0
  72. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/set_recipe_output_file_sdk.py +0 -0
  73. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/examples/upload_files.py +0 -0
  74. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/__init__.py +0 -0
  75. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/argument_parser/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/argument_parser/_is_enum.py +0 -0
  77. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  78. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/argument_parser/case_convert.py +0 -0
  79. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/__init__.py +0 -0
  80. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/_blob_session.py +0 -0
  81. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/_local_session.py +0 -0
  82. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/_s3_session.py +0 -0
  83. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  84. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  85. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  86. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/py.typed +0 -0
  87. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/__init__.py +0 -0
  88. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/annotation.py +0 -0
  89. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/missing_sentry.py +0 -0
  90. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/opaque_key.py +0 -0
  91. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/serial_alias.py +0 -0
  92. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/serial_class.py +0 -0
  93. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/serial_generic.py +0 -0
  94. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/serial_union.py +0 -0
  95. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization/yaml.py +0 -0
  96. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization_util/__init__.py +0 -0
  97. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  98. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  99. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization_util/dataclasses.py +0 -0
  100. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/serialization_util/serialization_helpers.py +0 -0
  101. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/strenum_compat/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/strenum_compat/strenum_compat.py +0 -0
  103. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/__init__.py +0 -0
  104. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/__main__.py +0 -0
  105. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  107. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  108. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/builder.py +0 -0
  109. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/builder_types.py +0 -0
  110. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/config.py +0 -0
  111. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/cross_output_links.py +0 -0
  112. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_io_ts.py +0 -0
  113. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_open_api.py +0 -0
  114. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_open_api_util.py +0 -0
  115. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/emit_typescript.py +0 -0
  116. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/load_types.py +0 -0
  117. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  118. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/open_api_util.py +0 -0
  119. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/parts/base.py.prepart +0 -0
  120. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  121. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/test.py +0 -0
  122. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/type_info/__main__.py +0 -0
  123. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  125. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/util.py +0 -0
  126. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/value_spec/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/value_spec/__main__.py +0 -0
  128. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  129. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  130. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/pkgs/type_spec/value_spec/types.py +0 -0
  131. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/setup.cfg +0 -0
  132. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/__init__.py +0 -0
  133. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/__init__.py +0 -0
  134. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/async_batch.py +0 -0
  135. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/client.py +0 -0
  136. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/environment.py +0 -0
  137. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/file_upload.py +0 -0
  138. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/core/types.py +0 -0
  139. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/construct_client.py +0 -0
  141. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/cron.py +0 -0
  142. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/db/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/db/connect.py +0 -0
  144. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/db/session.py +0 -0
  145. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/entrypoint.py +0 -0
  146. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/executors/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/executors/executors.py +0 -0
  148. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  149. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/executors/script_executor.py +0 -0
  150. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/http_server/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/http_server/types.py +0 -0
  152. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/job.py +0 -0
  153. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  156. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  158. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  159. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  161. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  162. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  163. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/types.py +0 -0
  164. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/queue_runner/worker.py +0 -0
  165. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/scan_profiles.py +0 -0
  166. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/scheduler.py +0 -0
  167. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  168. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  169. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/server.py +0 -0
  170. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  171. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/py.typed +0 -0
  172. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/batch/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/batch/execute_batch.py +0 -0
  175. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  176. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/chemical/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  178. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  180. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/create_entities.py +0 -0
  182. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/create_entity.py +0 -0
  183. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  184. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/export_entities.py +0 -0
  185. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/get_entities_data.py +0 -0
  186. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  187. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/list_aggregate.py +0 -0
  188. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/list_entities.py +0 -0
  189. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/lock_entity.py +0 -0
  190. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/lookup_entity.py +0 -0
  191. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  192. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/set_barcode.py +0 -0
  193. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  194. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/set_values.py +0 -0
  195. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  196. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/entity/unlock_entity.py +0 -0
  197. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/equipment/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  199. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/field_options/__init__.py +0 -0
  200. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  201. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/files/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/files/download_file.py +0 -0
  203. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/id_source/__init__.py +0 -0
  204. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/id_source/list_id_source.py +0 -0
  205. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/id_source/match_id_source.py +0 -0
  206. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/input_groups/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  208. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/__init__.py +0 -0
  209. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/create_inputs.py +0 -0
  210. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/get_input_data.py +0 -0
  211. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/get_input_names.py +0 -0
  212. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  213. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  214. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/set_input_category.py +0 -0
  215. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  216. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  217. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/integrations/__init__.py +0 -0
  218. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/integrations/push_notification.py +0 -0
  219. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  220. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/listing/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/listing/fetch_listing.py +0 -0
  222. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/material_families/__init__.py +0 -0
  223. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  224. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/notebooks/__init__.py +0 -0
  225. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  226. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/outputs/__init__.py +0 -0
  227. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/outputs/get_output_data.py +0 -0
  228. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/outputs/get_output_names.py +0 -0
  229. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  230. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  231. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/permissions/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  233. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/project/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/project/get_projects.py +0 -0
  235. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/project/get_projects_data.py +0 -0
  236. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipe_links/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  238. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  239. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  240. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  241. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  243. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  244. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  245. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  246. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  247. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  248. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  249. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/create_recipe.py +0 -0
  250. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/create_recipes.py +0 -0
  251. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  252. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  253. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  254. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_curve.py +0 -0
  255. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  256. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  257. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  258. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  259. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  260. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  261. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  262. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  263. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  264. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  265. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  266. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  267. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  268. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  269. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  270. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  271. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/runsheet/__init__.py +0 -0
  272. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  273. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  274. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/triggers/__init__.py +0 -0
  275. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/triggers/run_trigger.py +0 -0
  276. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/uploader/__init__.py +0 -0
  277. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  278. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  279. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/user/__init__.py +0 -0
  280. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/api/user/get_current_user_info.py +0 -0
  281. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/async_batch.py +0 -0
  282. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/async_batch_t.py +0 -0
  283. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/async_jobs.py +0 -0
  284. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/async_jobs_t.py +0 -0
  285. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/auth_retrieval.py +0 -0
  286. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/auth_retrieval_t.py +0 -0
  287. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/base.py +0 -0
  288. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/base_t.py +0 -0
  289. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/calculations.py +0 -0
  290. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/calculations_t.py +0 -0
  291. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/chemical_structure.py +0 -0
  292. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/chemical_structure_t.py +0 -0
  293. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/client_config.py +0 -0
  294. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/client_config_t.py +0 -0
  295. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/curves.py +0 -0
  296. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/curves_t.py +0 -0
  297. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/data.py +0 -0
  298. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/data_t.py +0 -0
  299. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/entity.py +0 -0
  300. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/experiment_groups.py +0 -0
  301. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/experiment_groups_t.py +0 -0
  302. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/exports.py +0 -0
  303. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/exports_t.py +0 -0
  304. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/field_values.py +0 -0
  305. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/field_values_t.py +0 -0
  306. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/fields.py +0 -0
  307. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/fields_t.py +0 -0
  308. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/generic_upload.py +0 -0
  309. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/generic_upload_t.py +0 -0
  310. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/id_source.py +0 -0
  311. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/id_source_t.py +0 -0
  312. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/identifier.py +0 -0
  313. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/identifier_t.py +0 -0
  314. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/input_attributes.py +0 -0
  315. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/input_attributes_t.py +0 -0
  316. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/inputs.py +0 -0
  317. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/inputs_t.py +0 -0
  318. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integration_server.py +0 -0
  319. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integration_server_t.py +0 -0
  320. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integration_session.py +0 -0
  321. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integration_session_t.py +0 -0
  322. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integrations.py +0 -0
  323. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/integrations_t.py +0 -0
  324. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/job_definition.py +0 -0
  325. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/listing.py +0 -0
  326. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/listing_t.py +0 -0
  327. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/notices.py +0 -0
  328. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/notices_t.py +0 -0
  329. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/notifications.py +0 -0
  330. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/notifications_t.py +0 -0
  331. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/outputs.py +0 -0
  332. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/outputs_t.py +0 -0
  333. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/overrides.py +0 -0
  334. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/overrides_t.py +0 -0
  335. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/permissions.py +0 -0
  336. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/permissions_t.py +0 -0
  337. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/phases.py +0 -0
  338. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/phases_t.py +0 -0
  339. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/post_base.py +0 -0
  340. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/post_base_t.py +0 -0
  341. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/queued_job.py +0 -0
  342. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/queued_job_t.py +0 -0
  343. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_identifiers.py +0 -0
  344. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_identifiers_t.py +0 -0
  345. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_inputs.py +0 -0
  346. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_inputs_t.py +0 -0
  347. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_links.py +0 -0
  348. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_links_t.py +0 -0
  349. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_metadata.py +0 -0
  350. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_metadata_t.py +0 -0
  351. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_output_metadata.py +0 -0
  352. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_output_metadata_t.py +0 -0
  353. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_tags.py +0 -0
  354. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_tags_t.py +0 -0
  355. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_workflow_steps.py +0 -0
  356. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  357. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipes.py +0 -0
  358. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/recipes_t.py +0 -0
  359. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/response.py +0 -0
  360. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/response_t.py +0 -0
  361. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/runsheet.py +0 -0
  362. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/runsheet_format.py +0 -0
  363. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/runsheet_format_t.py +0 -0
  364. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/runsheet_t.py +0 -0
  365. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/secret_retrieval.py +0 -0
  366. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/secret_retrieval_t.py +0 -0
  367. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/sockets.py +0 -0
  368. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/sockets_t.py +0 -0
  369. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/specs.py +0 -0
  370. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/specs_t.py +0 -0
  371. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/units.py +0 -0
  372. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/units_t.py +0 -0
  373. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/uploader.py +0 -0
  374. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/uploader_t.py +0 -0
  375. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/users.py +0 -0
  376. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/users_t.py +0 -0
  377. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/webhook_job.py +0 -0
  378. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/webhook_job_t.py +0 -0
  379. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/workflows.py +0 -0
  380. {uncountablepythonsdk-0.0.144 → uncountablepythonsdk-0.0.146}/uncountable/types/workflows_t.py +0 -0
@@ -36,7 +36,7 @@ jobs:
36
36
  run: |
37
37
  export SETUPTOOLS_SCM_PRETEND_VERSION_FOR_uncountablepythonsdk=$(git describe --tags --exact-match)
38
38
  python3 -m build
39
- - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
39
+ - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
40
40
  with:
41
41
  name: package-distributions
42
42
  path: dist/
@@ -50,7 +50,7 @@ jobs:
50
50
  permissions:
51
51
  id-token: write
52
52
  steps:
53
- - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
53
+ - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
54
54
  with:
55
55
  name: package-distributions
56
56
  path: dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.144
3
+ Version: 0.0.146
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
@@ -39,14 +39,14 @@ Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
41
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
- Requires-Dist: msgspec==0.19.*
42
+ Requires-Dist: msgspec<0.21,>=0.19
43
43
  Requires-Dist: tabulate==0.9.0
44
- Requires-Dist: types-psutil~=5.9.5
44
+ Requires-Dist: types-psutil~=7.1.3
45
45
  Requires-Dist: psutil>=5.9.0
46
46
  Provides-Extra: test
47
47
  Requires-Dist: mypy==1.*; extra == "test"
48
48
  Requires-Dist: ruff==0.*; extra == "test"
49
- Requires-Dist: pytest==8.*; extra == "test"
49
+ Requires-Dist: pytest>=8; extra == "test"
50
50
  Requires-Dist: coverage[toml]==7.*; extra == "test"
51
51
  Requires-Dist: pytest-cov==7.*; extra == "test"
52
52
  Requires-Dist: pytest-xdist==3.*; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.144
3
+ Version: 0.0.146
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
@@ -39,14 +39,14 @@ Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
41
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
- Requires-Dist: msgspec==0.19.*
42
+ Requires-Dist: msgspec<0.21,>=0.19
43
43
  Requires-Dist: tabulate==0.9.0
44
- Requires-Dist: types-psutil~=5.9.5
44
+ Requires-Dist: types-psutil~=7.1.3
45
45
  Requires-Dist: psutil>=5.9.0
46
46
  Provides-Extra: test
47
47
  Requires-Dist: mypy==1.*; extra == "test"
48
48
  Requires-Dist: ruff==0.*; extra == "test"
49
- Requires-Dist: pytest==8.*; extra == "test"
49
+ Requires-Dist: pytest>=8; extra == "test"
50
50
  Requires-Dist: coverage[toml]==7.*; extra == "test"
51
51
  Requires-Dist: pytest-cov==7.*; extra == "test"
52
52
  Requires-Dist: pytest-xdist==3.*; extra == "test"
@@ -17,6 +17,7 @@ docs/requirements.txt
17
17
  docs/integration_examples/create_ingredient.md
18
18
  docs/integration_examples/create_output.md
19
19
  docs/integration_examples/index.md
20
+ docs/integration_examples/upload_file.md
20
21
  docs/static/logo_blue.png
21
22
  docs/static/favicons/android-chrome-192x192.png
22
23
  docs/static/favicons/android-chrome-512x512.png
@@ -294,6 +295,7 @@ uncountable/types/api/equipment/associate_equipment_input.py
294
295
  uncountable/types/api/field_options/__init__.py
295
296
  uncountable/types/api/field_options/upsert_field_options.py
296
297
  uncountable/types/api/files/__init__.py
298
+ uncountable/types/api/files/create_file_record.py
297
299
  uncountable/types/api/files/download_file.py
298
300
  uncountable/types/api/id_source/__init__.py
299
301
  uncountable/types/api/id_source/list_id_source.py
@@ -21,15 +21,15 @@ grpcio==1.67.1
21
21
  protobuf>=4.21.1
22
22
  azure-storage-blob==12.*
23
23
  boto3-stubs[essential,ses]==1.*
24
- msgspec==0.19.*
24
+ msgspec<0.21,>=0.19
25
25
  tabulate==0.9.0
26
- types-psutil~=5.9.5
26
+ types-psutil~=7.1.3
27
27
  psutil>=5.9.0
28
28
 
29
29
  [test]
30
30
  mypy==1.*
31
31
  ruff==0.*
32
- pytest==8.*
32
+ pytest>=8
33
33
  coverage[toml]==7.*
34
34
  pytest-cov==7.*
35
35
  pytest-xdist==3.*
@@ -3,4 +3,5 @@
3
3
  ```{toctree}
4
4
  create_ingredient
5
5
  create_output
6
+ upload_file
6
7
  ```
@@ -0,0 +1,31 @@
1
+ # Upload Files
2
+
3
+ This example demonstrates the efficient way to upload files using the External API SDK's `client.upload_files()` method.
4
+
5
+ ```python
6
+ from io import BytesIO
7
+ from pathlib import Path
8
+
9
+ from uncountable.core import AuthDetailsApiKey, Client
10
+ from uncountable.core.client import ClientConfig
11
+ from uncountable.core.file_upload import DataFileUpload, UploadedFile
12
+
13
+ client: Client = Client(
14
+ base_url="<BASE_URL>",
15
+ auth_details=AuthDetailsApiKey(
16
+ api_id="<API_ID>",
17
+ api_secret_key="<API_SECRET_KEY>"
18
+ ),
19
+ config=ClientConfig(allow_insecure_tls=False),
20
+ )
21
+
22
+ filepath = Path("<YOUR_FILE_PATH>")
23
+ file_io: BytesIO = BytesIO(filepath.read_bytes())
24
+
25
+ upload_file_response: list[UploadedFile] = client.upload_files(
26
+ file_uploads=[DataFileUpload(data=file_io, name=filepath.name)]
27
+ )
28
+
29
+ uploaded_file_name = upload_file_response[0].name
30
+ uploaded_file_id = upload_file_response[0].file_id
31
+ ```
@@ -213,6 +213,59 @@ def _build_parser_discriminated_union(
213
213
  return parse
214
214
 
215
215
 
216
+ def _resolve_type_var(
217
+ *,
218
+ type_arg: typing.Any,
219
+ type_var_map: dict[typing.TypeVar, type],
220
+ ) -> typing.Any:
221
+ if isinstance(type_arg, typing.TypeVar):
222
+ if type_arg in type_var_map:
223
+ return type_var_map[type_arg]
224
+ return type_arg
225
+
226
+
227
+ def _resolve_base_type_vars(
228
+ *,
229
+ cls: type,
230
+ type_var_map: dict[typing.TypeVar, type],
231
+ ) -> None:
232
+ """Recursively resolve TypeVars from all base classes."""
233
+ for base in getattr(cls, "__orig_bases__", cls.__bases__):
234
+ base_origin = typing.get_origin(base)
235
+
236
+ # Skip typing.Generic marker
237
+ if base_origin is typing.Generic:
238
+ continue
239
+
240
+ base_args = typing.get_args(base)
241
+ if base_origin is None or base_args is None:
242
+ continue
243
+
244
+ # Map base class TypeVars
245
+ base_params = getattr(base_origin, "__parameters__", ())
246
+ for base_param, base_arg in zip(base_params, base_args, strict=True):
247
+ resolved_new_type = _resolve_type_var(
248
+ type_arg=base_arg, type_var_map=type_var_map
249
+ )
250
+ if base_param in type_var_map:
251
+ existing_type = type_var_map[base_param]
252
+
253
+ assert existing_type == resolved_new_type, (
254
+ f"Conflicting generic type variable mapping detected: "
255
+ f"TypeVar {base_param} is already mapped to {existing_type}, "
256
+ f"but attempting to remap to {resolved_new_type}. "
257
+ )
258
+ else:
259
+ type_var_map[base_param] = resolved_new_type
260
+
261
+ # Recurse into base's bases
262
+ if dataclasses.is_dataclass(base_origin):
263
+ _resolve_base_type_vars(
264
+ cls=base_origin, # type: ignore[arg-type]
265
+ type_var_map=type_var_map,
266
+ )
267
+
268
+
216
269
  def _build_parser_inner(
217
270
  parsed_type: type[T] | typing.TypeVar,
218
271
  context: ParserContext,
@@ -248,21 +301,25 @@ def _build_parser_inner(
248
301
  origin = typing.get_origin(parsed_type)
249
302
  type_args = typing.get_args(parsed_type)
250
303
  if dataclasses.is_dataclass(origin) and type_args is not None:
251
- new_type_var_map = {}
252
- type_params = getattr(origin, "__parameters__", ())
253
- for type_param, type_arg in zip(type_params, type_args, strict=True):
254
- resolved_type_arg = type_arg
255
- if isinstance(type_arg, typing.TypeVar) and type_arg in type_var_map:
256
- resolved_type_arg = type_var_map[type_arg]
257
-
258
- new_type_var_map[type_param] = resolved_type_arg
304
+ # Build local TypeVar map
305
+ merged_map: dict[typing.TypeVar, type] = {
306
+ **type_var_map,
307
+ **{
308
+ param: _resolve_type_var(type_arg=arg, type_var_map=type_var_map)
309
+ for param, arg in zip(
310
+ getattr(origin, "__parameters__", ()), type_args, strict=True
311
+ )
312
+ },
313
+ }
259
314
 
260
- return _build_parser_dataclass(
261
- origin, # type: ignore[arg-type]
262
- context,
263
- new_type_var_map,
315
+ # Resolve base class TypeVars
316
+ _resolve_base_type_vars(
317
+ cls=origin, # type: ignore[arg-type]
318
+ type_var_map=merged_map,
264
319
  )
265
320
 
321
+ return _build_parser_dataclass(origin, context, merged_map) # type: ignore[arg-type]
322
+
266
323
  # namedtuple support
267
324
  if is_namedtuple_type(parsed_type):
268
325
  type_hints = typing.get_type_hints(parsed_type)
@@ -308,7 +365,7 @@ def _build_parser_inner(
308
365
  args = typing.get_args(parsed_type)
309
366
  sorted_args = sorted(
310
367
  args,
311
- key=lambda subtype: (0 if subtype == type(None) else 1), # noqa: E721
368
+ key=lambda subtype: 0 if subtype == type(None) else 1, # noqa: E721
312
369
  )
313
370
  arg_parsers = [
314
371
  _build_parser_inner(arg, context, type_var_map) for arg in sorted_args
@@ -564,7 +621,7 @@ def _build_parser_dataclass(
564
621
 
565
622
  # Add to cache before building inner types, to support recursion
566
623
  parser_function = parse
567
- context.cache[parsed_type] = parser_function
624
+ context.cache[cache_key] = parser_function
568
625
 
569
626
  dc_field_parsers = []
570
627
  for field in dataclasses.fields(parsed_type): # type:ignore[arg-type]
@@ -84,7 +84,8 @@ def list_gdrive_files(
84
84
  print("Listing files", end="", flush=True)
85
85
  paginated_files_in_folder = [
86
86
  (
87
- gdrive_connection.files()
87
+ gdrive_connection
88
+ .files()
88
89
  .list(
89
90
  q=query,
90
91
  corpora="allDrives",
@@ -97,7 +98,8 @@ def list_gdrive_files(
97
98
  while paginated_files_in_folder[-1].get("nextPageToken") is not None:
98
99
  print(".", end="", flush=True)
99
100
  paginated_files_in_folder.append(
100
- gdrive_connection.files()
101
+ gdrive_connection
102
+ .files()
101
103
  .list(
102
104
  q=query,
103
105
  corpora="allDrives",
@@ -152,7 +154,8 @@ def move_gdrive_file(
152
154
  ) -> None:
153
155
  # Retrieve the existing parents to remove
154
156
  file = (
155
- gdrive_connection.files()
157
+ gdrive_connection
158
+ .files()
156
159
  .get(fileId=src_file_id, fields="parents, name", supportsTeamDrives=True)
157
160
  .execute()
158
161
  )
@@ -5,7 +5,12 @@ from decimal import Decimal
5
5
  from typing import Any
6
6
 
7
7
  from . import builder, util
8
- from .builder import EndpointEmitType, EndpointSpecificPath, base_namespace_name
8
+ from .builder import (
9
+ EndpointEmitType,
10
+ EndpointSpecificPath,
11
+ PropertyExtant,
12
+ base_namespace_name,
13
+ )
9
14
  from .config import PythonConfig
10
15
  from .cross_output_links import get_path_links
11
16
  from .emit_open_api_util import EmitOpenAPIStabilityLevel
@@ -115,9 +120,33 @@ def _check_type_match(stype: builder.SpecType, value: Any) -> bool:
115
120
  return any(
116
121
  _check_type_match(sub_type, value) for sub_type in stype.parameters
117
122
  )
118
-
123
+ elif isinstance(stype, builder.SpecTypeDefnObject):
124
+ if not isinstance(value, dict):
125
+ return False
126
+
127
+ assert stype.properties is not None
128
+ value_keys_validated: set[str] = set()
129
+ for field in stype.properties.values():
130
+ # Note: This has a dependency on python_field_name since we are forcing the
131
+ # constant values to use python style field name casing
132
+ py_name = python_field_name(field.name, field.name_case)
133
+ if py_name in value:
134
+ sub_value = value[py_name]
135
+ value_keys_validated.add(py_name)
136
+ if not _check_type_match(field.spec_type, sub_value):
137
+ return False
138
+ elif field.extant == PropertyExtant.required:
139
+ return False
140
+
141
+ return value_keys_validated == set(value.keys())
119
142
  elif isinstance(stype, builder.SpecTypeDefnStringEnum):
120
143
  return value in stype.values
144
+ elif isinstance(stype, builder.SpecTypeDefnUnion):
145
+ assert stype.discriminator_map is not None
146
+ assert stype.discriminator is not None
147
+ return _check_type_match(
148
+ stype.discriminator_map[value[stype.discriminator]], value
149
+ )
121
150
 
122
151
  raise Exception("invalid type", stype, value)
123
152
 
@@ -199,6 +228,18 @@ def _emit_value(
199
228
  return f"{refer_to(ctx, stype)}.{_resolve_enum_name(value, stype.name_case)}"
200
229
  elif isinstance(stype, builder.SpecTypeDefnAlias):
201
230
  return _emit_value(ctx, stype.alias, value)
231
+ elif isinstance(stype, builder.SpecTypeDefnUnion):
232
+ assert stype.discriminator_map is not None
233
+ assert stype.discriminator is not None
234
+ sub_type = stype.discriminator_map[value[stype.discriminator]]
235
+ if not _check_type_match(sub_type, value):
236
+ raise Exception("invalid union type for constant", value, stype)
237
+ return _emit_value(
238
+ ctx,
239
+ sub_type,
240
+ value,
241
+ indent=indent,
242
+ )
202
243
  elif isinstance(stype, builder.SpecTypeDefnObject):
203
244
  assert isinstance(value, dict), (
204
245
  f"Expected dict value for {stype.name} but got {value}"
@@ -112,6 +112,15 @@ def emit_value_ts(
112
112
 
113
113
  elif isinstance(stype, builder.SpecTypeDefnStringEnum):
114
114
  return f"{refer_to(ctx, stype)}.{ts_enum_name(value, stype.name_case)}"
115
+ elif isinstance(stype, builder.SpecTypeDefnUnion):
116
+ assert stype.discriminator_map is not None
117
+ assert stype.discriminator is not None
118
+ return emit_value_ts(
119
+ ctx,
120
+ stype.discriminator_map[value[stype.discriminator]],
121
+ value,
122
+ indent=indent,
123
+ )
115
124
  elif isinstance(stype, builder.SpecTypeDefnObject):
116
125
  assert isinstance(value, dict), (
117
126
  f"Expected dict value for {stype.name} but got {value}"
@@ -4,13 +4,14 @@ import decimal
4
4
  import io
5
5
  import json
6
6
  from enum import Enum
7
- from typing import Any, cast
7
+ from typing import Any
8
8
 
9
9
  import yaml
10
10
 
11
11
  from main.base.types import data_t, type_info_t
12
12
  from main.base.types.base_t import PureJsonValue
13
13
  from pkgs.argument_parser import CachedParser
14
+ from pkgs.serialization import OpaqueKey
14
15
  from pkgs.serialization_util import serialize_for_api, serialize_for_storage
15
16
 
16
17
  from .. import builder, util
@@ -87,11 +88,10 @@ def _dict_null_strip(data: dict[str, object]) -> dict[str, object]:
87
88
 
88
89
 
89
90
  class JsonEncoder(json.JSONEncoder):
90
- """We have some defaults of special types that we need to emit"""
91
-
92
91
  def default(self, obj: object) -> object:
93
92
  if isinstance(obj, decimal.Decimal):
94
93
  return str(obj)
94
+
95
95
  return json.JSONEncoder.default(self, obj)
96
96
 
97
97
 
@@ -100,7 +100,9 @@ def emit_type_info(build: builder.SpecBuilder, output: str) -> None:
100
100
 
101
101
  # sort for stability, indent for smaller diffs
102
102
  stripped = _dict_null_strip(dataclasses.asdict(type_map))
103
- serial = json.dumps(stripped, sort_keys=True, indent=2, cls=JsonEncoder)
103
+ serial = json.dumps(
104
+ serialize_for_api(stripped), sort_keys=True, indent=2, cls=JsonEncoder
105
+ )
104
106
  type_map_out = io.StringIO()
105
107
  type_map_out.write(MODIFY_NOTICE)
106
108
  type_map_out.write(f"export const TYPE_MAP = {serial}")
@@ -109,12 +111,22 @@ def emit_type_info(build: builder.SpecBuilder, output: str) -> None:
109
111
 
110
112
 
111
113
  def _convert_value_for_yaml_dump(value: Any) -> Any:
114
+ if dataclasses.is_dataclass(value):
115
+ return {
116
+ k: _convert_value_for_yaml_dump(v)
117
+ for k, v in dataclasses.asdict(value).items() # type: ignore[arg-type]
118
+ }
112
119
  if isinstance(value, Enum):
113
120
  return value.value
114
121
  elif isinstance(value, list):
115
122
  return [_convert_value_for_yaml_dump(item) for item in value]
116
123
  elif isinstance(value, dict):
117
- return {k: _convert_value_for_yaml_dump(v) for k, v in value.items()}
124
+ return {
125
+ (
126
+ str(k) if isinstance(k, OpaqueKey) else _convert_value_for_yaml_dump(k)
127
+ ): _convert_value_for_yaml_dump(v)
128
+ for k, v in value.items()
129
+ }
118
130
  elif isinstance(value, decimal.Decimal):
119
131
  return str(value)
120
132
  else:
@@ -132,8 +144,9 @@ def emit_type_info_python(build: builder.SpecBuilder, output: str) -> None:
132
144
  type_map = _build_map_all(build, python=True)
133
145
 
134
146
  stripped = _dict_null_strip(asdict_for_yaml_dump(type_map))
147
+ serialized = serialize_for_storage(stripped)
135
148
 
136
- yaml_content = yaml.dump(stripped, default_flow_style=False, sort_keys=True)
149
+ yaml_content = yaml.dump(serialized, default_flow_style=False, sort_keys=True)
137
150
  util.rewrite_file(f"{output}/type_map.yaml", yaml_content)
138
151
 
139
152
 
@@ -144,7 +157,7 @@ class MapProperty:
144
157
  label: str | None
145
158
  type_path: object
146
159
  extant: str
147
- ext_info: PureJsonValue | None
160
+ ext_info: type_info_t.ExtInfo | None
148
161
  desc: str | None
149
162
  # We don't have typing on defaults yet, relying on emitters to check it. Limit
150
163
  # use of this field, as it'll necessarily change when adding type info
@@ -156,13 +169,13 @@ class MapTypeBase:
156
169
  type_name: str
157
170
  label: str | None
158
171
  desc: str | None
159
- ext_info: PureJsonValue | None
172
+ ext_info: type_info_t.ExtInfo | None
160
173
 
161
174
 
162
175
  @dataclasses.dataclass
163
176
  class MapTypeObject(MapTypeBase):
164
177
  base_type_path: object
165
- properties: dict[str, MapProperty]
178
+ properties: dict[OpaqueKey, MapProperty]
166
179
 
167
180
 
168
181
  @dataclasses.dataclass
@@ -180,7 +193,7 @@ class StringEnumValue:
180
193
 
181
194
  @dataclasses.dataclass
182
195
  class MapStringEnum(MapTypeBase):
183
- values: dict[str, StringEnumValue]
196
+ values: dict[OpaqueKey, StringEnumValue]
184
197
 
185
198
 
186
199
  MapType = MapTypeObject | MapTypeAlias | MapStringEnum
@@ -188,12 +201,12 @@ MapType = MapTypeObject | MapTypeAlias | MapStringEnum
188
201
 
189
202
  @dataclasses.dataclass
190
203
  class MapNamespace:
191
- types: dict[str, MapType]
204
+ types: dict[OpaqueKey, MapType]
192
205
 
193
206
 
194
207
  @dataclasses.dataclass
195
208
  class MapAll:
196
- namespaces: dict[str, MapNamespace]
209
+ namespaces: dict[OpaqueKey, MapNamespace]
197
210
 
198
211
 
199
212
  def _build_map_all(build: builder.SpecBuilder, *, python: bool = False) -> MapAll:
@@ -207,12 +220,12 @@ def _build_map_all(build: builder.SpecBuilder, *, python: bool = False) -> MapAl
207
220
  continue
208
221
 
209
222
  map_namespace = MapNamespace(types={})
210
- map_all.namespaces[namespace.name] = map_namespace
223
+ map_all.namespaces[OpaqueKey(key=namespace.name)] = map_namespace
211
224
 
212
225
  for type_ in namespace.types.values():
213
226
  map_type = _build_map_type(build, type_)
214
227
  if map_type is not None:
215
- map_namespace.types[type_.name] = map_type
228
+ map_namespace.types[OpaqueKey(key=type_.name)] = map_type
216
229
 
217
230
  return map_all
218
231
 
@@ -382,14 +395,14 @@ def _build_map_type(
382
395
  ):
383
396
  _, ext_info = _validate_type_ext_info(stype)
384
397
 
385
- properties: dict[str, MapProperty] = {}
398
+ properties: dict[OpaqueKey, MapProperty] = {}
386
399
  map_type = MapTypeObject(
387
400
  type_name=stype.name,
388
401
  label=stype.label,
389
402
  properties=properties,
390
403
  desc=stype.desc,
391
404
  base_type_path=type_path_of(stype.base),
392
- ext_info=serialize_for_api(ext_info), # type: ignore[arg-type]
405
+ ext_info=ext_info,
393
406
  )
394
407
 
395
408
  if stype.properties is not None:
@@ -403,21 +416,22 @@ def _build_map_type(
403
416
  api_name=ts_name(prop.name, prop.name_case),
404
417
  extant=prop.extant,
405
418
  type_path=type_path_of(prop.spec_type),
406
- ext_info=serialize_for_api(parts.ext_info), # type: ignore[arg-type]
419
+ ext_info=parts.ext_info,
407
420
  desc=parts.desc,
408
421
  default=prop.default,
409
422
  )
410
- map_type.properties[prop.name] = map_property
423
+ map_type.properties[OpaqueKey(key=prop.name)] = map_property
411
424
 
412
425
  return map_type
413
426
 
414
427
  if isinstance(stype, builder.SpecTypeDefnAlias):
428
+ ext_info = _parse_ext_info(stype.ext_info)
415
429
  return MapTypeAlias(
416
430
  type_name=stype.name,
417
431
  label=stype.label,
418
432
  desc=stype.desc,
419
433
  alias_type_path=type_path_of(stype.alias),
420
- ext_info=_convert_ext_info(stype.ext_info),
434
+ ext_info=_parse_ext_info(stype.ext_info),
421
435
  discriminator=stype.discriminator,
422
436
  )
423
437
 
@@ -425,25 +439,27 @@ def _build_map_type(
425
439
  # Emit as a basic alias for now, as the front-end supports only those for now
426
440
  # IMPROVE: We should emit a proper union type and support that
427
441
  backing = stype.get_backing_type()
442
+ ext_info = _parse_ext_info(stype.ext_info)
428
443
  return MapTypeAlias(
429
444
  type_name=stype.name,
430
445
  label=stype.label,
431
446
  desc=stype.desc,
432
447
  alias_type_path=type_path_of(backing),
433
- ext_info=_convert_ext_info(stype.ext_info),
448
+ ext_info=_parse_ext_info(stype.ext_info),
434
449
  discriminator=stype.discriminator,
435
450
  )
436
451
 
437
452
  if isinstance(stype, builder.SpecTypeDefnStringEnum):
453
+ ext_info = _parse_ext_info(stype.ext_info)
438
454
  return MapStringEnum(
439
455
  type_name=stype.name,
440
456
  label=stype.label,
441
457
  desc=stype.desc,
442
- ext_info=_convert_ext_info(stype.ext_info),
458
+ ext_info=_parse_ext_info(stype.ext_info),
443
459
  # IMPROVE: We probably want the label here, but this requires a change
444
460
  # to the front-end type-info and form code to handle
445
461
  values={
446
- entry.value: StringEnumValue(
462
+ OpaqueKey(key=entry.value): StringEnumValue(
447
463
  value=entry.value,
448
464
  label=entry.label or entry.name,
449
465
  deprecated=entry.deprecated,
@@ -476,9 +492,3 @@ def _parse_ext_info(in_ext: Any) -> type_info_t.ExtInfo | None:
476
492
  if "open_api" in mod_ext:
477
493
  del mod_ext["open_api"]
478
494
  return ext_info_parser.parse_storage(mod_ext)
479
-
480
-
481
- def _convert_ext_info(in_ext: Any) -> PureJsonValue | None:
482
- # we need to convert this to API storage since it'll be used as-is in the UI
483
- parsed = _parse_ext_info(in_ext)
484
- return cast(PureJsonValue, serialize_for_api(parsed))
@@ -74,9 +74,9 @@ dependencies = [
74
74
  "protobuf >= 4.21.1",
75
75
  "azure-storage-blob == 12.*",
76
76
  "boto3-stubs[essential,ses]==1.*",
77
- "msgspec == 0.19.*",
77
+ "msgspec>=0.19,<0.21",
78
78
  "tabulate == 0.9.0",
79
- "types-psutil~=5.9.5",
79
+ "types-psutil~=7.1.3",
80
80
  "psutil>=5.9.0",
81
81
  ]
82
82
  dynamic = ["version"]
@@ -89,7 +89,7 @@ test = [
89
89
  "mypy == 1.*",
90
90
  "ruff == 0.*",
91
91
  # Testing
92
- "pytest ==8.*",
92
+ "pytest >=8",
93
93
  "coverage[toml] ==7.*",
94
94
  "pytest-cov ==7.*",
95
95
  "pytest-xdist == 3.*",
@@ -108,6 +108,13 @@ def register_list_queued_jobs(
108
108
  description="List all jobs queued on the integration server",
109
109
  )
110
110
 
111
+ list_queued_jobs_parser.add_argument(
112
+ "--status",
113
+ type=str,
114
+ default=None,
115
+ help="Status of the retrieved jobs",
116
+ )
117
+
111
118
  list_queued_jobs_parser.add_argument(
112
119
  "--offset",
113
120
  type=int,
@@ -123,6 +130,7 @@ def register_list_queued_jobs(
123
130
 
124
131
  def _handle_list_queued_jobs(args: argparse.Namespace) -> None:
125
132
  queued_jobs = send_list_queued_jobs_message(
133
+ status=args.status,
126
134
  offset=args.offset,
127
135
  limit=args.limit,
128
136
  host=args.host,
@@ -120,6 +120,7 @@ def check_health(*, host: str = _LOCAL_RPC_HOST, port: int) -> bool:
120
120
 
121
121
  def send_list_queued_jobs_message(
122
122
  *,
123
+ status: queued_job_t.JobStatus | None,
123
124
  offset: int,
124
125
  limit: int,
125
126
  host: str = "localhost",
@@ -129,6 +130,7 @@ def send_list_queued_jobs_message(
129
130
  request = ListQueuedJobsRequest(
130
131
  offset=offset,
131
132
  limit=limit,
133
+ status=status,
132
134
  )
133
135
 
134
136
  try: